# Expect script for binutils tests
#   Copyright (C) 2009-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.
#
# Written by H.J. Lu (hongjiu.lu@intel.com)
#

# Make sure that binutils can correctly handle ld output in ELF with
# STT_GNU_IFUNC symbols.

if { !([istarget "i?86-*-elf*"]
       || (([istarget "i?86-*-linux*"]
	    || [istarget "i?86-*-gnu*"])
	   && ![istarget "*-*-*aout*"]
	   && ![istarget "*-*-*oldld*"])
       || [istarget "i?86-*-nacl*"]
       || [istarget "x86_64-*-nacl*"]
       || [istarget "x86_64-*-linux*"]
       || [istarget "amd64-*-linux*"]) } {
    return
}

proc binutils_test { prog_name ld_options test } {
    global as
    global ld
    global READELF
    global objcopy
    global strip
    global srcdir
    global subdir
    global link_output

    eval set prog \$$prog_name
    set test_name "$prog_name $ld_options ($test)"

    if { ![ld_assemble $as $srcdir/$subdir/$test.s tmpdir/$test.o ] } {
	unresolved "$test_name"
	return
    }

    if { ![ld_simple_link $ld tmpdir/$test "$ld_options tmpdir/$test.o"] } {
	if { [string match "*not supported*" $link_output]
	     || [string match "*unrecognized option*" $link_output] } {
	    unsupported "$ld_options is not supported by this target"
	} else {
	    unresolved "$test_name"
	}
	return
    }

    send_log "$READELF -l --wide tmpdir/$test > tmpdir/$test.exp\n"
    set got [remote_exec host "$READELF -l --wide tmpdir/$test" "" "/dev/null" "tmpdir/$test.exp"]
    if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
	send_log "$got\n"
	unresolved "$test_name"
	return
    }

    send_log "$prog tmpdir/$test\n"
    set got [remote_exec host "$prog tmpdir/$test"]
    if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
	send_log "$got\n"
	fail "$test_name"
	return
    }

    send_log "$READELF -l --wide tmpdir/$test > tmpdir/$test.out\n"
    set got [remote_exec host "$READELF -l --wide tmpdir/$test" "" "/dev/null" "tmpdir/$test.out"]
    if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
	send_log "$got\n"
	unresolved "$test_name"
	return
    }

    if { [catch {exec cmp tmpdir/$test.exp tmpdir/$test.out}] } then {
	send_log "tmpdir/$test.exp tmpdir/$test.out differ.\n"
	fail "$test_name"
	return
    }

    pass "$test_name"
}

binutils_test strip "" ifunc-4-x86
binutils_test objcopy "" ifunc-4-x86
binutils_test strip "" ifunc-4-local-x86
binutils_test objcopy "" ifunc-4-local-x86
