public inbox for gdb-cvs@sourceware.org
help / color / mirror / Atom feed
* [binutils-gdb] gdb/testsuite: fix testing gdb.base/skip-inline.exp with clang
@ 2022-09-22  9:05 Bruno Larsen
  0 siblings, 0 replies; only message in thread
From: Bruno Larsen @ 2022-09-22  9:05 UTC (permalink / raw)
  To: gdb-cvs

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=4037b4191a0ed4f8fc51564416519886bc88a1b7

commit 4037b4191a0ed4f8fc51564416519886bc88a1b7
Author: Bruno Larsen <blarsen@redhat.com>
Date:   Tue Sep 13 18:56:23 2022 +0200

    gdb/testsuite: fix testing gdb.base/skip-inline.exp with clang
    
    When testing gdb.base/skip-inline.exp using clang, we get failures
    when trying to step out of functions, since clang requires one fewer
    step when compared to gcc.  The inferior gets increasingly out of sync
    as the test continues because of this difference, which generates those
    failures.
    
    This commit fixes this by switching those hardcoded steps to
    gdb_step_until, to guarantee that the inferior is always synced to what
    the test expects.  This approach does not work for the parts that use
    step 2 or step 3, so when we identify that clang is being used, those
    tests are skipped.

Diff:
---
 gdb/testsuite/gdb.base/skip-inline.exp | 107 +++++++++++++++++++--------------
 1 file changed, 62 insertions(+), 45 deletions(-)

diff --git a/gdb/testsuite/gdb.base/skip-inline.exp b/gdb/testsuite/gdb.base/skip-inline.exp
index f6e9926b66c..b7d519e60c1 100644
--- a/gdb/testsuite/gdb.base/skip-inline.exp
+++ b/gdb/testsuite/gdb.base/skip-inline.exp
@@ -15,6 +15,8 @@
 
 standard_testfile
 
+set epilogue [have_epilogue_line_info]
+
 if { [prepare_for_testing "failed to prepare" "skip-inline" \
 			  {skip-inline.c skip1.c } \
 			  {debug nowarnings}] } {
@@ -24,65 +26,80 @@ if { [prepare_for_testing "failed to prepare" "skip-inline" \
 set srcfile skip-inline.c
 set srcfile1 skip1.c
 
-if ![runto_main] {
-    return
-}
-
-# Create a skiplist entry for a specified file and function.
-
-gdb_test "skip function foo" "Function foo will be skipped when stepping\."
+proc_with_prefix single_step { } {
+    if ![runto_main] {
+	return
+    }
 
-gdb_test "bt" "\\s*\\#0\\s+main.*" "in the main"
-gdb_test "step" ".*" "step into baz, since foo will be skipped"
-gdb_test "bt" "\\s*\\#0\\s+baz.*" "in the baz, since foo was skipped"
-gdb_test "step" ".*" "step in the baz"
-gdb_test "bt" "\\s*\\#0\\s+baz.*" "still in the baz"
-gdb_test "step" ".*" "step back to main"
-gdb_test "bt" "\\s*\\#0\\s+main.*" "again in the main"
-gdb_test "step" ".*" "step again into baz, since foo will be skipped"
-gdb_test "bt" "\\s*\\#0\\s+baz.*" "again in the baz"
-gdb_test "step" ".*" "step in the baz, again"
-gdb_test "bt" "\\s*\\#0\\s+baz.*" "still in the baz, again"
-gdb_test "step" ".*" "step back to main, again"
-gdb_test "bt" "\\s*\\#0\\s+main.*" "again back to main"
-
-if ![runto_main] {
-    return
-}
-
-with_test_prefix "double step" {
     gdb_test "bt" "\\s*\\#0\\s+main.*" "in the main"
-    gdb_test "step 2" ".*" "step into baz, since foo will be skipped"
-    gdb_test "bt" "\\s*\\#0\\s+baz.*" "still in the baz"
-    gdb_test "step" ".*" "step back to main"
+    gdb_test "step" ".*" "step into baz, since foo will be skipped"
+    gdb_test "bt" "\\s*\\#0\\s+baz.*" "in the baz, since foo was skipped"
+    gdb_step_until ".*x = 0; x = baz \\(foo \\(\\)\\).*"
     gdb_test "bt" "\\s*\\#0\\s+main.*" "again in the main"
-    gdb_test "step 2" ".*" "step again into baz, since foo will be skipped"
+    gdb_test "step" ".*" "step again into baz, since foo will be skipped"
     gdb_test "bt" "\\s*\\#0\\s+baz.*" "again in the baz"
-    gdb_test "step" ".*" "step back to main, again"
-    gdb_test "bt" "\\s*\\#0\\s+main.*" "again back to main"
+    gdb_step_until "main \\(\\) at .*" "step back to main, again"
+    gdb_test "bt" "\\s*\\#0.*main.*" "again back to main"
 }
 
-if ![runto_main] {
-    return
-}
+proc_with_prefix double_step { } {
+    if ![runto_main] {
+	return
+    }
 
-with_test_prefix "triple step" {
-    gdb_test "bt" "\\s*\\#0\\s+main.*" "in the main"
-    gdb_test "step 3" ".*" "step over baz"
-    gdb_test "bt" "\\s*\\#0\\s+main.*" "again in the main"
-    gdb_test "step 3" ".*" "step over baz, again"
-    gdb_test "bt" "\\s*\\#0\\s+main.*" "again back to main"
+    with_test_prefix "double step" {
+	gdb_test "bt" "\\s*\\#0\\s+main.*" "in the main"
+	gdb_test "step 2" ".*" "step into baz, since foo will be skipped"
+	gdb_test "bt" "\\s*\\#0\\s+baz.*" "still in the baz"
+	gdb_test "step" ".*" "step back to main"
+	gdb_test "bt" "\\s*\\#0\\s+main.*" "again in the main"
+	gdb_test "step 2" ".*" "step again into baz, since foo will be skipped"
+	gdb_test "bt" "\\s*\\#0\\s+baz.*" "again in the baz"
+	gdb_test "step" ".*" "step back to main, again"
+	gdb_test "bt" "\\s*\\#0\\s+main.*" "again back to main"
+    }
 }
 
-if ![runto_main] {
-    return
+proc_with_prefix triple_step { } {
+    if ![runto_main] {
+	return
+    }
+
+    with_test_prefix "triple step" {
+	gdb_test "bt" "\\s*\\#0\\s+main.*" "in the main"
+	gdb_test "step 3" ".*" "step over baz"
+	gdb_test "bt" "\\s*\\#0\\s+main.*" "again in the main"
+	gdb_test "step 3" ".*" "step over baz, again"
+	gdb_test "bt" "\\s*\\#0\\s+main.*" "again back to main"
+    }
 }
 
-gdb_test "skip delete" ".*" "skip delete"
+proc_with_prefix skip_current_frame { } {
+    if ![runto_main] {
+	return
+    }
+
+    gdb_test "skip delete" ".*" "skip delete"
 
-with_test_prefix "skip current frame" {
     gdb_test "bt" "\\s*\\#0\\s+main.*" "in the main"
     gdb_test "step" ".*" "step into foo"
     gdb_test "bt" "\\s*\\#0\\s+foo.*" "in the foo"
     gdb_test "skip" "Function foo will be skipped when stepping\." "skip"
 }
+
+# Create a skiplist entry for a specified file and function.
+
+gdb_test "skip function foo" "Function foo will be skipped when stepping\."
+
+single_step
+
+# Some compilers link the epilogue of functions to the line containing the
+# closing brace, while others dont.  The behavior ends up so out of sync
+# with multiple steps at a time, that completely different procs would need
+# to be made, and it is frankly unnecessary.
+if {$epilogue} {
+    double_step
+    triple_step
+}
+
+skip_current_frame

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-09-22  9:05 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-09-22  9:05 [binutils-gdb] gdb/testsuite: fix testing gdb.base/skip-inline.exp with clang Bruno Larsen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).