+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].
 
     }
 }
 
-# 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"