# Expect script for LD selective linking tests
#   Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 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.
#
# 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
}

# These targets do not support selective linking
if {[istarget "alpha*-*-*"] || [istarget "am33*-*-*"] ||
    [istarget "arc-*-*"] || [istarget "d30v-*-*"] ||
    [istarget "dlx-*-*"] || [istarget "hppa*64*-*-*"] ||
    [istarget "i370-*-*"] || [istarget "i860-*-*"] ||
    [istarget "i960-*-*"] || [istarget "ia64-*-*"] ||
    [istarget "m88*-*-*"] || [istarget "mn10200-*-*"] ||
    [istarget "mep-*-*"] || [istarget "or32-*-*"] ||
    [istarget "pj*-*-*"]} {
    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 { ![is_remote host] && [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"
	set compiler "$CXX"
	# 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.
	set version [remote_exec host "$CXX -dumpversion"]
	set version [lindex $version 1]
	if [regexp "^(\[1-9\]\[0-9\]+|\[4-9\]|3.(\[1-9\]\[0-9\]+|\[4-9\]))\\." $version] {
	    setup_xfail {*-*-*}
	}
    } else {
	set testflags "$cflags"
	set compiler "$CC"
    }

    # 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 "$compiler $testflags" $srcdir/$subdir/$testfile $objfile] } {
	unresolved $testname
	continue
    }

    # V850 targets need libgcc.a
    if [istarget v850*-*-elf] {
	set libgcc [remote_exec host "$compiler -print-libgcc-file-name"]
	set libgcc [lindex $libgcc 1]
	regsub -all "\[\r\n\]" $libgcc "" 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-*-*]} {
	set libgcc [remote_exec host "$compiler -print-libgcc-file-name"]
	set libgcc [lindex $libgcc 1]
	regsub -all "\[\r\n\]" $libgcc "" libgcc
	set objfile "$objfile $libgcc"
    }

    # HPPA linux targets need libgcc.a for millicode routines ($$dyncall).
    if [istarget hppa*-*-linux*] {
	set libgcc [remote_exec host "$compiler -print-libgcc-file-name"]
	set libgcc [lindex $libgcc 1]
	regsub -all "\[\r\n\]" $libgcc "" 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
    }
}
