# Expect script for ld-gc tests
#   Copyright (C) 2008-2016 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"
run_dump_test "pr19167"
if { [is_elf_format] } then {
    run_dump_test "all-debug-sections"
}

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"
    }
    run_dump_test "pr18223"
}

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"
}

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

if { [is_elf_format] && [check_shared_lib_support] \
     && ([is_remote host] || [which $CC] != 0) } {
    run_cc_link_tests [list \
	[list \
	    "Build libpr20306.so" \
	    "-shared" \
	    "-fPIC" \
	    {pr20306.c} \
	    {} \
	    "libpr20306.so" \
	] \
    ]
    run_dump_test "pr20306"
}
