[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)
commit945ff6e213d206c79386f225626e887abad0e22d
tree316629ffa470d87ca22fbb5c0c6b3e1603228ca3
parentbe7628ca507fe36b49c5a82b39db68b98c2ba1b4
[gdb/testsuite] Fix gdb.dlang/watch-loc.exp on ppc64

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