# Test weak symbols.
# By Ian Lance Taylor, Cygnus Solutions.
#   Copyright (C) 1999-2021 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.

set testname "weak symbols"

# This test only works for ELF targets and some PE targets.
# It ought to work for some a.out targets, but it doesn't.
if {! [is_elf_format] && ! [is_pecoff_format]} {
    unsupported $testname
    return
}

# Weak symbols are broken for most PE targets.
if {! [istarget i?86-*-*] && ! [istarget sh-*-*]} {
    setup_xfail *-*-pe*
}

# hppa64 is incredibly broken
setup_xfail hppa64-*-*

if {! [ld_assemble $as $srcdir/$subdir/weak1.s tmpdir/weak1.o]
    || ! [ld_assemble $as $srcdir/$subdir/weak2.s tmpdir/weak2.o]} then {
    # It's OK if .weak doesn't work on this target.
    unsupported $testname
    return
}

set saved_LDFLAGS "$LDFLAGS"
if { [is_pecoff_format] } then {
    set LDFLAGS "$LDFLAGS --image-base 0"
}

set weak_regexp_big \
".*Contents of section .text:.*1000 00001008 0000200c 12121212 34343434.*Contents of section .data:.*2000 00001008 0000200c 56565656 78787878.*"

set weak_regexp_little \
".*Contents of section .text:.*1000 08100000 0c200000 12121212 34343434.*Contents of section .data:.*2000 08100000 0c200000 56565656 78787878.*"

if {! [ld_link $ld tmpdir/weak "$flags -T $srcdir/$subdir/weak.t tmpdir/weak1.o tmpdir/weak2.o"] } then {
    fail $testname
} else {
    set exec_output [run_host_cmd "$objdump" "-s tmpdir/weak"]
    set exec_output [prune_warnings $exec_output]
    verbose -log $exec_output

    if {[regexp $weak_regexp_big $exec_output] \
	|| [regexp $weak_regexp_little $exec_output] } then {
	pass $testname
    } else {
	fail $testname
    }
}

set LDFLAGS "$saved_LDFLAGS"
