# Expect script for common symbol override.
#
# Copyright (C) 2011-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.
#

#
# Written by Maciej W. Rozycki <macro@codesourcery.com>
#

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

# This target requires extra GAS options when building code for shared
# libraries.
set AFLAGS_PIC ""
if [istarget "tic6x-*-*"] {
    append AFLAGS_PIC " -mpic -mpid=near"
}
# This target requires a non-default emulation for successful shared
# library/executable builds.
set LFLAGS ""
if [istarget "tic6x-*-*"] {
    append LFLAGS " -melf32_tic6x_le"
}

set testname "Common symbol override test"

# Define a global symbol.
run_ld_link_tests [list \
    [list \
	"$testname (auxiliary shared object build)" \
	"$LFLAGS -shared" "" \
	"$AFLAGS_PIC" \
	{ comm-data1.s } \
	{ \
	    { readelf -s comm-data1.sd } \
	} \
	"libcomm-data.so" \
    ] \
]

# Set the pointer size according to the ELF flavor.
set AFLAGS ""
if [is_elf64 "tmpdir/libcomm-data.so"] {
    append AFLAGS " --defsym ELF64=1"
}
# HPUX targets use a different .comm syntax.
if [istarget "*-*-hpux*"] {
    append AFLAGS " --defsym HPUX=1"
}

# bfin does not currently support copy relocs.
setup_xfail "bfin-*-*"

setup_xfail "arm*-*-*" "ld/13802"

# List targets here that keep copy relocs rather than eliminating
# them where possible in favour to dynamic relocs in the relevant
# loadable sections; see also the "-z nocopyreloc" command-line
# option and the ELIMINATE_COPY_RELOCS macro some backends use.
set copy_reloc [expr [istarget mn10300-*-*] || [istarget vax-*-*]]

# 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" \
	"$LFLAGS -T comm-data2.ld -Ltmpdir -lcomm-data" "" \
	"$AFLAGS" \
	{ comm-data2.s } \
	[list \
	    [list readelf -s \
		[expr { $copy_reloc ? "comm-data2r.sd" : "comm-data2.sd"}]] \
	    [list readelf -r \
		[expr { $copy_reloc ? "comm-data2r.rd" : "comm-data2.rd"}]] \
	    [list readelf "-x .debug_foo" \
		[expr { $copy_reloc ? "comm-data2r.xd" : "comm-data2.xd"}]]] \
	"comm-data" \
    ] \
    [list \
	"$testname 3a" \
	"-static" "" \
	"" \
	{ comm-data3a.s comm-data3b.s } \
	{ \
	    { readelf -s comm-data3.sd } \
	} \
	"comm-data3a" \
    ] \
    [list \
	"$testname 3b" \
	"-static" "" \
	"" \
	{ comm-data3b.s comm-data3a.s } \
	{ \
	    { readelf -s comm-data3.sd } \
	} \
	"comm-data3b" \
    ] \
]
