[gdb/testsuite] Fix .debug_ranges in gdb.mi/dw2-ref-missing-frame-func.c
authorTom de Vries <tdevries@suse.de>
Wed, 22 Apr 2020 12:38:35 +0000 (14:38 +0200)
committerTom de Vries <tdevries@suse.de>
Wed, 22 Apr 2020 12:38:35 +0000 (14:38 +0200)
While investigating PR25862 (an assertion failure with target board
cc-with-debug-names), I noticed that the .debug_aranges section in
gdb.mi/dw2-ref-missing-frame-func.c contains a hardcoded 0:
...
"      .4byte  0 \n" // .Ldebug_info0 - Offset of Compilation Unit Info
...

So when looking for an address in the range 0x4004a7-0x4004bf, we should find
the CU at 0xc7:
...
  Compilation Unit @ offset 0xc7:
   Length:        0xba (32-bit)
   Version:       2
   Abbrev Offset: 0x64
   Pointer Size:  4
 <0><d2>: Abbrev Number: 1 (DW_TAG_compile_unit)
    <d3>   DW_AT_high_pc     : 0x4004bf
    <d7>   DW_AT_low_pc      : 0x4004a7
    <db>   DW_AT_name        : file1.txt
    <e5>   DW_AT_producer    : GNU C 3.3.3
    <f1>   DW_AT_language    : 1        (ANSI C)
...
but instead the .debug_aranges entry points us to the CU at 0x0:
...
  Length:                   28
  Version:                  2
  Offset into .debug_info:  0x0
  Pointer Size:             4
  Segment Size:             0

    Address    Length
    004004a7 00000018
    00000000 00000000
...

Fix this by using a label to refer to the start of the CU, similar to how
that's done for gdb.dlang/watch-loc.c in the fix for PR24522:
...
"      .4byte  .Lcu1_begin\n" // .Ldebug_info0 - Offset of Compilation Unit Info
...

The label marks the start of the empty .debug_info section for
dw2-ref-missing-frame-func.c, which is supposed to merge with the .debug_info
section in dw2-ref-missing-frame.S, so in order for that to work, we need to
make sure dw2-ref-missing-frame-func.o comes before dw2-ref-missing-frame.o in
the link line.

Tested on x86_64-linux.

gdb/testsuite/ChangeLog:

2020-04-22  Tom de Vries  <tdevries@suse.de>

* gdb.mi/dw2-ref-missing-frame-func.c (.debug_aranges): Fix
debug_info_offset.
* gdb.mi/dw2-ref-missing-frame.exp: Make sure $objfuncfile comes
before $objsfile in the line line.

gdb/testsuite/ChangeLog
gdb/testsuite/gdb.mi/dw2-ref-missing-frame-func.c
gdb/testsuite/gdb.mi/dw2-ref-missing-frame.exp

index 33ba594e19a6c484112725c29319dda264731061..5700fa81e28e3c17e58fe8358f2c54cff1fc5f89 100644 (file)
@@ -1,3 +1,10 @@
+2020-04-22  Tom de Vries  <tdevries@suse.de>
+
+       * gdb.mi/dw2-ref-missing-frame-func.c (.debug_aranges): Fix
+       debug_info_offset.
+       * gdb.mi/dw2-ref-missing-frame.exp: Make sure $objfuncfile comes
+       before $objsfile in the line line.
+
 2020-04-22  Tom de Vries  <tdevries@suse.de>
 
        * gdb.dlang/watch-loc.c (.debug_aranges): Fix _Dmain length.
index e3aed56c920817114ebf50738026245b0398584c..6d68b5b99cf4eb9e948ab404af7ecc3102bcf632 100644 (file)
@@ -57,11 +57,14 @@ asm ("cu_text_end:");
    generated by GCC.  (.gdb_index includes a gdb-generated map
    instead.)  */
 asm (
+"       .pushsection    .debug_info,\"\",%progbits \n"
+".Lcu1_begin: \n"
+"       .popsection \n"
 "      .pushsection    .debug_aranges,\"\",%progbits \n"
 "      .4byte  .Laranges_end - .Laranges_start \n"     // Length of Address Ranges Info
 ".Laranges_start: \n"
 "      .2byte  0x2 \n" // DWARF Version
-"      .4byte  \n" // .Ldebug_info0 - Offset of Compilation Unit Info
+"      .4byte  .Lcu1_begin\n" // .Ldebug_info0 - Offset of Compilation Unit Info
 "      .byte   4 \n"   // Size of Address
 "      .byte   0 \n"   // Size of Segment Descriptor
 "      .2byte  0 \n"   // Pad to 16 byte boundary
index f099054a2d2595d947eaf38f0fef29056d1caf19..01f1960230f9b8aeb48a9897b7605a42219f06fb 100644 (file)
@@ -30,7 +30,7 @@ set objmainfile [standard_output_file ${testfile}-main.o]
 if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" $objsfile object {}] != ""
      || [gdb_compile "${srcdir}/${subdir}/${srcfile2}" $objfuncfile object {}] != ""
      || [gdb_compile "${srcdir}/${subdir}/${srcfile3}" $objmainfile object {debug}] != ""
-     || [gdb_compile "$objsfile $objfuncfile $objmainfile" $binfile executable {}] != "" } {
+     || [gdb_compile "$objfuncfile $objsfile $objmainfile" $binfile executable {}] != "" } {
     return -1
 }