# Expect script for ld-versados tests
#   Copyright (C) 1995-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 Steve Chamberlain (sac@cygnus.com)
#

# Make sure that ld can read versados images and
# generate binaries which are identical to the customer's
# old method.

# This test can only be run if ld generates native executables.

# This test can only be run on 68k coff targets
# Square bracket expressions seem to confuse istarget.
if { ![istarget m68k-*-coff*] } then {
    return
}

set testname "LD VERSADOS"


proc inspect { whichone } {
    global objdump
    global exec_output
    global srcdir
    global subdir
    global testname

    send_log "$objdump -s tmpdir/$whichone.out >tmpdir/$whichone.dump\n"
    catch "exec $objdump -s tmpdir/$whichone.out | grep -v srec >tmpdir/$whichone.dump" exec_output

    if ![string match "" $exec_output] {
	send_log "$exec_output\n"
	verbose $exec_output
	unresolved $testname
	return 0
    }

    send_log "$objdump -s $srcdir/$subdir/$whichone.ook >tmpdir/$whichone.dok\n"
    catch "exec $objdump -s $srcdir/$subdir/$whichone.ook | grep -v srec >tmpdir/$whichone.dok" exec_output

    if ![string match "" $exec_output] {
	send_log "$exec_output\n"
	verbose $exec_output
	unresolved $testname
	return 0
    }

    # compare it with the correct output
    catch "exec diff tmpdir/$whichone.dump tmpdir/$whichone.dok" exec_output
    if ![string match "" $exec_output] {
	send_log "$exec_output\n"
	verbose $exec_output
	fail $testname
	return 0
    }

    return 1
}

if ![ld_simple_link $ld tmpdir/t1.out \
	" -T $srcdir/$subdir/t1.ld $srcdir/$subdir/t1-1.ro  $srcdir/$subdir/t1-2.ro"] {
    fail $testname
    return
} else {
    # Get a dump of what we've got, and what we should have
    if ![inspect t1] {
	return
    }
}


if ![ld_simple_link $ld  tmpdir/t2.out \
	" -T $srcdir/$subdir/t2.ld $srcdir/$subdir/t2-2.ro \
	$srcdir/$subdir/t2-1.ro  $srcdir/$subdir/t2-3.ro"] {
    fail $testname
    return
} else {
    # Get a dump of what we've got, and what we should have
    if ![inspect t2] {
	return
    }
}

pass $testname
