# Expect script for binutils tests
#   Copyright 2006, 2007, 2008, 2009, 2010 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.

if { ![istarget *-*-linux*]
     && ![istarget *-*-gnu*]} {
    return
}

if { [istarget *-*-linux*aout*]
     || [istarget *-*-linux*oldld*] } {
    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 "-z max-page-size=0x200000" maxpage1
binutils_test strip "-z max-page-size=0x200000 -z common-page-size=0x100000" maxpage1
binutils_test strip "-z max-page-size=0x100000" maxpage1
binutils_test strip "-z max-page-size=0x100000 -z common-page-size=0x1000" maxpage1

binutils_test strip "" maxpage1
binutils_test strip "-shared" maxpage1
binutils_test objcopy "" maxpage1
binutils_test objcopy "-shared" maxpage1

binutils_test strip "-z relro" relro1
binutils_test strip "-z relro -shared" relro1
binutils_test objcopy "-z relro" relro1
binutils_test objcopy "-z relro -shared" relro1
if { ([istarget "i?86-*-elf*"]		
      || (([istarget "i?86-*-linux*"]
	   || [istarget "i?86-*-gnu*"])
	  && ![istarget "*-*-*aout*"]
	  && ![istarget "*-*-*oldld*"])
      || [istarget "x86_64-*-linux*"]
      || [istarget "amd64-*-linux*"]) } {
    binutils_test strip "-z relro -shared" relro2
    binutils_test objcopy "-z relro -shared" relro2
}

binutils_test strip "-T ${srcdir}/${subdir}/lma.lnk" lma

# hppa64 has its own .tbss section, with different flags.
if { ![istarget "hppa64-*-*"] } {
    binutils_test objcopy "" tbss1
    binutils_test objcopy "-z relro" tbss1
    binutils_test objcopy "-shared" tbss1
    binutils_test objcopy "-shared -z relro" tbss1
    binutils_test objcopy "-z max-page-size=0x100000" tbss1
    binutils_test objcopy "-z max-page-size=0x100000 -z common-page-size=0x1000" tbss1
}

binutils_test objcopy "" tdata1
binutils_test objcopy "-z relro" tdata1
binutils_test objcopy "-shared" tdata1
binutils_test objcopy "-shared -z relro" tdata1
binutils_test objcopy "-z max-page-size=0x100000" tdata1
binutils_test objcopy "-z max-page-size=0x100000 -z common-page-size=0x1000" tdata1

if { ![istarget "hppa64-*-*"] } {
    binutils_test objcopy "" tbss2
    binutils_test objcopy "-z relro" tbss2
    binutils_test objcopy "-shared" tbss2
    binutils_test objcopy "-shared -z relro" tbss2
    binutils_test objcopy "-z max-page-size=0x100000" tbss2
    binutils_test objcopy "-z max-page-size=0x100000 -z common-page-size=0x1000" tbss2
}

binutils_test objcopy "" tdata2
binutils_test objcopy "-z relro" tdata2
binutils_test objcopy "-shared" tdata2
binutils_test objcopy "-shared -z relro" tdata2
binutils_test objcopy "-z max-page-size=0x100000" tdata2
binutils_test objcopy "-z max-page-size=0x100000 -z common-page-size=0x1000" tdata2
