# Test NOCROSSREFS in a linker script.
# By Ian Lance Taylor, Cygnus Support.
#   Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2007
#   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 test1 "NOCROSSREFS 1"
set test2 "NOCROSSREFS 2"
set test3 "NOCROSSREFS 3"

if { ![is_remote host] && [which $CC] == 0 } {
    untested $test1
    untested $test2
    untested $test3
    return
}

# Xtensa targets currently default to putting literal values in a separate
# section and that requires linker script support, so put literals in text.
global CFLAGS
if [istarget xtensa*-*-*] {
    set CFLAGS "$CFLAGS -mtext-section-literals"
}

# If we have a compiler that doesn't use/reference dot-symbols, then
# calls to functions reference the .opd section function descriptor.
# This makes NOCROSSREFS rather useless on powerpc64.
if [istarget powerpc64*-*-*] {
    set CFLAGS "$CFLAGS -mcall-aixdesc"
}

# Prevent the use of the MeP's small data area which references a symbol
# called __sdabase which will not be defined by our test linker scripts.
if [istarget mep*-*-elf] {
    set CFLAGS "-mtiny=0"
}

# The .dsbt section and __c6xabi_DSBT_BASE are not defined in our test
# linker scripts.
if [istarget tic6x*-*-*] {
    set CFLAGS "-mno-dsbt -msdata=none"
}

if { ![ld_compile $CC "$srcdir/$subdir/cross1.c" tmpdir/cross1.o] \
     || ![ld_compile $CC "$srcdir/$subdir/cross2.c" tmpdir/cross2.o] } {
    unresolved $test1
    unresolved $test2
    return
}

set flags [big_or_little_endian]

if [istarget sh64*-*-elf] {
    # This is what gcc passes to ld by default.
    set flags "-mshelf32"
}

# IA64 has both ordered and unordered sections in an input file.
setup_xfail ia64-*-*

set exec_output [run_host_cmd "$ld" "$flags -o tmpdir/cross1 -T $srcdir/$subdir/cross1.t tmpdir/cross1.o tmpdir/cross2.o"]

set exec_output [prune_warnings $exec_output]

regsub -all "(^|\n)($ld: warning: cannot find entry symbol\[^\n\]*\n?)" $exec_output "\\1" exec_output

if [string match "" $exec_output] then {
    fail $test1
} else {
    verbose -log "$exec_output"
    if [regexp "prohibited cross reference from .* to `.*foo' in" $exec_output] {
	pass $test1
    } else {
	fail $test1
    }
}

# Check cross references within a single object.

if { ![ld_compile $CC "$srcdir/$subdir/cross3.c" tmpdir/cross3.o] } {
    unresolved $test2
    return
}

set exec_output [run_host_cmd "$ld" "$flags -o tmpdir/cross2 -T $srcdir/$subdir/cross2.t tmpdir/cross3.o"]
set exec_output [prune_warnings $exec_output]

regsub -all "(^|\n)($ld: warning: cannot find entry symbol\[^\n\]*\n?)" $exec_output "\\1" exec_output

if [string match "" $exec_output] then {
    fail $test2
} else {
    verbose -log "$exec_output"
    if [regexp "prohibited cross reference from .* to `.*' in" $exec_output] {
	pass $test2
    } else {
	fail $test2
    }
}

# Check cross references for ld -r

if { ![ld_compile $CC "$srcdir/$subdir/cross4.c" tmpdir/cross4.o] } {
    unresolved $test3
    return
}

if ![ld_relocate $ld tmpdir/cross3-partial.o "tmpdir/cross1.o tmpdir/cross4.o"] {
    unresolved $test3
    return
}

set exec_output [run_host_cmd "$ld" "$flags -o tmpdir/cross3 -T $srcdir/$subdir/cross3.t tmpdir/cross3-partial.o tmpdir/cross2.o"]

set exec_output [prune_warnings $exec_output]

regsub -all "(^|\n)($ld: warning: cannot find entry symbol\[^\n\]*\n?)" $exec_output "\\1" exec_output

if [string match "" $exec_output] then {
    pass $test3
} else {
    verbose -log "$exec_output"
    fail $test3
}
