# Expect script for ELF MPX tests.
#   Copyright (C) 2013-2016 Free Software Foundation, Inc.
#
# This file is part of the GNU Binutils.
#
# 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, write to the Free Software
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
# MA 02110-1301, USA.
#

# The following tests require running the executable generated by ld,
# or enough of a build environment to create a fully linked executable.
# This is not commonly available when testing a cross-built linker.
if ![isnative] {
    return
}

# Only on Linux for now.
if ![istarget "x86_64-*-linux*"] {
    return
}

# Check to see if the C compiler works
if { [which $CC] == 0 } {
    return
}

# Add $PLT_CFLAGS if PLT is expected.
global PLT_CFLAGS

run_cc_link_tests [list \
    [list \
	"Build libmpx1a.a" \
	"" \
	"-Wa,-madd-bnd-prefix -fPIC $PLT_CFLAGS" \
	{mpx1a.c} \
	{{readelf {-r --wide} mpx1a.rd}} \
	"libmpx1a.a" \
    ] \
    [list \
	"Build libmpx1b.a" \
	"" \
	"" \
	{mpx1b.c} \
	{} \
	"libmpx1b.a" \
    ] \
    [list \
	"Build libmpx1c.a" \
	"" \
	"-Wa,-madd-bnd-prefix" \
	{mpx1c.c} \
	{{readelf {-r --wide} mpx1c.rd}} \
	"libmpx1c.a" \
    ] \
    [list \
	"Build libmpx2a.a" \
	"" \
	"-Wa,-madd-bnd-prefix -fPIE $PLT_CFLAGS" \
	{mpx2a.c} \
	{{readelf {-r --wide} mpx2a.rd}} \
	"libmpx2a.a" \
	] \
    [list \
	"Build libmpx2b.a" \
	"" \
	"-fPIE" \
	{mpx2b.c} \
	{} \
	"libmpx2b.a" \
    ] \
    [list \
	"Build libmpx2c.a" \
	"" \
	"-Wa,-madd-bnd-prefix -fPIE $PLT_CFLAGS" \
	{mpx2c.c} \
	{{readelf {-r --wide} mpx2c.rd}} \
	"libmpx2c.a" \
    ] \
]

set run_tests {
    {"Run mpx1"
     "tmpdir/mpx1a.o tmpdir/mpx1b.o tmpdir/mpx1c.o" ""
     {dummy.s} "mpx1" "mpx1.out"}
    {"Run mpx1 with -static"
     "tmpdir/mpx1a.o tmpdir/mpx1b.o tmpdir/mpx1c.o -static" ""
     {dummy.s} "mpx1static" "mpx1.out"}
    {"Run mpx2"
     "tmpdir/mpx2a.o tmpdir/mpx2b.o tmpdir/mpx2c.o -pie" ""
     {dummy.s} "mpx2" "mpx2.out"}
    {"Run mpx2 with -static"
     "tmpdir/mpx2a.o tmpdir/mpx2b.o tmpdir/mpx2c.o -static" ""
     {dummy.s} "mpx2static" "mpx2.out"}
}

run_ld_link_tests {
    {"Build libcall.so"
     "-m elf_x86_64 -shared -z bndplt" "" "--64"
     {mpx3b.s} {} "libcall.so"}
    {"Build mpx3"
     "-m elf_x86_64 -z bndplt tmpdir/libcall.so" "" "--64"
     {mpx3a.s} {{objdump -dw mpx3.dd}} "mpx3"}
    {"Build libcall1.so"
     "-m elf_x86_64 -shared -z bndplt" "" "--64"
     {mpx4b.s} {} "libcall1.so"}
    {"Build mpx4"
     "-m elf_x86_64 -z bndplt tmpdir/libcall1.so" "" "--64"
     {mpx4a.s} {{objdump -dw mpx4.dd}} "mpx4"}
}

run_ld_link_exec_tests [] $run_tests

run_dump_test "bnd-branch-1"
run_dump_test "bnd-ifunc-1"
run_dump_test "bnd-ifunc-2"
run_dump_test "bnd-plt-1"
