# Expect script for LD selective linking tests
#   Copyright 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.
#
# Written by Catherine Moore (clm@cygnus.com)
# Make sure that constructors are handled correctly.

# Only ELF based ports support selective linking
if ![is_elf_format] {
    return
}

# Alpha and IA64 do not support selective linking
if {[istarget "alpha*-*-*"] || [istarget "ia64-*-*"]} {
    return
}

# List contains test-items with three items followed by four lists:
# 1:name 2:test-type (CC or C++; add as needed) 3:filename 4:ld-flags
# 5:must-have-symbols 6:must-not-have-symbols 7:xfail-targets.
#
# If a must(-not)-have symbol is a list, then that list must have two
# items; the symbol name and a value the symbol must (not) have.
#
# Note: ld_nm trims leading `_' from _start
#
# FIXME: Instead of table, read settings from each source-file.
set seltests {
  {selective1 C   1.c  {}       {}    {dropme1 dropme2} {}}
  {selective2 C   2.c  {}       {}    {foo} {}}
  {selective3 C   2.c  {-u foo} {foo} {{foo 0}} {}}
  {selective4 C++ 3.cc {}       {start a A::foo() B::foo()} {A::bar()} {mips*-*}}
  {selective5 C++ 4.cc {}       {start a A::bar()} {A::foo() B::foo()} {mips*-*}}
  {selective6 C++ 5.cc {}       {start a A::bar()}
    {A::foo() B::foo() dropme1() dropme2()} {*-*-*}}
}

set cflags "-w -O -ffunction-sections -fdata-sections"
set cxxflags "-fvtable-gc -fno-exceptions -fno-rtti"
set ldflags "--gc-sections -Bstatic"

if [istarget mips*-*] {
    # MIPS16 doesn't support PIC code.
    set cflags "-mno-abicalls $cflags"
    # MIPS ELF uses __start by default, we override it.
    set ldflags "-e _start $ldflags"
}

if [istarget sh64*-*-elf] {
    # This is what gcc passes to ld by default, plus switch to the
    # "usual" ELF _start (shelf32 normally uses just `start' for COFF
    # compatibility)
    set ldflags "-e _start -mshelf32 $ldflags"
}

# If we don't have g++ for the target, mark all tests as untested.
if { [which $CXX] == 0 } {
    foreach testitem $seltests {
	untested "[lindex $testitem 0]"
    }
    return
}

foreach testitem $seltests {
    set testname [lindex $testitem 0]
    set testtype [lindex $testitem 1]
    set testfile [lindex $testitem 2]
    set objfile "tmpdir/[file rootname $testfile].o"
    set ldfile "tmpdir/[file rootname $testfile].x"
    set failed 0

    set ldargs [lindex $testitem 3]
    set mustsyms [lindex $testitem 4]
    set mustnotsyms [lindex $testitem 5]
    set xfails [lindex $testitem 6]

    foreach xfail_target $xfails {
	setup_xfail $xfail_target
    }
    setup_xfail "arc*-*" "d30v*-*" "dlx*-*" "i370*-*" "i860*-*"
    setup_xfail "i960*-*" "mn10200-*" "or32-*" "pj-*"

    # It's either C or C++ at the moment.
    if { $testtype == "C++" } {
	set testflags "$cflags $cxxflags"
	if [string match "*gcc*" [lindex $CC 0]] {
	    # Starting with 3.4.0, -fvtable-gc is no longer supported and thus
	    # the functionality we try to test for cannot be expected to work.
	    catch "exec -- $CC -dumpversion" version
	    if [regexp "^(\[1-9\]\[0-9\]+|\[4-9\]|3.(\[1-9\]\[0-9\]+|\[4-9\]))\\." $version] {
		setup_xfail {*-*-*}
	    }
	}
    } {
	set testflags "$cflags"
    }

    # Note that we do not actually *use* CXX; we just add cxxflags for C++
    # tests.  It might have been a buglet originally; now I think better
    # leave as is.
    if { ![ld_compile "$CC $testflags" $srcdir/$subdir/$testfile $objfile] } {
	unresolved $testname
	continue
    }

    # V850 targets need libgcc.a
    if [istarget v850*-*-elf] {
    	catch "exec $CC -print-libgcc-file-name" libgcc
	set objfile "$objfile $libgcc"
    }

    # ARM targets need libgcc.a in THUMB mode so that __call_via_r3 is provided
    if {[istarget arm-*-*] || [istarget xscale-*-*]} {
    	catch "exec $CC -print-libgcc-file-name" libgcc
	set objfile "$objfile $libgcc"
    }

    # HPPA linux targets need libgcc.a for millicode routines ($$dyncall).
    if [istarget hppa*-*-linux*] {
    	catch "exec $CC -print-libgcc-file-name" libgcc
	set objfile "$objfile $libgcc"
    }

    # m6811/m6812 code has references to soft registers.
    if {[istarget m6811-*-*] || [istarget m6812-*-*]} {
	set objfile "$objfile --defsym _.frame=0 --defsym _.d1=0"
	set objfile "$objfile --defsym _.d2=0"
    }

    if ![ld_simple_link $ld $ldfile "$ldflags [join $ldargs] $objfile"] {
	fail $testname
	continue
    }

    if ![ld_nm $nm --demangle $ldfile] {
	unresolved $testname
	continue
    }

    # Must make V2 demangled names look like V3
    foreach nm_output_key [array names nm_output] {
	if [regsub \\(void\\) $nm_output_key () new_nm_output_key] {
	    set nm_output($new_nm_output_key) nm_output($nm_output_key)
	}
    }

    # Check each mandated symbol and optionally mandated values.
    foreach mustsym $mustsyms {
	if { [llength [concat $mustsym]] == 1 } {
	    if { ![info exists nm_output($mustsym)] } {
		verbose -log "$testname: missing $mustsym"
		fail $testname
		set failed 1
		break
	    }
	} {
	    set mustsymname [lindex $mustsym 0]
	    set mustsymvalue [lindex $mustsym 1]
	    if { ![info exists nm_output($mustsymname)] } {
		verbose -log "$testname: missing $mustsymname"
		fail $testname
		set failed 1
		break
	    } {
		if { $nm_output($mustsymname) != $mustsymvalue } {
		    verbose -log "$testname: $mustsymname != $mustsymvalue"
		    verbose -log "is instead $nm_output($mustsymname)"
		    fail $testname
		    set failed 1
		    break
		}
	    }
	}
    }

    if { $failed != 0 } {
	continue
    }

    # Check each unwanted symbol, or that symbols do not have specific
    # values.
    foreach mustnotsym $mustnotsyms {
	if { [llength [concat $mustnotsym]] == 1 } {
	    if { [info exists nm_output($mustnotsym)] } {
		verbose -log "$testname: $mustnotsym == $nm_output($mustnotsym)"
		fail $testname
		set failed 1
		break
	    }
	} {
	    set mustnotsymname [lindex $mustnotsym 0]
	    set mustnotsymvalue [lindex $mustnotsym 1]
	    if { [info exists nm_output($mustnotsymname)] \
		    && $nm_output($mustnotsymname) == $mustnotsymvalue} {
		verbose -log "$testname: $mustnotsymname == $mustnotsymvalue"
		fail $testname
		set failed 1
		break
	    }
	}
    }

    if { $failed == 0 } {
	pass $testname
    }
}
