# Test handling of weak undefined symbols
#   Copyright 2001, 2002, 2004
#   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 2 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 undefined symbols"

# This test only works for ELF targets.  It ought to work for some
# a.out targets, but it doesn't.

if { ![istarget *-*-sysv4*] \
     && ![istarget *-*-unixware*] \
     && ![istarget *-*-elf*] \
     && ![istarget *-*-eabi*] \
     && ![istarget hppa*64*-*-hpux*] \
     && ![istarget *-*-linux*] \
     && ![istarget *-*-irix5*] \
     && ![istarget *-*-irix6*] \
     && ![is_pecoff_format] \
     && ![istarget *-*-solaris2*] } then {
    unsupported $testname
    return
}

if { [istarget *-*-linux*aout*] \
     || [istarget *-*-linux*oldld*] } {
    unsupported $testname
    return
}

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

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

# The linker should accept references to undefined weaks without error,
# and resolve them to zero.

set output_regexp \
".*Contents of section .data:.*0000 00000000 11111111.*"

if {! [ld_simple_link $ld tmpdir/weak-undef "$flags tmpdir/weak-undef.o -T $srcdir/$subdir/weak-undef.t"] } then {
    fail $testname
} else {
    if {[which $objdump] == 0} then {
	unresolved $testname
	return
    }

    verbose -log "$objdump -s tmpdir/weak-undef"
    catch "exec $objdump -s tmpdir/weak-undef" exec_output
    set exec_output [prune_warnings $exec_output]
    verbose -log $exec_output

    if {[regexp $output_regexp $exec_output]} then {
	pass $testname
    } else {
	fail $testname
    }
}
