# Expect script for ld-spu tests
#   Copyright (C) 2006-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.
#

if { ![istarget "spu-*-*"] } {
    return
}

proc embed_test { } {
    global subdir srcdir
    global AS ASFLAGS LD LDFLAGS READELF READELFFLAGS

    set cmd "$AS $ASFLAGS -o tmpdir/ear.o $srcdir/$subdir/ear.s"
    send_log "$cmd\n"
    set cmdret [catch "exec $cmd" comp_output]
    set comp_output [prune_warnings $comp_output]
    if { $cmdret != 0 || $comp_output != ""} then {
	send_log "$comp_output\n"
	verbose "$comp_output" 3
	fail "ear assembly"
	return
    }

    set cmd "$LD $LDFLAGS -o tmpdir/ear tmpdir/ear.o"
    send_log "$cmd\n"
    set cmdret [catch "exec $cmd" comp_output]
    set comp_output [prune_warnings $comp_output]
    if { $cmdret != 0 || $comp_output != ""} then {
	send_log "$comp_output\n"
	verbose "$comp_output" 3
	fail "ear link"
	return
    }

    set cmd "sh $srcdir/../../binutils/embedspu.sh -m32 ear tmpdir/ear tmpdir/embed.o"
    send_log "$cmd\n"
    set cmdret [catch "exec $cmd" comp_output]
    set comp_output [prune_warnings $comp_output]
    if { $cmdret != 0 || $comp_output != ""} then {
	send_log "$comp_output\n"
	verbose "$comp_output" 3
	if { [regexp "unknown pseudo-op: `.reloc'" $comp_output] } {
	    untested "ear embedspu"
	    return
	}
	fail "ear embedspu"
	return
    }

    set cmd "$READELF $READELFFLAGS -r --wide tmpdir/embed.o > tmpdir/embed.out"
    send_log "$cmd\n"
    set cmdret [catch "exec $cmd" comp_output]
    set comp_output [prune_warnings $comp_output]
    if { $cmdret != 0 || $comp_output != ""} then {
	send_log "$comp_output\n"
	verbose "$comp_output" 3
	fail "ear embed readelf"
	return
    }

    if { [regexp_diff "tmpdir/embed.out" $srcdir/$subdir/embed.rd] } then {
	fail "ear embed output"
	return
    }

    pass "ear embed"
}

set rd_test_list [lsort [glob -nocomplain $srcdir/$subdir/*.d]]
foreach sputest $rd_test_list {
    verbose [file rootname $sputest]
    run_dump_test [file rootname $sputest]
}

if { [isbuild "powerpc*-*-linux*"] } {
    embed_test
}
