diff options
author | Tom Tromey <tom@tromey.com> | 2021-03-06 09:16:59 -0700 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2021-03-06 09:17:28 -0700 |
commit | 4444f40757a242015973237627283a910f5d9654 (patch) | |
tree | 2eff136ada394093d03b997cd3c69069e8c36466 /gdb/dwarf2 | |
parent | 8c0546e928b557f10cb5aba2a91f3ecee660029d (diff) | |
download | gdb-4444f40757a242015973237627283a910f5d9654.zip gdb-4444f40757a242015973237627283a910f5d9654.tar.gz gdb-4444f40757a242015973237627283a910f5d9654.tar.bz2 |
Micro-optimize abbrev reading and storage
Currently, and abbrev_info points to a separately allocated array of
attr_abbrev objects. This array is constructed in a temporary vector,
then copied to the abbrev table's obstack.
This patch changes abbrev_info to use the struct hack to store the
objects directly, and changes abbrev_table::read to avoid an extra
copy when allocating, using the "growing objects" capability of
obstacks.
This saves a bit of space, and also perhaps a little time.
2021-03-06 Tom Tromey <tom@tromey.com>
* dwarf2/read.c (read_attribute): Make 'abbrev' const.
* dwarf2/abbrev.c (abbrev_table::alloc_abbrev): Remove.
(abbrev_table::read): Update.
* dwarf2/abbrev.h (struct attr_abbrev): Move earlier.
(struct abbrev_info): Reformat.
<attrs>: Now an array.
(struct abbrev_table) <alloc_abbrev>: Remove.
Diffstat (limited to 'gdb/dwarf2')
-rw-r--r-- | gdb/dwarf2/abbrev.c | 71 | ||||
-rw-r--r-- | gdb/dwarf2/abbrev.h | 42 | ||||
-rw-r--r-- | gdb/dwarf2/read.c | 5 |
3 files changed, 51 insertions, 67 deletions
diff --git a/gdb/dwarf2/abbrev.c b/gdb/dwarf2/abbrev.c index 6219c13..9ece708 100644 --- a/gdb/dwarf2/abbrev.c +++ b/gdb/dwarf2/abbrev.c @@ -65,19 +65,6 @@ abbrev_table::abbrev_table (sect_offset off) { } -/* Allocate space for a struct abbrev_info object in ABBREV_TABLE. */ - -struct abbrev_info * -abbrev_table::alloc_abbrev () -{ - struct abbrev_info *abbrev; - - abbrev = XOBNEW (&m_abbrev_obstack, struct abbrev_info); - memset (abbrev, 0, sizeof (struct abbrev_info)); - - return abbrev; -} - /* Add an abbreviation to the table. */ void @@ -97,11 +84,10 @@ abbrev_table::read (struct dwarf2_section_info *section, bfd *abfd = section->get_bfd_owner (); const gdb_byte *abbrev_ptr; struct abbrev_info *cur_abbrev; - unsigned int abbrev_number, bytes_read, abbrev_name; - unsigned int abbrev_form; - std::vector<struct attr_abbrev> cur_attrs; + unsigned int abbrev_number, bytes_read; abbrev_table_up abbrev_table (new struct abbrev_table (sect_off)); + struct obstack *obstack = &abbrev_table->m_abbrev_obstack; /* Caller must ensure this. */ gdb_assert (section->readin); @@ -112,56 +98,51 @@ abbrev_table::read (struct dwarf2_section_info *section, /* Loop until we reach an abbrev number of 0. */ while (abbrev_number) { - cur_attrs.clear (); - cur_abbrev = abbrev_table->alloc_abbrev (); + /* Start without any attrs. */ + obstack_blank (obstack, offsetof (abbrev_info, attrs)); + cur_abbrev = (struct abbrev_info *) obstack_base (obstack); - /* read in abbrev header */ + /* Read in abbrev header. */ cur_abbrev->number = abbrev_number; cur_abbrev->tag - = (enum dwarf_tag) read_unsigned_leb128 (abfd, abbrev_ptr, &bytes_read); + = (enum dwarf_tag) read_unsigned_leb128 (abfd, abbrev_ptr, + &bytes_read); abbrev_ptr += bytes_read; cur_abbrev->has_children = read_1_byte (abfd, abbrev_ptr); abbrev_ptr += 1; - /* now read in declarations */ + /* Now read in declarations. */ + int num_attrs = 0; for (;;) { - LONGEST implicit_const; + struct attr_abbrev cur_attr; - abbrev_name = read_unsigned_leb128 (abfd, abbrev_ptr, &bytes_read); + cur_attr.name + = (enum dwarf_attribute) read_unsigned_leb128 (abfd, abbrev_ptr, + &bytes_read); abbrev_ptr += bytes_read; - abbrev_form = read_unsigned_leb128 (abfd, abbrev_ptr, &bytes_read); + cur_attr.form + = (enum dwarf_form) read_unsigned_leb128 (abfd, abbrev_ptr, + &bytes_read); abbrev_ptr += bytes_read; - if (abbrev_form == DW_FORM_implicit_const) + if (cur_attr.form == DW_FORM_implicit_const) { - implicit_const = read_signed_leb128 (abfd, abbrev_ptr, - &bytes_read); + cur_attr.implicit_const = read_signed_leb128 (abfd, abbrev_ptr, + &bytes_read); abbrev_ptr += bytes_read; } else - { - /* Initialize it due to a false compiler warning. */ - implicit_const = -1; - } + cur_attr.implicit_const = -1; - if (abbrev_name == 0) + if (cur_attr.name == 0) break; - cur_attrs.emplace_back (); - struct attr_abbrev &cur_attr = cur_attrs.back (); - cur_attr.name = (enum dwarf_attribute) abbrev_name; - cur_attr.form = (enum dwarf_form) abbrev_form; - cur_attr.implicit_const = implicit_const; + ++num_attrs; + obstack_grow (obstack, &cur_attr, sizeof (cur_attr)); } - cur_abbrev->num_attrs = cur_attrs.size (); - cur_abbrev->attrs = - XOBNEWVEC (&abbrev_table->m_abbrev_obstack, struct attr_abbrev, - cur_abbrev->num_attrs); - if (!cur_attrs.empty ()) - memcpy (cur_abbrev->attrs, cur_attrs.data (), - cur_abbrev->num_attrs * sizeof (struct attr_abbrev)); - + cur_abbrev = (struct abbrev_info *) obstack_finish (obstack); + cur_abbrev->num_attrs = num_attrs; abbrev_table->add_abbrev (cur_abbrev); /* Get next abbreviation. diff --git a/gdb/dwarf2/abbrev.h b/gdb/dwarf2/abbrev.h index 8018f49..e1d8b80 100644 --- a/gdb/dwarf2/abbrev.h +++ b/gdb/dwarf2/abbrev.h @@ -29,24 +29,30 @@ #include "hashtab.h" -/* This data structure holds the information of an abbrev. */ -struct abbrev_info - { - unsigned int number; /* number identifying abbrev */ - enum dwarf_tag tag; /* dwarf tag */ - unsigned short has_children; /* boolean */ - unsigned short num_attrs; /* number of attributes */ - struct attr_abbrev *attrs; /* an array of attribute descriptions */ - }; - struct attr_abbrev - { - ENUM_BITFIELD(dwarf_attribute) name : 16; - ENUM_BITFIELD(dwarf_form) form : 16; +{ + ENUM_BITFIELD(dwarf_attribute) name : 16; + ENUM_BITFIELD(dwarf_form) form : 16; - /* It is valid only if FORM is DW_FORM_implicit_const. */ - LONGEST implicit_const; - }; + /* It is valid only if FORM is DW_FORM_implicit_const. */ + LONGEST implicit_const; +}; + +/* This data structure holds the information of an abbrev. */ +struct abbrev_info +{ + /* Number identifying abbrev. */ + unsigned int number; + /* DWARF tag. */ + enum dwarf_tag tag; + /* True if the DIE has children. */ + unsigned short has_children; + /* Number of attributes. */ + unsigned short num_attrs; + /* An array of attribute descriptions, allocated using the struct + hack. */ + struct attr_abbrev attrs[1]; +}; struct abbrev_table; typedef std::unique_ptr<struct abbrev_table> abbrev_table_up; @@ -85,10 +91,6 @@ private: DISABLE_COPY_AND_ASSIGN (abbrev_table); - /* Allocate space for a struct abbrev_info object in - ABBREV_TABLE. */ - struct abbrev_info *alloc_abbrev (); - /* Add an abbreviation to the table. */ void add_abbrev (struct abbrev_info *abbrev); diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index d4f1322..f129ea6 100644 --- a/gdb/dwarf2/read.c +++ b/gdb/dwarf2/read.c @@ -1340,7 +1340,8 @@ static const struct cu_partial_die_info find_partial_die (sect_offset, int, struct dwarf2_cu *); static const gdb_byte *read_attribute (const struct die_reader_specs *, - struct attribute *, struct attr_abbrev *, + struct attribute *, + const struct attr_abbrev *, const gdb_byte *); static void read_attribute_reprocess (const struct die_reader_specs *reader, @@ -20836,7 +20837,7 @@ read_attribute_value (const struct die_reader_specs *reader, static const gdb_byte * read_attribute (const struct die_reader_specs *reader, - struct attribute *attr, struct attr_abbrev *abbrev, + struct attribute *attr, const struct attr_abbrev *abbrev, const gdb_byte *info_ptr) { attr->name = abbrev->name; |