dwarf2read: replace gdb::optional<bool> with enum

gdb::optional<bool> is dangerous, because it's easy to do:

  if (opt_bool)

when you actually meant

  if (*opt_bool)

or vice-versa.  The first checks if the optional is set, the second
checks if the wrapped bool is true.

Replace it with an enum that explicitly defines the three possible
states.

gdb/ChangeLog:

	* dwarf2read.c (dw2_debug_names_iterator::next): Use enum to
	represent whether the symbol is static, dynamic, or we don't
	know.
This commit is contained in:
Simon Marchi 2019-08-25 18:09:47 -04:00
parent e3ec872f80
commit beadd3e84e
2 changed files with 16 additions and 5 deletions

View File

@ -1,3 +1,9 @@
2019-08-25 Simon Marchi <simon.marchi@efficios.com>
* dwarf2read.c (dw2_debug_names_iterator::next): Use enum to
represent whether the symbol is static, dynamic, or we don't
know.
2019-08-25 Yoshinori Sato <ysato@users.sourceforge.jp> 2019-08-25 Yoshinori Sato <ysato@users.sourceforge.jp>
* gdb/rx-tdep.c (rx_register_names): New. * gdb/rx-tdep.c (rx_register_names): New.

View File

@ -5843,7 +5843,11 @@ dw2_debug_names_iterator::next ()
return NULL; return NULL;
} }
const mapped_debug_names::index_val &indexval = indexval_it->second; const mapped_debug_names::index_val &indexval = indexval_it->second;
gdb::optional<bool> is_static; enum class symbol_linkage {
unknown,
static_,
extern_,
} symbol_linkage = symbol_linkage::unknown;
dwarf2_per_cu_data *per_cu = NULL; dwarf2_per_cu_data *per_cu = NULL;
for (const mapped_debug_names::index_val::attr &attr : indexval.attr_vec) for (const mapped_debug_names::index_val::attr &attr : indexval.attr_vec)
{ {
@ -5895,12 +5899,12 @@ dw2_debug_names_iterator::next ()
case DW_IDX_GNU_internal: case DW_IDX_GNU_internal:
if (!m_map.augmentation_is_gdb) if (!m_map.augmentation_is_gdb)
break; break;
is_static = true; symbol_linkage = symbol_linkage::static_;
break; break;
case DW_IDX_GNU_external: case DW_IDX_GNU_external:
if (!m_map.augmentation_is_gdb) if (!m_map.augmentation_is_gdb)
break; break;
is_static = false; symbol_linkage = symbol_linkage::extern_;
break; break;
} }
} }
@ -5910,10 +5914,11 @@ dw2_debug_names_iterator::next ()
goto again; goto again;
/* Check static vs global. */ /* Check static vs global. */
if (is_static.has_value () && m_block_index.has_value ()) if (symbol_linkage != symbol_linkage::unknown && m_block_index.has_value ())
{ {
const bool want_static = *m_block_index == STATIC_BLOCK; const bool want_static = *m_block_index == STATIC_BLOCK;
if (want_static != *is_static) const bool symbol_is_static = symbol_linkage == symbol_linkage::static_;
if (want_static != symbol_is_static)
goto again; goto again;
} }