[libbacktrace] Simplify memory management in build_address_map
authorTom de Vries <tdevries@suse.de>
Fri, 28 Dec 2018 03:43:41 +0000 (03:43 +0000)
committerTom de Vries <vries@gcc.gnu.org>
Fri, 28 Dec 2018 03:43:41 +0000 (03:43 +0000)
In the main loop in build_address_map, we first read the abbrevs into a local
variable abbrevs, and then allocate the corresponding unit, after which we assign
the abbrevs to the unit.  This results in dedicated free-upon-failure
handling for the variable, and extra code to make sure that free-upon-failure
doesn't trigger once the unit has taken ownership of the abbrevs.

Simplify this by reversing the order of abbrev reading and unit allocation,
and eliminating the abbrevs local variable.

Bootstrapped and reg-tested on x86_64.

2018-12-28  Tom de Vries  <tdevries@suse.de>

* dwarf.c (build_address_map): Simplify by removing local variable
abbrevs.

From-SVN: r267444

libbacktrace/ChangeLog
libbacktrace/dwarf.c

index 27a0f429331f0b05af3cfc7e2eaddc27a9fbb3c6..ee31ef0dd5e5f8f6b9542d822e6bd55f0c985b40 100644 (file)
@@ -1,3 +1,8 @@
+2018-12-28  Tom de Vries  <tdevries@suse.de>
+
+       * dwarf.c (build_address_map): Simplify by removing local variable
+       abbrevs.
+
 2018-12-28  Ian Lance Taylor  <iant@golang.org>
            Tom de Vries  <tdevries@suse.de>
 
index f3499a9f45a6021c39cfce9696aa6846a1aa0b08..7ef99bdd7f2a6ef5007ad61f351289445e47abf0 100644 (file)
@@ -1432,7 +1432,6 @@ build_address_map (struct backtrace_state *state, uintptr_t base_address,
                   void *data, struct unit_addrs_vector *addrs)
 {
   struct dwarf_buf info;
-  struct abbrevs abbrevs;
   struct backtrace_vector units;
   size_t units_count;
   size_t i;
@@ -1457,7 +1456,6 @@ build_address_map (struct backtrace_state *state, uintptr_t base_address,
   memset (&units, 0, sizeof units);
   units_count = 0;
 
-  memset (&abbrevs, 0, sizeof abbrevs);
   while (info.left > 0)
     {
       const unsigned char *unit_data_start;
@@ -1488,13 +1486,6 @@ build_address_map (struct backtrace_state *state, uintptr_t base_address,
          goto fail;
        }
 
-      abbrev_offset = read_offset (&unit_buf, is_dwarf64);
-      if (!read_abbrevs (state, abbrev_offset, dwarf_abbrev, dwarf_abbrev_size,
-                        is_bigendian, error_callback, data, &abbrevs))
-       goto fail;
-
-      addrsize = read_byte (&unit_buf);
-
       pu = ((struct unit **)
            backtrace_vector_grow (state, sizeof (struct unit *),
                                   error_callback, data, &units));
@@ -1509,6 +1500,14 @@ build_address_map (struct backtrace_state *state, uintptr_t base_address,
       *pu = u;
       ++units_count;
 
+      memset (&u->abbrevs, 0, sizeof u->abbrevs);
+      abbrev_offset = read_offset (&unit_buf, is_dwarf64);
+      if (!read_abbrevs (state, abbrev_offset, dwarf_abbrev, dwarf_abbrev_size,
+                        is_bigendian, error_callback, data, &u->abbrevs))
+       goto fail;
+
+      addrsize = read_byte (&unit_buf);
+
       u->unit_data = unit_buf.buf;
       u->unit_data_len = unit_buf.left;
       u->unit_data_offset = unit_buf.buf - unit_data_start;
@@ -1519,8 +1518,6 @@ build_address_map (struct backtrace_state *state, uintptr_t base_address,
       u->comp_dir = NULL;
       u->abs_filename = NULL;
       u->lineoff = 0;
-      u->abbrevs = abbrevs;
-      memset (&abbrevs, 0, sizeof abbrevs);
 
       /* The actual line number mappings will be read as needed.  */
       u->lines = NULL;
@@ -1559,7 +1556,6 @@ build_address_map (struct backtrace_state *state, uintptr_t base_address,
        }
       backtrace_vector_free (state, &units, error_callback, data);
     }
-  free_abbrevs (state, &abbrevs, error_callback, data);
   if (addrs->count > 0)
     {
       backtrace_vector_free (state, &addrs->vec, error_callback, data);