# Expect script for ld-gc tests
#   Copyright 2008, 2009, 2010, 2012
#   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.

# These tests require --gc-sections
if ![check_gc_sections_available] {
    return
}

set cflags "-ffunction-sections -fdata-sections"
set objfile "tmpdir/gc.o"

if [istarget powerpc64*-*-*] {
    # otherwise with -mcmodel=medium gcc we get XPASSes.
    set cflags "$cflags -mminimal-toc"
}

if { [istarget m681*-*-*] || [istarget m68hc1*-*-*] } {
    # Otherwise tests FAIL due to _.frame
    set cflags "$cflags -fomit-frame-pointer -mshort"
}

if { [is_remote host] || [which $CC] != 0 } {
    ld_compile "$CC -c $CFLAGS $cflags" $srcdir/$subdir/gc.c $objfile
}

proc test_gc { testname filename linker ldflags} {
    global nm
    global srcdir
    global subdir
    global nm_output
    global objfile

    if ![file readable $objfile ] {
	untested $testname
	return
    }

    set outfile "tmpdir/$filename"
    set options "-L$srcdir/$subdir"
    append options " " $ldflags " " [ld_simple_link_defsyms] " " $objfile

    # SH64 targets needs an extra ld option for this test.
    if [istarget sh64*-*-*] {
	if [istarget sh64*l*-*-*] {
	    set options "-mshlelf32 $options"
	} else {
	    set options "-mshelf32 $options"
	}
    }

    if ![ld_simple_link $linker $outfile $options] {
	fail $testname
	return
    }
    if ![ld_nm $nm "" $outfile] {
	unresolved $testname
	return
    }
    if {![info exists nm_output(used_func)] \
	    || ![info exists nm_output(used_var)]} {
	send_log "used sections do not exist\n"
	verbose "used sections do not exist"
	fail $testname
	return
    }
    #ppc64_elf_gc_mark_hook needs to be taught how to look through
    #the .toc section to properly mark variable sections for gc.
    setup_xfail "powerpc64*-*-*"
    if {[info exists nm_output(unused_func)] \
	    || [info exists nm_output(unused_var)]} {
	send_log "unused section still here\n"
	verbose "unused section still here"
	fail $testname
	return
    }
    pass $testname
}

test_gc "Check --gc-section" "gcexe" $ld "--gc-sections -e main"
test_gc "Check --gc-section/-q" "gcrexe" $ld "--gc-sections -q -e main"
test_gc "Check --gc-section/-r/-e" "gcrel" $ld "-r --gc-sections -e main"
test_gc "Check --gc-section/-r/-u" "gcrel" $ld "-r --gc-sections -u used_func"

run_dump_test "noent"
run_dump_test "abi-note"
run_dump_test "start"

if { [is_elf_format] && [check_shared_lib_support] } then {
    set gasopt ""
    if { [istarget tic6x-*] } then {
	set gasopt "-mpic -mpid=near"
    }
    if {![ld_assemble_flags $as $gasopt $srcdir/$subdir/libpersonality.s tmpdir/libpersonality.o]
	|| ![ld_simple_link $ld tmpdir/libpersonality.so "-shared tmpdir/libpersonality.o"] } then {
	fail libpersonality
    } else {
	run_dump_test "personality"
    }
}

if { [is_remote host] || [which $CC] != 0 } {
    if { [istarget "*-*-linux*"]
	 || [istarget "*-*-nacl*"]
	 || [istarget "*-*-gnu*"] } {
	ld_compile "$CC -fPIC $CFLAGS $cflags" $srcdir/$subdir/pr11218-1.c tmpdir/pr11218-1.o
	ld_simple_link $ld tmpdir/pr11218-1.so "-shared tmpdir/pr11218-1.o"
 	ld_compile "$CC -c $CFLAGS $cflags" $srcdir/$subdir/pr11218-2.c tmpdir/pr11218-2.o
	run_dump_test "pr11218"
    }
}

if { [is_remote host] || [which $CC] != 0 } {
	ld_compile "$CC $CFLAGS $cflags" $srcdir/$subdir/pr13683.c tmpdir/pr13683.o
	run_dump_test "pr13683"
}

if { [is_remote host] || [which $CC] != 0 } {
    ld_compile "$CC $CFLAGS $cflags" $srcdir/$subdir/pr14265.c tmpdir/pr14265.o
    run_dump_test "pr14265"
}
