gas: Don't use frag_align but use plain padding to align .debug_aranges.
authorMark Wielaard <mjw@redhat.com>
Sat, 13 Jun 2015 21:47:41 +0000 (17:47 -0400)
committerMark Wielaard <mjw@redhat.com>
Mon, 15 Jun 2015 07:25:21 +0000 (09:25 +0200)
out_debug_aranges uses frag_align to make sure the addresses start
out aligned. Using frag_align will call frag_var[_init], which will
end up calling TC_FRAG_INIT. On arm and aarch64 TC_FRAG_INIT will
generate a $d mapping symbol for the .debug_aranges to show that at
that point a sequence of data items starts.

Such a symbol pointing into a non-allocated debug section will confuse
eu-strip -g. And it seems inefficient and wrong in general to have
additional mapping symbols for debug sections, which won't contain
actual code in the first place.

Just keep track of the aranges header size and use plain padding to
align the addresses which avoids generating any mapping symbols on
aarch64 and arm.

Includes a testcase for aarch64 that PASS with this patch and shows
the extra $d mapping symbol in .debug_aranges before.

gas/ChangeLog

       * dwarf2dbg.c (out_header): Document EXPR->X_add_number value,
       out_debug_aranges depends on it.
       (out_debug_aranges): Track size of header to properly pad header
       for address alignment.

gas/testsuite/ChangeLog

       * gas/aarch64/dwarf.d: New.
       * gas/aarch64/dwarf.s: New.

gas/ChangeLog
gas/dwarf2dbg.c
gas/testsuite/ChangeLog
gas/testsuite/gas/aarch64/dwarf.d [new file with mode: 0644]
gas/testsuite/gas/aarch64/dwarf.s [new file with mode: 0644]

index d9c525d097c49043c874cbfc7b0c49a48f3394ad..d81d8a154fbdc09ea61cbe8b139b09c9542bc7ca 100644 (file)
@@ -1,3 +1,10 @@
+2015-06-13  Mark Wielaard  <mjw@redhat.com>
+
+       * dwarf2dbg.c (out_header): Document EXPR->X_add_number value,
+       out_debug_aranges depends on it.
+       (out_debug_aranges): Track size of header to properly pad header
+       for address alignment.
+
 2015-06-11  John David Anglin  <danglin@gcc.gnu.org>
 
        PR gas/18427
index e67c99216686c47a6e3256c807dad56bb4383996..ecaccc9cc2fc5e9b1e274647d2204ec1fd684a39 100644 (file)
@@ -1458,7 +1458,8 @@ out_file_list (void)
 
 /* Switch to SEC and output a header length field.  Return the size of
    offsets used in SEC.  The caller must set EXPR->X_add_symbol value
-   to the end of the section.  */
+   to the end of the section.  EXPR->X_add_number will be set to the
+   negative size of the header.  */
 
 static int
 out_header (asection *sec, expressionS *exp)
@@ -1638,6 +1639,7 @@ static void
 out_debug_aranges (segT aranges_seg, segT info_seg)
 {
   unsigned int addr_size = sizeof_address;
+  offsetT size;
   struct line_seg *s;
   expressionS exp;
   symbolS *aranges_end;
@@ -1646,21 +1648,27 @@ out_debug_aranges (segT aranges_seg, segT info_seg)
 
   sizeof_offset = out_header (aranges_seg, &exp);
   aranges_end = exp.X_add_symbol;
+  size = -exp.X_add_number;
 
   /* Version.  */
   out_two (DWARF2_ARANGES_VERSION);
+  size += 2;
 
   /* Offset to .debug_info.  */
   TC_DWARF2_EMIT_OFFSET (section_symbol (info_seg), sizeof_offset);
+  size += sizeof_offset;
 
   /* Size of an address (offset portion).  */
   out_byte (addr_size);
+  size++;
 
   /* Size of a segment descriptor.  */
   out_byte (0);
+  size++;
 
   /* Align the header.  */
-  frag_align (ffs (2 * addr_size) - 1, 0, 0);
+  while ((size++ % (2 * addr_size)) > 0)
+    out_byte (0);
 
   for (s = all_segs; s; s = s->next)
     {
index 81e38362096135af749b4afc28040e8b3d64aca1..6d6a90c2ed358c73db06711c392605580059c315 100644 (file)
@@ -1,3 +1,8 @@
+2015-06-13  Mark Wielaard  <mjw@redhat.com>
+
+       * gas/aarch64/dwarf.d: New.
+       * gas/aarch64/dwarf.s: New.
+
 2015-06-03  Matthew Wahab  <matthew.wahab@arm.com>
 
        * gas/arm/armv8-a+rdma.d: New.
diff --git a/gas/testsuite/gas/aarch64/dwarf.d b/gas/testsuite/gas/aarch64/dwarf.d
new file mode 100644 (file)
index 0000000..46aa6d0
--- /dev/null
@@ -0,0 +1,27 @@
+#readelf: -s --debug-dump=aranges
+#as: -g
+
+Symbol table '.symtab' contains 10 entries:
+   Num:    Value          Size Type    Bind   Vis      Ndx Name
+     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
+     1: 0000000000000000     0 SECTION LOCAL  DEFAULT    1 
+     2: 0000000000000000     0 SECTION LOCAL  DEFAULT    2 
+     3: 0000000000000000     0 SECTION LOCAL  DEFAULT    3 
+     4: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT    1 \$x
+     5: 0000000000000000     0 SECTION LOCAL  DEFAULT    6 
+     6: 0000000000000000     0 SECTION LOCAL  DEFAULT    8 
+     7: 0000000000000000     0 SECTION LOCAL  DEFAULT    4 
+     8: 0000000000000000     0 SECTION LOCAL  DEFAULT    9 
+     9: 0000000000000000     8 FUNC    GLOBAL DEFAULT    1 testfunc
+Contents of the .debug_aranges section:
+
+  Length:                   44
+  Version:                  2
+  Offset into .debug_info:  0x0
+  Pointer Size:             8
+  Segment Size:             0
+
+    Address            Length
+    0000000000000000 0000000000000008 
+    0000000000000000 0000000000000000 
+
diff --git a/gas/testsuite/gas/aarch64/dwarf.s b/gas/testsuite/gas/aarch64/dwarf.s
new file mode 100644 (file)
index 0000000..6660205
--- /dev/null
@@ -0,0 +1,6 @@
+.globl testfunc
+testfunc:
+       nop
+       ret
+.type testfunc, @function
+.size testfunc, .-testfunc