aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Tromey <tromey@adacore.com>2020-04-02 12:49:35 -0600
committerTom Tromey <tromey@adacore.com>2020-04-02 12:49:35 -0600
commite7da7f8f71572e3ef71a22ad3fae2388a53bd84c (patch)
treea9878cff6821b6e1c1829eea5a3bde8f68b5c36f
parentc90d28ac8903c5781b1a82e487072081383fd7b9 (diff)
downloadbinutils-e7da7f8f71572e3ef71a22ad3fae2388a53bd84c.zip
binutils-e7da7f8f71572e3ef71a22ad3fae2388a53bd84c.tar.gz
binutils-e7da7f8f71572e3ef71a22ad3fae2388a53bd84c.tar.bz2
Micro-optimize partial_die_info::read
While profiling the DWARF reader, I noticed that partial_die_info::read creates a vector to store attributes. However, the vector is not needed, as this code only processes a single attribute at a time. This patch removes the vector. On my machine, this improves the time of "./gdb ./gdb" from 2.22 seconds to 1.92 seconds (mean times over 10 runs). Note that the attribute is initialized by read_attribute, so it does not need any special initialization. Avoiding this also improves performance a bit. Tested on x86-64 Fedora 30. I'm checking this in. gdb/ChangeLog 2020-04-02 Tom Tromey <tromey@adacore.com> * dwarf2/read.c (partial_die_info::read): Do not create a vector of attributes.
-rw-r--r--gdb/ChangeLog5
-rw-r--r--gdb/dwarf2/read.c7
2 files changed, 8 insertions, 4 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index d801971..993a358 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,8 @@
+2020-04-02 Tom Tromey <tromey@adacore.com>
+
+ * dwarf2/read.c (partial_die_info::read): Do not create a vector
+ of attributes.
+
2020-04-02 Andrew Burgess <andrew.burgess@embecosm.com>
Bernd Edlinger <bernd.edlinger@hotmail.de>
Tom Tromey <tromey@adacore.com>
diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
index f94c66b..0df5676 100644
--- a/gdb/dwarf2/read.c
+++ b/gdb/dwarf2/read.c
@@ -17879,18 +17879,17 @@ partial_die_info::read (const struct die_reader_specs *reader,
int has_high_pc_attr = 0;
int high_pc_relative = 0;
- std::vector<struct attribute> attr_vec (abbrev.num_attrs);
for (i = 0; i < abbrev.num_attrs; ++i)
{
+ attribute attr;
bool need_reprocess;
- info_ptr = read_attribute (reader, &attr_vec[i], &abbrev.attrs[i],
+ info_ptr = read_attribute (reader, &attr, &abbrev.attrs[i],
info_ptr, &need_reprocess);
/* 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)
- read_attribute_reprocess (reader, &attr_vec[i]);
- attribute &attr = attr_vec[i];
+ read_attribute_reprocess (reader, &attr);
/* Store the data if it is of an attribute we want to keep in a
partial symbol table. */
switch (attr.name)