# 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} {mips*-*}}
  {selective3 C   2.c  {-u foo} {foo} {{foo 0}} {mips*-*}}
  {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 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
    }
}
