# Copyright (C) 2015-2020 Free Software Foundation, Inc. # # Contributed by Intel Corp. # # 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 . # Testing handle setup together with boundary violation signals. # # Some states are not allowed as reported on the manual, as noprint # implies nostop, but nostop might print. # # Caveat: Setting the handle to nopass, ends up in a endless loop. if { ![istarget i?86-*-*] && ![istarget x86_64-*-* ] } { verbose "Skipping x86 MPX tests." return } standard_testfile if { ![supports_mpx_check_pointer_bounds] } { return -1 } set comp_flags "-mmpx -fcheck-pointer-bounds -I${srcdir}/../nat/" if { [prepare_for_testing "failed to prepare" ${testfile} ${srcfile} \ [list debug nowarnings additional_flags=${comp_flags}]] } { return -1 } if ![runto_main] { untested "could not run to main" return -1 } gdb_test_multiple "print have_mpx ()" "have mpx" { -re ".. = 1\r\n$gdb_prompt " { pass "check whether processor supports MPX" } -re ".. = 0\r\n$gdb_prompt " { verbose "processor does not support MPX; skipping MPX tests" return } } set violation [multi_line "Program received signal SIGSEGV, Segmentation fault" \ "Upper bound violation while accessing address $hex" \ "Bounds: \\\[lower = $hex, upper = $hex\\\]"] set segv_with_exit "Program received signal SIGSEGV,\ Segmentation fault.*$inferior_exited_re.*" # Test handler for segmentation fault for: # print pass stop # set parameters "print pass stop" with_test_prefix "$parameters" { if ![runto_main] { fail "could not run to main" return -1 } gdb_test "handle SIGSEGV $parameters"\ ".*SIGSEGV.*Yes.*Yes.*Yes.*Segmentation fault.*"\ "set parameters" gdb_test "continue" ".*$violation.*" "display" gdb_test "where" ".*#0 $hex in upper.*"\ "should be in upper" } # Test handler for segmentation fault for: # print pass nostop # set parameters "print pass nostop" with_test_prefix "$parameters" { if ![runto_main] { fail "could not run to main" return -1 } gdb_test "handle SIGSEGV $parameters"\ ".*SIGSEGV.*No.*Yes.*Yes.*Segmentation fault.*"\ "set parameters" gdb_test "continue" ".*$segv_with_exit.*" "display" gdb_test "where" "No stack." "no inferior" } # Test handler for segmentation fault for: # print nopass stop # set parameters "print nopass stop" with_test_prefix "$parameters" { if ![runto_main] { fail "could not run to main" return -1 } gdb_test "handle SIGSEGV $parameters"\ ".*SIGSEGV.*Yes.*Yes.*No.*Segmentation fault.*"\ "set parameters" gdb_test "continue" ".*$violation.*" "display" gdb_test "where" ".*#0 $hex in upper.*"\ "should be in upper" } # Test handler for segmentation fault for: # print nopass stop # set parameters "noprint pass nostop" with_test_prefix "$parameters" { if ![runto_main] { fail "could not run to main" return -1 } gdb_test "handle SIGSEGV $parameters"\ ".*SIGSEGV.*No.*No.*Yes.*Segmentation fault.*"\ "set parameters" gdb_test "continue" "Continuing\..*$inferior_exited_re.*"\ "Display" gdb_test "where" "No stack." "no inferior" }