# Expect script for ld-mn10300 tests
#   Copyright (C) 2007-2016 Free Software Foundation, Inc.
#
# 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 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#

if {!([istarget "am3*-*-*"]) && !([istarget "mn10300*-*-*"]) } {
    return
}

# Set up a list as described in ld-lib.exp

set mn10300_tests {
    {
	"am33 string merging"
	"-relax -Ttext 0x8000074" ""
	""
	{ "i36434.s" "i36434-2.s" }
	{ {objdump -dz i36434.d} }
	"i36434.x"
    }
    {
	"difference of two same-section symbols"
	"-Ttext 0" ""
	""
	{ "i112045-1.s" }
	{ {objdump -d i112045-1.d} }
	"i112045-1.x"
    }
    {
	"difference of two same-section symbols where the difference is held in another section"
	"-relax -Ttext 100" ""
	""
	{ "i112045-3.s" }
	{ {objdump -D i112045-3.d} }
	"i112045-3.x"
    }
    {
	"relaxation and alignment directives"
	"-relax -Ttext 100 -Tbss 300" ""
	""
	{ "i127740.s" }
	{ {objdump -d i127740.d} }
	"i127740.x"
    }
    {
	"adjustment of symbols due to relaxation"
	"-Tdata 1f -Ttext 0 -relax" ""
	""
	{ "i135409-1.s" }
	{ {readelf --syms i135409-1.d} }
	"i135409-1.x"
    }
    {
	"adjustment of symbols due to relaxation (with alignment directives)"
	"-Tdata 1f -Ttext 0 -relax" ""
	""
	{ "i135409-2.s" }
	{ {readelf --syms i135409-2.d} }
	"i135409-2.x"
    }
    {
	"adjustment of symbols due to relaxation (with a symbol in the deleted region)"
	"-Tdata 1f -Ttext 0 -relax" ""
	""
	{ "i135409-3.s" }
	{ {objdump -d i135409-3.d} }
	"i135409-3.x"
    }
    {
	"adjusting a 16-bit forward branch"
	"-Ti135409-4.t -relax" ""
	""
	{ "i135409-4.s" }
	{ {objdump -d i135409-4.d} }
	"i135409-4.x"
    }
    {
	"adjusting a 16-bit backward branch"
	"-Ti135409-5.t -relax" ""
	""
	{ "i135409-5.s" }
	{ {objdump -d i135409-5.d} }
	"i135409-5.x"
    }
    {
	"relaxing offsets into a merged string section"
	"-Ti143317.t -shared -relax" ""
	""
	{ "i143317.s" }
	{ {objdump -d i143317.d} }
	"i143317.x"
    }
}

run_ld_link_tests $mn10300_tests

if {!([istarget "am3*-*-*"])} {
    return
}

set am33_tests {
    {
	"difference of two same-section symbols (in a shared library)"
	"-shared" ""
	""
	{ "i112045-2.s" }
	{ {objdump -R i112045-2.d} }
	"i112045-2.x"
    }
}

run_ld_link_tests $am33_tests

proc i126256-test { } {
    global CC
    global ld
    global srcdir
    global subdir

    set tmpdir tmpdir
    set testname "Seg fault whilst linking one shared library into another when relaxation is enabled."

    if {![is_remote host] && [which $CC] == 0} then {
	return
    }

    if { ![ld_compile "$CC -mrelax -fPIC" $srcdir/$subdir/i126256-1.c $tmpdir/i126256-1.o] } {
	unresolved $testname
    	return
    }

    if { ![ld_compile "$CC -mrelax -fPIC" $srcdir/$subdir/i126256-2.c $tmpdir/i126256-2.o] } {
	unresolved $testname
    	return
    }
    
    if { ![ld_simple_link $ld $tmpdir/i126256-1.so "-shared $tmpdir/i126256-1.o -e 0"]} {
        unresolved $testname
    	return
    }

    if { ![ld_simple_link $ld $tmpdir/i126256-2.so "--relax -shared $tmpdir/i126256-2.o $tmpdir/i126256-1.so -e 0"]} {
        fail $testname
    	return
    }

    pass $testname
}

i126256-test
