static const gdb_byte *read_attribute (const struct die_reader_specs *,
struct attribute *, struct attr_abbrev *,
- const gdb_byte *, bool *need_reprocess);
+ const gdb_byte *);
static void read_attribute_reprocess (const struct die_reader_specs *reader,
struct attribute *attr, dwarf_tag tag);
/* The only abbrev we care about is DW_AT_sibling. */
if (abbrev->attrs[i].name == DW_AT_sibling)
{
- bool ignored;
- read_attribute (reader, &attr, &abbrev->attrs[i], info_ptr,
- &ignored);
+ read_attribute (reader, &attr, &abbrev->attrs[i], info_ptr);
if (attr.form == DW_FORM_ref_addr)
complaint (_("ignoring absolute DW_AT_sibling"));
else
attributes. */
die->num_attrs = abbrev->num_attrs;
- std::vector<int> indexes_that_need_reprocess;
+ bool any_need_reprocess = false;
for (i = 0; i < abbrev->num_attrs; ++i)
{
- bool need_reprocess;
- info_ptr =
- read_attribute (reader, &die->attrs[i], &abbrev->attrs[i],
- info_ptr, &need_reprocess);
- if (need_reprocess)
- indexes_that_need_reprocess.push_back (i);
+ info_ptr = read_attribute (reader, &die->attrs[i], &abbrev->attrs[i],
+ info_ptr);
+ if (die->attrs[i].requires_reprocessing_p ())
+ any_need_reprocess = true;
}
struct attribute *attr = die->attr (DW_AT_str_offsets_base);
if (attr != nullptr)
cu->ranges_base = DW_UNSND (attr);
- for (int index : indexes_that_need_reprocess)
- read_attribute_reprocess (reader, &die->attrs[index], die->tag);
+ if (any_need_reprocess)
+ {
+ for (i = 0; i < abbrev->num_attrs; ++i)
+ {
+ if (die->attrs[i].requires_reprocessing_p ())
+ read_attribute_reprocess (reader, &die->attrs[i], die->tag);
+ }
+ }
*diep = die;
return info_ptr;
}
for (i = 0; i < abbrev.num_attrs; ++i)
{
attribute attr;
- bool need_reprocess;
- info_ptr = read_attribute (reader, &attr, &abbrev.attrs[i],
- info_ptr, &need_reprocess);
+ info_ptr = read_attribute (reader, &attr, &abbrev.attrs[i], info_ptr);
/* String and address offsets that need to do the reprocessing have
already been read at this point, so there is no need to wait until
the loop terminates to do the reprocessing. */
- if (need_reprocess)
+ if (attr.requires_reprocessing_p ())
read_attribute_reprocess (reader, &attr, tag);
/* Store the data if it is of an attribute we want to keep in a
partial symbol table. */
static const gdb_byte *
read_attribute_value (const struct die_reader_specs *reader,
struct attribute *attr, unsigned form,
- LONGEST implicit_const, const gdb_byte *info_ptr,
- bool *need_reprocess)
+ LONGEST implicit_const, const gdb_byte *info_ptr)
{
struct dwarf2_cu *cu = reader->cu;
dwarf2_per_objfile *per_objfile = cu->per_objfile;
struct comp_unit_head *cu_header = &cu->header;
unsigned int bytes_read;
struct dwarf_block *blk;
- *need_reprocess = false;
attr->form = (enum dwarf_form) form;
switch (form)
break;
case DW_FORM_loclistx:
{
- *need_reprocess = true;
- DW_UNSND (attr) = read_unsigned_leb128 (abfd, info_ptr, &bytes_read);
- info_ptr += bytes_read;
+ attr->set_unsigned_reprocess (read_unsigned_leb128 (abfd, info_ptr,
+ &bytes_read));
+ info_ptr += bytes_read;
}
break;
case DW_FORM_string:
info_ptr += bytes_read;
break;
case DW_FORM_rnglistx:
- *need_reprocess = true;
- /* FALLTHROUGH */
+ {
+ attr->set_unsigned_reprocess (read_unsigned_leb128 (abfd, info_ptr,
+ &bytes_read));
+ info_ptr += bytes_read;
+ }
+ break;
case DW_FORM_udata:
attr->set_unsigned (read_unsigned_leb128 (abfd, info_ptr, &bytes_read));
info_ptr += bytes_read;
info_ptr += bytes_read;
}
info_ptr = read_attribute_value (reader, attr, form, implicit_const,
- info_ptr, need_reprocess);
+ info_ptr);
break;
case DW_FORM_implicit_const:
attr->set_signed (implicit_const);
break;
case DW_FORM_addrx:
case DW_FORM_GNU_addr_index:
- *need_reprocess = true;
attr->set_unsigned_reprocess (read_unsigned_leb128 (abfd, info_ptr,
&bytes_read));
info_ptr += bytes_read;
str_index = read_unsigned_leb128 (abfd, info_ptr, &bytes_read);
info_ptr += bytes_read;
}
- *need_reprocess = true;
attr->set_unsigned_reprocess (str_index);
- }
+ }
break;
default:
error (_("Dwarf Error: Cannot handle %s in DWARF reader [in module %s]"),
static const gdb_byte *
read_attribute (const struct die_reader_specs *reader,
struct attribute *attr, struct attr_abbrev *abbrev,
- const gdb_byte *info_ptr, bool *need_reprocess)
+ const gdb_byte *info_ptr)
{
attr->name = abbrev->name;
attr->string_is_canonical = 0;
attr->requires_reprocessing = 0;
return read_attribute_value (reader, attr, abbrev->form,
- abbrev->implicit_const, info_ptr,
- need_reprocess);
+ abbrev->implicit_const, info_ptr);
}
/* Return pointer to string at .debug_str offset STR_OFFSET. */