DWARF calculate the number of indexed addresses.
authorMark Wielaard <mark@klomp.org>
Tue, 15 May 2018 08:34:29 +0000 (08:34 +0000)
committerMark Wielaard <mark@gcc.gnu.org>
Tue, 15 May 2018 08:34:29 +0000 (08:34 +0000)
The length in the .debug_addr unit header was calculated using the number
of elements in the addr_index_table. This is wrong because the entries in
the table are refcounted and only those with a refcount > 0 are actually
put in the index. Add a helper function count_index_addrs to get the
correct number of addresses in the index.

gcc/ChangeLog:

* dwarf2out.c (count_index_addrs): New function.
(dwarf2out_finish): Use count_index_addrs to calculate addrs_length.

From-SVN: r260251

gcc/ChangeLog
gcc/dwarf2out.c

index 17f2cfd..7e145f4 100644 (file)
@@ -1,3 +1,8 @@
+2018-05-14  Mark Wielaard  <mark@klomp.org>
+
+       * dwarf2out.c (count_index_addrs): New function.
+       (dwarf2out_finish): Use count_index_addrs to calculate addrs_length.
+
 2018-05-15  Prathamesh Kulkarni  <prathamesh.kulkarni@linaro.org>
 
        PR tree-optimization/83648
index a92b0ce..7ced2b1 100644 (file)
@@ -28820,6 +28820,19 @@ output_addr_table_entry (addr_table_entry **slot, unsigned int *cur_index)
   return 1;
 }
 
+/* A helper function for dwarf2out_finish.  Counts the number
+   of indexed addresses.  Must match the logic of the functions
+   output_addr_table_entry above.  */
+int
+count_index_addrs (addr_table_entry **slot, unsigned int *last_idx)
+{
+  addr_table_entry *entry = *slot;
+
+  if (entry->refcount > 0)
+    *last_idx += 1;
+  return 1;
+}
+
 /* Produce the .debug_addr section.  */
 
 static void
@@ -31306,8 +31319,12 @@ dwarf2out_finish (const char *)
         DWARF5 specifies a small header when address tables are used.  */
       if (dwarf_version >= 5)
        {
-         unsigned long addrs_length
-           = addr_index_table->elements () * DWARF2_ADDR_SIZE + 4;
+         unsigned int last_idx = 0;
+         unsigned long addrs_length;
+
+         addr_index_table->traverse_noresize
+           <unsigned int *, count_index_addrs> (&last_idx);
+         addrs_length = last_idx * DWARF2_ADDR_SIZE + 4;
 
          if (DWARF_INITIAL_LENGTH_SIZE - DWARF_OFFSET_SIZE == 4)
            dw2_asm_output_data (4, 0xffffffff,