mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-26 05:47:26 +08:00
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.
This commit is contained in:
@ -15,6 +15,8 @@
|
|||||||
|
|
||||||
standard_testfile
|
standard_testfile
|
||||||
|
|
||||||
|
set epilogue [have_epilogue_line_info]
|
||||||
|
|
||||||
if { [prepare_for_testing "failed to prepare" "skip-inline" \
|
if { [prepare_for_testing "failed to prepare" "skip-inline" \
|
||||||
{skip-inline.c skip1.c } \
|
{skip-inline.c skip1.c } \
|
||||||
{debug nowarnings}] } {
|
{debug nowarnings}] } {
|
||||||
@ -24,28 +26,23 @@ if { [prepare_for_testing "failed to prepare" "skip-inline" \
|
|||||||
set srcfile skip-inline.c
|
set srcfile skip-inline.c
|
||||||
set srcfile1 skip1.c
|
set srcfile1 skip1.c
|
||||||
|
|
||||||
|
proc_with_prefix single_step { } {
|
||||||
if ![runto_main] {
|
if ![runto_main] {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
# Create a skiplist entry for a specified file and function.
|
|
||||||
|
|
||||||
gdb_test "skip function foo" "Function foo will be skipped when stepping\."
|
|
||||||
|
|
||||||
gdb_test "bt" "\\s*\\#0\\s+main.*" "in the main"
|
gdb_test "bt" "\\s*\\#0\\s+main.*" "in the main"
|
||||||
gdb_test "step" ".*" "step into baz, since foo will be skipped"
|
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 "bt" "\\s*\\#0\\s+baz.*" "in the baz, since foo was skipped"
|
||||||
gdb_test "step" ".*" "step in the baz"
|
gdb_step_until ".*x = 0; x = baz \\(foo \\(\\)\\).*"
|
||||||
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 "bt" "\\s*\\#0\\s+main.*" "again in the main"
|
||||||
gdb_test "step" ".*" "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 "bt" "\\s*\\#0\\s+baz.*" "again in the baz"
|
||||||
gdb_test "step" ".*" "step in the baz, again"
|
gdb_step_until "main \\(\\) at .*" "step back to main, again"
|
||||||
gdb_test "bt" "\\s*\\#0\\s+baz.*" "still in the baz, again"
|
gdb_test "bt" "\\s*\\#0.*main.*" "again back to main"
|
||||||
gdb_test "step" ".*" "step back to main, again"
|
}
|
||||||
gdb_test "bt" "\\s*\\#0\\s+main.*" "again back to main"
|
|
||||||
|
|
||||||
|
proc_with_prefix double_step { } {
|
||||||
if ![runto_main] {
|
if ![runto_main] {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -61,7 +58,9 @@ with_test_prefix "double step" {
|
|||||||
gdb_test "step" ".*" "step back to main, again"
|
gdb_test "step" ".*" "step back to main, again"
|
||||||
gdb_test "bt" "\\s*\\#0\\s+main.*" "again back to main"
|
gdb_test "bt" "\\s*\\#0\\s+main.*" "again back to main"
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
proc_with_prefix triple_step { } {
|
||||||
if ![runto_main] {
|
if ![runto_main] {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -73,16 +72,34 @@ with_test_prefix "triple step" {
|
|||||||
gdb_test "step 3" ".*" "step over baz, again"
|
gdb_test "step 3" ".*" "step over baz, again"
|
||||||
gdb_test "bt" "\\s*\\#0\\s+main.*" "again back to main"
|
gdb_test "bt" "\\s*\\#0\\s+main.*" "again back to main"
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
proc_with_prefix skip_current_frame { } {
|
||||||
if ![runto_main] {
|
if ![runto_main] {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
gdb_test "skip delete" ".*" "skip delete"
|
gdb_test "skip delete" ".*" "skip delete"
|
||||||
|
|
||||||
with_test_prefix "skip current frame" {
|
|
||||||
gdb_test "bt" "\\s*\\#0\\s+main.*" "in the main"
|
gdb_test "bt" "\\s*\\#0\\s+main.*" "in the main"
|
||||||
gdb_test "step" ".*" "step into foo"
|
gdb_test "step" ".*" "step into foo"
|
||||||
gdb_test "bt" "\\s*\\#0\\s+foo.*" "in the foo"
|
gdb_test "bt" "\\s*\\#0\\s+foo.*" "in the foo"
|
||||||
gdb_test "skip" "Function foo will be skipped when stepping\." "skip"
|
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
|
||||||
|
Reference in New Issue
Block a user