[gdb/testsuite] Fix gdb.arch/i386-gnu-cfi.exp
authorTom de Vries <tdevries@suse.de>
Thu, 28 Jan 2021 16:39:32 +0000 (17:39 +0100)
committerTom de Vries <tdevries@suse.de>
Thu, 28 Jan 2021 16:39:32 +0000 (17:39 +0100)
When running test-case gdb.arch/i386-gnu-cfi.exp with target board unix/-m32, I get:
...
(gdb) up 3^M
79      abort.c: No such file or directory.^M
(gdb) FAIL: gdb.arch/i386-gnu-cfi.exp: shift up to the modified frame
...

The preceding backtrace looks like this:
...
(gdb) bt^M
 #0  0xf7fcf549 in __kernel_vsyscall ()^M
 #1  0xf7ce8896 in __libc_signal_restore_set (set=0xffffc3bc) at \
     ../sysdeps/unix/sysv/linux/internal-signals.h:104^M
 #2  __GI_raise (sig=6) at ../sysdeps/unix/sysv/linux/raise.c:47^M
 #3  0xf7cd0314 in __GI_abort () at abort.c:79^M
 #4  0x0804919f in gate (gate=0x8049040 <abort@plt>, data=0x0) at gate.c:3^M
 #5  0x08049176 in main () at i386-gnu-cfi.c:27^M
...
with function gate at position #4, while on another system where the test passes,
I see instead function gate at position #3.

Fix this by capturing the position of function gate in the backtrace, and
using that in the rest of the test instead of hardcoded constant 3.

Tested on x86_64-linux.

gdb/testsuite/ChangeLog:

2021-01-28  Tom de Vries  <tdevries@suse.de>

* gdb.arch/i386-gnu-cfi.exp: Capture the position of function gate
in the backtrace, and use that in the rest of the test instead of
hardcoded constant 3.  Use "frame" instead of "up" for robustness.

gdb/testsuite/ChangeLog
gdb/testsuite/gdb.arch/i386-gnu-cfi.exp

index ac45381f6c93d71309c171e0cb367cd70f55f555..73bbd00ea7cc54243df8daaeb6dd1dba7e918c7a 100644 (file)
@@ -1,3 +1,9 @@
+2021-01-28  Tom de Vries  <tdevries@suse.de>
+
+       * gdb.arch/i386-gnu-cfi.exp: Capture the position of function gate
+       in the backtrace, and use that in the rest of the test instead of
+       hardcoded constant 3.  Use "frame" instead of "up" for robustness.
+
 2021-01-28  Tom de Vries  <tdevries@suse.de>
 
        * gdb.arch/i386-sse-stack-align.S: Rename g[0-4] to test_g[0-4].
index 4228140fc350470edc297447a3dd7c40734d3f0f..657599b8ecc215fcf2e1711c578c881cf8bfdacb 100644 (file)
@@ -58,21 +58,33 @@ gdb_test_multiple {} "continue to abort()" {
     }
 }
 
-# Backtrace would crash before.
-
-gdb_test "bt" \
-         "main \\(\\) at .*${testfile}.c.*" \
-         "backtrace"
+# Verify that the backtrace works (it would crash before).  Use the backtrace
+# output to find the frame number for function "gate".
+set gate_n ""
+set backtrace_re \
+    [multi_line \
+        "" \
+        "#($decimal) *$hex in gate \[^\r\n\]*" \
+        "#$decimal *$hex in main \\(\\) at .*${testfile}.c.*"]
+gdb_test_multiple "backtrace" "" {
+    -re -wrap $backtrace_re {
+       set gate_n $expect_out(1,string)
+       pass $gdb_test_name
+    }
+}
+if { $gate_n == "" } {
+    return -1
+}
 
 # Check we see the inserted `DW_CFA_GNU_negative_offset_extended' CFI.
 # We see there the original CFI-stored filename `gate.c'.
 
-gdb_test "up 3" \
+gdb_test "frame $gate_n" \
          "gate \\(\[^()\]*\\) at .*gate.c.*" \
          "shift up to the modified frame"
 
 gdb_test_multiple "info frame" "existence of the CFI inserted register" {
-    -re "Stack level 3, frame at (0x\[0-9a-f\]+):.*Saved registers:.* ecx at (0x\[0-9a-f\]+),.*" {
+    -re "Stack level $gate_n, frame at (0x\[0-9a-f\]+):.*Saved registers:.* ecx at (0x\[0-9a-f\]+),.*" {
        pass "existence of the CFI inserted register"
        if { [string compare $expect_out(1,string) $expect_out(2,string)] } then {
            fail "value of the CFI inserted register"