Add support for 64-bit ARM architecture: AArch64
[deliverable/binutils-gdb.git] / ld / testsuite / lib / ld-lib.exp
CommitLineData
a2b64bed 1# Support routines for LD testsuite.
25629536 2# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
5a68afcf 3# 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
8c5fc800 4# Free Software Foundation, Inc.
a2b64bed 5#
f96b4a7b
NC
6# This file is part of the GNU Binutils.
7#
a2b64bed
NC
8# This file is free software; you can redistribute it and/or modify
9# it under the terms of the GNU General Public License as published by
f96b4a7b 10# the Free Software Foundation; either version 3 of the License, or
a2b64bed 11# (at your option) any later version.
3e8cba19 12#
a2b64bed
NC
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16# GNU General Public License for more details.
3e8cba19 17#
a2b64bed
NC
18# You should have received a copy of the GNU General Public License
19# along with this program; if not, write to the Free Software
f96b4a7b
NC
20# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21# MA 02110-1301, USA.
3b6fe0cc 22
f3097f33
RS
23proc load_common_lib { name } {
24 global srcdir
25 load_file $srcdir/../../binutils/testsuite/lib/$name
26}
27
28load_common_lib binutils-common.exp
29
fb35d3d8
DD
30# Returns 1 if the gcc for the target is at least version MAJOR.MINOR
31# Returns 0 otherwise.
32#
33proc at_least_gcc_version { major minor } {
5a68afcf 34
fb35d3d8
DD
35 if {![info exists CC]} {
36 set CC [find_gcc]
37 }
38 if { $CC == "" } {
39 return 0
40 }
41 set state [remote_exec host $CC --version]
42 set tmp "[lindex $state 1]\n"
43 # Look for (eg) 4.6.1 in the version output.
8b5b2228
MR
44 set ver_re "\[^\\.0-9\]+(\[1-9\]\[0-9\]*)\\.(\[0-9\]+)(?:\\.\[0-9\]+)?"
45 regexp $ver_re $tmp fred maj min
fb35d3d8 46 verbose "gcc version: $tmp"
8b5b2228
MR
47 if { ![info exists maj] || ![info exists min] } then {
48 perror "can't decipher gcc version number, fix the framework!"
49 return 0
50 }
fb35d3d8
DD
51 verbose "major gcc version is $maj, want at least $major"
52 if { $maj == $major } then {
53 verbose "minor gcc version is $min, want at least $minor"
8b5b2228 54 return [expr $min >= $minor]
fb35d3d8 55 } else {
8b5b2228 56 return [expr $maj > $major]
fb35d3d8
DD
57 }
58}
59
3b6fe0cc 60# Extract and print the version number of ld.
252b5132
RH
61#
62proc default_ld_version { ld } {
63 global host_triplet
64
7f6a71ff 65 if { ![is_remote host] && [which $ld] == 0 } then {
252b5132
RH
66 perror "$ld does not exist"
67 exit 1
68 }
3e8cba19 69
7f6a71ff
JM
70 remote_exec host "$ld --version" "" "/dev/null" "ld.version"
71 remote_upload host "ld.version"
72 set tmp [prune_warnings [file_contents "ld.version"]]
73 remote_file build delete "ld.version"
74 remote_file host delete "ld.version"
75
252b5132
RH
76 regexp "\[^\n\]* (cygnus-|)(\[-0-9.a-zA-Z-\]+)\[\r\n\].*" $tmp version cyg number
77 if [info exists number] then {
78 clone_output "$ld $number\n"
79 }
80}
81
7f6a71ff
JM
82proc run_host_cmd { prog command } {
83 global link_output
3e8cba19 84
7f6a71ff
JM
85 if { ![is_remote host] && [which "$prog"] == 0 } then {
86 perror "$prog does not exist"
252b5132
RH
87 return 0
88 }
3e8cba19 89
7f6a71ff
JM
90 verbose -log "$prog $command"
91 set status [remote_exec host [concat sh -c [list "$prog $command 2>&1"]] "" "/dev/null" "ld.tmp"]
92 remote_upload host "ld.tmp"
93 set link_output [file_contents "ld.tmp"]
94 regsub "\n$" $link_output "" link_output
95 if { [lindex $status 0] != 0 && [string match "" $link_output] } then {
96 append link_output "child process exited abnormally"
97 }
98 remote_file build delete ld.tmp
99 remote_file host delete ld.tmp
fab4a87f 100
7f6a71ff
JM
101 if [string match "" $link_output] then {
102 return ""
103 }
3e8cba19 104
7f6a71ff
JM
105 verbose -log "$link_output"
106 return "$link_output"
107}
108
109proc run_host_cmd_yesno { prog command } {
110 global exec_output
111
112 set exec_output [prune_warnings [run_host_cmd "$prog" "$command"]]
252b5132 113 if [string match "" $exec_output] then {
7f6a71ff 114 return 1;
252b5132 115 }
7f6a71ff
JM
116 return 0;
117}
118
119# Link an object using relocation.
120#
121proc default_ld_relocate { ld target objects } {
122 global HOSTING_EMU
123
124 remote_file host delete $target
125 return [run_host_cmd_yesno "$ld" "$HOSTING_EMU -o $target -r $objects"]
252b5132
RH
126}
127
1688b748 128# Check to see if ld is being invoked with a non-endian output format
3b6fe0cc 129#
1688b748
MH
130proc is_endian_output_format { object_flags } {
131
132 if {[string match "*-oformat binary*" $object_flags] || \
133 [string match "*-oformat ieee*" $object_flags] || \
134 [string match "*-oformat ihex*" $object_flags] || \
135 [string match "*-oformat netbsd-core*" $object_flags] || \
136 [string match "*-oformat srec*" $object_flags] || \
137 [string match "*-oformat tekhex*" $object_flags] || \
138 [string match "*-oformat trad-core*" $object_flags] } then {
139 return 0
140 } else {
141 return 1
142 }
143}
144
38e31547
NC
145# Look for big-endian or little-endian switches in the multlib
146# options and translate these into a -EB or -EL switch. Note
147# we cannot rely upon proc process_multilib_options to do this
148# for us because for some targets the compiler does not support
149# -EB/-EL but it does support -mbig-endian/-mlittle-endian, and
150# the site.exp file will include the switch "-mbig-endian"
151# (rather than "big-endian") which is not detected by proc
152# process_multilib_options.
3b6fe0cc 153#
38e31547 154proc big_or_little_endian {} {
3e8cba19 155
38e31547 156 if [board_info [target_info name] exists multilib_flags] {
b24f926d 157 set tmp_flags " [board_info [target_info name] multilib_flags]"
38e31547
NC
158
159 foreach x $tmp_flags {
160 case $x in {
906156c4 161 {*big*endian eb EB -eb -EB -mb -meb} {
38e31547
NC
162 set flags " -EB"
163 return $flags
164 }
906156c4 165 {*little*endian el EL -el -EL -ml -mel} {
38e31547
NC
166 set flags " -EL"
167 return $flags
168 }
169 }
170 }
171 }
172
173 set flags ""
174 return $flags
175}
252b5132 176
3b6fe0cc 177# Link a program using ld.
252b5132
RH
178#
179proc default_ld_link { ld target objects } {
180 global HOSTING_EMU
181 global HOSTING_CRT0
182 global HOSTING_LIBS
d1bcade6 183 global LIBS
252b5132 184 global host_triplet
6fc49d28 185 global link_output
fab4a87f 186 global exec_output
3e8cba19 187
252b5132 188 set objs "$HOSTING_CRT0 $objects"
d1bcade6 189 set libs "$LIBS $HOSTING_LIBS"
3e8cba19 190
1688b748
MH
191 if [is_endian_output_format $objects] then {
192 set flags [big_or_little_endian]
193 } else {
194 set flags ""
195 }
fab4a87f 196
7f6a71ff 197 remote_file host delete $target
fab4a87f 198
7f6a71ff 199 return [run_host_cmd_yesno "$ld" "$HOSTING_EMU $flags -o $target $objs $libs"]
252b5132
RH
200}
201
3b6fe0cc 202# Link a program using ld, without including any libraries.
252b5132
RH
203#
204proc default_ld_simple_link { ld target objects } {
205 global host_triplet
b765d4e3 206 global gcc_ld_flag
fab4a87f 207 global exec_output
7cda33a1 208
1688b748
MH
209 if [is_endian_output_format $objects] then {
210 set flags [big_or_little_endian]
211 } else {
212 set flags ""
213 }
3e8cba19 214
b765d4e3
L
215 # If we are compiling with gcc, we want to add gcc_ld_flag to
216 # flags. Rather than determine this in some complex way, we guess
217 # based on the name of the compiler.
b0fe1bf3
AM
218 set ldexe $ld
219 set ldparm [string first " " $ld]
cef3d14b 220 set ldflags ""
b0fe1bf3 221 if { $ldparm > 0 } then {
cef3d14b 222 set ldflags [string range $ld $ldparm end]
b0fe1bf3 223 set ldexe [string range $ld 0 $ldparm]
cef3d14b 224 set ld $ldexe
b0fe1bf3
AM
225 }
226 set ldexe [string replace $ldexe 0 [string last "/" $ldexe] ""]
0f84fde1 227 if {[string match "*gcc*" $ldexe] || [string match "*++*" $ldexe]} then {
cef3d14b 228 set ldflags "$gcc_ld_flag $ldflags"
b765d4e3
L
229 }
230
7f6a71ff 231 remote_file host delete $target
fab4a87f 232
cef3d14b 233 set exec_output [run_host_cmd "$ld" "$ldflags $flags -o $target $objects"]
7f6a71ff 234 set exec_output [prune_warnings $exec_output]
252b5132
RH
235
236 # We don't care if we get a warning about a non-existent start
237 # symbol, since the default linker script might use ENTRY.
238 regsub -all "(^|\n)(\[^\n\]*: warning: cannot find entry symbol\[^\n\]*\n?)" $exec_output "\\1" exec_output
239
240 if [string match "" $exec_output] then {
241 return 1
242 } else {
252b5132
RH
243 return 0
244 }
245}
246
3b6fe0cc 247# Compile an object using cc.
252b5132
RH
248#
249proc default_ld_compile { cc source object } {
250 global CFLAGS
58ffc3bd 251 global CXXFLAGS
252b5132
RH
252 global srcdir
253 global subdir
254 global host_triplet
255 global gcc_gas_flag
256
257 set cc_prog $cc
258 if {[llength $cc_prog] > 1} then {
259 set cc_prog [lindex $cc_prog 0]
260 }
7f6a71ff 261 if {![is_remote host] && [which $cc_prog] == 0} then {
252b5132
RH
262 perror "$cc_prog does not exist"
263 return 0
264 }
265
7f6a71ff
JM
266 remote_file build delete "$object"
267 remote_file host delete "$object"
252b5132 268
58ffc3bd 269 set flags "-I$srcdir/$subdir"
252b5132
RH
270
271 # If we are compiling with gcc, we want to add gcc_gas_flag to
272 # flags. Rather than determine this in some complex way, we guess
273 # based on the name of the compiler.
b0fe1bf3
AM
274 set ccexe $cc
275 set ccparm [string first " " $cc]
dec20c9e 276 set ccflags ""
b0fe1bf3 277 if { $ccparm > 0 } then {
dec20c9e 278 set ccflags [string range $cc $ccparm end]
b0fe1bf3 279 set ccexe [string range $cc 0 $ccparm]
dec20c9e 280 set cc $ccexe
b0fe1bf3
AM
281 }
282 set ccexe [string replace $ccexe 0 [string last "/" $ccexe] ""]
0f84fde1 283 if {[string match "*gcc*" $ccexe] || [string match "*++*" $ccexe]} then {
252b5132
RH
284 set flags "$gcc_gas_flag $flags"
285 }
286
58ffc3bd
MF
287 if {[string match "*++*" $ccexe]} {
288 set flags "$flags $CXXFLAGS"
289 } else {
290 set flags "$flags $CFLAGS"
291 }
292
38e31547 293 if [board_info [target_info name] exists multilib_flags] {
b24f926d 294 append flags " [board_info [target_info name] multilib_flags]"
38e31547
NC
295 }
296
dec20c9e 297 verbose -log "$cc $flags $ccflags -c $source -o $object"
252b5132 298
7f6a71ff
JM
299 set status [remote_exec host [concat sh -c [list "$cc $flags $ccflags -c $source -o $object 2>&1"]] "" "/dev/null" "ld.tmp"]
300 remote_upload host "ld.tmp"
301 set exec_output [file_contents "ld.tmp"]
302 remote_file build delete "ld.tmp"
303 remote_file host delete "ld.tmp"
252b5132
RH
304 set exec_output [prune_warnings $exec_output]
305 if [string match "" $exec_output] then {
306 if {![file exists $object]} then {
307 regexp ".*/(\[^/\]*)$" $source all dobj
308 regsub "\\.c" $dobj ".o" realobj
309 verbose "looking for $realobj"
7f6a71ff 310 if {[remote_file host exists $realobj]} then {
252b5132 311 verbose -log "mv $realobj $object"
7f6a71ff 312 remote_upload "$realobj" "$object"
252b5132
RH
313 } else {
314 perror "$object not found after compilation"
315 return 0
316 }
317 }
318 return 1
319 } else {
320 verbose -log "$exec_output"
321 perror "$source: compilation failed"
322 return 0
323 }
324}
325
3b6fe0cc 326# Assemble a file.
252b5132 327#
de1491f0 328proc default_ld_assemble { as in_flags source object } {
252b5132
RH
329 global ASFLAGS
330 global host_triplet
3e8cba19 331
252b5132
RH
332 if ![info exists ASFLAGS] { set ASFLAGS "" }
333
38e31547 334 set flags [big_or_little_endian]
de1491f0 335 set exec_output [run_host_cmd "$as" "$flags $in_flags $ASFLAGS -o $object $source"]
252b5132
RH
336 set exec_output [prune_warnings $exec_output]
337 if [string match "" $exec_output] then {
338 return 1
339 } else {
252b5132
RH
340 perror "$source: assembly failed"
341 return 0
342 }
343}
344
3b6fe0cc 345# Run nm on a file, putting the result in the array nm_output.
252b5132 346#
992c450d 347proc default_ld_nm { nm nmflags object } {
252b5132
RH
348 global NMFLAGS
349 global nm_output
350 global host_triplet
351
77e0b0ef
ILT
352 if {[info exists nm_output]} {
353 unset nm_output
354 }
355
252b5132
RH
356 if ![info exists NMFLAGS] { set NMFLAGS "" }
357
3e8cba19
AM
358 # Ensure consistent sorting of symbols
359 if {[info exists env(LC_ALL)]} {
360 set old_lc_all $env(LC_ALL)
361 }
362 set env(LC_ALL) "C"
7f6a71ff 363
992c450d 364 verbose -log "$nm $NMFLAGS $nmflags $object >tmpdir/nm.out"
252b5132 365
7f6a71ff 366 set status [remote_exec host [concat sh -c [list "$nm $NMFLAGS $nmflags $object 2>ld.stderr"]] "" "/dev/null" "tmpdir/nm.out"]
3e8cba19
AM
367 if {[info exists old_lc_all]} {
368 set env(LC_ALL) $old_lc_all
369 } else {
370 unset env(LC_ALL)
371 }
7f6a71ff
JM
372 remote_upload host "ld.stderr"
373 remote_upload host "tmpdir/nm.out" "tmpdir/nm.out"
374 set exec_output [prune_warnings [file_contents "ld.stderr"]]
375 remote_file host delete "ld.stderr"
376 remote_file build delete "ld.stderr"
252b5132
RH
377 if [string match "" $exec_output] then {
378 set file [open tmpdir/nm.out r]
379 while { [gets $file line] != -1 } {
380 verbose "$line" 2
dbc37f89 381 if [regexp "^(\[0-9a-fA-F\]+) \[a-zA-Z0-9\] \\.*(.+)$" $line whole value name] {
252b5132
RH
382 set name [string trimleft $name "_"]
383 verbose "Setting nm_output($name) to 0x$value" 2
384 set nm_output($name) 0x$value
385 }
386 }
387 close $file
388 return 1
389 } else {
390 verbose -log "$exec_output"
391 perror "$object: nm failed"
392 return 0
393 }
394}
395
1b662205
AM
396# Define various symbols needed when not linking against all
397# target libs.
398proc ld_simple_link_defsyms {} {
399
400 set flags "--defsym __stack_chk_fail=0"
401
402 # ARM targets call __gccmain
8c5fc800 403 if {[istarget arm*-*-*]} {
1b662205
AM
404 append flags " --defsym __gccmain=0"
405 }
406
36fe835f
DK
407 # Windows targets need __main, prefixed with underscore.
408 if {[istarget *-*-cygwin* ] || [istarget *-*-mingw*]} {
409 append flags " --defsym ___main=0"
410 }
411
1b662205
AM
412 # PowerPC EABI code calls __eabi.
413 if {[istarget powerpc*-*-eabi*] || [istarget powerpc*-*-rtems*]} {
414 append flags " --defsym __eabi=0"
415 }
416
417 # mn10200 code calls __truncsipsi2_d0_d2.
418 if {[istarget mn10200*-*-*]} then {
419 append flags " --defsym __truncsipsi2_d0_d2=0"
420 }
421
422 # m6811/m6812 code has references to soft registers.
32d79e68 423 if {[istarget m6811-*-*] || [istarget m6812-*-*] || [istarget m68hc1*-*-*]} {
1b662205
AM
424 append flags " --defsym _.frame=0 --defsym _.d1=0 --defsym _.d2=0"
425 append flags " --defsym _.d3=0 --defsym _.d4=0"
426 append flags " --defsym _.tmp=0 --defsym _.xy=0 --defsym _.z=0"
427 }
428
429 # Some OpenBSD targets have ProPolice and reference __guard and
430 # __stack_smash_handler.
431 if [istarget *-*-openbsd*] {
432 append flags " --defsym __guard=0"
433 append flags " --defsym __stack_smash_handler=0"
434 }
435
436 return $flags
437}
438
ef2b5578 439# run_dump_test FILE (optional:) EXTRA_OPTIONS
261def70
HPN
440# Copied from gas testsuite, tweaked and further extended.
441#
442# Assemble a .s file, then run some utility on it and check the output.
3e8cba19 443#
261def70
HPN
444# There should be an assembly language file named FILE.s in the test
445# suite directory, and a pattern file called FILE.d. `run_dump_test'
446# will assemble FILE.s, run some tool like `objdump', `objcopy', or
447# `nm' on the .o file to produce textual output, and then analyze that
448# with regexps. The FILE.d file specifies what program to run, and
449# what to expect in its output.
450#
451# The FILE.d file begins with zero or more option lines, which specify
452# flags to pass to the assembler, the program to run to dump the
453# assembler's output, and the options it wants. The option lines have
454# the syntax:
3e8cba19 455#
261def70 456# # OPTION: VALUE
3e8cba19 457#
261def70
HPN
458# OPTION is the name of some option, like "name" or "objdump", and
459# VALUE is OPTION's value. The valid options are described below.
460# Whitespace is ignored everywhere, except within VALUE. The option
461# list ends with the first line that doesn't match the above syntax
462# (hmm, not great for error detection).
463#
ef2b5578
MR
464# The optional EXTRA_OPTIONS argument to `run_dump_test' is a list of
465# two-element lists. The first element of each is an option name, and
466# the second additional arguments to be added on to the end of the
467# option list as given in FILE.d. (If omitted, no additional options
468# are added.)
469#
261def70 470# The interesting options are:
3e8cba19 471#
261def70
HPN
472# name: TEST-NAME
473# The name of this test, passed to DejaGNU's `pass' and `fail'
474# commands. If omitted, this defaults to FILE, the root of the
475# .s and .d files' names.
3e8cba19 476#
261def70
HPN
477# as: FLAGS
478# When assembling, pass FLAGS to the assembler.
479# If assembling several files, you can pass different assembler
480# options in the "source" directives. See below.
481#
482# ld: FLAGS
483# Link assembled files using FLAGS, in the order of the "source"
484# directives, when using multiple files.
485#
d6e0b160
HPN
486# ld_after_inputfiles: FLAGS
487# Similar to "ld", but put after all input files.
488#
cfe5266f
HPN
489# objcopy_linked_file: FLAGS
490# Run objcopy on the linked file with the specified flags.
491# This lets you transform the linked file using objcopy, before the
492# result is analyzed by an analyzer program specified below (which
493# may in turn *also* be objcopy).
494#
261def70
HPN
495# PROG: PROGRAM-NAME
496# The name of the program to run to analyze the .o file produced
497# by the assembler or the linker output. This can be omitted;
498# run_dump_test will guess which program to run by seeing which of
499# the flags options below is present.
500#
501# objdump: FLAGS
502# nm: FLAGS
503# objcopy: FLAGS
504# Use the specified program to analyze the assembler or linker
505# output file, and pass it FLAGS, in addition to the output name.
3e8cba19
AM
506# Note that they are run with LC_ALL=C in the environment to give
507# consistent sorting of symbols.
261def70
HPN
508#
509# source: SOURCE [FLAGS]
510# Assemble the file SOURCE.s using the flags in the "as" directive
511# and the (optional) FLAGS. If omitted, the source defaults to
512# FILE.s.
513# This is useful if several .d files want to share a .s file.
514# More than one "source" directive can be given, which is useful
515# when testing linking.
516#
ef2b5578
MR
517# dump: DUMP
518# Match against DUMP.d. If omitted, this defaults to FILE.d. This
519# is useful if several .d files differ by options only. Options are
520# always read from FILE.d.
521#
261def70
HPN
522# xfail: TARGET
523# The test is expected to fail on TARGET. This may occur more than
524# once.
525#
526# target: TARGET
527# Only run the test for TARGET. This may occur more than once; the
33aa234e
JK
528# target being tested must match at least one. You may provide target
529# name "cfi" for any target supporting the CFI statements.
261def70
HPN
530#
531# notarget: TARGET
532# Do not run the test for TARGET. This may occur more than once;
533# the target being tested must not match any of them.
534#
535# error: REGEX
536# An error with message matching REGEX must be emitted for the test
537# to pass. The PROG, objdump, nm and objcopy options have no
164de317
HPN
538# meaning and need not supplied if this is present. Multiple "error"
539# directives append to the expected linker error message.
261def70 540#
bb00e284
HPN
541# warning: REGEX
542# Expect a linker warning matching REGEX. It is an error to issue
164de317
HPN
543# both "error" and "warning". Multiple "warning" directives
544# append to the expected linker warning message.
bb00e284 545#
261def70
HPN
546# Each option may occur at most once unless otherwise mentioned.
547#
548# After the option lines come regexp lines. `run_dump_test' calls
549# `regexp_diff' to compare the output of the dumping tool against the
eb22018c
RS
550# regexps in FILE.d. `regexp_diff' is defined in binutils-common.exp;
551# see further comments there.
3b6fe0cc 552#
ef2b5578 553proc run_dump_test { name {extra_options {}} } {
261def70
HPN
554 global subdir srcdir
555 global OBJDUMP NM AS OBJCOPY READELF LD
556 global OBJDUMPFLAGS NMFLAGS ASFLAGS OBJCOPYFLAGS READELFFLAGS LDFLAGS
557 global host_triplet runtests
9a2ee7fc 558 global env verbose
261def70
HPN
559
560 if [string match "*/*" $name] {
561 set file $name
562 set name [file tail $name]
563 } else {
564 set file "$srcdir/$subdir/$name"
565 }
566
567 if ![runtest_file_p $runtests $name] then {
568 return
569 }
570
571 set opt_array [slurp_options "${file}.d"]
572 if { $opt_array == -1 } {
573 perror "error reading options from $file.d"
574 unresolved $subdir/$name
575 return
576 }
577 set dumpfile tmpdir/dump.out
578 set run_ld 0
cfe5266f 579 set run_objcopy 0
261def70
HPN
580 set opts(as) {}
581 set opts(ld) {}
d6e0b160 582 set opts(ld_after_inputfiles) {}
261def70
HPN
583 set opts(xfail) {}
584 set opts(target) {}
585 set opts(notarget) {}
586 set opts(objdump) {}
587 set opts(nm) {}
588 set opts(objcopy) {}
589 set opts(readelf) {}
590 set opts(name) {}
591 set opts(PROG) {}
592 set opts(source) {}
ef2b5578 593 set opts(dump) {}
261def70 594 set opts(error) {}
bb00e284 595 set opts(warning) {}
cfe5266f 596 set opts(objcopy_linked_file) {}
261def70
HPN
597
598 foreach i $opt_array {
599 set opt_name [lindex $i 0]
600 set opt_val [lindex $i 1]
601 if ![info exists opts($opt_name)] {
602 perror "unknown option $opt_name in file $file.d"
603 unresolved $subdir/$name
604 return
605 }
606
607 switch -- $opt_name {
608 xfail {}
609 target {}
610 notarget {}
164de317
HPN
611 warning {}
612 error {}
261def70 613 source {
df58fc94 614 # Move any source-specific as-flags to a separate list to
261def70
HPN
615 # simplify processing.
616 if { [llength $opt_val] > 1 } {
df58fc94 617 lappend asflags [lrange $opt_val 1 end]
261def70
HPN
618 set opt_val [lindex $opt_val 0]
619 } else {
df58fc94 620 lappend asflags {}
261def70
HPN
621 }
622 }
623 default {
624 if [string length $opts($opt_name)] {
625 perror "option $opt_name multiply set in $file.d"
626 unresolved $subdir/$name
627 return
628 }
629
630 # A single "# ld:" with no options should do the right thing.
631 if { $opt_name == "ld" } {
632 set run_ld 1
633 }
cfe5266f
HPN
634 # Likewise objcopy_linked_file.
635 if { $opt_name == "objcopy_linked_file" } {
636 set run_objcopy 1
637 }
261def70
HPN
638 }
639 }
7f6a71ff
JM
640 if { $opt_name == "as" || $opt_name == "ld" } {
641 set opt_val [subst $opt_val]
642 }
134fa82e
HPN
643
644 # Append differently whether it's a message (without space) or
645 # an option or list (with space).
646 switch -- $opt_name {
647 warning -
648 error {
649 append opts($opt_name) $opt_val
650 }
651 default {
652 set opts($opt_name) [concat $opts($opt_name) $opt_val]
653 }
654 }
261def70 655 }
ef2b5578
MR
656
657 foreach i $extra_options {
658 set opt_name [lindex $i 0]
659 set opt_val [lindex $i 1]
660 if ![info exists opts($opt_name)] {
661 perror "unknown option $opt_name given in extra_opts"
662 unresolved $subdir/$name
663 return
664 }
665 # Add extra option to end of existing option, adding space
666 # if necessary.
667 if { ![regexp "warning|error" $opt_name]
668 && [string length $opts($opt_name)] } {
669 append opts($opt_name) " "
670 }
671 append opts($opt_name) $opt_val
672 }
673
3935e1af
RS
674 foreach opt { as ld } {
675 regsub {\[big_or_little_endian\]} $opts($opt) \
676 [big_or_little_endian] opts($opt)
677 }
261def70
HPN
678
679 # Decide early whether we should run the test for this target.
680 if { [llength $opts(target)] > 0 } {
681 set targmatch 0
682 foreach targ $opts(target) {
683 if [istarget $targ] {
684 set targmatch 1
685 break
686 }
687 }
688 if { $targmatch == 0 } {
689 return
690 }
691 }
692 foreach targ $opts(notarget) {
693 if [istarget $targ] {
694 return
695 }
696 }
697
f364d1ca
AM
698 set program ""
699 # It's meaningless to require an output-testing method when we
700 # expect an error.
701 if { $opts(error) == "" } {
702 if {$opts(PROG) != ""} {
703 switch -- $opts(PROG) {
704 objdump { set program objdump }
705 nm { set program nm }
706 objcopy { set program objcopy }
707 readelf { set program readelf }
708 default
261def70
HPN
709 { perror "unrecognized program option $opts(PROG) in $file.d"
710 unresolved $subdir/$name
711 return }
f364d1ca
AM
712 }
713 } else {
261def70 714 # Guess which program to run, by seeing which option was specified.
f364d1ca
AM
715 foreach p {objdump objcopy nm readelf} {
716 if {$opts($p) != ""} {
717 if {$program != ""} {
718 perror "ambiguous dump program in $file.d"
719 unresolved $subdir/$name
720 return
721 } else {
722 set program $p
723 }
261def70
HPN
724 }
725 }
726 }
f364d1ca 727 if { $program == "" && $opts(warning) == "" } {
261def70
HPN
728 perror "dump program unspecified in $file.d"
729 unresolved $subdir/$name
730 return
731 }
732 }
733
261def70
HPN
734 if { $opts(name) == "" } {
735 set testname "$subdir/$name"
736 } else {
737 set testname $opts(name)
738 }
739
740 if { $opts(source) == "" } {
741 set sourcefiles [list ${file}.s]
df58fc94 742 set asflags [list ""]
261def70
HPN
743 } else {
744 set sourcefiles {}
745 foreach sf $opts(source) {
b7b0b729
HPN
746 if { [string match "/*" $sf] } {
747 lappend sourcefiles "$sf"
f364d1ca 748 } else {
b7b0b729
HPN
749 lappend sourcefiles "$srcdir/$subdir/$sf"
750 }
261def70
HPN
751 }
752 }
753
ef2b5578
MR
754 if { $opts(dump) == "" } {
755 set dfile ${file}.d
756 } else {
757 set dfile $srcdir/$subdir/$opts(dump)
758 }
759
261def70
HPN
760 # Time to setup xfailures.
761 foreach targ $opts(xfail) {
762 setup_xfail $targ
763 }
764
765 # Assemble each file.
766 set objfiles {}
767 for { set i 0 } { $i < [llength $sourcefiles] } { incr i } {
768 set sourcefile [lindex $sourcefiles $i]
df58fc94 769 set sourceasflags [lindex $asflags $i]
261def70
HPN
770
771 set objfile "tmpdir/dump$i.o"
30dabe8a 772 catch "exec rm -f $objfile" exec_output
261def70 773 lappend objfiles $objfile
df58fc94 774 set cmd "$AS $ASFLAGS $opts(as) $sourceasflags -o $objfile $sourcefile"
261def70
HPN
775
776 send_log "$cmd\n"
7f6a71ff
JM
777 set cmdret [remote_exec host [concat sh -c [list "$cmd 2>&1"]] "" "/dev/null" "ld.tmp"]
778 remote_upload host "ld.tmp"
779 set comp_output [prune_warnings [file_contents "ld.tmp"]]
780 remote_file host delete "ld.tmp"
781 remote_file build delete "ld.tmp"
261def70 782
7f6a71ff 783 if { [lindex $cmdret 0] != 0 || ![string match "" $comp_output] } then {
261def70
HPN
784 send_log "$comp_output\n"
785 verbose "$comp_output" 3
f364d1ca
AM
786
787 set exitstat "succeeded"
788 if { $cmdret != 0 } { set exitstat "failed" }
789 verbose -log "$exitstat with: <$comp_output>"
261def70
HPN
790 fail $testname
791 return
792 }
793 }
794
f364d1ca
AM
795 set expmsg $opts(error)
796 if { $opts(warning) != "" } {
797 if { $expmsg != "" } {
798 perror "$testname: mixing error and warning test-directives"
799 return
800 }
801 set expmsg $opts(warning)
802 }
803
261def70
HPN
804 # Perhaps link the file(s).
805 if { $run_ld } {
806 set objfile "tmpdir/dump"
30dabe8a 807 catch "exec rm -f $objfile" exec_output
3e3f011f
RS
808
809 # Add -L$srcdir/$subdir so that the linker command can use
810 # linker scripts in the source directory.
811 set cmd "$LD $LDFLAGS -L$srcdir/$subdir \
d6e0b160 812 $opts(ld) -o $objfile $objfiles $opts(ld_after_inputfiles)"
261def70
HPN
813
814 send_log "$cmd\n"
7f6a71ff
JM
815 set cmdret [remote_exec host [concat sh -c [list "$cmd 2>&1"]] "" "/dev/null" "ld.tmp"]
816 remote_upload host "ld.tmp"
d3746675 817 set comp_output [file_contents "ld.tmp"]
7f6a71ff
JM
818 remote_file host delete "ld.tmp"
819 remote_file build delete "ld.tmp"
820 set cmdret [lindex $cmdret 0]
cfe5266f 821
f364d1ca 822 if { $cmdret == 0 && $run_objcopy } {
cfe5266f
HPN
823 set infile $objfile
824 set objfile "tmpdir/dump1"
7f6a71ff 825 remote_file host delete $objfile
cfe5266f
HPN
826
827 # Note that we don't use OBJCOPYFLAGS here; any flags must be
828 # explicitly specified.
829 set cmd "$OBJCOPY $opts(objcopy_linked_file) $infile $objfile"
830
831 send_log "$cmd\n"
7f6a71ff
JM
832 set cmdret [remote_exec host [concat sh -c [list "$cmd 2>&1"]] "" "/dev/null" "ld.tmp"]
833 remote_upload host "ld.tmp"
d3746675 834 append comp_output [file_contents "ld.tmp"]
7f6a71ff
JM
835 remote_file host delete "ld.tmp"
836 remote_file build delete "ld.tmp"
837 set cmdret [lindex $cmdret 0]
f364d1ca
AM
838 }
839
7f6a71ff 840 regsub "\n$" $comp_output "" comp_output
f364d1ca
AM
841 if { $cmdret != 0 || $comp_output != "" || $expmsg != "" } then {
842 set exitstat "succeeded"
843 if { $cmdret != 0 } { set exitstat "failed" }
844 verbose -log "$exitstat with: <$comp_output>, expected: <$expmsg>"
845 send_log "$comp_output\n"
846 verbose "$comp_output" 3
847
164de317
HPN
848 if { ($expmsg == "") == ($comp_output == "") \
849 && [regexp $expmsg $comp_output] \
850 && (($cmdret == 0) == ($opts(error) == "")) } {
f364d1ca
AM
851 # We have the expected output from ld.
852 if { $opts(error) != "" || $program == "" } {
853 pass $testname
854 return
cfe5266f 855 }
f364d1ca
AM
856 } else {
857 verbose -log "$exitstat with: <$comp_output>, expected: <$expmsg>"
cfe5266f
HPN
858 fail $testname
859 return
860 }
861 }
261def70
HPN
862 } else {
863 set objfile "tmpdir/dump0.o"
864 }
865
866 # We must not have expected failure if we get here.
867 if { $opts(error) != "" } {
868 fail $testname
cfe5266f 869 return
261def70
HPN
870 }
871
f364d1ca
AM
872 set progopts1 $opts($program)
873 eval set progopts \$[string toupper $program]FLAGS
874 eval set binary \$[string toupper $program]
875
7f6a71ff 876 if { ![is_remote host] && [which $binary] == 0 } {
261def70
HPN
877 untested $testname
878 return
879 }
880
881 if { $progopts1 == "" } { set $progopts1 "-r" }
882 verbose "running $binary $progopts $progopts1" 3
883
884 # Objcopy, unlike the other two, won't send its output to stdout,
885 # so we have to run it specially.
3e8cba19 886 set cmd "$binary $progopts $progopts1 $objfile > $dumpfile"
261def70
HPN
887 if { $program == "objcopy" } {
888 set cmd "$binary $progopts $progopts1 $objfile $dumpfile"
3e8cba19
AM
889 }
890
891 # Ensure consistent sorting of symbols
892 if {[info exists env(LC_ALL)]} {
893 set old_lc_all $env(LC_ALL)
894 }
895 set env(LC_ALL) "C"
896 send_log "$cmd\n"
7f6a71ff 897 set cmdret [remote_exec host [concat sh -c [list "$cmd 2>ld.tmp"]] "" "/dev/null"]
164de317 898 set cmdret [lindex $cmdret 0]
7f6a71ff
JM
899 remote_upload host "ld.tmp"
900 set comp_output [prune_warnings [file_contents "ld.tmp"]]
901 remote_file host delete "ld.tmp"
902 remote_file build delete "ld.tmp"
3e8cba19
AM
903 if {[info exists old_lc_all]} {
904 set env(LC_ALL) $old_lc_all
261def70 905 } else {
3e8cba19
AM
906 unset env(LC_ALL)
907 }
164de317
HPN
908 if { $cmdret != 0 || $comp_output != "" } {
909 send_log "exited abnormally with $cmdret, output:$comp_output\n"
3e8cba19
AM
910 fail $testname
911 return
261def70
HPN
912 }
913
9a2ee7fc 914 if { $verbose > 2 } then { verbose "output is [file_contents $dumpfile]" 3 }
ef2b5578 915 if { [regexp_diff $dumpfile "${dfile}"] } then {
261def70 916 fail $testname
9a2ee7fc 917 if { $verbose == 2 } then { verbose "output is [file_contents $dumpfile]" 2 }
261def70
HPN
918 return
919 }
920
921 pass $testname
922}
923
924proc slurp_options { file } {
5a68afcf
RM
925 # If options_regsub(foo) is set to {a b}, then the contents of a
926 # "#foo:" line will have regsub -all applied to replace a with b.
927 global options_regsub
928
261def70
HPN
929 if [catch { set f [open $file r] } x] {
930 #perror "couldn't open `$file': $x"
931 perror "$x"
932 return -1
933 }
934 set opt_array {}
935 # whitespace expression
936 set ws {[ ]*}
937 set nws {[^ ]*}
938 # whitespace is ignored anywhere except within the options list;
cfe5266f
HPN
939 # option names are alphabetic plus underscore only.
940 set pat "^#${ws}(\[a-zA-Z_\]*)$ws:${ws}(.*)$ws\$"
261def70
HPN
941 while { [gets $f line] != -1 } {
942 set line [string trim $line]
943 # Whitespace here is space-tab.
944 if [regexp $pat $line xxx opt_name opt_val] {
945 # match!
5a68afcf
RM
946 if [info exists options_regsub($opt_name)] {
947 set subst $options_regsub($opt_name)
948 regsub -all -- [lindex $subst 0] $opt_val [lindex $subst 1] \
949 opt_val
950 }
261def70
HPN
951 lappend opt_array [list $opt_name $opt_val]
952 } else {
953 break
954 }
955 }
956 close $f
957 return $opt_array
958}
959
261def70
HPN
960proc file_contents { filename } {
961 set file [open $filename r]
962 set contents [read $file]
963 close $file
964 return $contents
965}
bffbf940 966
5d3236ee
DK
967proc set_file_contents { filename contents } {
968 set file [open $filename w]
969 puts $file "$contents"
970 close $file
971}
972
d8880531
L
973# Create an archive using ar
974#
fa0a16b1 975proc ar_simple_create { ar aropts target objects } {
d8880531
L
976 remote_file host delete $target
977
fa0a16b1 978 set exec_output [run_host_cmd "$ar" "$aropts rc $target $objects"]
d8880531
L
979 set exec_output [prune_warnings $exec_output]
980
981 if [string match "" $exec_output] then {
982 send_log "$exec_output\n"
983 return 1
984 } else {
985 return 0
986 }
987}
988
9147e853
JJ
989# List contains test-items with 3 items followed by 2 lists, one item and
990# one optional item:
894891db
NC
991# 0:name
992# 1:ld/ar options
993# 2:assembler options
994# 3:filenames of assembler files
995# 4:list of actions, options and expected outputs.
996# 5:name of output file
997# 6:compiler flags (optional)
3b6fe0cc 998#
894891db
NC
999# Actions: { command command-line-options file-containg-expected-output-regexps }
1000# Commands:
1001# objdump: Apply objdump options on result.
1002# nm: Apply nm options on result.
1003# readelf: Apply readelf options on result.
5a68afcf 1004# ld: Don't apply anything on result. Compare output during linking with
894891db
NC
1005# the file containing regexps (which is the second arg, not the third).
1006# Note that this *must* be the first action if it is to be used at all;
1007# in all other cases, any output from the linker during linking is
1008# treated as a sign of an error and FAILs the test.
3b6fe0cc 1009#
bffbf940
JJ
1010proc run_ld_link_tests { ldtests } {
1011 global ld
1012 global as
1013 global nm
d8880531 1014 global ar
bffbf940
JJ
1015 global objdump
1016 global READELF
1017 global srcdir
1018 global subdir
1019 global env
9147e853
JJ
1020 global CC
1021 global CFLAGS
eca41774 1022 global runtests
5d3236ee 1023 global exec_output
bffbf940
JJ
1024
1025 foreach testitem $ldtests {
1026 set testname [lindex $testitem 0]
eca41774
DK
1027
1028 if ![runtest_file_p $runtests $testname] then {
1029 continue
1030 }
1031
bffbf940
JJ
1032 set ld_options [lindex $testitem 1]
1033 set as_options [lindex $testitem 2]
9147e853 1034 set src_files [lindex $testitem 3]
bffbf940
JJ
1035 set actions [lindex $testitem 4]
1036 set binfile tmpdir/[lindex $testitem 5]
9147e853 1037 set cflags [lindex $testitem 6]
bffbf940
JJ
1038 set objfiles {}
1039 set is_unresolved 0
1040 set failed 0
5d3236ee
DK
1041 set maybe_failed 0
1042 set ld_output ""
bffbf940
JJ
1043
1044# verbose -log "Testname is $testname"
1045# verbose -log "ld_options is $ld_options"
1046# verbose -log "as_options is $as_options"
9147e853 1047# verbose -log "src_files is $src_files"
bffbf940
JJ
1048# verbose -log "actions is $actions"
1049# verbose -log "binfile is $binfile"
1050
1051 # Assemble each file in the test.
9147e853 1052 foreach src_file $src_files {
74d44110
MR
1053 set fileroot "[file rootname [file tail $src_file]]"
1054 set objfile "tmpdir/$fileroot.o"
bffbf940
JJ
1055 lappend objfiles $objfile
1056
9147e853 1057 if { [file extension $src_file] == ".c" } {
74d44110 1058 set as_file "tmpdir/$fileroot.s"
9147e853
JJ
1059 if ![ld_compile "$CC -S $CFLAGS $cflags" $srcdir/$subdir/$src_file $as_file] {
1060 set is_unresolved 1
1061 break
1062 }
1063 } else {
1064 set as_file "$srcdir/$subdir/$src_file"
1065 }
1066 if ![ld_assemble $as "$as_options $as_file" $objfile] {
bffbf940
JJ
1067 set is_unresolved 1
1068 break
1069 }
1070 }
1071
1072 # Catch assembler errors.
77c56f44 1073 if { $is_unresolved } {
bffbf940
JJ
1074 unresolved $testname
1075 continue
1076 }
1077
a7470592 1078 if { [regexp ".*\\.a$" $binfile] } {
fa0a16b1 1079 if { ![ar_simple_create $ar $ld_options $binfile "$objfiles"] } {
d8880531 1080 set failed 1
d8880531 1081 }
fa0a16b1 1082 } elseif { ![ld_simple_link $ld $binfile "-L$srcdir/$subdir $ld_options $objfiles"] } {
5d3236ee
DK
1083 set maybe_failed 1
1084 set ld_output "$exec_output"
d8880531
L
1085 }
1086
77c56f44 1087 if { !$failed } {
bffbf940
JJ
1088 foreach actionlist $actions {
1089 set action [lindex $actionlist 0]
1090 set progopts [lindex $actionlist 1]
1091
1092 # There are actions where we run regexp_diff on the
1093 # output, and there are other actions (presumably).
1094 # Handling of the former look the same.
1095 set dump_prog ""
1096 switch -- $action {
1097 objdump
1098 { set dump_prog $objdump }
1099 nm
1100 { set dump_prog $nm }
1101 readelf
1102 { set dump_prog $READELF }
5d3236ee
DK
1103 ld
1104 { set dump_prog "ld" }
bffbf940
JJ
1105 default
1106 {
1107 perror "Unrecognized action $action"
1108 set is_unresolved 1
1109 break
1110 }
1111 }
1112
5d3236ee 1113 if { $action == "ld" } {
894891db
NC
1114 set regexpfile $progopts
1115 verbose "regexpfile is $srcdir/$subdir/$regexpfile"
5d3236ee
DK
1116 set_file_contents "tmpdir/ld.messages" "$ld_output"
1117 verbose "ld.messages has '[file_contents tmpdir/ld.messages]'"
894891db 1118 if { [regexp_diff "tmpdir/ld.messages" "$srcdir/$subdir/$regexpfile"] } then {
5d3236ee
DK
1119 verbose "output is $ld_output" 2
1120 set failed 1
1121 break
1122 }
1123 set maybe_failed 0
77c56f44 1124 } elseif { !$maybe_failed && $dump_prog != "" } {
bffbf940
JJ
1125 set dumpfile [lindex $actionlist 2]
1126 set binary $dump_prog
1127
1128 # Ensure consistent sorting of symbols
1129 if {[info exists env(LC_ALL)]} {
1130 set old_lc_all $env(LC_ALL)
1131 }
1132 set env(LC_ALL) "C"
7f6a71ff
JM
1133 set cmd "$binary $progopts $binfile"
1134 set status [remote_exec host [concat sh -c [list "$cmd >dump.out 2>ld.stderr"]] "" "/dev/null"]
bffbf940 1135 send_log "$cmd\n"
7f6a71ff
JM
1136 remote_upload host "ld.stderr"
1137 set comp_output [prune_warnings [file_contents "ld.stderr"]]
1138 remote_file host delete "ld.stderr"
1139 remote_file build delete "ld.stderr"
5a68afcf 1140
bffbf940
JJ
1141 if {[info exists old_lc_all]} {
1142 set env(LC_ALL) $old_lc_all
1143 } else {
1144 unset env(LC_ALL)
1145 }
bffbf940
JJ
1146
1147 if ![string match "" $comp_output] then {
1148 send_log "$comp_output\n"
1149 set failed 1
1150 break
1151 }
1152
7f6a71ff
JM
1153 remote_upload host "dump.out"
1154
bffbf940
JJ
1155 if { [regexp_diff "dump.out" "$srcdir/$subdir/$dumpfile"] } then {
1156 verbose "output is [file_contents "dump.out"]" 2
1157 set failed 1
7f6a71ff
JM
1158 remote_file build delete "dump.out"
1159 remote_file host delete "dump.out"
bffbf940
JJ
1160 break
1161 }
7f6a71ff
JM
1162 remote_file build delete "dump.out"
1163 remote_file host delete "dump.out"
bffbf940
JJ
1164 }
1165 }
bffbf940
JJ
1166 }
1167
77c56f44 1168 if { $is_unresolved } {
bffbf940 1169 unresolved $testname
77c56f44
RS
1170 } elseif { $maybe_failed || $failed } {
1171 fail $testname
1172 } else {
1173 pass $testname
bffbf940
JJ
1174 }
1175 }
1176}
1177
252b5132
RH
1178# This definition is taken from an unreleased version of DejaGnu. Once
1179# that version gets released, and has been out in the world for a few
1180# months at least, it may be safe to delete this copy.
1181if ![string length [info proc prune_warnings]] {
1182 #
1183 # prune_warnings -- delete various system verbosities from TEXT
1184 #
1185 # An example is:
1186 # ld.so: warning: /usr/lib/libc.so.1.8.1 has older revision than expected 9
1187 #
1188 # Sites with particular verbose os's may wish to override this in site.exp.
1189 #
1190 proc prune_warnings { text } {
1191 # This is from sun4's. Do it for all machines for now.
1192 # The "\\1" is to try to preserve a "\n" but only if necessary.
1193 regsub -all "(^|\n)(ld.so: warning:\[^\n\]*\n?)+" $text "\\1" text
1194
1195 # It might be tempting to get carried away and delete blank lines, etc.
1196 # Just delete *exactly* what we're ask to, and that's it.
1197 return $text
1198 }
1199}
24edc24d 1200
c8c140d9
BE
1201# targets_to_xfail is a list of target triplets to be xfailed.
1202# ldtests contains test-items with 3 items followed by 1 lists, 2 items
fab4a87f 1203# and 3 optional items:
c8c140d9
BE
1204# 0:name
1205# 1:ld options
1206# 2:assembler options
55255dae 1207# 3:filenames of source files
c8c140d9
BE
1208# 4:name of output file
1209# 5:expected output
1210# 6:compiler flags (optional)
55255dae 1211# 7:language (optional)
fab4a87f 1212# 8:linker warning (optional)
c8c140d9
BE
1213
1214proc run_ld_link_exec_tests { targets_to_xfail ldtests } {
24edc24d
L
1215 global ld
1216 global as
1217 global srcdir
1218 global subdir
1219 global env
1220 global CC
55255dae 1221 global CXX
24edc24d 1222 global CFLAGS
58ffc3bd 1223 global CXXFLAGS
22ec3bd1 1224 global errcnt
fab4a87f 1225 global exec_output
24edc24d
L
1226
1227 foreach testitem $ldtests {
c8c140d9
BE
1228 foreach target $targets_to_xfail {
1229 setup_xfail $target
1230 }
24edc24d
L
1231 set testname [lindex $testitem 0]
1232 set ld_options [lindex $testitem 1]
1233 set as_options [lindex $testitem 2]
1234 set src_files [lindex $testitem 3]
1235 set binfile tmpdir/[lindex $testitem 4]
1236 set expfile [lindex $testitem 5]
1237 set cflags [lindex $testitem 6]
55255dae 1238 set lang [lindex $testitem 7]
fab4a87f 1239 set warning [lindex $testitem 8]
24edc24d 1240 set objfiles {}
24edc24d
L
1241 set failed 0
1242
1243# verbose -log "Testname is $testname"
1244# verbose -log "ld_options is $ld_options"
1245# verbose -log "as_options is $as_options"
1246# verbose -log "src_files is $src_files"
1247# verbose -log "actions is $actions"
1248# verbose -log "binfile is $binfile"
1249
1250 # Assemble each file in the test.
1251 foreach src_file $src_files {
74d44110
MR
1252 set fileroot "[file rootname [file tail $src_file]]"
1253 set objfile "tmpdir/$fileroot.o"
24edc24d
L
1254 lappend objfiles $objfile
1255
a10e6b21
L
1256 # We ignore warnings since some compilers may generate
1257 # incorrect section attributes and the assembler will warn
1258 # them.
58ffc3bd
MF
1259 if { [ string match "c++" $lang ] } {
1260 ld_compile "$CXX -c $CXXFLAGS $cflags" $srcdir/$subdir/$src_file $objfile
1261 } else {
1262 ld_compile "$CC -c $CFLAGS $cflags" $srcdir/$subdir/$src_file $objfile
1263 }
a10e6b21
L
1264
1265 # We have to use $CC to build PIE and shared library.
55255dae
L
1266 if { [ string match "c" $lang ] } {
1267 set link_proc ld_simple_link
1268 set link_cmd $CC
1269 } elseif { [ string match "c++" $lang ] } {
1270 set link_proc ld_simple_link
1271 set link_cmd $CXX
1272 } elseif { [ string match "-shared" $ld_options ] \
a10e6b21
L
1273 || [ string match "-pie" $ld_options ] } {
1274 set link_proc ld_simple_link
1275 set link_cmd $CC
1276 } else {
1277 set link_proc ld_link
1278 set link_cmd $ld
1279 }
24edc24d 1280
a10e6b21 1281 if ![$link_proc $link_cmd $binfile "-L$srcdir/$subdir $ld_options $objfiles"] {
24edc24d
L
1282 set failed 1
1283 } else {
a10e6b21 1284 set failed 0
fab4a87f
L
1285 }
1286
1287 # Check if exec_output is expected.
1288 if { $warning != "" } then {
1289 verbose -log "returned with: <$exec_output>, expected: <$warning>"
1290 if { [regexp $warning $exec_output] } then {
1291 set failed 0
1292 } else {
1293 set failed 1
1294 }
1295 }
1296
1297 if { $failed == 0 } {
a10e6b21
L
1298 send_log "Running: $binfile > $binfile.out\n"
1299 verbose "Running: $binfile > $binfile.out"
1300 catch "exec $binfile > $binfile.out" exec_output
5a68afcf 1301
24edc24d
L
1302 if ![string match "" $exec_output] then {
1303 send_log "$exec_output\n"
1304 verbose "$exec_output" 1
1305 set failed 1
a10e6b21
L
1306 } else {
1307 send_log "diff $binfile.out $srcdir/$subdir/$expfile\n"
1308 verbose "diff $binfile.out $srcdir/$subdir/$expfile"
1309 catch "exec diff $binfile.out $srcdir/$subdir/$expfile" exec_output
1310 set exec_output [prune_warnings $exec_output]
1311
1312 if ![string match "" $exec_output] then {
1313 send_log "$exec_output\n"
1314 verbose "$exec_output" 1
1315 set failed 1
1316 }
24edc24d
L
1317 }
1318 }
1319
1320 if { $failed != 0 } {
1321 fail $testname
22ec3bd1
L
1322 } else {
1323 set errcnt 0
24edc24d 1324 pass $testname
a10e6b21 1325 }
24edc24d 1326 }
24edc24d
L
1327 }
1328}
d2dee3b2
L
1329
1330# List contains test-items with 3 items followed by 2 lists, one item and
1331# one optional item:
55255dae 1332# 0:name
fa0a16b1 1333# 1:ld or ar options
55255dae
L
1334# 2:compile options
1335# 3:filenames of source files
1336# 4:action and options.
1337# 5:name of output file
1338# 6:language (optional)
dd98f8d2 1339# 7:linker warnings (optional)
d2dee3b2
L
1340#
1341# Actions:
1342# objdump: Apply objdump options on result. Compare with regex (last arg).
1343# nm: Apply nm options on result. Compare with regex (last arg).
1344# readelf: Apply readelf options on result. Compare with regex (last arg).
1345#
1346proc run_cc_link_tests { ldtests } {
1347 global nm
1348 global objdump
1349 global READELF
1350 global srcdir
1351 global subdir
1352 global env
1353 global CC
55255dae 1354 global CXX
d2dee3b2 1355 global CFLAGS
58ffc3bd 1356 global CXXFLAGS
d8880531 1357 global ar
dd98f8d2 1358 global exec_output
d2dee3b2
L
1359
1360 foreach testitem $ldtests {
1361 set testname [lindex $testitem 0]
1362 set ldflags [lindex $testitem 1]
1363 set cflags [lindex $testitem 2]
1364 set src_files [lindex $testitem 3]
1365 set actions [lindex $testitem 4]
1366 set binfile tmpdir/[lindex $testitem 5]
55255dae 1367 set lang [lindex $testitem 6]
dd98f8d2 1368 set warnings [lindex $testitem 7]
d2dee3b2
L
1369 set objfiles {}
1370 set is_unresolved 0
1371 set failed 0
1372
1373 # Compile each file in the test.
1374 foreach src_file $src_files {
74d44110
MR
1375 set fileroot "[file rootname [file tail $src_file]]"
1376 set objfile "tmpdir/$fileroot.o"
d2dee3b2
L
1377 lappend objfiles $objfile
1378
1379 # We ignore warnings since some compilers may generate
1380 # incorrect section attributes and the assembler will warn
1381 # them.
58ffc3bd
MF
1382 if { [ string match "c++" $lang ] } {
1383 ld_compile "$CXX -c $CXXFLAGS $cflags" $srcdir/$subdir/$src_file $objfile
1384 } else {
1385 ld_compile "$CC -c $CFLAGS $cflags" $srcdir/$subdir/$src_file $objfile
1386 }
d2dee3b2
L
1387 }
1388
1389 # Clear error and warning counts.
1390 reset_vars
1391
55255dae
L
1392 if { [ string match "c++" $lang ] } {
1393 set cc_cmd $CXX
1394 } else {
1395 set cc_cmd $CC
1396 }
1397
a7470592 1398 if { [regexp ".*\\.a$" $binfile] } {
fa0a16b1 1399 if { ![ar_simple_create $ar $ldflags $binfile "$objfiles"] } {
d8880531
L
1400 fail $testname
1401 set failed 1
1402 } else {
1403 set failed 0
1404 }
fa0a16b1 1405 } elseif { ![ld_simple_link $cc_cmd $binfile "-L$srcdir/$subdir $ldflags $objfiles"] } {
dd98f8d2
NC
1406 # Check if exec_output is expected.
1407 if { $warnings != "" } then {
1408 verbose -log "returned with: <$exec_output>, expected: <$warnings>"
1409 if { [regexp $warnings $exec_output] } then {
1410 set failed 0
1411 } else {
1412 set failed 1
1413 }
1414 } else {
1415 fail $testname
1416 set failed 1
1417 }
d2dee3b2
L
1418 } else {
1419 set failed 0
d8880531
L
1420 }
1421
1422 if { $failed == 0 } {
d2dee3b2
L
1423 foreach actionlist $actions {
1424 set action [lindex $actionlist 0]
1425 set progopts [lindex $actionlist 1]
1426
1427 # There are actions where we run regexp_diff on the
1428 # output, and there are other actions (presumably).
1429 # Handling of the former look the same.
1430 set dump_prog ""
1431 switch -- $action {
1432 objdump
1433 { set dump_prog $objdump }
1434 nm
1435 { set dump_prog $nm }
1436 readelf
1437 { set dump_prog $READELF }
1438 default
1439 {
1440 perror "Unrecognized action $action"
1441 set is_unresolved 1
1442 break
1443 }
1444 }
1445
1446 if { $dump_prog != "" } {
1447 set dumpfile [lindex $actionlist 2]
1448 set binary $dump_prog
1449
1450 # Ensure consistent sorting of symbols
1451 if {[info exists env(LC_ALL)]} {
1452 set old_lc_all $env(LC_ALL)
1453 }
1454 set env(LC_ALL) "C"
1455 set cmd "$binary $progopts $binfile > dump.out"
1456 send_log "$cmd\n"
1457 catch "exec $cmd" comp_output
1458 if {[info exists old_lc_all]} {
1459 set env(LC_ALL) $old_lc_all
1460 } else {
1461 unset env(LC_ALL)
1462 }
1463 set comp_output [prune_warnings $comp_output]
1464
1465 if ![string match "" $comp_output] then {
1466 send_log "$comp_output\n"
1467 set failed 1
1468 break
1469 }
1470
1471 if { [regexp_diff "dump.out" "$srcdir/$subdir/$dumpfile"] } then {
1472 verbose "output is [file_contents "dump.out"]" 2
1473 set failed 1
1474 break
1475 }
1476 }
1477 }
1478
1479 if { $failed != 0 } {
1480 fail $testname
1481 } else { if { $is_unresolved == 0 } {
1482 pass $testname
1483 } }
1484 }
1485
1486 # Catch action errors.
1487 if { $is_unresolved != 0 } {
1488 unresolved $testname
1489 continue
1490 }
1491 }
1492}
430a16a5
NC
1493
1494# Returns true if --gc-sections is supported on the target.
1495
1496proc check_gc_sections_available { } {
1497 global gc_sections_available_saved
1498 global ld
5a68afcf 1499
430a16a5
NC
1500 if {![info exists gc_sections_available_saved]} {
1501 # Some targets don't support gc-sections despite whatever's
1502 # advertised by ld's options.
a06ea964
NC
1503 if {[istarget aarch64*-*-*]
1504 || [istarget arc-*-*]
de5c4ae2
AM
1505 || [istarget d30v-*-*]
1506 || [istarget dlx-*-*]
1507 || [istarget i960-*-*]
1508 || [istarget or32-*-*]
1509 || [istarget pj*-*-*]
1510 || [istarget alpha-*-*]
1d5316ab 1511 || [istarget hppa*64-*-*]
de5c4ae2
AM
1512 || [istarget i370-*-*]
1513 || [istarget i860-*-*]
5a7c5e86 1514 || [istarget ia64-*-*]
de5c4ae2
AM
1515 || [istarget mep-*-*]
1516 || [istarget mn10200-*-*]
b1435da1 1517 || [istarget *-*-cygwin]
5a7c5e86 1518 || [istarget *-*-mingw*] } {
430a16a5
NC
1519 set gc_sections_available_saved 0
1520 return 0
1521 }
1522
1523 # elf2flt uses -q (--emit-relocs), which is incompatible with
1524 # --gc-sections.
1525 if { [board_info target exists ldflags]
1526 && [regexp " -elf2flt\[ =\]" " [board_info target ldflags] "] } {
1527 set gc_sections_available_saved 0
1528 return 0
1529 }
1530
430a16a5 1531 # Check if the ld used by gcc supports --gc-sections.
1d5316ab
AM
1532 # FIXME: this test is useless since ld --help always says
1533 # --gc-sections is available
430a16a5
NC
1534 set ld_output [remote_exec host $ld "--help"]
1535 if { [ string first "--gc-sections" $ld_output ] >= 0 } {
1536 set gc_sections_available_saved 1
1537 } else {
1538 set gc_sections_available_saved 0
1539 }
1540 }
1541 return $gc_sections_available_saved
1542}
33aa234e 1543
1d5316ab
AM
1544# Returns true if -shared is supported on the target
1545# Only used and accurate for ELF targets at the moment
1546
1547proc check_shared_lib_support { } {
1548 if {![istarget arc-*-*]
1549 && ![istarget avr-*-*]
1550 && ![istarget cr16-*-*]
1551 && ![istarget cris*-*-*]
1552 && ![istarget crx-*-*]
1553 && ![istarget d10v-*-*]
1554 && ![istarget d30v-*-*]
1555 && ![istarget dlx-*-*]
cfb8c092 1556 && ![istarget epiphany-*-*]
1d5316ab
AM
1557 && ![istarget fr30-*-*]
1558 && ![istarget frv-*-*]
1559 && ![istarget h8300-*-*]
1560 && ![istarget i860-*-*]
1561 && ![istarget i960-*-*]
1562 && ![istarget ip2k-*-*]
1563 && ![istarget iq2000-*-*]
1564 && ![istarget lm32-*-*]
1565 && ![istarget m32c-*-*]
1566 && ![istarget m32r-*-*]
32d79e68
AM
1567 && ![istarget m6811-*-*]
1568 && ![istarget m6812-*-*]
1d5316ab
AM
1569 && ![istarget m68hc1*-*-*]
1570 && ![istarget mcore*-*-*]
1571 && ![istarget mep-*-*]
1572 && ![istarget microblaze-*-*]
1573 && ![istarget mn10200-*-*]
1574 && ![istarget moxie-*-*]
1575 && ![istarget msp430-*-*]
1576 && ![istarget mt-*-*]
1577 && ![istarget openrisc-*-*]
1578 && ![istarget or32-*-*]
1579 && ![istarget pj-*-*]
1580 && ![istarget rx-*-*]
1581 && ![istarget spu-*-*]
1582 && ![istarget v850*-*-*]
1583 && ![istarget xstormy16-*-*]
1584 && ![istarget *-*-irix*]
1585 && ![istarget *-*-rtems] } {
1586 return 1
1587 }
1588 return 0
1589}
1590
5d3236ee
DK
1591# Returns true if the target ld supports the plugin API.
1592proc check_plugin_api_available { } {
1593 global plugin_api_available_saved
1594 global ld
1595 if {![info exists plugin_api_available_saved]} {
1596 # Check if the ld used by gcc supports --plugin.
1597 set ld_output [remote_exec host $ld "--help"]
1598 if { [ string first "-plugin" $ld_output ] >= 0 } {
1599 set plugin_api_available_saved 1
1600 } else {
1601 set plugin_api_available_saved 0
1602 }
1603 }
1604 return $plugin_api_available_saved
1605}
1606
33aa234e
JK
1607# Check if the assembler supports CFI statements.
1608
1609proc check_as_cfi { } {
1610 global check_as_cfi_result
1611 global as
1612 if [info exists check_as_cfi_result] {
1613 return $check_as_cfi_result
1614 }
1615 set as_file "tmpdir/check_as_cfi.s"
1616 set as_fh [open $as_file w 0666]
1617 puts $as_fh "# Generated file. DO NOT EDIT"
1618 puts $as_fh "\t.cfi_startproc"
1619 puts $as_fh "\t.cfi_endproc"
1620 close $as_fh
1621 remote_download host $as_file
1622 verbose -log "Checking CFI support:"
1623 rename "perror" "check_as_cfi_perror"
1624 proc perror { args } { }
1625 set success [ld_assemble $as $as_file "/dev/null"]
1626 rename "perror" ""
1627 rename "check_as_cfi_perror" "perror"
1628 #remote_file host delete $as_file
1629 set check_as_cfi_result $success
1630 return $success
1631}
1632
1633# Provide virtual target "cfi" for targets supporting CFI.
1634
1635rename "istarget" "istarget_ld"
1636proc istarget { target } {
1637 if {$target == "cfi"} {
1638 return [check_as_cfi]
1639 }
1640 return [istarget_ld $target]
1641}
This page took 0.743168 seconds and 4 git commands to generate.