# Copyright (C) 2015-2021 Free Software Foundation, Inc.
#
# Contributed by Intel Corp.  <walfred.tedeschi@intel.com>
#
# 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/>.

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

if { ![have_mpx] } {
    unsupported "processor does not support MPX"
    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] {
    return -1
}

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] {
        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] {
        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] {
        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] {
        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"
}

