# Expect script for common symbol override, MIPS variation.
#
#   Copyright 2011  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 Maciej W. Rozycki <macro@codesourcery.com>
#

# This test is for MIPS shared-library targets.
if { ![istarget mips*-*-*]
     || ![is_elf_format]
     || ![check_shared_lib_support] } {
    return
}

proc mips_comm_data_test { abi flag emul reloc } {

    set testname "MIPS $abi/$reloc common symbol override test"

    # There's no "-z copyreloc" option, deal with it.
    set ZFLAG [string map [list copyreloc "" nocopyreloc "-z $reloc"] $reloc]
    set AFLAGS "$flag -EB"
    set LDFLAGS "-m$emul"

    # Define a global symbol.
    run_ld_link_tests [list \
	[list \
	    "$testname (auxiliary shared object build)" \
	    "$LDFLAGS -shared" "" \
	    "$AFLAGS -call_shared" \
	    { ../ld-elf/comm-data1.s } \
	    { \
		{ readelf -s ../ld-elf/comm-data1.sd } \
	    } \
	  "libmips-$abi-$reloc-comm-data.so" \
	] \
    ]

    # Set the pointer size according to the ABI.
    if { $abi == "n64" } {
	append AFLAGS " --defsym ELF64=1"
    }

    # Verify that a common symbol has been converted to an undefined
    # reference to the global symbol of the same name defined above
    # and that the debug reference has been dropped.
    run_ld_link_tests [list \
	[list \
	    "$testname" \
	    "$LDFLAGS $ZFLAG -T ../ld-elf/comm-data2.ld -Ltmpdir -lmips-$abi-$reloc-comm-data" "" \
	    "$AFLAGS -call_nonpic" \
	    { ../ld-elf/comm-data2.s } \
	    { \
		{ readelf -s ../ld-elf/comm-data2.sd } \
		{ readelf -r ../ld-elf/comm-data2.rd } \
		{ readelf "-x .debug_foo" ../ld-elf/comm-data2.xd } \
	    } \
	    "mips-$abi-$reloc-comm-data" \
	] \
    ]
}

# For targets that default to a specific ISA (instead of "from-abi"),
# the 64-bit -march option is required to override it, like for
# "mipsisa32r2el-*-*".
set abis { o32 -32 elf32btsmip n32 "-n32 -march=mips3" elf32btsmipn32 n64 "-64 -march=mips3" elf64btsmip }
set relocs { copyreloc nocopyreloc }
foreach { abi flag emul } $abis {
    foreach reloc $relocs {
	mips_comm_data_test $abi $flag $emul $reloc
    }
}
