# Expect script for ld-sh tests
#   Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation
#
# This file 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 2 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.
#

# Test SH reloc failures - that is, cases that ld must not allow.

if ![istarget sh64-*-*] {
    return
}

if [istarget sh64-*-linux*] {
    set emul32 "shlelf32_linux"
    set oformat32 "elf32-sh64-linux"
    set startsym "_start"
    set doabi64 0
} elseif { [istarget sh64*-*-netbsd*] || [istarget sh5*-*-netbsd*] } then {
    set emul32 "shelf32_nbsd"
    set oformat32 "elf32-sh64-nbsd"
    set startsym "__start"
    set doabi64 1
    set emul64 "shelf64_nbsd"
    set oformat64 "elf64-sh64-nbsd"
} else {
    set emul32 "shelf32"
    set oformat32 "elf32-sh64"
    set startsym "start"
    set doabi64 1
    set emul64 "shelf64"
    set oformat64 "elf64-sh64"
}

# opcode, asflags, ldflags, expected or "" for fail
# opcode blank means rebuild relfail.o and set default as/ld options

set sh64abi32relfailtests {

    { "" "-isa=shcompact -abi=32" "-m $emul32 -Ttext 0x1000 --oformat $oformat32" "" }
    { "mov.l lab,r0;.align 3;lab:nop" "" "" "mov.l 1008" }
    { "mov.l to0,r0" "" "" "mov.l 1010" }
    { "mov.l to1,r0" "" "" "" }
    { "mov.l to2,r0" "" "" "" }
    { "mov.l to3,r0" "" "" "" }
    { "mov.l to4,r0" "" "" "mov.l 1014" }

    { "" "-isa=shmedia -abi=32 -no-expand" "-m $emul32 -Ttext 0x1000 --oformat $oformat32" "" }
    { "pta lab,tr0;.align 3;lab:nop" "" "" "pta.*1008" }

    { "ld.q r0,datalabel to0 - 0x1000,r0" "" "" "ld.q.*,16," }
    { "ld.q r0,datalabel to1 - 0x1000,r0" "" "" "" }
    { "ld.q r0,datalabel to2 - 0x1000,r0" "" "" "" }
    { "ld.q r0,datalabel to3 - 0x1000,r0" "" "" "" }
    { "ld.q r0,datalabel to4 - 0x1000,r0" "" "" "" }

    { "ld.l r0,datalabel to0 - 0x1000,r0" "" "" "ld.l.*,16," }
    { "ld.l r0,datalabel to1 - 0x1000,r0" "" "" "" }
    { "ld.l r0,datalabel to2 - 0x1000,r0" "" "" "" }
    { "ld.l r0,datalabel to3 - 0x1000,r0" "" "" "" }
    { "ld.l r0,datalabel to4 - 0x1000,r0" "" "" "ld.l.*,20," }

    { "ld.w r0,datalabel to0 - 0x1000,r0" "" "" "ld.w.*,16," }
    { "ld.w r0,datalabel to1 - 0x1000,r0" "" "" "" }
    { "ld.w r0,datalabel to2 - 0x1000,r0" "" "" "ld.w.*,18," }
    { "ld.w r0,datalabel to3 - 0x1000,r0" "" "" "" }
    { "ld.w r0,datalabel to4 - 0x1000,r0" "" "" "ld.w.*,20," }

}

set sh64abi64relfailtests {

    { "" "-isa=shmedia -abi=64 -no-expand" "-m $emul64 -Ttext 0x1000 --oformat $oformat64" "" }
    { "pta lab,tr0;.align 3;lab:nop" "" "" "pta.*1008" }
    { "pta datalabel to0,tr0" "" "" "pta.*1010" }
    { "pta datalabel to1,tr0" "" "" "pta.*1011" }
    { "pta datalabel to2,tr0" "" "" "" }
    { "pta datalabel to3,tr0" "" "" "" }
    { "pta datalabel to4,tr0" "" "" "pta.*1014" }

    { "ld.q r0,datalabel to0 - 0x1000,r0" "" "" "ld.q.*,16," }
    { "ld.q r0,datalabel to1 - 0x1000,r0" "" "" "" }
    { "ld.q r0,datalabel to2 - 0x1000,r0" "" "" "" }
    { "ld.q r0,datalabel to3 - 0x1000,r0" "" "" "" }
    { "ld.q r0,datalabel to4 - 0x1000,r0" "" "" "" }

    { "ld.l r0,datalabel to0 - 0x1000,r0" "" "" "ld.l.*,16," }
    { "ld.l r0,datalabel to1 - 0x1000,r0" "" "" "" }
    { "ld.l r0,datalabel to2 - 0x1000,r0" "" "" "" }
    { "ld.l r0,datalabel to3 - 0x1000,r0" "" "" "" }
    { "ld.l r0,datalabel to4 - 0x1000,r0" "" "" "ld.l.*,20," }

    { "ld.w r0,datalabel to0 - 0x1000,r0" "" "" "ld.w.*,16," }
    { "ld.w r0,datalabel to1 - 0x1000,r0" "" "" "" }
    { "ld.w r0,datalabel to2 - 0x1000,r0" "" "" "ld.w.*,18," }
    { "ld.w r0,datalabel to3 - 0x1000,r0" "" "" "" }
    { "ld.w r0,datalabel to4 - 0x1000,r0" "" "" "ld.w.*,20," }

}

proc run_sh64relfailtests {sh64relfailtests} {
    global ld
    global as
    global nm
    global objdump
    global readelf
    global srcdir
    global subdir
    global emul32
    global emul64
    global oformat32
    global oformat64
    global startsym

    set testindex 0
    set is_unresolved 0

    foreach testentry $sh64relfailtests {
	set opcode [lindex $testentry 0]
	set as_options [lindex $testentry 1]
	set ld_options [subst [lindex $testentry 2]]
	set expect_fail [lindex $testentry 3]
	
	set testname "SH64 relfail $opcode $as_options $ld_options"
	
	set objfiles {}
	
	incr testindex
	
	if {$opcode == ""} {
	    set def_as_options $as_options
	    set def_ld_options $ld_options
	    set is_unresolved 0
	    set baseobj "tmpdir/relfail-$testindex.o"
	    if ![ld_assemble $as "$as_options $srcdir/$subdir/relfail.s" $baseobj] {
		set is_unresolved 1
	    }
	    continue
	}
	
	if {$as_options == ""} {
	    set as_options $def_as_options
	}
	if {$ld_options == ""} {
	    set ld_options $def_ld_options
	}
	
	if { $is_unresolved } {
	    unresolved $testname
	    continue
	}
	
	set asm [open "tmpdir/relfail-$testindex.s" "w"]
	puts $asm " .text"
	puts $asm " .global $startsym"
	puts $asm "$startsym:"
	puts $asm " $opcode"
	close $asm
	
	if ![ld_assemble $as "$as_options tmpdir/relfail-$testindex.s" "tmpdir/relfail-$testindex.o"] {
	    unresolved $testname
	    continue
	}
	
	set binfile "tmpdir/relfail-$testindex.x"
	
	file delete $binfile
	set objects "tmpdir/relfail-$testindex.o $baseobj"
	set result [ld_simple_link $ld $binfile "--no-warn-mismatch $ld_options $objects"]
	
	set exists [file exists $binfile]
	if {$exists && $expect_fail == ""} {
	    verbose "$testname: file $binfile exists when it shouldn't" 1
	    catch "exec $objdump -d $binfile" objdump_output
	    verbose $objdump_output 1
	    fail "$testname (file exists)"
	    continue
	}
	if {!$exists && $expect_fail != ""} {
	    verbose "$testname: file $binfile doesn't exist when it should" 1
	    fail "$testname (file missing)"
	    continue
	}
	
	if {$exists} {
	    catch "exec $objdump -d $binfile" objdump_output
	    regsub -all {[ 	][ 	]*} $objdump_output " " objdump_short
	    if ![regexp $expect_fail $objdump_short junk] {
		verbose $objdump_output 1
		fail "$testname (incorrect reloc)"
		continue
	    }
	}
	
	file delete "tmpdir/relfail-$testindex.s"
	file delete "tmpdir/relfail-$testindex.o"
	file delete $binfile
	pass $testname
    }
}

run_sh64relfailtests $sh64abi32relfailtests
if {$doabi64} {
    run_sh64relfailtests $sh64abi64relfailtests
}
