Remove some variables in favor of using gdb::optional
While reading that code, I noticed that some variables essentially meant whether to consider some other variable or not. I think using gdb::optional (which was not available when this code was written) is clearer, as it embeds the used/not used predicate directly in the type of the variable, making it harder to miss. gdb/ChangeLog: * dwarf2read.c (struct dw2_symtab_iterator): <want_specific_block>: Remove. <block_index>: Change type to gdb::optional. (dw2_symtab_iter_init): Remove WANT_SPECIFIC_BLOCK parameter, change type of BLOCK_INDEX parameter to gdb::optional. (dw2_symtab_iter_next): Re-write in function of gdb::optional. (dw2_lookup_symbol): Don't pass argument for WANT_SPECIFIC_BLOCK. (dw2_expand_symtabs_for_function): Don't pass argument for WANT_SPECIFIC_BLOCK, pass empty optional for BLOCK_INDEX. (class dw2_debug_names_iterator) <dw2_debug_names_iterator>: Remove WANT_SPECIFIC_BLOCK parameter, change BLOCK_INDEX type to gdb::optional. <m_want_specific_block>: Remove. <m_block_index>: Change type to gdb::optional. (dw2_debug_names_iterator::next): Change type of IS_STATIC to gdb::optional. Re-write in function of gdb::optional. (dw2_debug_names_lookup_symbol): Don't pass argument for WANT_SPECIFIC_BLOCK. (dw2_debug_names_expand_symtabs_for_function): Don't pass argument for WANT_SPECIFIC_BLOCK, pass empty optional for BLOCK_INDEX.
This commit is contained in:
parent
188a63736c
commit
2b79f3761c
|
@ -1,3 +1,28 @@
|
|||
2019-08-04 Simon Marchi <simon.marchi@polymtl.ca>
|
||||
|
||||
* dwarf2read.c (struct dw2_symtab_iterator):
|
||||
<want_specific_block>: Remove.
|
||||
<block_index>: Change type to gdb::optional.
|
||||
(dw2_symtab_iter_init): Remove WANT_SPECIFIC_BLOCK parameter,
|
||||
change type of BLOCK_INDEX parameter to gdb::optional.
|
||||
(dw2_symtab_iter_next): Re-write in function of gdb::optional.
|
||||
(dw2_lookup_symbol): Don't pass argument for
|
||||
WANT_SPECIFIC_BLOCK.
|
||||
(dw2_expand_symtabs_for_function): Don't pass argument for
|
||||
WANT_SPECIFIC_BLOCK, pass empty optional for BLOCK_INDEX.
|
||||
(class dw2_debug_names_iterator)
|
||||
<dw2_debug_names_iterator>: Remove WANT_SPECIFIC_BLOCK
|
||||
parameter, change BLOCK_INDEX type to gdb::optional.
|
||||
<m_want_specific_block>: Remove.
|
||||
<m_block_index>: Change type to gdb::optional.
|
||||
(dw2_debug_names_iterator::next): Change type of IS_STATIC to
|
||||
gdb::optional. Re-write in function of gdb::optional.
|
||||
(dw2_debug_names_lookup_symbol): Don't pass argument for
|
||||
WANT_SPECIFIC_BLOCK.
|
||||
(dw2_debug_names_expand_symtabs_for_function): Don't pass
|
||||
argument for WANT_SPECIFIC_BLOCK, pass empty optional for
|
||||
BLOCK_INDEX.
|
||||
|
||||
2019-08-03 Philippe Waroquiers <philippe.waroquiers@skynet.be>
|
||||
|
||||
* NEWS: Mention changes to "info sources" command.
|
||||
|
|
|
@ -3881,11 +3881,9 @@ struct dw2_symtab_iterator
|
|||
{
|
||||
/* The dwarf2_per_objfile owning the CUs we are iterating on. */
|
||||
struct dwarf2_per_objfile *dwarf2_per_objfile;
|
||||
/* If non-zero, only look for symbols that match BLOCK_INDEX. */
|
||||
int want_specific_block;
|
||||
/* One of GLOBAL_BLOCK or STATIC_BLOCK.
|
||||
Unused if !WANT_SPECIFIC_BLOCK. */
|
||||
int block_index;
|
||||
/* If set, only look for symbols that match that block. Valid values are
|
||||
GLOBAL_BLOCK and STATIC_BLOCK. */
|
||||
gdb::optional<int> block_index;
|
||||
/* The kind of symbol we're looking for. */
|
||||
domain_enum domain;
|
||||
/* The list of CUs from the index entry of the symbol,
|
||||
|
@ -3902,20 +3900,16 @@ struct dw2_symtab_iterator
|
|||
int global_seen;
|
||||
};
|
||||
|
||||
/* Initialize the index symtab iterator ITER.
|
||||
If WANT_SPECIFIC_BLOCK is non-zero, only look for symbols
|
||||
in block BLOCK_INDEX. Otherwise BLOCK_INDEX is ignored. */
|
||||
/* Initialize the index symtab iterator ITER. */
|
||||
|
||||
static void
|
||||
dw2_symtab_iter_init (struct dw2_symtab_iterator *iter,
|
||||
struct dwarf2_per_objfile *dwarf2_per_objfile,
|
||||
int want_specific_block,
|
||||
int block_index,
|
||||
gdb::optional<int> block_index,
|
||||
domain_enum domain,
|
||||
const char *name)
|
||||
{
|
||||
iter->dwarf2_per_objfile = dwarf2_per_objfile;
|
||||
iter->want_specific_block = want_specific_block;
|
||||
iter->block_index = block_index;
|
||||
iter->domain = domain;
|
||||
iter->next = 0;
|
||||
|
@ -3945,9 +3939,6 @@ dw2_symtab_iter_next (struct dw2_symtab_iterator *iter)
|
|||
offset_type cu_index_and_attrs =
|
||||
MAYBE_SWAP (iter->vec[iter->next + 1]);
|
||||
offset_type cu_index = GDB_INDEX_CU_VALUE (cu_index_and_attrs);
|
||||
int want_static = iter->block_index != GLOBAL_BLOCK;
|
||||
/* This value is only valid for index versions >= 7. */
|
||||
int is_static = GDB_INDEX_SYMBOL_STATIC_VALUE (cu_index_and_attrs);
|
||||
gdb_index_symbol_kind symbol_kind =
|
||||
GDB_INDEX_SYMBOL_KIND_VALUE (cu_index_and_attrs);
|
||||
/* Only check the symbol attributes if they're present.
|
||||
|
@ -3977,9 +3968,16 @@ dw2_symtab_iter_next (struct dw2_symtab_iterator *iter)
|
|||
/* Check static vs global. */
|
||||
if (attrs_valid)
|
||||
{
|
||||
if (iter->want_specific_block
|
||||
&& want_static != is_static)
|
||||
continue;
|
||||
bool is_static = GDB_INDEX_SYMBOL_STATIC_VALUE (cu_index_and_attrs);
|
||||
|
||||
if (iter->block_index.has_value ())
|
||||
{
|
||||
bool want_static = *iter->block_index == STATIC_BLOCK;
|
||||
|
||||
if (is_static != want_static)
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Work around gold/15646. */
|
||||
if (!is_static && iter->global_seen)
|
||||
continue;
|
||||
|
@ -4032,7 +4030,7 @@ dw2_lookup_symbol (struct objfile *objfile, int block_index,
|
|||
struct dw2_symtab_iterator iter;
|
||||
struct dwarf2_per_cu_data *per_cu;
|
||||
|
||||
dw2_symtab_iter_init (&iter, dwarf2_per_objfile, 1, block_index, domain, name);
|
||||
dw2_symtab_iter_init (&iter, dwarf2_per_objfile, block_index, domain, name);
|
||||
|
||||
while ((per_cu = dw2_symtab_iter_next (&iter)) != NULL)
|
||||
{
|
||||
|
@ -4115,9 +4113,7 @@ dw2_expand_symtabs_for_function (struct objfile *objfile,
|
|||
struct dw2_symtab_iterator iter;
|
||||
struct dwarf2_per_cu_data *per_cu;
|
||||
|
||||
/* Note: It doesn't matter what we pass for block_index here. */
|
||||
dw2_symtab_iter_init (&iter, dwarf2_per_objfile, 0, GLOBAL_BLOCK, VAR_DOMAIN,
|
||||
func_name);
|
||||
dw2_symtab_iter_init (&iter, dwarf2_per_objfile, {}, VAR_DOMAIN, func_name);
|
||||
|
||||
while ((per_cu = dw2_symtab_iter_next (&iter)) != NULL)
|
||||
dw2_instantiate_symtab (per_cu, false);
|
||||
|
@ -5661,14 +5657,11 @@ dwarf2_read_debug_names (struct dwarf2_per_objfile *dwarf2_per_objfile)
|
|||
class dw2_debug_names_iterator
|
||||
{
|
||||
public:
|
||||
/* If WANT_SPECIFIC_BLOCK is true, only look for symbols in block
|
||||
BLOCK_INDEX. Otherwise BLOCK_INDEX is ignored. */
|
||||
dw2_debug_names_iterator (const mapped_debug_names &map,
|
||||
bool want_specific_block,
|
||||
block_enum block_index, domain_enum domain,
|
||||
gdb::optional<block_enum> block_index,
|
||||
domain_enum domain,
|
||||
const char *name)
|
||||
: m_map (map), m_want_specific_block (want_specific_block),
|
||||
m_block_index (block_index), m_domain (domain),
|
||||
: m_map (map), m_block_index (block_index), m_domain (domain),
|
||||
m_addr (find_vec_in_debug_names (map, name))
|
||||
{}
|
||||
|
||||
|
@ -5691,13 +5684,9 @@ private:
|
|||
/* The internalized form of .debug_names. */
|
||||
const mapped_debug_names &m_map;
|
||||
|
||||
/* If true, only look for symbols that match BLOCK_INDEX. */
|
||||
const bool m_want_specific_block = false;
|
||||
|
||||
/* One of GLOBAL_BLOCK or STATIC_BLOCK.
|
||||
Unused if !WANT_SPECIFIC_BLOCK - FIRST_LOCAL_BLOCK is an invalid
|
||||
value. */
|
||||
const block_enum m_block_index = FIRST_LOCAL_BLOCK;
|
||||
/* If set, only look for symbols that match that block. Valid values are
|
||||
GLOBAL_BLOCK and STATIC_BLOCK. */
|
||||
const gdb::optional<block_enum> m_block_index;
|
||||
|
||||
/* The kind of symbol we're looking for. */
|
||||
const domain_enum m_domain = UNDEF_DOMAIN;
|
||||
|
@ -5854,8 +5843,7 @@ dw2_debug_names_iterator::next ()
|
|||
return NULL;
|
||||
}
|
||||
const mapped_debug_names::index_val &indexval = indexval_it->second;
|
||||
bool have_is_static = false;
|
||||
bool is_static;
|
||||
gdb::optional<bool> is_static;
|
||||
dwarf2_per_cu_data *per_cu = NULL;
|
||||
for (const mapped_debug_names::index_val::attr &attr : indexval.attr_vec)
|
||||
{
|
||||
|
@ -5907,13 +5895,11 @@ dw2_debug_names_iterator::next ()
|
|||
case DW_IDX_GNU_internal:
|
||||
if (!m_map.augmentation_is_gdb)
|
||||
break;
|
||||
have_is_static = true;
|
||||
is_static = true;
|
||||
break;
|
||||
case DW_IDX_GNU_external:
|
||||
if (!m_map.augmentation_is_gdb)
|
||||
break;
|
||||
have_is_static = true;
|
||||
is_static = false;
|
||||
break;
|
||||
}
|
||||
|
@ -5924,11 +5910,11 @@ dw2_debug_names_iterator::next ()
|
|||
goto again;
|
||||
|
||||
/* Check static vs global. */
|
||||
if (have_is_static)
|
||||
if (is_static.has_value () && m_block_index.has_value ())
|
||||
{
|
||||
const bool want_static = m_block_index != GLOBAL_BLOCK;
|
||||
if (m_want_specific_block && want_static != is_static)
|
||||
goto again;
|
||||
const bool want_static = *m_block_index == STATIC_BLOCK;
|
||||
if (want_static != *is_static)
|
||||
goto again;
|
||||
}
|
||||
|
||||
/* Match dw2_symtab_iter_next, symbol_kind
|
||||
|
@ -6027,8 +6013,7 @@ dw2_debug_names_lookup_symbol (struct objfile *objfile, int block_index_int,
|
|||
}
|
||||
const auto &map = *mapp;
|
||||
|
||||
dw2_debug_names_iterator iter (map, true /* want_specific_block */,
|
||||
block_index, domain, name);
|
||||
dw2_debug_names_iterator iter (map, block_index, domain, name);
|
||||
|
||||
struct compunit_symtab *stab_best = NULL;
|
||||
struct dwarf2_per_cu_data *per_cu;
|
||||
|
@ -6091,9 +6076,7 @@ dw2_debug_names_expand_symtabs_for_function (struct objfile *objfile,
|
|||
{
|
||||
const mapped_debug_names &map = *dwarf2_per_objfile->debug_names_table;
|
||||
|
||||
/* Note: It doesn't matter what we pass for block_index here. */
|
||||
dw2_debug_names_iterator iter (map, false /* want_specific_block */,
|
||||
GLOBAL_BLOCK, VAR_DOMAIN, func_name);
|
||||
dw2_debug_names_iterator iter (map, {}, VAR_DOMAIN, func_name);
|
||||
|
||||
struct dwarf2_per_cu_data *per_cu;
|
||||
while ((per_cu = iter.next ()) != NULL)
|
||||
|
|
Loading…
Reference in New Issue