124 lines
3.8 KiB
Diff
124 lines
3.8 KiB
Diff
|
[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 | 11 +++++++++++
|
||
|
gdb/testsuite/gdb.dlang/watch-loc.c | 8 ++++++--
|
||
|
gdb/testsuite/gdb.dlang/watch-loc.exp | 17 ++++++++++++++++-
|
||
|
3 files changed, 33 insertions(+), 3 deletions(-)
|
||
|
|
||
|
diff --git a/gdb/testsuite/gdb.dlang/watch-loc.c b/gdb/testsuite/gdb.dlang/watch-loc.c
|
||
|
index de594f35ae6..0a58f27d9fa 100644
|
||
|
--- a/gdb/testsuite/gdb.dlang/watch-loc.c
|
||
|
+++ b/gdb/testsuite/gdb.dlang/watch-loc.c
|
||
|
@@ -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
|
||
|
diff --git a/gdb/testsuite/gdb.dlang/watch-loc.exp b/gdb/testsuite/gdb.dlang/watch-loc.exp
|
||
|
index d65f3c674fd..dcd93789ce4 100644
|
||
|
--- a/gdb/testsuite/gdb.dlang/watch-loc.exp
|
||
|
+++ b/gdb/testsuite/gdb.dlang/watch-loc.exp
|
||
|
@@ -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
|
||
|
}
|
||
|
|