# 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
}

global CFLAGS
set old_CFLAGS "$CFLAGS"

# Xtensa targets currently default to putting literal values in a separate
# section and that requires linker script support, so put literals in text.
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
    set CFLAGS "$old_CFLAGS"
    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
    set CFLAGS "$old_CFLAGS"
    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
    set CFLAGS "$old_CFLAGS"
    return
}

if ![ld_relocate $ld tmpdir/cross3-partial.o "tmpdir/cross1.o tmpdir/cross4.o"] {
    unresolved $test3
    set CFLAGS "$old_CFLAGS"
    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
}

set CFLAGS "$old_CFLAGS"
