1# Basic expect script for LD Regression Tests
2#   Copyright (C) 1993-2014 Free Software Foundation, Inc.
3#
4# This file is part of the GNU Binutils.
5#
6# This file 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# Written by Jeffrey Wheat (cassidy@cygnus.com)
22#
23
24if ![info exists ld] then {
25    set ld [findfile $base_dir/ld-new $base_dir/ld-new [transform ld]]
26}
27
28if ![info exists as] then {
29    set as [findfile $base_dir/../gas/as-new $base_dir/../gas/as-new [transform as]]
30}
31
32if ![info exists nm] then {
33    set nm [findfile $base_dir/../binutils/nm-new $base_dir/../binutils/nm-new [transform nm]]
34}
35
36if ![info exists objdump] then {
37    set objdump [findfile $base_dir/../binutils/objdump]
38}
39
40if ![info exists objcopy] then {
41    set objcopy [findfile $base_dir/../binutils/objcopy]
42}
43
44if ![info exists ar] then {
45    set ar [findfile $base_dir/../binutils/ar]
46}
47
48if ![info exists strip] then {
49    set strip [findfile $base_dir/../binutils/strip-new $base_dir/../binutils/strip-new [transform strip]]
50}
51
52remote_exec host "mkdir -p tmpdir"
53
54# Make symlinks from tmpdir/ld to the linker and assembler in the
55# build tree, so that we can use a -B option to gcc to force it to use
56# the newly built linker and assembler.
57if {![file isdirectory tmpdir/ld]} then {
58    catch "exec mkdir tmpdir/ld" status
59    catch "exec ln -s ../../ld-new tmpdir/ld/ld" status
60    catch "exec ln -s ld tmpdir/ld/collect-ld" status
61    catch "exec ln -s ../../../gas/as-new tmpdir/ld/as" status
62}
63set gcc_B_opt "-B[pwd]/tmpdir/ld/"
64
65# load the linker path
66set ld_L_opt ""
67if {[file exists tmpdir/libpath.exp]} {
68    load_lib tmpdir/libpath.exp
69
70    foreach dir $libpath {
71	append ld_L_opt " -L$dir"
72    }
73}
74
75# The "make check" target in the Makefile passes in
76# "CC=$(CC_FOR_TARGET)".  But, if the user invokes runtest directly
77# (as when testing an installed linker), these flags may not be set.
78if {![info exists CC]} {
79    set CC [find_gcc]
80}
81if {![info exists CFLAGS]} {
82    set CFLAGS "-g -O2"
83}
84if {![info exists CXX]} {
85    set CXX [find_g++]
86}
87if {![info exists CXXFLAGS]} {
88    set CXXFLAGS ""
89}
90
91# The mips64-*-linux-gnu compiler defaults to the N32 ABI after
92# installed, but to the O32 ABI in the build tree, because of some
93# specs-file hacks.  Make sure we use an ABI that is compatible with
94# the one we expect.
95if {[istarget mips64*-*-linux*] &&
96    (![board_info [target_info name] exists multilib_flags] ||
97     ![string match "*-mabi" [board_info [target_info name] multilib_flags]])
98   } {
99    append gcc_B_opt " -mabi=n32"
100}
101
102if { [istarget rx-*-*] } {
103    global ASFLAGS
104    set ASFLAGS "-muse-conventional-section-names"
105}
106
107# load the utility procedures
108load_lib ld-lib.exp
109
110proc get_link_files {varname} {
111    global $varname
112    global target_triplet
113    global srcdir
114    global CC
115    if ![info exists $varname] {
116	#configure.host returns variables that can be substituted into
117	#makefile rules, with embedded shell variable expansions.
118	#make wants $$shell_var, we want $shell_var ...
119	set cmd "host='$target_triplet' && . $srcdir/../configure.host && sed -e 's,\\\$\\\$,\$,g' <<EOF\n\$$varname\nEOF"
120	set status [catch "exec sh -c [list $cmd]" result]
121	if $status { error "Error getting native link files: $result" }
122	set cmd "CC='$CC' && eval echo \"$result\""
123	set status [catch "exec sh -c [list $cmd]" result]
124	if $status { error "Error getting native link files: $result" }
125	set $varname $result
126	send_log "$varname = $result\n"
127    }
128}
129
130proc get_target_emul {} {
131    global target_triplet
132    global srcdir
133    set status [catch "exec sh -c \"targ='$target_triplet' && . $srcdir/../configure.tgt && echo \\\$targ_emul\"" result]
134    if $status { error "Error getting emulation name: $result" }
135    return $result
136}
137
138if [isnative] {
139    foreach x {HOSTING_CRT0 HOSTING_SCRT0 HOSTING_LIBS HOSTING_SLIBS} {
140	get_link_files $x
141    }
142} else {
143    foreach x {HOSTING_CRT0 HOSTING_SCRT0 HOSTING_LIBS HOSTING_SLIBS} { set $x "" }
144}
145if ![info exists HOSTING_EMU] { set HOSTING_EMU "-m [get_target_emul]" }
146
147#
148# ld_version -- extract and print the version number of ld compiler (GCC)
149#
150proc ld_version {} {
151    global ld
152    default_ld_version $ld
153}
154
155#
156# ld_exit -- just a stub for ld
157#
158proc ld_exit {} {
159}
160
161#
162# ld_start
163#	relink the linker
164#
165proc ld_start { ld target } {
166	#
167}
168
169#
170# ld_relocate
171#	link an object using relocation
172#
173proc ld_relocate { ld target objects } {
174	default_ld_relocate $ld $target $objects
175}
176
177#
178# ld_link
179#	link a program using ld
180#
181proc ld_link { ld target objects } {
182	default_ld_link $ld $target $objects
183}
184
185#
186# ld_simple_link
187#	link a program using ld, without including any libraries
188#
189proc ld_simple_link { ld target objects } {
190	default_ld_simple_link $ld $target $objects
191}
192
193#
194# ld_compile
195#	compile an object using $cc
196#
197proc ld_compile { cc source object } {
198	default_ld_compile $cc $source $object
199}
200
201#
202# ld_assemble
203#	assemble a file
204#
205proc ld_assemble { as source object } {
206	default_ld_assemble $as "" $source $object
207}
208
209#
210# ld_assemble_flags
211#	assemble a file with extra flags
212#
213proc ld_assemble_flags { as flags source object } {
214	default_ld_assemble $as $flags $source $object
215}
216
217#
218# ld_nm
219#	run nm on a file
220#
221proc ld_nm { nm nmflags object } {
222	default_ld_nm $nm $nmflags $object
223}
224
225#
226# ld_exec
227#	execute ithe target
228#
229proc ld_exec { target output } {
230	default_ld_exec $target $output
231}
232
233# From gas-defs.exp, to support run_dump_test.
234if ![info exists AS] then {
235    set AS $as
236}
237
238if ![info exists ASFLAGS] then {
239    set ASFLAGS ""
240}
241
242if ![info exists OBJDUMP] then {
243    set OBJDUMP $objdump
244}
245
246if ![info exists OBJDUMPFLAGS] then {
247    set OBJDUMPFLAGS {}
248}
249
250if ![info exists NM] then {
251    set NM $nm
252}
253
254if ![info exists NMFLAGS] then {
255    set NMFLAGS {}
256}
257
258if ![info exists OBJCOPY] then {
259    set OBJCOPY $objcopy
260}
261
262if ![info exists OBJCOPYFLAGS] then {
263    set OBJCOPYFLAGS {}
264}
265
266if ![info exists READELF] then {
267    set READELF [findfile $base_dir/../binutils/readelf]
268}
269
270if ![info exists READELFFLAGS] then {
271    set READELFFLAGS {}
272}
273
274if ![info exists LD] then {
275    set LD [findfile $base_dir/ld-new ./ld-new [transform ld]]
276}
277
278if ![info exists LDFLAGS] then {
279    set LDFLAGS {}
280}
281