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