# Test weak symbols.
# By Ian Lance Taylor, Cygnus Solutions.

set testname "weak 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 *-*-linux*] \
     && ![istarget *-*-irix5*] \
     && ![istarget *-*-irix6*] \
     && ![istarget *-*-solaris2*] } then {
    return
}

if { [istarget *-*-linuxaout*] \
     || [istarget *-*-linuxoldld*] } {
    return
}

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.
    unresolved $testname
    return
}

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_simple_link $ld tmpdir/weak "-T $srcdir/$subdir/weak.t tmpdir/weak1.o tmpdir/weak2.o"] } then {
    fail $testname
} else {
    if {[which $objdump] == 0} then {
	unresolved $testname
	return
    }

    verbose -log "$objdump -s tmpdir/weak"
    catch "exec $objdump -s tmpdir/weak" exec_output
    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
    }
}
