# Expect script for ld-mn10300 tests
#   Copyright (C) 2007-2018 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., 51 Franklin Street - Fifth Floor, Boston,
# MA 02110-1301, 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_link $ld $tmpdir/i126256-1.so "-shared $tmpdir/i126256-1.o -e 0"]} {
        unresolved $testname
    	return
    }

    if { ![ld_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
