# 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/>.


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 u_fault [multi_line "Program received signal SIGSEGV, Segmentation fault" \
                        "Upper bound violation while accessing address $hex" \
                        "Bounds: \\\[lower = $hex, upper = $hex\\\]"]

set l_fault [multi_line "Program received signal SIGSEGV, Segmentation fault" \
                        "Lower bound violation while accessing address $hex" \
                        "Bounds: \\\[lower = $hex, upper = $hex\\\]"]

for {set i 0} {$i < 15} {incr i} {
    set message "MPX signal segv Upper: ${i}"

    if {[gdb_test "continue" "$u_fault.*" $message] != 0} {
       break
    }

    gdb_test "where" ".*#0  $hex in upper.*"\
             "$message: should be in upper"
}

for {set i 0} {$i < 15} {incr i} {
    set message "MPX signal segv Lower: ${i}"

    if {[gdb_test "continue" "$l_fault.*" $message] != 0} {
       break
    }

    gdb_test "where" ".*#0  $hex in lower.*"\
             "$message: should be in lower"
}
