# Test that the linker reports undefined symbol errors correctly.
# By Ian Lance Taylor, Cygnus Support
#
#   Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 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 testund "undefined"
set testfn "undefined function"
set testline "undefined line"

if { [which $CC] == 0 } {
    verbose "Could not find C compiler!" 1
    untested $testund
    untested $testfn
    untested $testline
    return
}

if ![ld_compile "$CC -g" $srcdir/$subdir/undefined.c tmpdir/undefined.o] {
    verbose "Unable to compile test file!" 1
    unresolved $testund
    unresolved $testfn
    unresolved $testline
    return
}

catch "exec rm -f tmpdir/undefined" exec_output

set flags [big_or_little_endian]

# Using -e start prevents the SunOS linker from trying to build a
# shared library.
send_log "$ld -e start $flags -o tmpdir/undefined tmpdir/undefined.o\n"
verbose "$ld -e start $flags -o tmpdir/undefined tmpdir/undefined.o"

catch "exec $ld -e start $flags -o tmpdir/undefined tmpdir/undefined.o" exec_output
send_log "$exec_output\n"
verbose "$exec_output"

proc checkund { string testname } {
    global exec_output

    if [string match "*$string*" $exec_output] {
	pass $testname
    } else {
	fail $testname
    }
}

set mu "undefined reference to `*this_function_is_not_defined'"
checkund $mu $testund

# ARM PE defaults to using stabs debugging, which we can't handle for
# a COFF file.
#setup_xfail "arm*-*-pe*"
#setup_xfail "thumb*-*-pe*"

set mf "tmpdir/undefined.o* In function `function':"
checkund $mf $testfn

if ![is_elf_format] {
    # COFF SH gets this test wrong--it reports line 10, because although
    # the jump is at line 9, the function address, and the reloc, is
    # stored at the end of the function.
    setup_xfail "sh-*-*"

    # ARM PE defaults to using stabs debugging, which we can't handle for
    # a COFF file.
    #setup_xfail "arm*-*-pe*"
    #setup_xfail "thumb*-*-pe*"
}

set ml "undefined.c:9: undefined reference to `*this_function_is_not_defined'"
# With targets that use elf/dwarf2, such as the arm-elf and thumb-elf
# toolchains, the code in bfd/elf.c:_bfd_elf_find_nearest_line() is called
# in order to locate the file name/line number where the undefined
# reference occurs.  Unfortunately this tries to use the dwarf2 debug
# information held in the .debug_info section.  This section contains a series
# of comp_unit structures, each of which has a low/high address range
# representing the span of memory locations covered by that structure.  The
# structures also index into other structures held in the .debug_line section
# and together they can translate memory locations back into file/function/line
# number addresses in the source code.  Since the information about the memory
# region covered by a comp_unit is only determined at link time, the low/high
# addresses in the .debug_info section and the line addresses in the .debug_line
# section are computed by generating relocs against known symbols in the object
# code.
#
# When the undefined reference is detected, the relocs in the dwarf2
# debug sections have not yet been resolved, so the low/high addresses and the
# line number address are all set at zero.  Thus when _bfd_elf_find_nearest_line()
# calls _bfd_dwarf2_find_nearest_line() no comp_unit can be found which
# actually covers the address where the reference occured, and so
# _bfd_elf_find_nearest_line() fails.
#
# The upshot of all of this, is that the error message reported by the
# linker, instead of having a source file name & line number as in:
#
#   undefined.c:9: undefined reference to `this_function_is_not_defined'
#
# has an object file & section address instead:
#
#   undefined.0(.text+0xc): undefined reference to `this_function_is_not_defined'
#
# hence the xfails below.

setup_xfail mcore-*-elf
setup_xfail mips-sgi-irix6*
setup_xfail "sh64-*-*"

# The undefined test fails on 31 bit s/390 because the address of the 
# function `this_function_is_not_defined' is stored in the literal pool of
# the function. Therefore the line number in the error message is 8 instead
# of 9. On 64 bit s/390 this works because of the new brasl instruction that
# doesn't need a literal pool entry.
setup_xfail s390-*-*

checkund $ml $testline
