gdb/testsuite: introduce gdb_step_until
authorBruno Larsen <blarsen@redhat.com>
Wed, 20 Jul 2022 19:44:26 +0000 (16:44 -0300)
committerBruno Larsen <blarsen@redhat.com>
Tue, 13 Sep 2022 12:02:20 +0000 (14:02 +0200)
Currently, GDB's testsuite uses a set amount of step commands to exit
functions. This is a problem if a compiler emits different epilogue
information from gcc, or emits no epilogue information at all. It was
most noticeable if Clang was used to test GDB.

To fix this unreliability, this commit introduces a new proc that will
step the inferior until it is stopped at a line that matches the given
regexp, or until it steps too many times - defined as an optional
argument. If the line is found, it shows up as a single PASS in the
test, and if the line is not found, a single FAIL is emitted.

This patch only introduces this proc, but does not add it to any
existing tests, these will be introduced in the following commit.

gdb/testsuite/lib/gdb.exp

index 2f1147159adae5795d36d586d5af3573f8416881..0f6bb20b49cb0e447447194658b0b675c0a5db5e 100644 (file)
@@ -8842,5 +8842,35 @@ gdb_caching_proc arm_cc_for_target {
     return ""
 }
 
+# Step until the pattern REGEXP is found.  Step at most
+# MAX_STEPS times, but stop stepping once REGEXP is found.
+#
+# If REGEXP is found then a single pass is emitted, otherwise, after
+# MAX_STEPS steps, a single fail is emitted.
+#
+# TEST_NAME is the name used in the pass/fail calls.
+
+proc gdb_step_until { regexp {test_name ""} {max_steps 10} } {
+    if { $test_name == "" } {
+       set test_name "stepping until regexp"
+    }
+
+    set count 0
+    gdb_test_multiple "step" "$test_name" {
+       -re "$regexp\r\n$::gdb_prompt $" {
+           pass $test_name
+       }
+       -re ".*$::gdb_prompt $" {
+           if {$count < $max_steps} {
+               incr count
+               send_gdb "step\n"
+               exp_continue
+           } else {
+               fail $test_name
+           }
+       }
+    }
+}
+
 # Always load compatibility stuff.
 load_lib future.exp