# Copyright (C) 2019-2021 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 breakpoints work correctly when stack protector is used. # Note on Debian/Ubuntu, stack protector is on by default, and is # currently force disabled in gdb_compile due to the XFAIL below. # Ensure the compiler is gcc/clang and is new enough to support stack # protection. if { !([test_compiler_info "gcc-*"] || [test_compiler_info "clang-*"]) || [test_compiler_info {gcc-[0-3]-*}] || [test_compiler_info {gcc-4-0-*}] || [test_compiler_info {clang-[0-4]=*}] } { return 0 } standard_testfile set protector_options { "-fno-stack-protector" "-fstack-protector" \ "-fstack-protector-all" "-fstack-protector-strong" } proc simple_func_break_test { protection } { global testfile global srcfile global binfile set options debug lappend options additional_flags=$protection if {[prepare_for_testing "failed to prepare" $testfile $srcfile $options]} { return -1 } clean_restart ${binfile} if { ![runto_main] } then { fail "can't run to main" return -1 } # Break on function foo and ensure it stops on the first line of code. gdb_breakpoint "foo" if { $protection == "-fstack-protector-all" && [test_compiler_info "gcc-*"] } { setup_xfail "gcc/88432" "*-*-linux*" } gdb_continue_to_breakpoint "foo" ".*break here.*" return 1 } foreach_with_prefix protection $protector_options { simple_func_break_test $protection }