[gdb/testsuite] Fix gdb.dlang/watch-loc.exp on ppc64
authorTom de Vries <tdevries@suse.de>
Wed, 16 Sep 2020 16:04:37 +0000 (18:04 +0200)
committerTom de Vries <tdevries@suse.de>
Wed, 16 Sep 2020 16:04:37 +0000 (18:04 +0200)
On ppc64, we run into:
...
/tmp/ccKXURmw.s: Assembler messages:^M
/tmp/ccKXURmw.s:99: Error: can't resolve \
  `_Dmain_end' {.text section} - `_Dmain' {.opd section}^M
compiler exited with status 1
...

The unresolvable entity comes from the .debug_aranges section hardcoded in
watch-loc.c:
...
"      .4byte  _Dmain \n"      // Address
"      .4byte  _Dmain_end - _Dmain \n" // Length
...
where _Dmain is the function label for function _Dmain, and _Dmain_end is a
label after function _Dmain:
...
int _Dmain (void)
{
  asm ("_Dmain_label: .globl _Dmain_label");
  return 0;
}

asm ("_Dmain_end: .globl _Dmain_end");
...

The problem is that the two labels are not in the same section, because _Dmain
ends up in the .opd section, which "contains the official procedure
descriptors.  A pointer to a function shall reference a procedure descriptor in
this section."

Fix this by using function_range instead to get the length.

Also, fix the address part to not use _Dmain, but instead use the function
start as returned by function_range.

Tested on x86_64-linux.

gdb/testsuite/ChangeLog:

2020-09-16  Tom de Vries  <tdevries@suse.de>

PR testsuite/26617
* gdb.dlang/watch-loc.c: Only add .debug_aranges if
        WITH_DEBUG_SECTIONS is defined.
(xstr, str): New macro.
(.debug_aranges): Use DMAIN_START_0/1/2 and DMAIN_LENGTH
to get start and size of _Dmain.
* gdb.dlang/watch-loc.exp: Pass DMAIN_START_0/1/2 and DMAIN_LENGTH
using additional_flags.

gdb/testsuite/ChangeLog
gdb/testsuite/gdb.dlang/watch-loc.c
gdb/testsuite/gdb.dlang/watch-loc.exp

index 848f35ff7ec4e2e2e3255fb80a28c5b04e23f188..0a29d7f6791808467591158dd965498da67d6330 100644 (file)
@@ -1,3 +1,14 @@
+2020-09-16  Tom de Vries  <tdevries@suse.de>
+
+       PR testsuite/26617
+       * gdb.dlang/watch-loc.c: Only add .debug_aranges if
+        WITH_DEBUG_SECTIONS is defined.
+       (xstr, str): New macro.
+       (.debug_aranges): Use DMAIN_START_0/1/2 and DMAIN_LENGTH
+       to get start and size of _Dmain.
+       * gdb.dlang/watch-loc.exp: Pass DMAIN_START_0/1/2 and DMAIN_LENGTH
+       using additional_flags.
+
 2020-09-16  Tankut Baris Aktemur  <tankut.baris.aktemur@intel.com>
 
        * gdb.base/bp-cmds-sourced-script.c: New file.
index de594f35ae6378c788365f1701ab02c6705afa0c..0a58f27d9fab3c13a740bd3ef45a4edbd2ec78c9 100644 (file)
@@ -36,6 +36,9 @@ main (void)
   return _Dmain ();
 }
 
+#ifdef WITH_DEBUG_SECTIONS
+#define xstr(s) str(s)
+#define str(s) #s
 /* The .debug_names-based index support depends on .debug_aranges
    generated by GCC.  (.gdb_index includes a gdb-generated map
    instead.)  */
@@ -52,10 +55,11 @@ asm (
 "      .byte   0 \n"   // Size of Segment Descriptor
 "      .2byte  0 \n"   // Pad to 16 byte boundary
 "      .2byte  0 \n"
-"      .4byte  _Dmain \n"      // Address
-"      .4byte  _Dmain_end - _Dmain \n" // Length
+"      .4byte  " xstr(DMAIN_START_0) xstr(DMAIN_START_1) xstr(DMAIN_START_2) "\n"              // Address
+"      .4byte  " xstr(DMAIN_LENGTH) "\n"       // Length
 "      .4byte  0 \n"
 "      .4byte  0 \n"
 ".Laranges_end: \n"
 "      .popsection \n"
 );
+#endif
index d65f3c674fdac1f9a919b2d03dbc772ef49da126..dcd93789ce49f00edf13efd9e1c5bbd93085e4f5 100644 (file)
@@ -27,6 +27,10 @@ if {![dwarf2_support]} {
 
 standard_testfile watch-loc.c watch-loc-dw.S
 
+lassign [function_range _Dmain ${srcdir}/${subdir}/${srcfile}] \
+    dmain_start dmain_length
+
+
 # Make some DWARF for the test.
 set asm_file [standard_output_file $srcfile2]
 Dwarf::assemble $asm_file {
@@ -62,8 +66,19 @@ Dwarf::assemble $asm_file {
     }
 }
 
+set dmain_start_list [split $dmain_start]
+set dmain_start_0 [lindex $dmain_start_list 0]
+set dmain_start_1 [lindex $dmain_start_list 1]
+set dmain_start_2 [lindex $dmain_start_list 2]
+
 if { [prepare_for_testing "failed to prepare" ${testfile} \
-          [list $srcfile $asm_file] {nodebug}] } {
+          [list $srcfile $asm_file] \
+         "nodebug \
+              additional_flags=-DWITH_DEBUG_SECTIONS \
+              additional_flags=-DDMAIN_START_0=$dmain_start_0 \
+              additional_flags=-DDMAIN_START_1=$dmain_start_1 \
+              additional_flags=-DDMAIN_START_2=$dmain_start_2 \
+              additional_flags=-DDMAIN_LENGTH=$dmain_length"] } {
     return -1
 }