# 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 <http://www.gnu.org/licenses/>.

# 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
    }

    if { ![runto_main] } then {
	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
}
