From 1a86b364a30f60abaa4762dd1b9af3818840416c Mon Sep 17 00:00:00 2001 From: Tom de Vries Date: Sat, 31 Aug 2024 07:56:48 +0200 Subject: [PATCH] [gdb/testsuite] Handle unsupported catch syscall On riscv64-linux, I run into: ... Expecting: ^(catch syscall[^M ]+)?((&.*)*.*~"Catchpoint 5 .*\\n".*=breakpoint-created,bkpt=\{number="5",type="catchpoint".*\}.*\n\^done[^M ]+[(]gdb[)] ^M [ ]*) catch syscall^M &"catch syscall\n"^M &"The feature 'catch syscall' is not supported on this architecture yet.\n"^M ^error,msg="The feature 'catch syscall' is not supported on this architecture yet."^M (gdb) ^M FAIL: gdb.mi/mi-breakpoint-changed.exp: test_insert_delete_modify: catch syscall (unexpected output) ... Fix this by: - factoring out proc supports_catch_syscall out of gdb.base/catch-syscall.exp, and - using it in gdb.mi/mi-breakpoint-changed.exp. Tested on x86_64-linux and riscv64-linux. Approved-By: Andrew Burgess --- gdb/testsuite/gdb.base/catch-syscall.exp | 25 +--------- .../gdb.mi/mi-breakpoint-changed.exp | 29 +++++++++-- gdb/testsuite/lib/gdb.exp | 49 +++++++++++++++++++ 3 files changed, 75 insertions(+), 28 deletions(-) diff --git a/gdb/testsuite/gdb.base/catch-syscall.exp b/gdb/testsuite/gdb.base/catch-syscall.exp index 431bfd5bb14..2e20b8f8183 100644 --- a/gdb/testsuite/gdb.base/catch-syscall.exp +++ b/gdb/testsuite/gdb.base/catch-syscall.exp @@ -19,39 +19,18 @@ # It was written by Sergio Durigan Junior # on September/2008. +require supports_catch_syscall + standard_testfile if { [prepare_for_testing "failed to prepare" $testfile ${testfile}.c] } { return -1 } -# Check target supports catch syscall or not. if {![runto_main]} { return } -set test "catch syscall" -gdb_test_multiple $test $test { - -re "The feature \'catch syscall\' is not supported.*\r\n$gdb_prompt $" { - unsupported "catch syscall isn't supported" - return -1 - } - -re ".*$gdb_prompt $" { - pass $test - } -} - -set test "check catch syscall" -gdb_test_multiple "continue" $test { - -re ".*Your system does not support this type\r\nof catchpoint.*$gdb_prompt $" { - unsupported "catch syscall isn't supported" - return -1 - } - -re ".*Catchpoint.*$gdb_prompt $" { - pass $test - } -} - # Test-case for PR27313. Verify that negative syscall numbers are refused. gdb_test "catch syscall -1" "Unknown syscall number '-1'\\." diff --git a/gdb/testsuite/gdb.mi/mi-breakpoint-changed.exp b/gdb/testsuite/gdb.mi/mi-breakpoint-changed.exp index d7f81322d8d..18e19a27be3 100644 --- a/gdb/testsuite/gdb.mi/mi-breakpoint-changed.exp +++ b/gdb/testsuite/gdb.mi/mi-breakpoint-changed.exp @@ -15,6 +15,8 @@ require allow_shlib_tests +set supports_catch_syscall [supports_catch_syscall] + load_lib mi-support.exp standard_testfile pending.c @@ -85,17 +87,34 @@ proc test_insert_delete_modify { } { mi_gdb_test ${test} \ {(&.*)*.*~".*atchpoint 3: .*\\n".*=breakpoint-created,bkpt=\{number="3",type="(hw |)watchpoint".*\}.*\n\^done} \ $test + set test "trace marker" mi_gdb_test $test \ {(&.*)*.*~"Tracepoint 4 at .*\\n".*=breakpoint-created,bkpt=\{number="4",type="tracepoint".*\}.*\n\^done} \ $test + set test "catch syscall" - mi_gdb_test $test \ - {(&.*)*.*~"Catchpoint 5 .*\\n".*=breakpoint-created,bkpt=\{number="5",type="catchpoint".*\}.*\n\^done} \ - $test + if { $::supports_catch_syscall } { + mi_gdb_test $test \ + {(&.*)*.*~"Catchpoint 5 .*\\n".*=breakpoint-created,bkpt=\{number="5",type="catchpoint".*\}.*\n\^done} \ + $test + set bp_nr 6 + } else { + unsupported $test + set bp_nr 5 + } + set test "dprintf marker, \"arg\" \"" + set bp_re [mi_make_breakpoint \ + -number $bp_nr \ + -type dprintf \ + -func marker \ + -script [string_to_regexp {["printf \"arg\" \""]}]] mi_gdb_test $test \ - {.*=breakpoint-created,bkpt=\{number="6",type="dprintf".*,script=\[\"printf \\\"arg\\\" \\\"\"\].*\}\r\n\^done} \ + [multi_line \ + ".*" \ + "=breakpoint-created,${bp_re}" \ + "\\^done"] \ $test # 2. when modifying condition @@ -143,7 +162,7 @@ proc test_insert_delete_modify { } { # Delete some breakpoints and verify that '=breakpoint-deleted # notification is correctly emitted. - for {set i 3} {$i < 7} {incr i} { + for {set i 3} {$i <= $bp_nr} {incr i} { mi_gdb_test "delete ${i}" ".*=breakpoint-deleted,id=\"${i}\".*\\^done" \ "delete ${i}" } diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp index 2d33470b0ea..d4d4acb2313 100644 --- a/gdb/testsuite/lib/gdb.exp +++ b/gdb/testsuite/lib/gdb.exp @@ -3568,6 +3568,55 @@ gdb_caching_proc supports_memtag {} { return 0 } +# Return 1 if catch syscall is supported, otherwise return 0. + +gdb_caching_proc supports_catch_syscall {} { + set me "supports_catch_syscall" + + # Compile a test program. + set src { + int main() { + return 0; + } + } + if {![gdb_simple_compile $me $src executable]} { + verbose -log "$me: failed to compile" + return 0 + } + + # No error message, compilation succeeded so now run it via gdb. + + gdb_exit + gdb_start + gdb_reinitialize_dir $::srcdir/$::subdir + gdb_load $obj + if { ![runto_main] } { + verbose -log "$me: failed to run to main" + return 0 + } + + # To make sure we test both setting and inserting the catchpoint. + gdb_test_no_output "set breakpoint always-inserted on" + + set res 0 + set re_yes \ + [string_to_regexp \ + "Catchpoint 2 (any syscall)"] + gdb_test_multiple "catch syscall" "" { + -re -wrap ^$re_yes { + set res 1 + } + -re -wrap "" { + } + } + + gdb_exit + remote_file build delete $obj + + verbose "$me: returning $res" 2 + return $res +} + # Return 1 if the target supports hardware single stepping. proc can_hardware_single_step {} { -- 2.39.5