# Copyright 2008-2020 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # Test support for stepping over longjmp. # standard_testfile .c if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug nowarnings}] != "" } { untested "failed to compile" return -1 } if [get_compiler_info] { return -1 } clean_restart ${binfile} if ![runto_main] then { fail "can't run to main" return 0 } set bp_miss_step_1 [gdb_get_line_number "miss_step_1"] set bp_miss_step_2 [gdb_get_line_number "miss_step_2"] set bp_start_test_1 [gdb_get_line_number "patt1"] set bp_start_test_2 [gdb_get_line_number "patt2"] set bp_start_test_3 [gdb_get_line_number "patt3"] # # Pattern 1 - simple longjmp. # delete_breakpoints gdb_test "break $bp_start_test_1" \ "Breakpoint.*at.* file .*$srcfile, line.*$bp_start_test_1.*" \ "breakpoint at pattern 1 start" gdb_test "continue" "patt1.*" "continue to breakpoint at pattern 1 start" # set safe-net break gdb_test "break $bp_miss_step_1" \ "Breakpoint.*at.* file .*$srcfile, line.*$bp_miss_step_1.*" \ "breakpoint at miss_step_1" gdb_test "next" "longjmps\\+\\+;.*" "next over setjmp (1)" gdb_test "next" "longjmp \\(env, 1\\);.*" "next to longjmp (1)" set msg "next over longjmp(1)" gdb_test_multiple "next" $msg { -re ".*patt1.*$gdb_prompt $" { pass $msg gdb_test "next" "resumes\\+\\+.*" "next into else block (1)" gdb_test "next" "miss_step_1.*" "next into safety net (1)" } -re "miss_step_1.*$gdb_prompt $" { fail $msg } } # # Pattern 2 - longjmp from an inner function. # delete_breakpoints gdb_test "break $bp_start_test_2" \ "Breakpoint.*at.* file .*$srcfile, line.*$bp_start_test_2.*" \ "breakpoint at pattern 2 start" gdb_test "continue" "patt2.*" "continue to breakpoint at pattern 2 start" # set safe-net break gdb_test "break $bp_miss_step_2" \ "Breakpoint.*at.* file .*$srcfile, line.*$bp_miss_step_2.*" \ "breakpoint at miss_step_2" gdb_test "next" "call_longjmp.*" "next over setjmp (2)" set msg "next over call_longjmp (2)" gdb_test_multiple "next" $msg { -re ".*patt2.*$gdb_prompt $" { pass $msg gdb_test "next" "resumes\\+\\+.*" "next into else block (2)" gdb_test "next" "miss_step_2.*" "next into safety net (2)" } -re "miss_step_2.*$gdb_prompt $" { fail $msg } } # # Pattern 3 - setjmp/longjmp inside stepped-over function. # delete_breakpoints gdb_test "break $bp_start_test_3" \ "Breakpoint.*at.* file .*$srcfile, line.*$bp_start_test_3.*" \ "breakpoint at pattern 3 start" gdb_test "continue" "patt3.*" "continue to breakpoint at pattern 3 start" gdb_test "next" "longjmp caught.*" "next over patt3"