1# Expect script for ld-gc tests
2#   Copyright (C) 2008-2016 Free Software Foundation, Inc.
3#
4# This file is part of the GNU Binutils.
5#
6# This program is free software; you can redistribute it and/or modify
7# it under the terms of the GNU General Public License as published by
8# the Free Software Foundation; either version 3 of the License, or
9# (at your option) any later version.
10#
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY; without even the implied warranty of
13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14# GNU General Public License for more details.
15#
16# You should have received a copy of the GNU General Public License
17# along with this program; if not, write to the Free Software
18# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19# MA 02110-1301, USA.
20
21# These tests require --gc-sections
22if ![check_gc_sections_available] {
23    return
24}
25
26set cflags "-ffunction-sections -fdata-sections"
27set objfile "tmpdir/gc.o"
28
29if [istarget powerpc64*-*-*] {
30    # otherwise with -mcmodel=medium gcc we get XPASSes.
31    set cflags "$cflags -mminimal-toc"
32}
33
34if { [istarget m681*-*-*] || [istarget m68hc1*-*-*] } {
35    # Otherwise tests FAIL due to _.frame
36    set cflags "$cflags -fomit-frame-pointer -mshort"
37}
38
39if { [is_remote host] || [which $CC] != 0 } {
40    ld_compile "$CC -c $CFLAGS $cflags" $srcdir/$subdir/gc.c $objfile
41}
42
43proc test_gc { testname filename linker ldflags} {
44    global nm
45    global srcdir
46    global subdir
47    global nm_output
48    global objfile
49
50    if ![file readable $objfile ] {
51	untested $testname
52	return
53    }
54
55    set outfile "tmpdir/$filename"
56    set options "-L$srcdir/$subdir"
57    append options " " $ldflags " " [ld_simple_link_defsyms] " " $objfile
58
59    # SH64 targets needs an extra ld option for this test.
60    if [istarget sh64*-*-*] {
61	if [istarget sh64*l*-*-*] {
62	    set options "-mshlelf32 $options"
63	} else {
64	    set options "-mshelf32 $options"
65	}
66    }
67
68    if ![ld_simple_link $linker $outfile $options] {
69	fail $testname
70	return
71    }
72    if ![ld_nm $nm "" $outfile] {
73	unresolved $testname
74	return
75    }
76    if {![info exists nm_output(used_func)] \
77	    || ![info exists nm_output(used_var)]} {
78	send_log "used sections do not exist\n"
79	verbose "used sections do not exist"
80	fail $testname
81	return
82    }
83    #ppc64_elf_gc_mark_hook needs to be taught how to look through
84    #the .toc section to properly mark variable sections for gc.
85    setup_xfail "powerpc64*-*-*"
86    if {[info exists nm_output(unused_func)] \
87	    || [info exists nm_output(unused_var)]} {
88	send_log "unused section still here\n"
89	verbose "unused section still here"
90	fail $testname
91	return
92    }
93    pass $testname
94}
95
96test_gc "Check --gc-section" "gcexe" $ld "--gc-sections -e main"
97test_gc "Check --gc-section/-q" "gcrexe" $ld "--gc-sections -q -e main"
98test_gc "Check --gc-section/-r/-e" "gcrel" $ld "-r --gc-sections -e main"
99test_gc "Check --gc-section/-r/-u" "gcrel" $ld "-r --gc-sections -u used_func"
100
101run_dump_test "noent"
102run_dump_test "abi-note"
103run_dump_test "start"
104run_dump_test "pr19167"
105if { [is_elf_format] } then {
106    run_dump_test "all-debug-sections"
107}
108
109if { [is_elf_format] && [check_shared_lib_support] } then {
110    set gasopt ""
111    if { [istarget tic6x-*] } then {
112	set gasopt "-mpic -mpid=near"
113    }
114    if {![ld_assemble_flags $as $gasopt $srcdir/$subdir/libpersonality.s tmpdir/libpersonality.o]
115	|| ![ld_simple_link $ld tmpdir/libpersonality.so "-shared tmpdir/libpersonality.o"] } then {
116	fail libpersonality
117    } else {
118	run_dump_test "personality"
119    }
120    run_dump_test "pr18223"
121}
122
123if { [is_remote host] || [which $CC] != 0 } {
124    if { [istarget "*-*-linux*"]
125	 || [istarget "*-*-nacl*"]
126	 || [istarget "*-*-gnu*"] } {
127	ld_compile "$CC -fPIC $CFLAGS $cflags" $srcdir/$subdir/pr11218-1.c tmpdir/pr11218-1.o
128	ld_simple_link $ld tmpdir/pr11218-1.so "-shared tmpdir/pr11218-1.o"
129 	ld_compile "$CC -c $CFLAGS $cflags" $srcdir/$subdir/pr11218-2.c tmpdir/pr11218-2.o
130	run_dump_test "pr11218"
131    }
132}
133
134if { [is_remote host] || [which $CC] != 0 } {
135	ld_compile "$CC $CFLAGS $cflags" $srcdir/$subdir/pr13683.c tmpdir/pr13683.o
136	run_dump_test "pr13683"
137}
138
139if { [is_remote host] || [which $CC] != 0 } {
140    ld_compile "$CC $CFLAGS $cflags" $srcdir/$subdir/pr14265.c tmpdir/pr14265.o
141    run_dump_test "pr14265"
142}
143
144if { [is_remote host] || [which $CC] != 0 } {
145    ld_compile "$CC $CFLAGS $cflags -O0" $srcdir/$subdir/pr19161-1.c tmpdir/pr19161-1.o
146    ld_compile "$CC $CFLAGS $cflags -O0" $srcdir/$subdir/pr19161-2.c tmpdir/pr19161-2.o
147    run_dump_test "pr19161"
148}
149
150if { [is_elf_format] && [check_shared_lib_support] \
151     && ([is_remote host] || [which $CC] != 0) } {
152    run_cc_link_tests [list \
153	[list \
154	    "Build libpr20306.so" \
155	    "-shared" \
156	    "-fPIC" \
157	    {pr20306.c} \
158	    {} \
159	    "libpr20306.so" \
160	] \
161    ]
162    run_dump_test "pr20306"
163}
164