]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
[gdb/testsuite] Fix gdb.dwarf2/dwp-symlink.exp with target board fission-dwp
authorTom de Vries <tdevries@suse.de>
Sat, 26 Oct 2024 12:48:44 +0000 (14:48 +0200)
committerTom de Vries <tdevries@suse.de>
Sat, 26 Oct 2024 12:48:44 +0000 (14:48 +0200)
There are two test-cases that only run when the target board produces .dwp
files, gdb.dwarf2/dwp-sepdebug.exp and gdb.dwarf2/dwp-symlink.exp.

When running those test-cases with target board fission-dwp, I run into:
...
(gdb) ptype main^M
warning: Could not find DWO CU dwp-symlink0.dwo(0x496f1a7405c37a61) \
  referenced by CU at offset 0xa6 [in module dwp-symlink]^M
type = <unknown return type> ()^M
(gdb) FAIL: gdb.dwarf2/dwp-symlink.exp: binary default, dwp at symlink
...
coming from:
...
 # This case cannot work.
 gdb_test "ptype main" {type = int \(\)} "binary default, dwp at symlink"
...

I had a bit of difficulty understanding what the test-case does/tries to do,
so to build some understanding I reproduced the behaviour outside of the
test-case:
...
$ cat start.c
void _start (void) {}
$ gcc -gsplit-dwarf start.c -nostdlib
$ gdb -q -batch a.out -ex "print _start"
$1 = {void (void)} 0x400144 <_start>
$ dwp -e a.out
$ rm start.dwo
$ gdb -q -batch a.out -ex "print _start"
$1 = {void (void)} 0x400144 <_start>
$ ln -s a.out b.out
$ gdb -q -batch b.out -ex "print _start"
$1 = {void (void)} 0x400144 <_start>
$ mv a.out.dwp b.out.dwp
$ gdb -q -batch b.out -ex "print _start"
$1 = {void (void)} 0x400144 <_start>
$ gdb -q -batch a.out -ex "print _start"
During symbol reading: Could not find DWO CU start.dwo(0x8bdfd613387aa145) \
  referenced by CU at offset 0x0 [in module a.out]
warning: Could not find DWO CU start.dwo(0x8bdfd613387aa145) \
  referenced by CU at offset 0x0 [in module a.out]
$1 = {<text variable, no debug info>} 0x400144 <_start>
...
and agreed, that cannot work: the DWO CU required in a.out is in b.out.dwp,
and there's no way to find b.out.dwp starting from a.out.

The fact that a FAIL is produced is incorrect, gdb does nothing wrong.

Fix this by checking for the warning text instead.

While we're at it, fix this PATH as well:
...
(gdb) cd /data/vries/gdb/leap-15-5/build/gdb/testsuite/outputs/gdb.dwarf2/dwp-symlink^M
Working directory /data/vries/gdb/leap-15-5/build/gdb/testsuite/outputs/gdb.dwarf2/dwp-symlink.^M
(gdb) PASS: gdb.dwarf2/dwp-symlink.exp: cd \
  /data/vries/gdb/leap-15-5/build/gdb/testsuite/outputs/gdb.dwarf2/dwp-symlink
PATH: gdb.dwarf2/dwp-symlink.exp: cd \
  /data/vries/gdb/leap-15-5/build/gdb/testsuite/outputs/gdb.dwarf2/dwp-symlink
...

While we're at it, use string_to_regexp to simplify the test-case.

Tested on x86_64-linux, with target board fission-dwp.

gdb/testsuite/gdb.dwarf2/dwp-symlink.exp

index 46622c85086ecfebcafc735abe21a7e3c6fcea93..cdf196859f8bb649205a788d4def210ca52c6498 100644 (file)
@@ -45,11 +45,13 @@ if [remote_file host exists [standard_output_file $thelink.dwp]] {
 
 clean_restart "$testfile"
 
-gdb_test "ptype main" {type = int \(int, char \*\*\)} "binary default, dwp default"
+set main_type_re [string_to_regexp "type = int (int, char **)"]
+
+gdb_test "ptype main" $main_type_re "binary default, dwp default"
 
 clean_restart "$thelink"
 
-gdb_test "ptype main" {type = int \(int, char \*\*\)} "binary symlink, dwp default"
+gdb_test "ptype main" $main_type_re "binary symlink, dwp default"
 
 gdb_exit
 remote_exec host "mv -f [standard_output_file ${testfile}.dwp] [standard_output_file ${thelink}.dwp]"
@@ -64,12 +66,13 @@ if ![remote_file host exists [standard_output_file ${thelink}.dwp]] {
 
 clean_restart "$testfile"
 
-# This case cannot work.
-gdb_test "ptype main" {type = int \(\)} "binary default, dwp at symlink"
+gdb_test "ptype main" \
+    "Could not find DWO CU .*" \
+    "binary default, dwp at symlink"
 
 clean_restart "$thelink"
 
-gdb_test "ptype main" {type = int \(int, char \*\*\)} "binary symlink, dwp at symlink"
+gdb_test "ptype main" $main_type_re "binary symlink, dwp at symlink"
 
 # Verify we can still find the dwp if we change directories and we specified
 # a relative path for the program.
@@ -77,7 +80,9 @@ gdb_test "ptype main" {type = int \(int, char \*\*\)} "binary symlink, dwp at sy
 # This is clean_restart, but specifying a relative path to the binary.
 clean_restart
 gdb_test "cd [file dirname [standard_output_file ${thelink}]]" \
-    "Working directory .*"
+    "Working directory .*" \
+    "cd to dir containing binary"
+
 gdb_load "./${thelink}"
 
 gdb_test "cd .." "Working directory .*"