Re: Enable --build-id for moxie-elf-ld
[deliverable/binutils-gdb.git] / ld / testsuite / lib / ld-lib.exp
CommitLineData
a2b64bed 1# Support routines for LD testsuite.
82704155 2# Copyright (C) 1994-2019 Free Software Foundation, Inc.
a2b64bed 3#
f96b4a7b
NC
4# This file is part of the GNU Binutils.
5#
a2b64bed
NC
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
f96b4a7b 8# the Free Software Foundation; either version 3 of the License, or
a2b64bed 9# (at your option) any later version.
3e8cba19 10#
a2b64bed
NC
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.
3e8cba19 15#
a2b64bed
NC
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
f96b4a7b
NC
18# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19# MA 02110-1301, USA.
3b6fe0cc 20
f3097f33
RS
21proc load_common_lib { name } {
22 global srcdir
23 load_file $srcdir/../../binutils/testsuite/lib/$name
24}
25
26load_common_lib binutils-common.exp
27
fb35d3d8
DD
28# Returns 1 if the gcc for the target is at least version MAJOR.MINOR
29# Returns 0 otherwise.
30#
31proc at_least_gcc_version { major minor } {
68bce020 32 global CC
5a68afcf 33
fb35d3d8
DD
34 if {![info exists CC]} {
35 set CC [find_gcc]
36 }
37 if { $CC == "" } {
8be1e369 38 return 0
fb35d3d8
DD
39 }
40 set state [remote_exec host $CC --version]
8be1e369
AM
41 if { [lindex $state 0] != 0 } {
42 return 0;
43 }
fb35d3d8
DD
44 set tmp "[lindex $state 1]\n"
45 # Look for (eg) 4.6.1 in the version output.
8b5b2228
MR
46 set ver_re "\[^\\.0-9\]+(\[1-9\]\[0-9\]*)\\.(\[0-9\]+)(?:\\.\[0-9\]+)?"
47 regexp $ver_re $tmp fred maj min
fb35d3d8 48 verbose "gcc version: $tmp"
8b5b2228
MR
49 if { ![info exists maj] || ![info exists min] } then {
50 perror "can't decipher gcc version number, fix the framework!"
51 return 0
52 }
fb35d3d8
DD
53 verbose "major gcc version is $maj, want at least $major"
54 if { $maj == $major } then {
55 verbose "minor gcc version is $min, want at least $minor"
8b5b2228 56 return [expr $min >= $minor]
fb35d3d8 57 } else {
8b5b2228 58 return [expr $maj > $major]
fb35d3d8
DD
59 }
60}
61
3b6fe0cc 62# Extract and print the version number of ld.
252b5132
RH
63#
64proc default_ld_version { ld } {
65 global host_triplet
66
7f6a71ff 67 if { ![is_remote host] && [which $ld] == 0 } then {
252b5132
RH
68 perror "$ld does not exist"
69 exit 1
70 }
3e8cba19 71
7f6a71ff
JM
72 remote_exec host "$ld --version" "" "/dev/null" "ld.version"
73 remote_upload host "ld.version"
74 set tmp [prune_warnings [file_contents "ld.version"]]
75 remote_file build delete "ld.version"
76 remote_file host delete "ld.version"
77
252b5132
RH
78 regexp "\[^\n\]* (cygnus-|)(\[-0-9.a-zA-Z-\]+)\[\r\n\].*" $tmp version cyg number
79 if [info exists number] then {
80 clone_output "$ld $number\n"
81 }
82}
83
7f6a71ff
JM
84proc run_host_cmd { prog command } {
85 global link_output
f1d7f4a6
AM
86 global gcc_B_opt
87 global ld_L_opt
5a8edf8e
AM
88 global gcc_ld_B_opt_tested
89 global ld
3e8cba19 90
7f6a71ff
JM
91 if { ![is_remote host] && [which "$prog"] == 0 } then {
92 perror "$prog does not exist"
252b5132
RH
93 return 0
94 }
3e8cba19 95
f1d7f4a6
AM
96 # If we are compiling with gcc, we want to add gcc_B_opt and
97 # ld_L_opt to flags. However, if $prog already has -B options,
98 # which might be the case when running gcc out of a build
99 # directory, we want our -B options to come first.
100 set gccexe $prog
101 set gccparm [string first " " $gccexe]
102 set gccflags ""
103 if { $gccparm > 0 } then {
104 set gccflags [string range $gccexe $gccparm end]
105 set gccexe [string range $gccexe 0 $gccparm]
106 set prog $gccexe
107 }
108 set gccexe [string replace $gccexe 0 [string last "/" $gccexe] ""]
109 if {[string match "*cc*" $gccexe] || [string match "*++*" $gccexe]} then {
110 set gccflags "$gcc_B_opt $gccflags $ld_L_opt"
5a8edf8e
AM
111 if {![info exists gcc_ld_B_opt_tested]} {
112 set gcc_ld_B_opt_tested 1
113 set ld_version_message [run_host_cmd "$ld" "--version"]
114 set gcc_ld_version_message [run_host_cmd "$prog" "$gccflags -Wl,--version"]
115 if {[string first $ld_version_message $gcc_ld_version_message] < 0} {
116 perror "************************************************************************"
117 perror "Your compiler driver ignores -B when choosing ld."
118 perror "You will not be testing the new ld in many of the following tests."
119 set gcc_ld_version [run_host_cmd "$prog" "$gccflags --print-prog-name=ld"]
120 if {![string match "" $gcc_ld_version] && ![string match "ld" $gcc_ld_version]} {
121
122 perror "It seems you will be testing $gcc_ld_version instead."
123 }
124 perror "************************************************************************"
125 }
126 }
f1d7f4a6
AM
127 }
128
129 verbose -log "$prog $gccflags $command"
130 set status [remote_exec host [concat sh -c [list "$prog $gccflags $command 2>&1"]] "" "/dev/null" "ld.tmp"]
7f6a71ff
JM
131 remote_upload host "ld.tmp"
132 set link_output [file_contents "ld.tmp"]
133 regsub "\n$" $link_output "" link_output
134 if { [lindex $status 0] != 0 && [string match "" $link_output] } then {
135 append link_output "child process exited abnormally"
136 }
137 remote_file build delete ld.tmp
138 remote_file host delete ld.tmp
fab4a87f 139
7f6a71ff
JM
140 if [string match "" $link_output] then {
141 return ""
142 }
3e8cba19 143
7f6a71ff
JM
144 verbose -log "$link_output"
145 return "$link_output"
146}
147
148proc run_host_cmd_yesno { prog command } {
149 global exec_output
d76b6207 150 global errcnt warncnt
7f6a71ff
JM
151
152 set exec_output [prune_warnings [run_host_cmd "$prog" "$command"]]
d76b6207
L
153 # Ignore error and warning.
154 set errcnt 0
155 set warncnt 0
252b5132 156 if [string match "" $exec_output] then {
7f6a71ff 157 return 1;
252b5132 158 }
7f6a71ff
JM
159 return 0;
160}
161
162# Link an object using relocation.
163#
164proc default_ld_relocate { ld target objects } {
165 global HOSTING_EMU
166
167 remote_file host delete $target
168 return [run_host_cmd_yesno "$ld" "$HOSTING_EMU -o $target -r $objects"]
252b5132
RH
169}
170
1688b748 171# Check to see if ld is being invoked with a non-endian output format
3b6fe0cc 172#
1688b748
MH
173proc is_endian_output_format { object_flags } {
174
175 if {[string match "*-oformat binary*" $object_flags] || \
176 [string match "*-oformat ieee*" $object_flags] || \
177 [string match "*-oformat ihex*" $object_flags] || \
178 [string match "*-oformat netbsd-core*" $object_flags] || \
179 [string match "*-oformat srec*" $object_flags] || \
180 [string match "*-oformat tekhex*" $object_flags] || \
181 [string match "*-oformat trad-core*" $object_flags] } then {
182 return 0
183 } else {
184 return 1
185 }
186}
187
d9816402 188# Link a program using ld
252b5132
RH
189#
190proc default_ld_link { ld target objects } {
252b5132 191 global host_triplet
fab4a87f 192 global exec_output
7cda33a1 193
f1d7f4a6 194 set flags ""
1688b748
MH
195 if [is_endian_output_format $objects] then {
196 set flags [big_or_little_endian]
b765d4e3
L
197 }
198
7f6a71ff 199 remote_file host delete $target
f1d7f4a6 200 set exec_output [run_host_cmd "$ld" "$flags -o $target $objects"]
7f6a71ff 201 set exec_output [prune_warnings $exec_output]
252b5132
RH
202
203 # We don't care if we get a warning about a non-existent start
204 # symbol, since the default linker script might use ENTRY.
205 regsub -all "(^|\n)(\[^\n\]*: warning: cannot find entry symbol\[^\n\]*\n?)" $exec_output "\\1" exec_output
206
f1d7f4a6 207 return [string match "" $exec_output]
252b5132
RH
208}
209
3b6fe0cc 210# Compile an object using cc.
252b5132
RH
211#
212proc default_ld_compile { cc source object } {
213 global CFLAGS
58ffc3bd 214 global CXXFLAGS
252b5132
RH
215 global srcdir
216 global subdir
217 global host_triplet
f1d7f4a6 218 global gcc_B_opt
252b5132
RH
219
220 set cc_prog $cc
221 if {[llength $cc_prog] > 1} then {
222 set cc_prog [lindex $cc_prog 0]
223 }
7f6a71ff 224 if {![is_remote host] && [which $cc_prog] == 0} then {
252b5132
RH
225 perror "$cc_prog does not exist"
226 return 0
227 }
228
7f6a71ff
JM
229 remote_file build delete "$object"
230 remote_file host delete "$object"
252b5132 231
f1d7f4a6 232 set flags "$gcc_B_opt -I$srcdir/$subdir"
252b5132 233
f1d7f4a6
AM
234 # If we are compiling with gcc, we want to add gcc_B_opt to flags.
235 # However, if $prog already has -B options, which might be the
236 # case when running gcc out of a build directory, we want our -B
237 # options to come first.
b0fe1bf3
AM
238 set ccexe $cc
239 set ccparm [string first " " $cc]
dec20c9e 240 set ccflags ""
b0fe1bf3 241 if { $ccparm > 0 } then {
dec20c9e 242 set ccflags [string range $cc $ccparm end]
b0fe1bf3 243 set ccexe [string range $cc 0 $ccparm]
dec20c9e 244 set cc $ccexe
b0fe1bf3 245 }
252b5132 246
f1d7f4a6 247 set ccexe [string replace $ccexe 0 [string last "/" $ccexe] ""]
58ffc3bd 248 if {[string match "*++*" $ccexe]} {
f1d7f4a6 249 append flags " $CXXFLAGS"
58ffc3bd 250 } else {
f1d7f4a6 251 append flags " $CFLAGS"
58ffc3bd
MF
252 }
253
3046b3d3
VP
254 if [board_info [target_info name] exists cflags] {
255 append flags " [board_info [target_info name] cflags]"
256 }
257
38e31547 258 if [board_info [target_info name] exists multilib_flags] {
b24f926d 259 append flags " [board_info [target_info name] multilib_flags]"
38e31547
NC
260 }
261
f1d7f4a6
AM
262 set cmd "$cc $flags $ccflags -c $source -o $object"
263 verbose -log "$cmd"
252b5132 264
f1d7f4a6 265 set status [remote_exec host [concat sh -c [list "$cmd 2>&1"]] "" "/dev/null" "ld.tmp"]
7f6a71ff
JM
266 remote_upload host "ld.tmp"
267 set exec_output [file_contents "ld.tmp"]
268 remote_file build delete "ld.tmp"
269 remote_file host delete "ld.tmp"
252b5132 270 set exec_output [prune_warnings $exec_output]
6f9dbcd4
AM
271 # Versions of gcc up to and including pre-release gcc-7, at least on
272 # some targets, generate .section directives with incorrect type.
273 # Ignore warnings from the assembler about this.
274 regsub -all "(^|\n)\[^\n\]*: ignoring incorrect section type \[^\n\]*" $exec_output "" exec_output
275 regsub -all "^\[^\n\]*: Assembler messages:\n" $exec_output "" exec_output
252b5132
RH
276 if [string match "" $exec_output] then {
277 if {![file exists $object]} then {
278 regexp ".*/(\[^/\]*)$" $source all dobj
279 regsub "\\.c" $dobj ".o" realobj
280 verbose "looking for $realobj"
7f6a71ff 281 if {[remote_file host exists $realobj]} then {
252b5132 282 verbose -log "mv $realobj $object"
7f6a71ff 283 remote_upload "$realobj" "$object"
252b5132
RH
284 } else {
285 perror "$object not found after compilation"
286 return 0
287 }
288 }
289 return 1
290 } else {
291 verbose -log "$exec_output"
292 perror "$source: compilation failed"
293 return 0
294 }
295}
296
3b6fe0cc 297# Assemble a file.
252b5132 298#
de1491f0 299proc default_ld_assemble { as in_flags source object } {
252b5132
RH
300 global ASFLAGS
301 global host_triplet
690f47bf
RS
302 global srcdir
303 global subdir
3e8cba19 304
252b5132
RH
305 if ![info exists ASFLAGS] { set ASFLAGS "" }
306
690f47bf 307 set flags "[big_or_little_endian] -I$srcdir/$subdir"
de1491f0 308 set exec_output [run_host_cmd "$as" "$flags $in_flags $ASFLAGS -o $object $source"]
252b5132
RH
309 set exec_output [prune_warnings $exec_output]
310 if [string match "" $exec_output] then {
311 return 1
312 } else {
252b5132
RH
313 perror "$source: assembly failed"
314 return 0
315 }
316}
317
3b6fe0cc 318# Run nm on a file, putting the result in the array nm_output.
252b5132 319#
992c450d 320proc default_ld_nm { nm nmflags object } {
252b5132
RH
321 global NMFLAGS
322 global nm_output
323 global host_triplet
324
77e0b0ef
ILT
325 if {[info exists nm_output]} {
326 unset nm_output
327 }
328
252b5132
RH
329 if ![info exists NMFLAGS] { set NMFLAGS "" }
330
3e8cba19
AM
331 # Ensure consistent sorting of symbols
332 if {[info exists env(LC_ALL)]} {
333 set old_lc_all $env(LC_ALL)
334 }
335 set env(LC_ALL) "C"
7f6a71ff 336
992c450d 337 verbose -log "$nm $NMFLAGS $nmflags $object >tmpdir/nm.out"
252b5132 338
7f6a71ff 339 set status [remote_exec host [concat sh -c [list "$nm $NMFLAGS $nmflags $object 2>ld.stderr"]] "" "/dev/null" "tmpdir/nm.out"]
3e8cba19
AM
340 if {[info exists old_lc_all]} {
341 set env(LC_ALL) $old_lc_all
342 } else {
343 unset env(LC_ALL)
344 }
7f6a71ff
JM
345 remote_upload host "ld.stderr"
346 remote_upload host "tmpdir/nm.out" "tmpdir/nm.out"
347 set exec_output [prune_warnings [file_contents "ld.stderr"]]
348 remote_file host delete "ld.stderr"
349 remote_file build delete "ld.stderr"
252b5132
RH
350 if [string match "" $exec_output] then {
351 set file [open tmpdir/nm.out r]
352 while { [gets $file line] != -1 } {
353 verbose "$line" 2
dbc37f89 354 if [regexp "^(\[0-9a-fA-F\]+) \[a-zA-Z0-9\] \\.*(.+)$" $line whole value name] {
252b5132
RH
355 set name [string trimleft $name "_"]
356 verbose "Setting nm_output($name) to 0x$value" 2
357 set nm_output($name) 0x$value
358 }
359 }
360 close $file
361 return 1
362 } else {
363 verbose -log "$exec_output"
364 perror "$object: nm failed"
365 return 0
366 }
367}
368
1b662205
AM
369# Define various symbols needed when not linking against all
370# target libs.
d9816402 371proc ld_link_defsyms {} {
1b662205
AM
372
373 set flags "--defsym __stack_chk_fail=0"
374
375 # ARM targets call __gccmain
8c5fc800 376 if {[istarget arm*-*-*]} {
1b662205
AM
377 append flags " --defsym __gccmain=0"
378 }
379
5a1431e6 380 # Windows targets need __main, some prefixed with underscore.
36fe835f 381 if {[istarget *-*-cygwin* ] || [istarget *-*-mingw*]} {
5a1431e6 382 append flags " --defsym __main=0 --defsym ___main=0"
36fe835f
DK
383 }
384
1b662205
AM
385 # PowerPC EABI code calls __eabi.
386 if {[istarget powerpc*-*-eabi*] || [istarget powerpc*-*-rtems*]} {
387 append flags " --defsym __eabi=0"
388 }
389
390 # mn10200 code calls __truncsipsi2_d0_d2.
391 if {[istarget mn10200*-*-*]} then {
392 append flags " --defsym __truncsipsi2_d0_d2=0"
393 }
394
395 # m6811/m6812 code has references to soft registers.
32d79e68 396 if {[istarget m6811-*-*] || [istarget m6812-*-*] || [istarget m68hc1*-*-*]} {
1b662205
AM
397 append flags " --defsym _.frame=0 --defsym _.d1=0 --defsym _.d2=0"
398 append flags " --defsym _.d3=0 --defsym _.d4=0"
399 append flags " --defsym _.tmp=0 --defsym _.xy=0 --defsym _.z=0"
400 }
401
402 # Some OpenBSD targets have ProPolice and reference __guard and
403 # __stack_smash_handler.
404 if [istarget *-*-openbsd*] {
405 append flags " --defsym __guard=0"
406 append flags " --defsym __stack_smash_handler=0"
407 }
408
409 return $flags
410}
411
d8880531
L
412# Create an archive using ar
413#
fa0a16b1 414proc ar_simple_create { ar aropts target objects } {
d8880531
L
415 remote_file host delete $target
416
1a215085 417 set exec_output [run_host_cmd "$ar" "-rc $aropts $target $objects"]
d8880531
L
418 set exec_output [prune_warnings $exec_output]
419
420 if [string match "" $exec_output] then {
421 send_log "$exec_output\n"
422 return 1
423 } else {
424 return 0
425 }
426}
427
9147e853
JJ
428# List contains test-items with 3 items followed by 2 lists, one item and
429# one optional item:
894891db 430# 0:name
897aea50
MR
431# 1:ld/ar leading options, placed before object files
432# 2:ld/ar trailing options, placed after object files
433# 3:assembler options
434# 4:filenames of assembler files
435# 5:list of actions, options and expected outputs.
436# 6:name of output file
437# 7:compiler flags (optional)
3b6fe0cc 438#
894891db
NC
439# Actions: { command command-line-options file-containg-expected-output-regexps }
440# Commands:
441# objdump: Apply objdump options on result.
442# nm: Apply nm options on result.
443# readelf: Apply readelf options on result.
5a68afcf 444# ld: Don't apply anything on result. Compare output during linking with
894891db
NC
445# the file containing regexps (which is the second arg, not the third).
446# Note that this *must* be the first action if it is to be used at all;
447# in all other cases, any output from the linker during linking is
448# treated as a sign of an error and FAILs the test.
3b6fe0cc 449#
5df1bc57
AM
450# args is an optional list of target triplets to be xfailed.
451#
452proc run_ld_link_tests { ldtests args } {
bffbf940
JJ
453 global ld
454 global as
455 global nm
d8880531 456 global ar
bffbf940
JJ
457 global objdump
458 global READELF
459 global srcdir
460 global subdir
461 global env
9147e853
JJ
462 global CC
463 global CFLAGS
eca41774 464 global runtests
5d3236ee 465 global exec_output
647e4d46
L
466 global ld_elf_shared_opt
467
468 if { [is_elf_format] && [check_shared_lib_support] } {
469 set ld_extra_opt "$ld_elf_shared_opt"
470 } else {
471 set ld_extra_opt ""
472 }
bffbf940
JJ
473
474 foreach testitem $ldtests {
475 set testname [lindex $testitem 0]
eca41774
DK
476
477 if ![runtest_file_p $runtests $testname] then {
478 continue
479 }
480
5df1bc57 481 foreach target $args {
1336939d
AM
482 if [match_target $target] {
483 setup_xfail "*-*-*"
484 break
485 }
5df1bc57
AM
486 }
487
bffbf940 488 set ld_options [lindex $testitem 1]
897aea50
MR
489 set ld_after [lindex $testitem 2]
490 set as_options [lindex $testitem 3]
491 set src_files [lindex $testitem 4]
492 set actions [lindex $testitem 5]
493 set binfile tmpdir/[lindex $testitem 6]
494 set cflags [lindex $testitem 7]
bffbf940
JJ
495 set objfiles {}
496 set is_unresolved 0
497 set failed 0
5d3236ee
DK
498 set maybe_failed 0
499 set ld_output ""
bffbf940
JJ
500
501# verbose -log "Testname is $testname"
502# verbose -log "ld_options is $ld_options"
897aea50 503# verbose -log "ld_after is $ld_after"
bffbf940 504# verbose -log "as_options is $as_options"
9147e853 505# verbose -log "src_files is $src_files"
bffbf940
JJ
506# verbose -log "actions is $actions"
507# verbose -log "binfile is $binfile"
508
509 # Assemble each file in the test.
9147e853 510 foreach src_file $src_files {
74d44110
MR
511 set fileroot "[file rootname [file tail $src_file]]"
512 set objfile "tmpdir/$fileroot.o"
bffbf940
JJ
513 lappend objfiles $objfile
514
9147e853 515 if { [file extension $src_file] == ".c" } {
74d44110 516 set as_file "tmpdir/$fileroot.s"
9147e853
JJ
517 if ![ld_compile "$CC -S $CFLAGS $cflags" $srcdir/$subdir/$src_file $as_file] {
518 set is_unresolved 1
519 break
520 }
521 } else {
522 set as_file "$srcdir/$subdir/$src_file"
523 }
524 if ![ld_assemble $as "$as_options $as_file" $objfile] {
bffbf940
JJ
525 set is_unresolved 1
526 break
527 }
528 }
529
530 # Catch assembler errors.
77c56f44 531 if { $is_unresolved } {
bffbf940
JJ
532 unresolved $testname
533 continue
534 }
535
abc868c6
AM
536 if { $binfile eq "tmpdir/" } {
537 # compile only
538 } elseif { [regexp ".*\\.a$" $binfile] } {
897aea50 539 if { ![ar_simple_create $ar $ld_options $binfile "$objfiles $ld_after"] } {
d8880531 540 set failed 1
d8880531 541 }
d9816402 542 } elseif { ![ld_link $ld $binfile "$ld_extra_opt -L$srcdir/$subdir $ld_options $objfiles $ld_after"] } {
5d3236ee
DK
543 set maybe_failed 1
544 set ld_output "$exec_output"
d8880531
L
545 }
546
77c56f44 547 if { !$failed } {
bffbf940
JJ
548 foreach actionlist $actions {
549 set action [lindex $actionlist 0]
550 set progopts [lindex $actionlist 1]
551
552 # There are actions where we run regexp_diff on the
553 # output, and there are other actions (presumably).
554 # Handling of the former look the same.
555 set dump_prog ""
556 switch -- $action {
557 objdump
558 { set dump_prog $objdump }
559 nm
560 { set dump_prog $nm }
561 readelf
562 { set dump_prog $READELF }
5d3236ee
DK
563 ld
564 { set dump_prog "ld" }
bffbf940
JJ
565 default
566 {
567 perror "Unrecognized action $action"
568 set is_unresolved 1
569 break
570 }
571 }
572
5d3236ee 573 if { $action == "ld" } {
894891db
NC
574 set regexpfile $progopts
575 verbose "regexpfile is $srcdir/$subdir/$regexpfile"
5d3236ee
DK
576 set_file_contents "tmpdir/ld.messages" "$ld_output"
577 verbose "ld.messages has '[file_contents tmpdir/ld.messages]'"
894891db 578 if { [regexp_diff "tmpdir/ld.messages" "$srcdir/$subdir/$regexpfile"] } then {
5d3236ee
DK
579 verbose "output is $ld_output" 2
580 set failed 1
581 break
582 }
583 set maybe_failed 0
77c56f44 584 } elseif { !$maybe_failed && $dump_prog != "" } {
bffbf940
JJ
585 set dumpfile [lindex $actionlist 2]
586 set binary $dump_prog
587
588 # Ensure consistent sorting of symbols
589 if {[info exists env(LC_ALL)]} {
590 set old_lc_all $env(LC_ALL)
591 }
592 set env(LC_ALL) "C"
7f6a71ff
JM
593 set cmd "$binary $progopts $binfile"
594 set status [remote_exec host [concat sh -c [list "$cmd >dump.out 2>ld.stderr"]] "" "/dev/null"]
bffbf940 595 send_log "$cmd\n"
7f6a71ff
JM
596 remote_upload host "ld.stderr"
597 set comp_output [prune_warnings [file_contents "ld.stderr"]]
598 remote_file host delete "ld.stderr"
599 remote_file build delete "ld.stderr"
5a68afcf 600
bffbf940
JJ
601 if {[info exists old_lc_all]} {
602 set env(LC_ALL) $old_lc_all
603 } else {
604 unset env(LC_ALL)
605 }
bffbf940
JJ
606
607 if ![string match "" $comp_output] then {
608 send_log "$comp_output\n"
609 set failed 1
610 break
611 }
612
7f6a71ff
JM
613 remote_upload host "dump.out"
614
bffbf940
JJ
615 if { [regexp_diff "dump.out" "$srcdir/$subdir/$dumpfile"] } then {
616 verbose "output is [file_contents "dump.out"]" 2
617 set failed 1
7f6a71ff
JM
618 remote_file build delete "dump.out"
619 remote_file host delete "dump.out"
bffbf940
JJ
620 break
621 }
7f6a71ff
JM
622 remote_file build delete "dump.out"
623 remote_file host delete "dump.out"
bffbf940
JJ
624 }
625 }
bffbf940
JJ
626 }
627
77c56f44 628 if { $is_unresolved } {
bffbf940 629 unresolved $testname
77c56f44
RS
630 } elseif { $maybe_failed || $failed } {
631 fail $testname
632 } else {
633 pass $testname
bffbf940
JJ
634 }
635 }
636}
637
c8c140d9 638# ldtests contains test-items with 3 items followed by 1 lists, 2 items
fab4a87f 639# and 3 optional items:
c8c140d9 640# 0:name
fef75122 641# 1:ld leading options, placed before object files
c8c140d9 642# 2:assembler options
55255dae 643# 3:filenames of source files
c8c140d9
BE
644# 4:name of output file
645# 5:expected output
646# 6:compiler flags (optional)
55255dae 647# 7:language (optional)
fab4a87f 648# 8:linker warning (optional)
fef75122 649# 9:ld trailing options, placed after object files (optional)
982c6f26 650# args is an optional list of target triplets to be xfailed.
c8c140d9 651
982c6f26 652proc run_ld_link_exec_tests { ldtests args } {
24edc24d
L
653 global ld
654 global as
655 global srcdir
656 global subdir
657 global env
658 global CC
55255dae 659 global CXX
24edc24d 660 global CFLAGS
58ffc3bd 661 global CXXFLAGS
22ec3bd1 662 global errcnt
fab4a87f 663 global exec_output
9966f7ee 664 global board_cflags
98d72909 665 global STATIC_LDFLAGS
9966f7ee
JW
666
667 # When using GCC as the linker driver, we need to specify board cflags when
668 # linking because cflags may contain linker options. For example when
669 # linker options are included in GCC spec files then we need the -specs
670 # option.
671 if [board_info [target_info name] exists cflags] {
672 set board_cflags " [board_info [target_info name] cflags]"
673 } else {
674 set board_cflags ""
675 }
24edc24d
L
676
677 foreach testitem $ldtests {
678 set testname [lindex $testitem 0]
679 set ld_options [lindex $testitem 1]
680 set as_options [lindex $testitem 2]
681 set src_files [lindex $testitem 3]
682 set binfile tmpdir/[lindex $testitem 4]
683 set expfile [lindex $testitem 5]
684 set cflags [lindex $testitem 6]
55255dae 685 set lang [lindex $testitem 7]
fab4a87f 686 set warning [lindex $testitem 8]
fef75122 687 set ld_after [lindex $testitem 9]
24edc24d 688 set objfiles {}
24edc24d
L
689 set failed 0
690
44ed8092
SL
691 if { ![check_compiler_available] } {
692 unsupported $testname
693 continue
694 }
695
1336939d
AM
696 foreach target $args {
697 if [match_target $target] {
698 setup_xfail "*-*-*"
699 break
700 }
701 }
702
24edc24d
L
703# verbose -log "Testname is $testname"
704# verbose -log "ld_options is $ld_options"
705# verbose -log "as_options is $as_options"
706# verbose -log "src_files is $src_files"
24edc24d
L
707# verbose -log "binfile is $binfile"
708
709 # Assemble each file in the test.
710 foreach src_file $src_files {
74d44110
MR
711 set fileroot "[file rootname [file tail $src_file]]"
712 set objfile "tmpdir/$fileroot.o"
24edc24d
L
713 lappend objfiles $objfile
714
58ffc3bd 715 if { [ string match "c++" $lang ] } {
a44d0bd7 716 set cmd "$CXX -c $CXXFLAGS $cflags"
58ffc3bd 717 } else {
a44d0bd7 718 set cmd "$CC -c $CFLAGS $cflags"
58ffc3bd 719 }
a44d0bd7
AM
720 if ![ld_compile $cmd $srcdir/$subdir/$src_file $objfile] {
721 set failed 1
722 break
723 }
724 }
725 if { $failed != 0 } {
726 unresolved $testname
727 continue
cb5ab6c8 728 }
a10e6b21 729
241e64e3
L
730 if { [ string match "asm" $lang ] } {
731 set link_proc ld_link
732 set link_cmd $ld
733 } elseif { [ string match "c++" $lang ] } {
d9816402 734 set link_proc ld_link
cb5ab6c8 735 set link_cmd $CXX
cb5ab6c8
L
736 } else {
737 set link_proc ld_link
d9816402 738 set link_cmd $CC
cb5ab6c8 739 }
24edc24d 740
abc868c6
AM
741 if { $binfile eq "tmpdir/" } {
742 # compile only
743 pass $testname
744 continue;
98d72909
L
745 } else {
746 if { [string match "" $STATIC_LDFLAGS] \
747 && [regexp -- ".* \[-\]+static .*" " $board_cflags $ld_options $objfiles $ld_after "] } {
748 untested $testname
749 continue
750 }
751 if ![$link_proc $link_cmd $binfile "$board_cflags -L$srcdir/$subdir $ld_options $objfiles $ld_after"] {
752 set failed 1
753 }
cb5ab6c8
L
754 }
755
756 # Check if exec_output is expected.
757 if { $warning != "" } then {
758 verbose -log "returned with: <$exec_output>, expected: <$warning>"
759 if { [regexp $warning $exec_output] } then {
a10e6b21 760 set failed 0
cb5ab6c8
L
761 } else {
762 set failed 1
fab4a87f 763 }
cb5ab6c8 764 }
fab4a87f 765
d9816402 766 if { $failed == 0 && [isnative] } {
cb5ab6c8
L
767 send_log "Running: $binfile > $binfile.out\n"
768 verbose "Running: $binfile > $binfile.out"
769 catch "exec $binfile > $binfile.out" exec_output
fab4a87f 770
cb5ab6c8
L
771 if ![string match "" $exec_output] then {
772 send_log "$exec_output\n"
773 verbose "$exec_output" 1
774 set failed 1
775 } else {
776 send_log "diff $binfile.out $srcdir/$subdir/$expfile\n"
777 verbose "diff $binfile.out $srcdir/$subdir/$expfile"
778 catch "exec diff $binfile.out $srcdir/$subdir/$expfile" exec_output
779 set exec_output [prune_warnings $exec_output]
5a68afcf 780
24edc24d
L
781 if ![string match "" $exec_output] then {
782 send_log "$exec_output\n"
783 verbose "$exec_output" 1
784 set failed 1
785 }
786 }
cb5ab6c8 787 }
24edc24d 788
cb5ab6c8
L
789 if { $failed != 0 } {
790 fail $testname
d9816402
AM
791 } elseif ![isnative] {
792 unsupported $testname
cb5ab6c8
L
793 } else {
794 set errcnt 0
795 pass $testname
24edc24d 796 }
24edc24d
L
797 }
798}
d2dee3b2
L
799
800# List contains test-items with 3 items followed by 2 lists, one item and
801# one optional item:
55255dae 802# 0:name
fa0a16b1 803# 1:ld or ar options
55255dae
L
804# 2:compile options
805# 3:filenames of source files
806# 4:action and options.
807# 5:name of output file
808# 6:language (optional)
d2dee3b2
L
809#
810# Actions:
811# objdump: Apply objdump options on result. Compare with regex (last arg).
812# nm: Apply nm options on result. Compare with regex (last arg).
813# readelf: Apply readelf options on result. Compare with regex (last arg).
2bd7f877
AB
814# warning: Check linker output against regex (last arg).
815# error: Like 'warning' but checking output in error case.
816# warning_output: Check linker output against regex in a file (last arg).
817# error_output: Like 'warning_output' but checking output in error case.
d2dee3b2
L
818#
819proc run_cc_link_tests { ldtests } {
820 global nm
821 global objdump
822 global READELF
823 global srcdir
824 global subdir
825 global env
826 global CC
55255dae 827 global CXX
d2dee3b2 828 global CFLAGS
58ffc3bd 829 global CXXFLAGS
d8880531 830 global ar
dd98f8d2 831 global exec_output
603c4399 832 global board_cflags
98d72909 833 global STATIC_LDFLAGS
603c4399
JW
834
835 if [board_info [target_info name] exists cflags] {
836 set board_cflags " [board_info [target_info name] cflags]"
837 } else {
838 set board_cflags ""
839 }
d2dee3b2
L
840
841 foreach testitem $ldtests {
842 set testname [lindex $testitem 0]
843 set ldflags [lindex $testitem 1]
844 set cflags [lindex $testitem 2]
845 set src_files [lindex $testitem 3]
846 set actions [lindex $testitem 4]
847 set binfile tmpdir/[lindex $testitem 5]
55255dae 848 set lang [lindex $testitem 6]
d2dee3b2
L
849 set objfiles {}
850 set is_unresolved 0
851 set failed 0
2bd7f877
AB
852 set check_ld(terminal) 0
853 set check_ld(source) ""
d2dee3b2 854
44ed8092
SL
855 if { ![check_compiler_available] } {
856 unsupported $testname
857 continue
858 }
859
c3e11cbe
AM
860 #verbose -log "testname is $testname"
861 #verbose -log "ldflags is $ldflags"
862 #verbose -log "cflags is $cflags"
863 #verbose -log "src_files is $src_files"
864 #verbose -log "actions is $actions"
865 #verbose -log "binfile is $binfile"
866 #verbose -log "lang is $lang"
2bd7f877
AB
867
868 foreach actionlist $actions {
869 set action [lindex $actionlist 0]
870 set progopts [lindex $actionlist 1]
871
872 # Find actions related to error/warning processing.
873 switch -- $action {
874 error
875 {
876 set check_ld(source) "regexp"
877 set check_ld(regexp) $progopts
878 set check_ld(terminal) 1
879 }
880 warning
881 {
882 set check_ld(source) "regexp"
883 set check_ld(regexp) $progopts
884 }
885 error_output
886 {
887 set check_ld(source) "file"
888 set check_ld(file) $progopts
889 set check_ld(terminal) 1
890 }
891 warning_output
892 {
893 set check_ld(source) "file"
894 set check_ld(file) $progopts
895 }
896 }
897 }
c3e11cbe 898
d2dee3b2
L
899 # Compile each file in the test.
900 foreach src_file $src_files {
74d44110
MR
901 set fileroot "[file rootname [file tail $src_file]]"
902 set objfile "tmpdir/$fileroot.o"
d2dee3b2
L
903 lappend objfiles $objfile
904
58ffc3bd 905 if { [ string match "c++" $lang ] } {
a44d0bd7 906 set cmd "$CXX -c $CXXFLAGS $cflags"
58ffc3bd 907 } else {
a44d0bd7 908 set cmd "$CC -c $CFLAGS $cflags"
58ffc3bd 909 }
a44d0bd7
AM
910 if ![ld_compile $cmd $srcdir/$subdir/$src_file $objfile] {
911 set failed 1
912 break
913 }
914 }
915 if { $failed != 0 } {
916 unresolved $testname
917 continue
d2dee3b2
L
918 }
919
920 # Clear error and warning counts.
921 reset_vars
922
55255dae
L
923 if { [ string match "c++" $lang ] } {
924 set cc_cmd $CXX
925 } else {
926 set cc_cmd $CC
927 }
928
abc868c6
AM
929 if { $binfile eq "tmpdir/" } {
930 # compile only
931 } elseif { [regexp ".*\\.a$" $binfile] } {
fa0a16b1 932 if { ![ar_simple_create $ar $ldflags $binfile "$objfiles"] } {
d8880531 933 set failed 1
d8880531 934 }
741e0128 935 } else {
98d72909
L
936 if { [string match "" $STATIC_LDFLAGS] \
937 && [regexp -- ".* \[-\]+static .*" " $board_cflags $ldflags $objfiles "] } {
938 untested $testname
939 continue
940 }
2bd7f877
AB
941 ld_link $cc_cmd $binfile "$board_cflags -L$srcdir/$subdir $ldflags $objfiles"
942 set ld_output "$exec_output"
741e0128 943
2bd7f877
AB
944 if { $check_ld(source) == "regexp" } then {
945 # Match output against regexp argument.
946 verbose -log "returned with: <$ld_output>, expected: <$check_ld(regexp)>"
947 if { ![regexp $check_ld(regexp) $ld_output] } then {
dd98f8d2
NC
948 set failed 1
949 }
2bd7f877
AB
950 } elseif { $check_ld(source) == "file" } then {
951 # Match output against patterns in a file.
952 set_file_contents "tmpdir/ld.messages" "$ld_output"
953 verbose "ld.messages has '[file_contents tmpdir/ld.messages]'"
954 if { [regexp_diff "tmpdir/ld.messages" "$srcdir/$subdir/$check_ld(file)"] } then {
955 verbose "output is $ld_output" 2
956 set failed 1
957 }
958 }
959
960 if { $check_ld(source) != "" } then {
961 if { $ld_output == "" } then {
962 verbose -log "Linker was expected to give error or warning"
963 set failed 1
964 }
965 } else {
966 if { $ld_output != "" } then {
967 verbose -log "Unexpected linker warning or error"
968 set failed 1
969 }
741e0128 970 }
d8880531
L
971 }
972
973 if { $failed == 0 } {
d2dee3b2
L
974 foreach actionlist $actions {
975 set action [lindex $actionlist 0]
976 set progopts [lindex $actionlist 1]
977
978 # There are actions where we run regexp_diff on the
979 # output, and there are other actions (presumably).
980 # Handling of the former look the same.
981 set dump_prog ""
982 switch -- $action {
983 objdump
984 { set dump_prog $objdump }
985 nm
986 { set dump_prog $nm }
987 readelf
988 { set dump_prog $READELF }
2bd7f877
AB
989 error {}
990 warning {}
991 error_output {}
992 warning_output {}
d2dee3b2
L
993 default
994 {
995 perror "Unrecognized action $action"
996 set is_unresolved 1
997 break
998 }
999 }
1000
1001 if { $dump_prog != "" } {
1002 set dumpfile [lindex $actionlist 2]
1003 set binary $dump_prog
1004
1005 # Ensure consistent sorting of symbols
1006 if {[info exists env(LC_ALL)]} {
1007 set old_lc_all $env(LC_ALL)
1008 }
1009 set env(LC_ALL) "C"
1010 set cmd "$binary $progopts $binfile > dump.out"
1011 send_log "$cmd\n"
1012 catch "exec $cmd" comp_output
1013 if {[info exists old_lc_all]} {
1014 set env(LC_ALL) $old_lc_all
1015 } else {
1016 unset env(LC_ALL)
1017 }
1018 set comp_output [prune_warnings $comp_output]
1019
1020 if ![string match "" $comp_output] then {
1021 send_log "$comp_output\n"
1022 set failed 1
1023 break
1024 }
1025
1026 if { [regexp_diff "dump.out" "$srcdir/$subdir/$dumpfile"] } then {
1027 verbose "output is [file_contents "dump.out"]" 2
1028 set failed 1
1029 break
1030 }
1031 }
1032 }
d2dee3b2
L
1033 }
1034
d44ea5d0 1035 if { $failed } {
abc868c6 1036 fail $testname
d44ea5d0 1037 } elseif { $is_unresolved } {
d2dee3b2 1038 unresolved $testname
d44ea5d0
AM
1039 } else {
1040 pass $testname
d2dee3b2
L
1041 }
1042 }
1043}
430a16a5
NC
1044
1045# Returns true if --gc-sections is supported on the target.
1046
1047proc check_gc_sections_available { } {
1048 global gc_sections_available_saved
1049 global ld
5a68afcf 1050
430a16a5
NC
1051 if {![info exists gc_sections_available_saved]} {
1052 # Some targets don't support gc-sections despite whatever's
1053 # advertised by ld's options.
be570f06 1054 if { [istarget alpha-*-*]
8376927b 1055 || [istarget bpf-*-*]
be570f06 1056 || [istarget d30v-*-*]
59c108f7 1057 || [istarget dlx-*-*]
59c108f7 1058 || [istarget hppa*64-*-*]
59c108f7
NC
1059 || [istarget ia64-*-*]
1060 || [istarget mep-*-*]
be570f06
AM
1061 || [istarget mn10200-*-*]
1062 || [istarget pj*-*-*]
1063 || [istarget pru*-*-*]
fce97736 1064 || [istarget s12z-*-*]
be570f06 1065 || [istarget xgate-*-*] } {
430a16a5
NC
1066 set gc_sections_available_saved 0
1067 return 0
1068 }
1069
1070 # elf2flt uses -q (--emit-relocs), which is incompatible with
1071 # --gc-sections.
1072 if { [board_info target exists ldflags]
1073 && [regexp " -elf2flt\[ =\]" " [board_info target ldflags] "] } {
1074 set gc_sections_available_saved 0
1075 return 0
1076 }
1077
430a16a5 1078 # Check if the ld used by gcc supports --gc-sections.
1d5316ab
AM
1079 # FIXME: this test is useless since ld --help always says
1080 # --gc-sections is available
430a16a5
NC
1081 set ld_output [remote_exec host $ld "--help"]
1082 if { [ string first "--gc-sections" $ld_output ] >= 0 } {
1083 set gc_sections_available_saved 1
1084 } else {
1085 set gc_sections_available_saved 0
1086 }
1087 }
1088 return $gc_sections_available_saved
1089}
33aa234e 1090
1336939d
AM
1091# Return true if target uses the generic_link_hash_table linker.
1092proc is_generic { } {
1093 if { [istarget "d30v-*-*"]
1094 || [istarget "dlx-*-*"]
1095 || [istarget "pj*-*-*"]
1096 || [istarget "s12z-*-*"]
1097 || [istarget "xgate-*-*"] } {
1098 return 1
1099 }
1100 return 0
1101}
1102
1103# Return true if target uses genelf.em.
1104proc uses_genelf { } {
b62b1f71
AM
1105 if { [istarget "d30v-*-*"]
1106 || [istarget "dlx-*-*"]
1107 || [istarget "fr30-*-*"]
1108 || ([istarget "frv-*-*"] && ![istarget "frv-*-linux*"])
1109 || [istarget "ft32-*-*"]
b62b1f71
AM
1110 || [istarget "iq2000-*-*"]
1111 || [istarget "mn10200-*-*"]
b62b1f71
AM
1112 || [istarget "msp430-*-*"]
1113 || [istarget "mt-*-*"]
be570f06 1114 || [istarget "pj*-*-*"]
6ff185b8 1115 || [istarget "s12z-*-*"]
be570f06 1116 || [istarget "xgate-*-*"] } {
1336939d 1117 return 1
b62b1f71 1118 }
1336939d 1119 return 0
b62b1f71
AM
1120}
1121
bdd32e03
AM
1122proc is_underscore_target { } {
1123 global is_underscore_target_saved
1124 global target_triplet
1125 global srcdir
1126
1127 if { ![info exists is_underscore_target_saved] } {
1128 set cmd "targ=$target_triplet . $srcdir/../../bfd/config.bfd &&"
1129 append cmd { echo "$targ_underscore"}
1130 verbose -log "$cmd"
1131 set status [catch {exec sh -c $cmd} result]
1132 if { $status == 0 && [string match "yes" $result] } {
1133 set is_underscore_target_saved 1
1134 } else {
1135 set is_underscore_target_saved 0
1136 }
1137 }
1138 return $is_underscore_target_saved
1139}
1140
5d3236ee
DK
1141# Returns true if the target ld supports the plugin API.
1142proc check_plugin_api_available { } {
1143 global plugin_api_available_saved
1144 global ld
1145 if {![info exists plugin_api_available_saved]} {
1146 # Check if the ld used by gcc supports --plugin.
1147 set ld_output [remote_exec host $ld "--help"]
2d03dd2f 1148 if { [ string first "-plugin PLUGIN" $ld_output ] >= 0 } {
5d3236ee
DK
1149 set plugin_api_available_saved 1
1150 } else {
1151 set plugin_api_available_saved 0
1152 }
1153 }
1154 return $plugin_api_available_saved
1155}
1156
3f730821
HPN
1157# Sets ld_sysroot to the current sysroot (empty if not supported) and
1158# returns true if the target ld supports sysroot.
bdd65db9 1159proc check_sysroot_available { } {
3f730821 1160 global ld_sysroot_available_saved ld ld_sysroot
bdd65db9 1161 if {![info exists ld_sysroot_available_saved]} {
3f730821
HPN
1162 # Check if ld supports --sysroot *other* than empty.
1163 set ld_sysroot [string trimright [lindex [remote_exec host $ld "--print-sysroot"] 1]]
1164 if { $ld_sysroot == "" } {
bdd65db9
HPN
1165 set ld_sysroot_available_saved 0
1166 } else {
1167 set ld_sysroot_available_saved 1
1168 }
1169 }
1170 return $ld_sysroot_available_saved
1171}
1172
44ed8092
SL
1173# Return true if we can build a program with the compiler.
1174# On some targets, CC might be defined, but libraries and startup
1175# code might be missing or require special options that the ld test
1176# harness doesn't know about.
1177
1178proc check_compiler_available { } {
1179 global compiler_available_saved
1180 global CC
1181
1182 if {![info exists compiler_available_saved]} {
1183 if { [which $CC] == 0 } {
1184 set compiler_available_saved 0
1185 return 0
1186 }
1187
1188 set flags ""
1189 if [board_info [target_info name] exists cflags] {
1190 append flags " [board_info [target_info name] cflags]"
1191 }
1192 if [board_info [target_info name] exists ldflags] {
1193 append flags " [board_info [target_info name] ldflags]"
1194 }
1195
1196 set basename "tmpdir/compiler[pid]"
1197 set src ${basename}.c
1198 set output ${basename}.out
1199 set f [open $src "w"]
1200 puts $f "int main (void)"
1201 puts $f "{"
1202 puts $f " return 0; "
1203 puts $f "}"
1204 close $f
1205 if [is_remote host] {
1206 set src [remote_download host $src]
1207 }
1208 set compiler_available_saved [run_host_cmd_yesno "$CC" "$flags $src -o $output"]
1209 remote_file host delete $src
1210 remote_file host delete $output
1211 file delete $src
1212 }
1213 return $compiler_available_saved
1214}
1215
5ff55910
L
1216# Returns 1 if plugin is enabled in gcc. Returns 0 otherwise.
1217proc check_gcc_plugin_enabled { } {
1218 global CC
1219
1220 if {![info exists CC]} {
1221 set CC [find_gcc]
1222 }
7f6bf02d 1223 if { $CC == ""} {
8be1e369 1224 return 0
5ff55910
L
1225 }
1226 set state [remote_exec host $CC -v]
8be1e369
AM
1227 if { [lindex $state 0] != 0 } {
1228 return 0;
1229 }
1230 for { set i 1 } { $i < [llength $state] } { incr i } {
5ff55910
L
1231 set v [lindex $state $i]
1232 if { [ string match "*--disable-plugin*" $v ] } {
1233 verbose "plugin is disabled by $v"
1234 return 0;
1235 }
1236 }
1237
1238 return 1;
1239}
1240
3bd58fbe
L
1241# Returns true if the target compiler supports LTO
1242proc check_lto_available { } {
1243 global lto_available_saved
1244 global CC
7174e19f 1245
3bd58fbe 1246 if {![info exists lto_available_saved]} {
5ff55910 1247 if { ![check_gcc_plugin_enabled] } {
19aef622
NC
1248 set lto_available_saved 0
1249 return 0
1250 }
00f4a602
L
1251 # This test will hide LTO bugs in ld. Since GCC 4.9 adds
1252 # -ffat-lto-objects, we always run LTO tests on Linux with
1253 # GCC 4.9 or newer.
1254 if { [istarget "*-*-linux*"] && [at_least_gcc_version 4 9] } {
1255 set lto_available_saved 1
1256 return 1
1257 }
3bd58fbe 1258 # Check if gcc supports -flto -fuse-linker-plugin
f1d7f4a6
AM
1259 set flags ""
1260 if [board_info [target_info name] exists cflags] {
1261 append flags " [board_info [target_info name] cflags]"
1262 }
1263 if [board_info [target_info name] exists ldflags] {
1264 append flags " [board_info [target_info name] ldflags]"
3bd58fbe 1265 }
f1d7f4a6
AM
1266
1267 set basename "tmpdir/lto[pid]"
1268 set src ${basename}.c
1269 set output ${basename}.out
3bd58fbe 1270 set f [open $src "w"]
7174e19f 1271 puts $f "int main() { return 0; }"
3bd58fbe 1272 close $f
010f98a5
L
1273 if [is_remote host] {
1274 set src [remote_download host $src]
1275 }
c3e11cbe 1276 set lto_available_saved [run_host_cmd_yesno "$CC" "$flags -flto -fuse-linker-plugin $src -o $output"]
f1d7f4a6
AM
1277 remote_file host delete $src
1278 remote_file host delete $output
3bd58fbe 1279 file delete $src
3bd58fbe
L
1280 }
1281 return $lto_available_saved
1282}
1283
c3e11cbe
AM
1284# Returns true if the target compiler supports LTO -ffat-lto-objects
1285proc check_lto_fat_available { } {
1286 global lto_fat_available_saved
1287 global CC
1288
1289 if {![info exists lto_fat_available_saved]} {
5ff55910 1290 if { ![check_gcc_plugin_enabled] } {
c3e11cbe
AM
1291 set lto_fat_available_saved 0
1292 return 0
1293 }
00f4a602
L
1294 # This test will hide LTO bugs in ld. Since GCC 4.9 adds
1295 # -ffat-lto-objects, we always run LTO tests on Linux with
1296 # GCC 4.9 or newer.
1297 if { [istarget "*-*-linux*"] && [at_least_gcc_version 4 9] } {
1298 set lto_fat_available_saved 1
1299 return 1
1300 }
c3e11cbe
AM
1301 # Check if gcc supports -flto -fuse-linker-plugin
1302 set flags ""
1303 if [board_info [target_info name] exists cflags] {
1304 append flags " [board_info [target_info name] cflags]"
1305 }
1306 if [board_info [target_info name] exists ldflags] {
1307 append flags " [board_info [target_info name] ldflags]"
1308 }
1309
1310 set basename "tmpdir/lto[pid]"
1311 set src ${basename}.c
1312 set output ${basename}.out
1313 set f [open $src "w"]
1314 puts $f "int main() { return 0; }"
1315 close $f
010f98a5
L
1316 if [is_remote host] {
1317 set src [remote_download host $src]
1318 }
c3e11cbe
AM
1319 set lto_fat_available_saved [run_host_cmd_yesno "$CC" "$flags -flto -ffat-lto-objects -fuse-linker-plugin $src -o $output"]
1320 remote_file host delete $src
1321 remote_file host delete $output
1322 file delete $src
1323 }
1324 return $lto_fat_available_saved
1325}
1326
92c09111
L
1327# Returns true if the target compiler supports LTO and -shared
1328proc check_lto_shared_available { } {
1329 global lto_shared_available_saved
1330 global CC
1331
92c09111 1332 if {![info exists lto_shared_available_saved]} {
5ff55910 1333 if { ![check_gcc_plugin_enabled] } {
3bb9e7b4
AM
1334 set lto_shared_available_saved 0
1335 return 0
1336 }
00f4a602
L
1337 # This test will hide LTO bugs in ld. Since GCC 4.9 adds
1338 # -ffat-lto-objects, we always run LTO tests on Linux with
1339 # GCC 4.9 or newer.
1340 if { [istarget "*-*-linux*"] && [at_least_gcc_version 4 9] } {
1341 set lto_shared_available_saved 1
1342 return 1
1343 }
92c09111 1344 # Check if gcc supports -flto -fuse-linker-plugin -shared
f1d7f4a6
AM
1345 set flags ""
1346 if [board_info [target_info name] exists cflags] {
1347 append flags " [board_info [target_info name] cflags]"
1348 }
1349 if [board_info [target_info name] exists ldflags] {
1350 append flags " [board_info [target_info name] ldflags]"
92c09111 1351 }
f1d7f4a6
AM
1352
1353 set basename "tmpdir/lto_shared[pid]"
1354 set src ${basename}.c
1355 set output ${basename}.so
92c09111
L
1356 set f [open $src "w"]
1357 puts $f ""
1358 close $f
010f98a5
L
1359 if [is_remote host] {
1360 set src [remote_download host $src]
1361 }
f1d7f4a6
AM
1362 set lto_shared_available_saved [run_host_cmd_yesno "$CC" "$flags -shared -fPIC -flto -fuse-linker-plugin $src -o $output"]
1363 remote_file host delete $src
1364 remote_file host delete $output
92c09111 1365 file delete $src
92c09111
L
1366 }
1367 return $lto_shared_available_saved
1368}
1369
33aa234e
JK
1370# Check if the assembler supports CFI statements.
1371
1372proc check_as_cfi { } {
1373 global check_as_cfi_result
1374 global as
1375 if [info exists check_as_cfi_result] {
1376 return $check_as_cfi_result
1377 }
1378 set as_file "tmpdir/check_as_cfi.s"
1379 set as_fh [open $as_file w 0666]
1380 puts $as_fh "# Generated file. DO NOT EDIT"
1381 puts $as_fh "\t.cfi_startproc"
1382 puts $as_fh "\t.cfi_endproc"
1383 close $as_fh
1384 remote_download host $as_file
1385 verbose -log "Checking CFI support:"
1386 rename "perror" "check_as_cfi_perror"
1387 proc perror { args } { }
1388 set success [ld_assemble $as $as_file "/dev/null"]
1389 rename "perror" ""
1390 rename "check_as_cfi_perror" "perror"
1391 #remote_file host delete $as_file
1392 set check_as_cfi_result $success
1393 return $success
1394}
1395
c22ee0ad
L
1396# Returns true if IFUNC works.
1397
1398proc check_ifunc_available { } {
1399 global ifunc_available_saved
1400 global CC
1401
1402 if {![info exists ifunc_available_saved]} {
44ed8092 1403 if { ![check_compiler_available] } {
c22ee0ad
L
1404 set ifunc_available_saved 0
1405 return 0
1406 }
1407 # Check if gcc supports -flto -fuse-linker-plugin
1408 set flags ""
1409 if [board_info [target_info name] exists cflags] {
1410 append flags " [board_info [target_info name] cflags]"
1411 }
1412 if [board_info [target_info name] exists ldflags] {
1413 append flags " [board_info [target_info name] ldflags]"
1414 }
1415
1416 set basename "tmpdir/ifunc[pid]"
1417 set src ${basename}.c
1418 set output ${basename}.out
1419 set f [open $src "w"]
1420 puts $f "extern int library_func2 (void);"
1421 puts $f "int main (void)"
1422 puts $f "{"
1423 puts $f " if (library_func2 () != 2) __builtin_abort ();"
1424 puts $f " return 0; "
1425 puts $f "}"
1426 puts $f "static int library_func1 (void) {return 2; }"
1427 puts $f "void *foo (void) __asm__ (\"library_func2\");"
1428 puts $f "void *foo (void) { return library_func1; }"
1429 puts $f "__asm__(\".type library_func2, %gnu_indirect_function\");"
1430 close $f
010f98a5
L
1431 if [is_remote host] {
1432 set src [remote_download host $src]
1433 }
c22ee0ad 1434 set ifunc_available_saved [run_host_cmd_yesno "$CC" "$flags $src -o $output"]
77236b83 1435 if { [isnative] && $ifunc_available_saved == 1 } {
c22ee0ad
L
1436 set ifunc_available_saved [run_host_cmd_yesno "$output" ""]
1437 }
1438 remote_file host delete $src
1439 remote_file host delete $output
1440 file delete $src
1441 }
1442 return $ifunc_available_saved
1443}
1444
97dc35c8
L
1445# Returns true if ifunc attribute works.
1446
1447proc check_ifunc_attribute_available { } {
1448 global ifunc_attribute_available_saved
1449 global CC
1450
1451 if {![info exists ifunc_attribute_available_saved]} {
44ed8092 1452 if { ![check_compiler_available] } {
97dc35c8
L
1453 set ifunc_attribute_available_saved 0
1454 return 0
1455 }
1456 # Check if gcc supports -flto -fuse-linker-plugin
1457 set flags ""
1458 if [board_info [target_info name] exists cflags] {
1459 append flags " [board_info [target_info name] cflags]"
1460 }
1461 if [board_info [target_info name] exists ldflags] {
1462 append flags " [board_info [target_info name] ldflags]"
1463 }
1464
1465 set basename "tmpdir/ifunc[pid]"
1466 set src ${basename}.c
1467 set output ${basename}.out
1468 set f [open $src "w"]
1469 puts $f "extern int library_func2 (void) __attribute__ ((ifunc (\"foo\")));"
1470 puts $f "int main (void)"
1471 puts $f "{"
1472 puts $f " if (library_func2 () != 2) __builtin_abort ();"
1473 puts $f " return 0; "
1474 puts $f "}"
1475 puts $f "static int library_func1 (void) {return 2; }"
1476 puts $f "void *foo (void) { return library_func1; }"
1477 close $f
010f98a5
L
1478 if [is_remote host] {
1479 set src [remote_download host $src]
1480 }
97dc35c8 1481 set ifunc_attribute_available_saved [run_host_cmd_yesno "$CC" "$flags $src -o $output"]
77236b83 1482 if { [isnative] && $ifunc_attribute_available_saved == 1 } {
97dc35c8
L
1483 set ifunc_attribute_available_saved [run_host_cmd_yesno "$output" ""]
1484 }
1485 remote_file host delete $src
1486 remote_file host delete $output
1487 file delete $src
1488 }
1489 return $ifunc_attribute_available_saved
1490}
1491
fd121c5c
JW
1492# Return true if libdl is supported.
1493
1494proc check_libdl_available { } {
1495 global libdl_available_saved
1496 global CC
1497
1498 if {![info exists libdl_available_saved]} {
44ed8092 1499 if { ![check_compiler_available] } {
fd121c5c
JW
1500 set libdl_available_saved 0
1501 return 0
1502 }
1503
1504 set basename "tmpdir/dl_avail_test[pid]"
1505 set src ${basename}.c
1506 set output ${basename}.out
1507 set f [open $src "w"]
1508 # Sample test file.
1509 puts $f "#include <dlfcn.h>"
1510 puts $f "int main (void)"
1511 puts $f "{"
1512 puts $f " dlopen (\"dummy.so\", RTLD_NOW);"
1513 puts $f " return 0; "
1514 puts $f "}"
1515 close $f
1516 if [is_remote host] {
1517 set src [remote_download host $src]
1518 }
1519 set libdl_available_saved [run_host_cmd_yesno "$CC" "$src -o $output -ldl"]
1520 remote_file host delete $src
1521 remote_file host delete $output
1522 file delete $src
1523 }
1524 return $libdl_available_saved
1525}
0aae7e72
L
1526
1527# Returns true if GNU2 TLS works.
1528
1529proc check_gnu2_tls_available { } {
1530 global gnu2_tls_available_saved
1531 global CC
1532 global GNU2_CFLAGS
1533
1534 if {![info exists gnu2_tls_available_saved]} {
44ed8092 1535 if { ![check_compiler_available] || "$GNU2_CFLAGS" == "" } {
0aae7e72
L
1536 set gnu2_tls_available_saved 0
1537 return 0
1538 }
1539 # Check if GNU2 TLS works.
1540 set flags "$GNU2_CFLAGS"
1541 if [board_info [target_info name] exists cflags] {
1542 append flags " [board_info [target_info name] cflags]"
1543 }
1544 if [board_info [target_info name] exists ldflags] {
1545 append flags " [board_info [target_info name] ldflags]"
1546 }
1547
1548 set basename "tmpdir/gnu2_tls[pid]"
1549 set src1 ${basename}1.c
1550 set output1 ${basename}.so
1551 set f [open $src1 "w"]
1552 puts $f "extern __thread int zzz;"
1553 puts $f "int foo (void)"
1554 puts $f "{"
1555 puts $f " return zzz;"
1556 puts $f "}"
1557 close $f
1558 if [is_remote host] {
1559 set src1 [remote_download host $src1]
1560 }
1561 set src2 ${basename}2.c
1562 set output2 ${basename}.exe
1563 set f [open $src2 "w"]
1564 puts $f "__thread int zzz = 20;"
1565 puts $f "extern int foo (void);"
1566 puts $f "int main (void)"
1567 puts $f "{"
1568 puts $f " if (foo () != 20) __builtin_abort ();"
1569 puts $f " return 0; "
1570 puts $f "}"
1571 close $f
1572 if [is_remote host] {
1573 set src2 [remote_download host $src2]
1574 }
1575 set gnu2_tls_available_saved [run_host_cmd_yesno "$CC" "-fPIC -shared $flags $src1 -o $output1"]
1576 if { $gnu2_tls_available_saved == 1 } {
1577 set gnu2_tls_available_saved [run_host_cmd_yesno "$CC" "$flags $src2 $output1 -o $output2"]
1578 if { $gnu2_tls_available_saved == 1 } {
1579 set gnu2_tls_available_saved [run_host_cmd_yesno "$output2" ""]
1580 }
1581 }
1582 remote_file host delete $src1
1583 remote_file host delete $output1
1584 remote_file host delete $src2
1585 remote_file host delete $output2
1586 file delete $src1 $src2
1587 }
1588 return $gnu2_tls_available_saved
1589}
This page took 1.069626 seconds and 4 git commands to generate.