]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - binutils/testsuite/lib/binutils-common.exp
Emit a note warning the user that creating an executable stack because of a missing...
[thirdparty/binutils-gdb.git] / binutils / testsuite / lib / binutils-common.exp
CommitLineData
a2c58332 1# Copyright (C) 1993-2022 Free Software Foundation, Inc.
f3097f33
RS
2#
3# This file is part of the GNU Binutils.
4#
5# This file is free software; you can redistribute it and/or modify
6# it under the terms of the GNU General Public License as published by
7# the Free Software Foundation; either version 3 of the License, or
8# (at your option) any later version.
9#
10# This program is distributed in the hope that it will be useful,
11# but WITHOUT ANY WARRANTY; without even the implied warranty of
12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13# GNU General Public License for more details.
14#
15# You should have received a copy of the GNU General Public License
16# along with this program; if not, write to the Free Software
17# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
18# MA 02110-1301, USA.
19
20# True if the object format is known to be ELF.
21#
22proc is_elf_format {} {
b3066ae8
AM
23 # config.sub for these targets curiously transforms a target doublet
24 # ending in -elf to -none. eg. m68hc12-elf to m68hc12-unknown-none
25 # They are always elf.
7b4ae824 26 if { [istarget m68hc1*-*] || [istarget s12z*-*] || [istarget xgate-*] } {
b3066ae8
AM
27 return 1;
28 }
679ca975
AM
29# vxworks (and windiss) excluded due to number of ELF tests that need
30# modifying to pass on those targets.
31# && ![istarget *-*-vxworks*]
32# && ![istarget *-*-windiss*]
b3066ae8 33
679ca975
AM
34 if { ![istarget *-*-chorus*]
35 && ![istarget *-*-cloudabi*]
36 && ![istarget *-*-eabi*]
37 && ![istarget *-*-*elf*]
38 && ![istarget *-*-*freebsd*]
39 && ![istarget *-*-fuchsia*]
f3097f33 40 && ![istarget *-*-gnu*]
f3097f33
RS
41 && ![istarget *-*-irix5*]
42 && ![istarget *-*-irix6*]
679ca975
AM
43 && ![istarget *-*-kaos*]
44 && ![istarget *-*-*linux*]
c43b2c54 45 && ![istarget *-*-lynxos*]
4a85cc09 46 && ![istarget *-*-nacl*]
f3097f33 47 && ![istarget *-*-netbsd*]
679ca975 48 && ![istarget *-*-nto*]
f3097f33 49 && ![istarget *-*-openbsd*]
4a85cc09
SKS
50 && ![istarget *-*-rtems*]
51 && ![istarget *-*-solaris2*]
52 && ![istarget *-*-sysv4*]
53 && ![istarget *-*-unixware*]
f96bd6c2 54 && ![istarget *-*-wasm32*]
4a85cc09 55 && ![istarget avr-*-*]
4a85cc09 56 && ![istarget hppa*64*-*-hpux*]
e7e57d02 57 && ![istarget i?86-*-beos*]
679ca975 58 && ![istarget ia64-*-hpux*] } {
f3097f33
RS
59 return 0
60 }
61
e7e57d02
JB
62 if { [istarget i?86-*-beospe*] } {
63 return 0
64 }
65
c65c21e1
AM
66 if { [istarget *-*-linux*ecoff*]
67 || [istarget *-*-rtemscoff*] } {
f3097f33
RS
68 return 0
69 }
70
ab4f385b 71 if { [istarget *-*-netbsdaout*] } {
4d496013 72 return 0
f3097f33
RS
73 }
74
4a85cc09 75 if { [istarget arm-*-openbsd*]
f3097f33 76 || [istarget ns32k-*-openbsd*]
f3097f33
RS
77 || [istarget vax-*-openbsd*] } {
78 return 0
79 }
80
81 return 1
82}
83
84# True if the object format is known to be a.out.
85#
86proc is_aout_format {} {
c65c21e1 87 if { [istarget *-*-*aout*]
f3097f33
RS
88 || [istarget *-*-bsd*]
89 || [istarget *-*-msdos*]
f3097f33 90 || [istarget ns32k-*-*]
ab4f385b 91 || [istarget pdp11-*-*] } {
f3097f33
RS
92 return 1
93 }
94 return 0
95}
96
97# True if the object format is known to be PE COFF.
98#
7a34d0ea
AM
99proc is_pecoff_format args {
100 if { [llength $args] == 1 } {
101 set m_os [lindex $args 0]
102 } else {
103 set m_os *-*
104 }
105 if { [istarget $m_os-beospe*]
106 || [istarget $m_os-cegcc*]
107 || [istarget $m_os-cygwin*]
108 || [istarget $m_os-interix*]
109 || [istarget $m_os-mingw*]
7a34d0ea
AM
110 || [istarget $m_os-pe*]
111 || [istarget $m_os-winnt*] } {
5b537ffc 112 return 1
f3097f33 113 }
5b537ffc 114 return 0
f3097f33
RS
115}
116
0b1352e0
AM
117proc is_som_format {} {
118 if { ![istarget hppa*-*-*] || [istarget hppa*64*-*-*] } {
119 return 0;
120 }
121 if { [istarget *-*-osf*] \
122 || [istarget {*-*-h[ip]ux*}] \
123 || [istarget *-*-mpeix*] \
124 || [istarget *-*-bsd*] } {
125 return 1;
126 }
127 return 0;
128}
129
efd0ed58
AM
130proc is_xcoff_format {} {
131 if { [istarget rs6000-*-*]
132 || [istarget powerpc*-*-aix*]
133 || [istarget powerpc*-*-beos*]
134 || [istarget powerpc*-*-macos*] } {
135 return 1;
136 }
137 return 0;
138}
139
f3097f33
RS
140# True if the object format is known to be 64-bit ELF.
141#
142proc is_elf64 { binary_file } {
143 global READELF
144 global READELFFLAGS
145
506b86a4 146 set tmpfile [file dirname $binary_file]/readelf.out
f3097f33 147 set readelf_size ""
506b86a4 148 catch "exec $READELF $READELFFLAGS -h $binary_file > $tmpfile" got
f3097f33
RS
149
150 if ![string match "" $got] then {
151 return 0
152 }
153
154 if { ![regexp "\n\[ \]*Class:\[ \]*ELF(\[0-9\]+)\n" \
506b86a4 155 [file_contents $tmpfile] nil readelf_size] } {
f3097f33
RS
156 return 0
157 }
158
159 if { $readelf_size == "64" } {
160 return 1
161 }
162
163 return 0
164}
eb22018c 165
506b86a4
AM
166# True if the object format is known to use RELA relocations.
167#
168proc is_rela { binary_file } {
169 global READELF
170 global READELFFLAGS
171
172 set tmpfile [file dirname $binary_file]/readelf.out
173 catch "exec $READELF $READELFFLAGS -S $binary_file > $tmpfile" got
174
175 if ![string match "" $got] then {
176 return 0
177 }
178
179 if { ![regexp "RELA" [file_contents $tmpfile]] } {
180 return 0
181 }
182
183 return 1
184}
185
d4f5b5e2
AM
186# Return the file name suffix required for executables, if any.
187#
188proc exeext {} {
189 if { [istarget *-*-cygwin*]
190 || [istarget *-*-mingw*]
191 || [istarget *-*-msdos*]
192 || [istarget *-*-*vms*] } {
193 return ".exe"
194 }
195 return ""
196}
197
6d9dabbb
MR
198# True if the target matches TARGET, specified as a TCL procedure if
199# in square brackets or as machine triplet otherwise.
200#
201proc match_target { target } {
02e0be69 202 if [regexp {^!?\[.*\]$} $target] {
6d9dabbb
MR
203 return $target
204 } else {
205 return [istarget $target]
206 }
207}
208
02e0be69
AM
209# True if the ELF target supports setting the ELF header OSABI field
210# to ELFOSABI_GNU or ELFOSABI_FREEBSD, a requirement for STT_GNU_IFUNC
99fabbc9 211# symbol and SHF_GNU_MBIND or SHF_GNU_RETAIN section support.
a43942db
MR
212#
213# This generally depends on the target OS only, however there are a
214# number of exceptions for bare metal targets as follows. The MSP430
02e0be69
AM
215# and Visium targets set OSABI to ELFOSABI_STANDALONE. Likewise
216# non-EABI ARM targets set OSABI to ELFOSABI_ARM
a43942db 217#
99fabbc9
JL
218# Non-Linux HPPA defaults to ELFOSABI_HPUX.
219#
02e0be69
AM
220# Note that some TI C6X targets use ELFOSABI_C6000_* but one doesn't,
221# so we don't try to sort out tic6x here. (The effect is that linker
222# testcases will generally need to exclude tic6x or use a -m option.)
223#
224proc supports_gnu_osabi {} {
a43942db
MR
225 if { [istarget *-*-gnu*]
226 || [istarget *-*-linux*]
02e0be69
AM
227 || [istarget *-*-nacl*]
228 || ( [istarget *-*-*bsd*] && ![istarget arm*-*-netbsd*] )
02e0be69
AM
229 || [istarget *-*-lynxos]
230 || ( [istarget *-*-nto*] && ![istarget arm*-*-*] )
231 || [istarget *-*-irix*]
232 || [istarget *-*-*eabi*]
bb897477 233 || [istarget *-*-rtems*] } {
a43942db
MR
234 return 1
235 }
f96bd6c2 236 if { [istarget "wasm32*-*-*"] } {
4d496013 237 return 1
f96bd6c2 238 }
a43942db
MR
239 if { ![istarget "*-*-elf*"] } {
240 return 0
241 }
242 if { [istarget "arm*-*-*"]
243 || [istarget "msp430-*-*"]
99fabbc9 244 || [istarget "hppa-unknown-elf"]
a43942db
MR
245 || [istarget "visium-*-*"] } {
246 return 0
247 }
02e0be69
AM
248 return 1
249}
250
251# Return true if target uses the generic_link_hash_table linker.
252proc is_generic { } {
253 if { [istarget "d30v-*-*"]
a43942db 254 || [istarget "dlx-*-*"]
be570f06 255 || [istarget "pj*-*-*"]
6ff185b8 256 || [istarget "s12z-*-*"]
be570f06 257 || [istarget "xgate-*-*"] } {
02e0be69
AM
258 return 1
259 }
260 return 0
261}
262
d1bcae83
L
263# True if the object format is ELF with unused section symbols.
264proc is_elf_unused_section_symbols {} {
265 global AS ASFLAGS READELF
266
267 if {![info exists elf_unused_section_symbols_saved]} {
268 set elf_unused_section_symbols_saved 1
269 if { [is_elf_format] } {
270 set base "empty[pid]"
271 set src "$base.s"
272 set obj "$base.obj"
273 set f [open $src "w"]
274 close $f
275 set cmd "$AS $ASFLAGS -o $obj $src"
276 send_log "$cmd\n"
277 set cmdret [remote_exec host $cmd]
278 set cmdret [lindex $cmdret 0]
279 if { $cmdret == 0 } {
280 set cmd "$READELF -sW $obj"
281 send_log "$cmd\n"
282 set got [remote_exec host $cmd]
283 if { ![string match "*SECTION*" $got] } {
284 set elf_unused_section_symbols_saved 0
285 }
286 }
287 file delete $obj
288 file delete $src
289 }
290 }
291 return $elf_unused_section_symbols_saved
292}
293
02e0be69
AM
294# True if the ELF target supports STB_GNU_UNIQUE.
295#
296# This require ELFOSABI_GNU, and `bfd_elf_final_link'.
297#
298proc supports_gnu_unique {} {
299 if { [istarget *-*-freebsd*] } {
a43942db
MR
300 return 0
301 }
02e0be69
AM
302 if { [supports_gnu_osabi] && ![is_generic] } {
303 return 1
304 }
305 return 0
a43942db
MR
306}
307
9cc0123f
AM
308# True for targets that do not sort .symtab as per the ELF standard.
309# ie. any that have mips_elf32_be_vec, mips_elf32_le_vec,
310# mips_elf32_n_be_vec or mips_elf32_n_le_vec as the primary bfd target
311# vector in config.bfd. When syncing with config.bfd, don't forget that
312# earlier case-matches trump later ones.
313proc is_bad_symtab {} {
314 if { ![istarget "mips*-*-*"] } {
315 return 0;
316 }
317 if { [istarget "*-*-chorus*"]
318 || [istarget "*-*-irix5*"]
319 || [istarget "*-*-irix6*"]
320 || [istarget "*-*-none"]
321 || [istarget "*-*-rtems*"]
322 || [istarget "*-*-windiss"] } {
323 return 1;
324 }
325 if { [istarget "*-*-elf*"]
326 && ![istarget "*-sde-*"]
327 && ![istarget "*-mti-*"]
328 && ![istarget "*-img-*"] } {
329 return 1;
330 }
331 if { [istarget "*-*-openbsd*"]
332 && ![istarget "mips64*-*-*"] } {
333 return 1;
334 }
335 return 0;
336}
337
33ea299c
TP
338# Returns true if -shared is supported on the target
339
340proc check_shared_lib_support { } {
341 global shared_available_saved
342 global ld
343
344 if {![info exists shared_available_saved]} {
345 set ld_output [remote_exec host $ld "-shared"]
346 if { [ string first "not supported" $ld_output ] >= 0 } {
347 set shared_available_saved 0
348 } else {
349 set shared_available_saved 1
350 }
351 }
352 return $shared_available_saved
353}
354
8a8a1171
NC
355# Returns true if -pie is supported on the target
356
357proc check_pie_support { } {
358 global pie_available_saved
359 global ld
360
361 if {![info exists pie_available_saved]} {
362 set ld_output [remote_exec host $ld "-pie"]
363 if { [ string first "not supported" $ld_output ] >= 0 } {
364 set pie_available_saved 0
365 } else {
366 set pie_available_saved 1
367 }
368 }
369 return $pie_available_saved
370}
371
5fd104ad
AM
372proc check_relro_support { } {
373 global relro_available_saved
374 global ld
375
376 if {![info exists relro_available_saved]} {
377 remote_file host delete norelro
378 set ld_output [remote_exec host $ld "-z norelro"]
379 if { [string first "not supported" $ld_output] >= 0
380 || [string first "unrecognized option" $ld_output] >= 0
381 || [string first "-z norelro ignored" $ld_output] >= 0
382 || [string first "cannot find norelro" $ld_output] >= 0 } {
383 set relro_available_saved 0
384 } else {
385 set relro_available_saved 1
386 }
387 }
388 return $relro_available_saved
389}
390
2c6f3e56
JL
391# Check for support of the .noinit section, used for data that is not
392# initialized at load, or during the application's initialization sequence.
393proc supports_noinit_section {} {
394 # .noinit is only supported by ELF targets.
395 if { ![is_elf_format] } {
396 return 0;
397 }
398
399 # Targets that set HAVE_NOINIT=yes in their emulparams script utilizing
400 # elf.sc, or explicitly define a .noinit section in their linker script.
401 #
402 # arc-*-* is not included here, since it only supports .noinit with the
403 # non-default arcv2elf emulation.
404 if {[istarget "arm-*-*"]
405 || [istarget "avr-*-*"]
406 || [istarget "msp430-*-*"]
407 || [istarget "pru-*-*"] } {
408 return 1;
409 }
410 return 0;
411}
412
413# Check for support of the .persistent section, used for data that is
414# initialized at load, but not during the application's initialization sequence.
415proc supports_persistent_section {} {
416 # .persistent is only supported by ELF targets.
417 if { ![is_elf_format] } {
418 return 0;
419 }
420
421 # Targets that set HAVE_PERSISTENT=yes in their emulparams script utilizing
422 # elf.sc, or explicitly define a .persistent section in their linker script.
423 if { [istarget "arm-*-*"]
424 || [istarget "msp430-*-*"] } {
425 return 1;
426 }
427 return 0;
428}
429
fb6ac163
AM
430# Whether a target support DT_RELR sections.
431proc supports_dt_relr {} {
1657026c
AM
432 if { ([istarget x86_64-*-*]
433 || [istarget i?86-*-*]
434 || [istarget powerpc64*-*-*])
fb6ac163
AM
435 && ([istarget *-*-linux*]
436 || [istarget *-*-gnu*]) } {
437 return 1
438 }
439 return 0
440}
441
eb22018c
RS
442# Compare two files line-by-line. FILE_1 is the actual output and FILE_2
443# is the expected output. Ignore blank lines in either file.
444#
445# FILE_2 is a series of regexps, comments and # directives. The directives
446# are:
447#
448# #pass
449# Treat the test as a PASS if everything up till this point has
450# matched. Ignore any remaining lines in either FILE_1 or FILE_2.
451#
452# #failif
453# Reverse the sense of the test: expect differences to exist.
454#
455# #...
456# REGEXP
457# Skip all lines in FILE_1 until the first that matches REGEXP.
458#
bc754168
AM
459# #?REGEXP
460# Optionally match REGEXP against line from FILE_1. If the REGEXP
461# does not match then the next line from FILE_2 is tried.
462#
738f4d98
MR
463# Other # lines are comments. Regexp lines starting with the `!' character
464# specify inverse matching (use `\!' for literal matching against a leading
465# `!'). Skip empty lines in both files.
eb22018c
RS
466#
467# The first optional argument is a list of regexp substitutions of the form:
468#
469# EXP1 SUBSPEC1 EXP2 SUBSPEC2 ...
470#
471# This tells the function to apply each regexp substitution EXPi->SUBSPECi
472# in order to every line of FILE_2.
473#
474# Return nonzero if differences exist.
475proc regexp_diff { file_1 file_2 args } {
476 set eof -1
477 set end_1 0
478 set end_2 0
479 set differences 0
480 set diff_pass 0
481 set fail_if_match 0
482 set ref_subst ""
483 if { [llength $args] > 0 } {
484 set ref_subst [lindex $args 0]
485 }
486 if { [llength $args] > 1 } {
487 perror "Too many arguments to regexp_diff"
488 return 1
489 }
490
491 if [file exists $file_1] then {
492 set file_a [open $file_1 r]
493 } else {
494 perror "$file_1 doesn't exist"
495 return 1
496 }
497
498 if [file exists $file_2] then {
499 set file_b [open $file_2 r]
500 } else {
501 perror "$file_2 doesn't exist"
502 close $file_a
503 return 1
504 }
505
506 verbose " Regexp-diff'ing: $file_1 $file_2" 2
507
508 while { 1 } {
509 set line_a ""
510 set line_b ""
511 while { [string length $line_a] == 0 } {
512 # Ignore blank line in FILE_1.
513 if { [gets $file_a line_a] == $eof } {
514 set end_1 1
515 break
516 }
517 }
518 while { [string length $line_b] == 0 || [string match "#*" $line_b] } {
519 if { [string match "#pass" $line_b] } {
520 set end_2 1
521 set diff_pass 1
522 break
523 } elseif { [string match "#failif" $line_b] } {
524 send_log "fail if no difference\n"
525 verbose "fail if no difference" 3
526 set fail_if_match 1
527 } elseif { [string match "#..." $line_b] } {
528 if { [gets $file_b line_b] == $eof } {
529 set end_2 1
530 set diff_pass 1
531 break
532 }
47a50e5b 533 set negated [expr { [string index $line_b 0] == "!" }]
738f4d98
MR
534 set line_bx [string range $line_b $negated end]
535 set n [expr { $negated ? "! " : "" }]
eb22018c
RS
536 # Substitute on the reference.
537 foreach {name value} $ref_subst {
738f4d98 538 regsub -- $name $line_bx $value line_bx
eb22018c 539 }
738f4d98
MR
540 verbose "looking for $n\"^$line_bx$\"" 3
541 while { [expr [regexp "^$line_bx$" "$line_a"] == $negated] } {
eb22018c
RS
542 verbose "skipping \"$line_a\"" 3
543 if { [gets $file_a line_a] == $eof } {
544 set end_1 1
545 break
546 }
547 }
548 break
bc754168
AM
549 } elseif { [string match "#\\?*" $line_b] } {
550 if { ! $end_1 } {
551 set line_b [string replace $line_b 0 1]
552 set negated [expr { [string index $line_b 0] == "!" }]
553 set line_bx [string range $line_b $negated end]
554 set n [expr { $negated ? "! " : "" }]
555 # Substitute on the reference.
556 foreach {name value} $ref_subst {
557 regsub -- $name $line_bx $value line_bx
558 }
559 verbose "optional match for $n\"^$line_bx$\"" 3
560 if { [expr [regexp "^$line_bx$" "$line_a"] != $negated] } {
561 break
562 }
563 }
eb22018c
RS
564 }
565 if { [gets $file_b line_b] == $eof } {
566 set end_2 1
567 break
568 }
569 }
570
571 if { $diff_pass } {
572 break
573 } elseif { $end_1 && $end_2 } {
574 break
575 } elseif { $end_1 } {
576 send_log "extra regexps in $file_2 starting with \"^$line_b$\"\nEOF from $file_1\n"
577 verbose "extra regexps in $file_2 starting with \"^$line_b$\"\nEOF from $file_1" 3
578 set differences 1
579 break
580 } elseif { $end_2 } {
581 send_log "extra lines in $file_1 starting with \"^$line_a$\"\nEOF from $file_2\n"
582 verbose "extra lines in $file_1 starting with \"^$line_a$\"\nEOF from $file_2\n" 3
583 set differences 1
584 break
585 } else {
47a50e5b 586 set negated [expr { [string index $line_b 0] == "!" }]
738f4d98
MR
587 set line_bx [string range $line_b $negated end]
588 set n [expr { $negated ? "! " : "" }]
589 set s [expr { $negated ? " " : "" }]
eb22018c
RS
590 # Substitute on the reference.
591 foreach {name value} $ref_subst {
738f4d98 592 regsub -- $name $line_bx $value line_bx
eb22018c 593 }
738f4d98
MR
594 verbose "regexp $n\"^$line_bx$\"\nline \"$line_a\"" 3
595 if { [expr [regexp "^$line_bx$" "$line_a"] == $negated] } {
eb22018c 596 send_log "regexp_diff match failure\n"
738f4d98 597 send_log "regexp $n\"^$line_bx$\"\nline $s\"$line_a\"\n"
eb22018c
RS
598 verbose "regexp_diff match failure\n" 3
599 set differences 1
600 }
601 }
602 }
603
604 if { $differences == 0 && !$diff_pass && [eof $file_a] != [eof $file_b] } {
605 send_log "$file_1 and $file_2 are different lengths\n"
606 verbose "$file_1 and $file_2 are different lengths" 3
607 set differences 1
608 }
609
610 if { $fail_if_match } {
611 if { $differences == 0 } {
612 set differences 1
613 } else {
614 set differences 0
615 }
616 }
617
618 close $file_a
619 close $file_b
620
621 return $differences
622}
7dd36a6f
L
623
624# prune_warnings_extra -- delete extra warnings from TEXT.
625#
626# An example is:
627# ld: warning: /lib64/ld-linux-x86-64.so.2: unsupported GNU_PROPERTY_TYPE (5) type : 0xc0010001
628proc prune_warnings_extra { text } {
629 global experimental
630 # Warnings are only pruned from non-experimental code (ie code not
631 # on a release branch). For experimental code we want the warnings
632 # as they indicate that the sources need to be updated to recognise
633 # the new properties.
634 if { "$experimental" == "false" } {
635 # The "\\1" is to try to preserve a "\n" but only if necessary.
636 regsub -all "(^|\n)(\[^\n\]*: warning:\[^\n\]*unsupported GNU_PROPERTY_TYPE\[^\n\]*\n?)+" $text "\\1" text
637 }
f92f9e87
L
638 # PR binutils/23898: It is OK to have gaps in build notes.
639 regsub -all "(^|\n)(\[^\n\]*: Warning: Gap in build notes detected from\[^\n\]*\n?)+" $text "\\1" text
333cd559 640 regsub -all "(^|\n)(\[^\n\]*: warning:\[^\n\]*missing \\.note\\.GNU-stack section\[^\n\]*\n?)+" $text "\\1" text
0d38576a 641 regsub -all "(^|\n)(\[^\n\]*: NOTE: This behaviour is deprecated\[^\n\]*\n?)+" $text "\\1" text
7dd36a6f
L
642 return $text
643}
644
645# This definition is taken from an unreleased version of DejaGnu. Once
646# that version gets released, and has been out in the world for a few
647# months at least, it may be safe to delete this copy.
648if ![string length [info proc prune_warnings]] {
649 #
650 # prune_warnings -- delete various system verbosities from TEXT
651 #
652 # An example is:
653 # ld.so: warning: /usr/lib/libc.so.1.8.1 has older revision than expected 9
654 #
655 # Sites with particular verbose os's may wish to override this in site.exp.
656 #
657 proc prune_warnings { text } {
658 # This is from sun4's. Do it for all machines for now.
659 # The "\\1" is to try to preserve a "\n" but only if necessary.
660 regsub -all "(^|\n)(ld.so: warning:\[^\n\]*\n?)+" $text "\\1" text
661 # It might be tempting to get carried away and delete blank lines, etc.
662 # Just delete *exactly* what we're ask to, and that's it.
663 set text [prune_warnings_extra $text]
664 return $text
665 }
666} elseif { [info procs saved-prune_warnings] == [list] } {
667 rename prune_warnings saved-prune_warnings
668 proc prune_warnings { text } {
669 set text [saved-prune_warnings $text]
670 set text [prune_warnings_extra $text]
671 return $text
672 }
673}
8ffb70eb
AM
674
675# run_dump_test FILE (optional:) EXTRA_OPTIONS
676#
677# Assemble a .s file, then run some utility on it and check the output.
0b884151 678# Optionally generate the .s file first by running the compiler.
8ffb70eb
AM
679#
680# There should be an assembly language file named FILE.s in the test
681# suite directory, and a pattern file called FILE.d. run_dump_test
682# will assemble FILE.s, optionally run objcopy on the object file,
683# optionally run ld, optionally run another objcopy, optionally run
684# another tool under test specified by PROG, then run a dump tool like
685# addr2line, nm, objdump, readelf or size on the object file to produce
686# textual output, and then analyze that with regexps.
687# The FILE.d file specifies what program to run, and what to expect in
688# its output.
689#
690# The FILE.d file begins with zero or more option lines, which specify
691# flags to pass to the assembler, the program to run to dump the
692# assembler's output, and the options it wants. The option lines have
693# the syntax:
694#
695# # OPTION: VALUE
696#
697# OPTION is the name of some option, like "name" or "objdump", and
698# VALUE is OPTION's value. The valid options are described below.
699# Whitespace is ignored everywhere, except within VALUE. The option
700# list ends with the first line that doesn't match the above syntax.
701# However, a line within the options that begins with a #, but doesn't
702# have a recognizable option name followed by a colon, is considered a
703# comment and entirely ignored.
704#
705# The optional EXTRA_OPTIONS argument to `run_dump_test' is a list of
706# two-element lists. The first element of each is an option name, and
707# the second additional arguments to be added on to the end of the
708# option list as given in FILE.d. (If omitted, no additional options
709# are added.)
710#
711# The interesting options are:
712#
713# name: TEST-NAME
714# The name of this test, passed to DejaGNU's `pass' and `fail'
715# commands. If omitted, this defaults to FILE, the root of the
716# .s and .d files' names.
717#
718# as: FLAGS
719# When assembling, pass FLAGS to the assembler.
720# If assembling several files, you can pass different assembler
721# options in the "source" directives. See below.
52d6f3ee
MM
722# Multiple instances of this directive tells run_dump_test to run the test
723# multiple times -- one time with each set of flags provided.
724# Each instance will run exactly as a file with a single "as" line, it is
725# not possible to condition any behaviour on which set of "as" flags is
726# used. That means that the "source" specific options are appended to
727# the "as" flags for their corresponding files, and any extra processing
728# (e.g. with "ld" and "objcopy") is repeated for each test.
8ffb70eb
AM
729#
730# ld: FLAGS
731# Link assembled files using FLAGS, in the order of the "source"
732# directives, when using multiple files.
733#
734# ld_after_inputfiles: FLAGS
735# Similar to "ld", but put FLAGS after all input files.
736#
0b884151
NA
737# cc: FLAGS
738# Run the compiler with FLAGS (to which -S is added) to generate assembler
739# source first. source: must be provided and should consist of .c files.
740# Source-specific CC flags are not supported.
741#
8ffb70eb
AM
742# objcopy_objects: FLAGS
743# Run objcopy with the specified flags after assembling any source
744# that has the special marker RUN_OBJCOPY in the source specific
745# flags.
746#
747# objcopy_linked_file: FLAGS
748# Run objcopy on the linked file with the specified flags.
749# This lets you transform the linked file using objcopy, before the
750# result is analyzed by an analyzer program specified below.
751#
752# PROG: PROGRAM-NAME
753# The name of a program under test, to run to modify or analyze the
754# .o file produced by the assembler. Recognised names are: ar,
755# elfedit, nm, objcopy, ranlib, strings, and strip.
756#
757# DUMPPROG: PROGRAM-NAME
758# The name of the program to run to analyze the file produced
759# by the assembler or the linker. This can be omitted;
760# run_dump_test will guess which program to run from which of
761# the flags options below is present.
762#
763# addr2line: FLAGS
764# nm: FLAGS
765# objdump: FLAGS
766# readelf: FLAGS
767# size: FLAGS
768# Use the specified program to analyze the output file, and pass it
769# FLAGS, in addition to the output name. Note that they are run
770# with LC_ALL=C in the environment to give consistent sorting of
771# symbols. If no FLAGS are needed then you can use:
772# DUMPPROG: [nm objdump readelf addr2line]
773# instead, or just pass a flag that happens to be the default.
774# If objdump is the dump tool and we're not dumping binary, nor
775# have run ld, then the standard section names (.text, .data and
776# .bss) are replaced by target ones if any (eg. rx-elf uses "P"
777# instead of .text). The substition is done for both the
778# objdump options (eg: "-j .text" is replaced by "-j P") and the
779# reference file.
780#
781# source: SOURCE [FLAGS]
782# Assemble the file SOURCE.s using the flags in the "as" directive
783# and the (optional) FLAGS. If omitted, the source defaults to
784# FILE.s.
785# This is useful if several .d files want to share a .s file.
786# More than one "source" directive can be given, which is useful
787# when testing linking.
788#
789# dump: DUMP
790# Match against DUMP.d. If omitted, this defaults to FILE.d. This
791# is useful if several .d files differ by options only. Options are
792# always read from FILE.d.
793#
794# target: GLOB|PROC ...
795# Run this test only on a specified list of targets. More precisely,
796# in the space-separated list each glob is passed to "istarget" and
797# each proc is called as a TCL procedure. List items are interpreted
798# such that procs are denoted by surrounding square brackets, and any
799# other items are consired globs. If the call evaluates true for any
800# of them, the test will be run, otherwise it will be marked
801# unsupported.
802#
803# notarget: GLOB|PROC ...
804# Do not run this test on a specified list of targets. Again, each
805# glob in the space-separated list is passed to "istarget" and each
806# proc is called as a TCL procedure, and the test is run if it
807# evaluates *false* for *all* of them. Otherwise it will be marked
808# unsupported.
809#
810# alltargets: GLOB|PROC ...
811# Run this test on a specified list of targets. Again, each
812# glob in the space-separated list is passed to "istarget" and each
813# proc is called as a TCL procedure, and the test is run if it
814# evaluates *true* for *all* of them. Otherwise it will be marked
815# unsupported.
816#
817# skip: GLOB|PROC ...
818# anyskip: GLOB|PROC ...
819# noskip: GLOB|PROC ...
820# These are exactly the same as "notarget", "alltargets" and
821# "target" respectively, except that they do nothing at all if the
822# check fails. They should only be used in groups, to construct a
823# single test which is run on all targets but with variant options
824# or expected output on some targets. (For example, see
825# gas/arm/inst.d and gas/arm/wince_inst.d.)
826#
827# xfail: GLOB|PROC ...
828# Run this test and it is is expected to fail on a specified list
829# of targets.
830#
831# error: REGEX
832# An error with message matching REGEX must be emitted for the test
833# to pass. The DUMPPROG, addr2line, nm, objdump, readelf and size
834# options have no meaning and need not supplied if this is present.
835# Multiple "error" directives append to the expected error message.
836#
837# error_output: FILE
838# Means the same as 'error', except the regular expression lines
839# are contains in FILE.
840#
841# warning: REGEX
842# Expect a warning matching REGEX. It is an error to issue
843# both "error" and "warning". Multiple "warning" directives
844# append to the expected warning message.
845#
846# warning_output: FILE
847# Means the same as 'warning', except the regular expression
848# lines are contains in FILE.
849#
850# map: FILE
851# Adding this option will cause the linker to generate a linker
852# map file, using the -Map=MAPFILE command line option. If
853# there is no -Map=MAPFILE in the 'ld: FLAGS' then one will be
854# added to the linker command line. The contents of the
855# generated MAPFILE are then compared against the regexp lines
856# in FILE using `regexp_diff' (see below for details).
857#
858# section_subst: no
859# Means that the section substitution for objdump is disabled.
860#
861# Each option may occur at most once unless otherwise mentioned.
862#
863# After the option lines come regexp lines. run_dump_test calls
864# regexp_diff to compare the output of the dumping tool against the
865# regexps in FILE.d.
866#
867proc run_dump_test { name {extra_options {}} } {
ad77db1c
AM
868 global ADDR2LINE ADDR2LINEFLAGS AS ASFLAGS CC_FOR_TARGET CFLAGS_FOR_TARGET
869 global ELFEDIT ELFEDITFLAGS LD LDFLAGS NM NMFLAGS OBJCOPY OBJCOPYFLAGS
870 global OBJDUMP OBJDUMPFLAGS READELF READELFFLAGS STRIP STRIPFLAGS
cd8adbf3 871 global SIZE SIZEFLAGS
5fd104ad 872 global copyfile env runtests srcdir subdir verbose
f2e37a5c 873 global DT_RELR_LDFLAGS NO_DT_RELR_LDFLAGS
8ffb70eb
AM
874
875 if [string match "*/*" $name] {
876 set file $name
877 set name [file tail $name]
878 } else {
879 set file "$srcdir/$subdir/$name"
880 }
881
882 if ![runtest_file_p $runtests $name] then {
883 return
884 }
885
886 set opt_array [slurp_options "${file}.d"]
887 if { $opt_array == -1 } {
888 perror "error reading options from $file.d"
889 unresolved $subdir/$name
890 return
891 }
892 set dumpfile tmpdir/dump.out
893 set run_ld 0
894 set run_objcopy 0
895 set objfile_names {}
896 set opts(PROG) {}
897 set opts(DUMPPROG) {}
898 set opts(addr2line) {}
899 set opts(alltargets) {}
900 set opts(anyskip) {}
901 set opts(ar) {}
902 set opts(as) {}
52d6f3ee
MM
903 set as_final_flags {}
904 set as_additional_flags {}
0b884151 905 set opts(cc) {}
8ffb70eb
AM
906 set opts(dump) {}
907 set opts(elfedit) {}
908 set opts(error) {}
909 set opts(error_output) {}
910 set opts(ld) {}
911 set opts(ld_after_inputfiles) {}
912 set opts(map) {}
913 set opts(name) {}
914 set opts(nm) {}
915 set opts(noskip) {}
916 set opts(notarget) {}
917 set opts(objcopy) {}
918 set opts(objcopy_linked_file) {}
919 set opts(objcopy_objects) {}
920 set opts(objdump) {}
921 set opts(ranlib) {}
922 set opts(readelf) {}
923 set opts(section_subst) {}
924 set opts(size) {}
925 set opts(strings) {}
926 set opts(strip) {}
927 set opts(skip) {}
928 set opts(source) {}
929 set opts(strip) {}
930 set opts(target) {}
931 set opts(warning) {}
932 set opts(warning_output) {}
933 set opts(xfail) {}
934
935 set in_extra 0
936 foreach i [concat $opt_array {{} {}} $extra_options] {
937 set opt_name [lindex $i 0]
938 set opt_val [lindex $i 1]
939 if { $opt_name == "" } {
940 set in_extra 1
941 continue
942 }
943 if ![info exists opts($opt_name)] {
944 perror "unknown option $opt_name in file $file.d"
945 unresolved $subdir/$name
946 return
947 }
948
0b884151
NA
949 # Allow more substitutions, including tcl functions, for as, ld,
950 # and cc. Not done in general because extra quoting is needed for glob
8ffb70eb 951 # args used for example in binutils-all/remove-relocs-04.d.
0b884151 952 if { $opt_name == "as" || $opt_name == "ld" || $opt_name == "cc" } {
8ffb70eb
AM
953 set opt_val [subst $opt_val]
954 } else {
955 # Just substitute $srcdir and $subdir
956 regsub -all {\$srcdir} "$opt_val" "$srcdir" opt_val
957 regsub -all {\$subdir} "$opt_val" "$subdir" opt_val
958 }
959
960 switch -- $opt_name {
961 xfail {}
962 target {}
963 alltargets {}
964 notarget {}
965 skip {}
966 anyskip {}
967 noskip {}
968 warning {}
969 error {}
970 source {
971 # Move any source-specific as-flags to a separate list to
972 # simplify processing.
973 if { [llength $opt_val] > 1 } {
974 lappend asflags [lrange $opt_val 1 end]
975 set opt_val [lindex $opt_val 0]
976 } else {
977 lappend asflags {}
978 }
979
980 # Create the object file name based on nothing but the source
981 # file name.
982 set new_objfile \
983 [concat tmpdir/[file rootname [file tail [lindex $opt_val 0]]].o]
984 # But, sometimes, we have the exact same source filename in
985 # different directories (foo/src.s bar/src.s) which would lead
986 # us to try and create two src.o files. We detect this
987 # conflict here, and instead create src.o and src1.o.
988 set j 0
989 while { [lsearch $objfile_names $new_objfile] != -1 } {
990 incr j
991 set new_objfile \
992 [concat tmpdir/[file rootname [file tail [lindex $opt_val 0]]]${j}.o]
993 }
994 lappend objfile_names $new_objfile
995 }
996 default {
52d6f3ee 997 if { !$in_extra
4d496013
AM
998 && [string length $opts($opt_name)]
999 && $opt_name != "as" } {
8ffb70eb
AM
1000 perror "option $opt_name multiply set in $file.d"
1001 unresolved $subdir/$name
1002 return
1003 }
1004
1005 # A single "#ld:" with no options should do the right thing.
1006 if { $opt_name == "ld" } {
1007 set run_ld 1
1008 }
1009 # Likewise objcopy_linked_file.
1010 if { $opt_name == "objcopy_linked_file" } {
1011 set run_objcopy 1
1012 }
1013 }
1014 }
1015
1016 # Append differently whether it's a message (without space) or
1017 # an option or list (with space).
1018 switch -- $opt_name {
1019 warning -
1020 error {
1021 append opts($opt_name) $opt_val
1022 }
4d496013
AM
1023 as {
1024 if { $in_extra } {
1025 set as_additional_flags [concat $as_additional_flags $opt_val]
1026 } else {
1027 lappend opts(as) $opt_val
1028 }
1029 }
8ffb70eb
AM
1030 default {
1031 set opts($opt_name) [concat $opts($opt_name) $opt_val]
1032 }
1033 }
1034 }
1035
093f70cc 1036 # Ensure there is something in $opts(as) for the foreach loop below.
52d6f3ee 1037 if { [llength $opts(as)] == 0 } {
4d496013 1038 set opts(as) [list " "]
8ffb70eb 1039 }
093f70cc 1040 foreach x $opts(as) {
4d496013
AM
1041 if { [string length $x] && [string length $as_additional_flags] } {
1042 append x " "
1043 }
1044 append x $as_additional_flags
1045 regsub {\[big_or_little_endian\]} $x \
1046 [big_or_little_endian] x
1047 lappend as_final_flags $x
093f70cc 1048 }
52d6f3ee
MM
1049
1050 regsub {\[big_or_little_endian\]} $opts(ld) \
4d496013 1051 [big_or_little_endian] opts(ld)
8ffb70eb
AM
1052
1053 if { $opts(name) == "" } {
1054 set testname "$subdir/$name"
1055 } else {
1056 set testname $opts(name)
1057 }
1058
1059 set err_warn 0
1060 foreach opt { warning error warning_output error_output } {
1061 if { $opts($opt) != "" } {
1062 if { $err_warn } {
1063 perror "$testname: bad mix of warning and error test directives"
1064 unresolved $testname
1065 return
1066 }
1067 set err_warn 1
1068 }
1069 }
1070
1071 # Decide early whether we should run the test for this target.
1072 if { [llength $opts(noskip)] > 0 } {
1073 set targmatch 0
1074 foreach targ $opts(noskip) {
1075 if [match_target $targ] {
1076 set targmatch 1
1077 break
1078 }
1079 }
1080 if { $targmatch == 0 } {
1081 return
1082 }
1083 }
1084 foreach targ $opts(anyskip) {
1085 if ![match_target $targ] {
1086 return
1087 }
1088 }
1089 foreach targ $opts(skip) {
1090 if [match_target $targ] {
1091 return
1092 }
1093 }
1094 if { [llength $opts(target)] > 0 } {
1095 set targmatch 0
1096 foreach targ $opts(target) {
1097 if [match_target $targ] {
1098 set targmatch 1
1099 break
1100 }
1101 }
1102 if { $targmatch == 0 } {
1103 unsupported $testname
1104 return
1105 }
1106 }
1107 foreach targ $opts(alltargets) {
1108 if ![match_target $targ] {
1109 unsupported $testname
1110 return
1111 }
1112 }
1113 foreach targ $opts(notarget) {
1114 if [match_target $targ] {
1115 unsupported $testname
1116 return
1117 }
1118 }
1119
1120 set dumpprogram ""
1121 # It's meaningless to require an output-testing method when we
1122 # expect an error.
1123 if { $opts(error) == "" && $opts(error_output) == "" } {
1124 if { $opts(DUMPPROG) != "" } {
1125 switch -- $opts(DUMPPROG) {
1126 addr2line { set dumpprogram addr2line }
1127 nm { set dumpprogram nm }
1128 objdump { set dumpprogram objdump }
1129 readelf { set dumpprogram readelf }
1130 size { set dumpprogram size }
1131 default {
1132 perror "unrecognized DUMPPROG option $opts(DUMPPROG) in $file.d"
1133 unresolved $testname
1134 return
1135 }
1136 }
1137 } else {
1138 # Guess which program to run, by seeing which option was specified.
1139 foreach p {addr2line nm objdump readelf size} {
1140 if {$opts($p) != ""} {
1141 if {$dumpprogram != ""} {
1142 perror "ambiguous dump program in $file.d"
1143 unresolved $testname
1144 return
1145 } else {
1146 set dumpprogram $p
1147 }
1148 }
1149 }
1150 }
1151 if { $dumpprogram == "" && $opts(map) == "" && !$err_warn } {
1152 perror "dump program unspecified in $file.d"
1153 unresolved $testname
1154 return
1155 }
1156 }
1157
0b884151
NA
1158 # Possibly compile some of the inputs, and build up a replacement
1159 # for opts(source) with the output .s names substituted in as we go.
1160 # Set the .s names from the objfile_names to take advantage of the
1161 # uniquification that happened earlier.
1162 if { $opts(cc) != ""} {
1163 set cmdret 0
1164 set new_source ""
1165
1166 foreach cfile $opts(source) ofile $objfile_names {
1167 if { [file extension $cfile] != ".c" } {
1168 lappend new_source "$cfile"
1169 continue
1170 }
1171
1172 if { ! [string match "./*" $cfile] } {
1173 set cfile "$srcdir/$subdir/$cfile"
1174 }
1175 # ofile is never absolute, so this always works to protect sfile
1176 # from later absolutization.
1177 set sfile "./[file rootname $ofile].s"
ad77db1c 1178 set cmd "$CC_FOR_TARGET $CFLAGS_FOR_TARGET -S $opts(cc) -o $sfile $cfile"
0b884151
NA
1179 send_log "$cmd\n"
1180 set cmdret [remote_exec host [concat sh -c [list "$cmd 2>&1"]] "" "/dev/null" "dump.tmp"]
1181 remote_upload host "dump.tmp"
1182 set comp_output [prune_warnings [file_contents "dump.tmp"]]
1183 remote_file host delete "dump.tmp"
1184 remote_file build delete "dump.tmp"
1185 lappend new_source "$sfile"
1186 set cmdret [lindex $cmdret 0]
1187
1188 regsub "\n$" $comp_output "" comp_output
1189 if { $cmdret != 0} {
1190 send_log "compilation of $cfile failed, exit status $cmdret with <$comp_output>"
4d496013 1191 # Should this be 'unresolved', or is that too silent?
0b884151
NA
1192 fail $testname
1193 return 0
1194 }
1195 }
1196 set opts(source) $new_source
1197 }
1198
8ffb70eb
AM
1199 if { $opts(source) == "" } {
1200 set sourcefiles [list ${file}.s]
1201 set asflags [list ""]
1202 set objfile_names [list tmpdir/[file tail ${file}].o]
1203 } else {
1204 set sourcefiles {}
1205 foreach sf $opts(source) {
171b8e19 1206 if { [string match "./*" $sf] } {
8ffb70eb
AM
1207 lappend sourcefiles "$sf"
1208 } else {
1209 lappend sourcefiles "$srcdir/$subdir/$sf"
1210 }
1211 }
1212 }
1213
1214 if { $opts(dump) == "" } {
1215 set dfile ${file}.d
1216 } else {
1217 set dfile $srcdir/$subdir/$opts(dump)
1218 }
1219
1220 # Time to setup xfailures.
1221 foreach targ $opts(xfail) {
1336939d
AM
1222 if [match_target $targ] {
1223 setup_xfail "*-*-*"
1224 break
1225 }
8ffb70eb
AM
1226 }
1227
52d6f3ee 1228 foreach as_flags $as_final_flags {
4d496013
AM
1229 # Assemble each file.
1230 set objfiles {}
1231 for { set i 0 } { $i < [llength $sourcefiles] } { incr i } {
1232 set sourcefile [lindex $sourcefiles $i]
1233 set sourceasflags [lindex $asflags $i]
1234 set run_objcopy_objects 0
1235
1236 if { [string match "*RUN_OBJCOPY*" $sourceasflags] } {
1237 set run_objcopy_objects 1
1238 }
1239 regsub "RUN_OBJCOPY" $sourceasflags "" sourceasflags
1240
1241 set objfile [lindex $objfile_names $i]
1242 catch "exec rm -f $objfile" exec_output
1243 lappend objfiles $objfile
1244
1245 if { $as_flags == "binary" } {
1246 while {[file type $sourcefile] eq "link"} {
1247 set newfile [file readlink $sourcefile]
1248 if {[string index $newfile 0] ne "/"} {
1249 set newfile [file dirname $sourcefile]/$newfile
1250 }
1251 set sourcefile $newfile
1252 }
1253 set newfile [remote_download host $sourcefile $objfile]
1254 set cmdret 0
1255 if { $newfile == "" } {
1256 set cmdret 1
1257 }
1258 } else {
1259 if { [istarget "hppa*-*-*"] \
1260 && ![istarget "*-*-linux*"] \
1261 && ![istarget "*-*-netbsd*" ] } {
1262 set cmd "sed -e 's/^\[ \]*\.comm \\(\[^,\]*\\),\\(.*\\)/\\1 .comm \\2/' < $sourcefile > tmpdir/asm.s"
1263 send_log "$cmd\n"
1264 set cmdret [remote_exec host [concat sh -c [list "$cmd"]]]
1265 set cmdret [lindex $cmdret 0]
1266 if { $cmdret != 0 } {
1267 perror "sed failure"
1268 unresolved $testname
1269 continue
1270 }
1271 set sourcefile tmpdir/asm.s
1272 }
1273 set cmd "$AS $ASFLAGS $as_flags $sourceasflags -o $objfile $sourcefile"
1274
1275 send_log "$cmd\n"
1276 set cmdret [remote_exec host [concat sh -c [list "$cmd 2>&1"]] "" "/dev/null" "dump.tmp"]
1277 remote_upload host "dump.tmp"
1278 set comp_output [prune_warnings [file_contents "dump.tmp"]]
1279 remote_file host delete "dump.tmp"
1280 remote_file build delete "dump.tmp"
1281 set cmdret [lindex $cmdret 0]
1282 }
1283 if { $cmdret == 0 && $run_objcopy_objects } {
1284 set cmd "$OBJCOPY $opts(objcopy_objects) $objfile"
1285
1286 send_log "$cmd\n"
1287 set cmdret [remote_exec host [concat sh -c [list "$cmd 2>&1"]] \
1288 "" "/dev/null" "dump.tmp"]
1289 remote_upload host "dump.tmp"
1290 append comp_output [prune_warnings [file_contents "dump.tmp"]]
1291 remote_file host delete "dump.tmp"
1292 remote_file build delete "dump.tmp"
1293 set cmdret [lindex $cmdret 0]
1294 }
1295 }
1296
1297 # Perhaps link the file(s).
1298 if { $cmdret == 0 && $run_ld } {
1299 set objfile "tmpdir/dump"
1300 catch "exec rm -f $objfile" exec_output
1301
1302 set ld_extra_opt ""
1303 global ld
1304 set ld "$LD"
5fd104ad
AM
1305 if [check_relro_support] {
1306 set ld_extra_opt "-z norelro"
1307 }
52d6f3ee 1308
4d496013
AM
1309 # Add -L$srcdir/$subdir so that the linker command can use
1310 # linker scripts in the source directory.
1311 set cmd "$LD $ld_extra_opt $LDFLAGS -L$srcdir/$subdir \
8ffb70eb
AM
1312 $opts(ld) -o $objfile $objfiles $opts(ld_after_inputfiles)"
1313
4d496013
AM
1314 # If needed then check for, or add a -Map option.
1315 set mapfile ""
1316 if { $opts(map) != "" } then {
1317 if { [regexp -- "-Map=(\[^ \]+)" $cmd all mapfile] } then {
1318 # Found existing mapfile option
1319 verbose -log "Existing mapfile '$mapfile' found"
1320 } else {
1321 # No mapfile option.
1322 set mapfile "tmpdir/dump.map"
1323 verbose -log "Adding mapfile '$mapfile'"
1324 set cmd "$cmd -Map=$mapfile"
1325 }
1326 }
1327
1328 send_log "$cmd\n"
1329 set cmdret [remote_exec host [concat sh -c [list "$cmd 2>&1"]] "" "/dev/null" "dump.tmp"]
1330 remote_upload host "dump.tmp"
333cd559 1331 append comp_output [prune_warnings [file_contents "dump.tmp"]]
4d496013
AM
1332 remote_file host delete "dump.tmp"
1333 remote_file build delete "dump.tmp"
1334 set cmdret [lindex $cmdret 0]
1335
1336 if { $cmdret == 0 && $run_objcopy } {
1337 set infile $objfile
1338 set objfile "tmpdir/dump1"
1339 remote_file host delete $objfile
1340
1341 # Note that we don't use OBJCOPYFLAGS here; any flags must be
1342 # explicitly specified.
1343 set cmd "$OBJCOPY $opts(objcopy_linked_file) $infile $objfile"
1344
1345 send_log "$cmd\n"
1346 set cmdret [remote_exec host [concat sh -c [list "$cmd 2>&1"]] "" "/dev/null" "dump.tmp"]
1347 remote_upload host "dump.tmp"
333cd559 1348 append comp_output [prune_warnings [file_contents "dump.tmp"]]
4d496013
AM
1349 remote_file host delete "dump.tmp"
1350 remote_file build delete "dump.tmp"
1351 set cmdret [lindex $cmdret 0]
1352 }
1353 } else {
1354 set objfile [lindex $objfiles 0]
1355 }
1356
1357 if { $cmdret == 0 && $opts(PROG) != "" } {
1358 set destopt ${copyfile}.o
1359 switch -- $opts(PROG) {
1360 ar { set program ar }
1361 elfedit {
1362 set program elfedit
1363 set destopt ""
1364 }
1365 nm { set program nm }
1366 objcopy { set program objcopy }
1367 ranlib { set program ranlib }
1368 strings { set program strings }
1369 strip {
1370 set program strip
1371 set destopt "-o $destopt"
1372 }
1373 default {
1374 perror "unrecognized PROG option $opts(PROG) in $file.d"
1375 unresolved $testname
1376 continue
1377 }
1378 }
1379
1380 set progopts1 $opts($program)
1381 eval set progopts \$[string toupper $program]FLAGS
1382 eval set binary \$[string toupper $program]
1383
1384 if { ![is_remote host] && [which $binary] == 0 } {
1385 untested $testname
1386 continue
1387 }
1388
1389 verbose "running $binary $progopts $progopts1" 3
1390 set cmd "$binary $progopts $progopts1 $objfile $destopt"
1391
1392 # Ensure consistent sorting of symbols
1393 if {[info exists env(LC_ALL)]} {
1394 set old_lc_all $env(LC_ALL)
1395 }
1396 set env(LC_ALL) "C"
1397 send_log "$cmd\n"
1398 set cmdret [remote_exec host [concat sh -c [list "$cmd 2>dump.tmp"]] "" "/dev/null"]
1399 set cmdret [lindex $cmdret 0]
1400 remote_upload host "dump.tmp"
1401 append comp_output [prune_warnings [file_contents "dump.tmp"]]
1402 remote_file host delete "dump.tmp"
1403 remote_file build delete "dump.tmp"
1404 if {[info exists old_lc_all]} {
1405 set env(LC_ALL) $old_lc_all
1406 } else {
1407 unset env(LC_ALL)
1408 }
1409 if { $destopt != "" } {
1410 set objfile ${copyfile}.o
1411 }
1412 }
1413
1414 set want_out(source) ""
1415 set want_out(terminal) 0
1416 if { $err_warn } {
1417 if { $opts(error) != "" || $opts(error_output) != "" } {
1418 set want_out(terminal) 1
1419 }
1420
1421 if { $opts(error) != "" || $opts(warning) != "" } {
1422 set want_out(source) "regex"
1423 if { $opts(error) != "" } {
1424 set want_out(regex) $opts(error)
1425 } else {
1426 set want_out(regex) $opts(warning)
1427 }
1428 } else {
1429 set want_out(source) "file"
1430 if { $opts(error_output) != "" } {
1431 set want_out(file) $opts(error_output)
1432 } else {
1433 set want_out(file) $opts(warning_output)
1434 }
1435 }
1436 }
1437
1438 regsub "\n$" $comp_output "" comp_output
1439 if { $cmdret != 0 || $comp_output != "" || $want_out(source) != "" } {
1440 set exitstat "succeeded"
1441 if { $cmdret != 0 } { set exitstat "failed" }
1442
1443 if { $want_out(source) == "regex" } {
1444 verbose -log "$exitstat with: <$comp_output>, expected: <$want_out(regex)>"
1445 } elseif { $want_out(source) == "file" } {
1446 verbose -log "$exitstat with: <$comp_output>, expected in file $want_out(file)"
1447 set_file_contents "tmpdir/ld.messages" "$comp_output"
1448 } else {
1449 verbose -log "$exitstat with: <$comp_output>, no expected output"
1450 }
1451
1452 if { (($want_out(source) == "") == ($comp_output == "")) \
1453 && (($cmdret == 0) == ($want_out(terminal) == 0)) \
1454 && ((($want_out(source) == "regex") \
1455 && [regexp -- $want_out(regex) $comp_output]) \
1456 || (($want_out(source) == "file") \
1457 && (![regexp_diff "tmpdir/ld.messages" "$srcdir/$subdir/$want_out(file)"]))) } {
1458 # We have the expected output.
1459 if { $want_out(terminal) || $dumpprogram == "" } {
1460 pass $testname
1461 continue
1462 }
1463 } else {
1464 fail $testname
1465 continue
1466 }
1467 }
1468
1469 # We must not have expected failure if we get here.
1470 if { $want_out(terminal) } {
1471 fail $testname
1472 continue
1473 }
1474
1475 if { $opts(map) != "" } then {
1476 # Check the map file matches.
1477 set map_pattern_file $srcdir/$subdir/$opts(map)
1478 verbose -log "Compare '$mapfile' against '$map_pattern_file'"
1479 if { [regexp_diff $mapfile $map_pattern_file] } then {
1480 fail "$testname (map file check)"
1481 } else {
1482 pass "$testname (map file check)"
1483 }
1484
1485 if { $dumpprogram == "" } then {
1486 continue
1487 }
1488 }
1489
1490 set progopts1 $opts($dumpprogram)
1491 eval set progopts \$[string toupper $dumpprogram]FLAGS
1492 eval set binary \$[string toupper $dumpprogram]
1493
1494 if { ![is_remote host] && [which $binary] == 0 } {
1495 untested $testname
1496 continue
1497 }
1498
1499 # For objdump of gas output, automatically translate standard section names
1500 set sect_names ""
1501 if { !$run_ld && $dumpprogram == "objdump" \
1502 && $opts(section_subst) != "no" \
1503 && ![string match "*-b binary*" $progopts1] } {
1504 set sect_names [get_standard_section_names]
1505 if { $sect_names != ""} {
1506 regsub -- "\\.text" $progopts1 "[lindex $sect_names 0]" progopts1
1507 regsub -- "\\.data" $progopts1 "[lindex $sect_names 1]" progopts1
1508 regsub -- "\\.bss" $progopts1 "[lindex $sect_names 2]" progopts1
1509 }
1510 }
1511
1512 if { $progopts1 == "" } { set $progopts1 "-r" }
1513 verbose "running $binary $progopts $progopts1" 3
1514
1515 set cmd "$binary $progopts $progopts1 $objfile > $dumpfile"
1516
1517 # Ensure consistent sorting of symbols
1518 if {[info exists env(LC_ALL)]} {
1519 set old_lc_all $env(LC_ALL)
1520 }
1521 set env(LC_ALL) "C"
1522 send_log "$cmd\n"
1523 set cmdret [remote_exec host [concat sh -c [list "$cmd 2>dump.tmp"]] "" "/dev/null"]
1524 set cmdret [lindex $cmdret 0]
1525 remote_upload host "dump.tmp"
1526 set comp_output [prune_warnings [file_contents "dump.tmp"]]
1527 remote_file host delete "dump.tmp"
1528 remote_file build delete "dump.tmp"
1529 if {[info exists old_lc_all]} {
1530 set env(LC_ALL) $old_lc_all
1531 } else {
1532 unset env(LC_ALL)
1533 }
1534 if { $cmdret != 0 || $comp_output != "" } {
1535 send_log "exited abnormally with $cmdret, output:$comp_output\n"
1536 fail $testname
1537 continue
1538 }
1539
1540 if { $verbose > 2 } then { verbose "output is [file_contents $dumpfile]" 3 }
1541
1542 # Create the substition list for objdump output.
1543 set regexp_subst ""
1544 if { $sect_names != "" } {
1545 set regexp_subst [list "\\\\?\\.text" [lindex $sect_names 0] \
1546 "\\\\?\\.data" [lindex $sect_names 1] \
1547 "\\\\?\\.bss" [lindex $sect_names 2] ]
1548 }
1549
1550 if { [regexp_diff $dumpfile "${dfile}" $regexp_subst] } then {
1551 fail $testname
1552 if { $verbose == 2 } then { verbose "output is [file_contents $dumpfile]" 2 }
1553 continue
1554 }
1555
1556 pass $testname
8ffb70eb 1557 }
8ffb70eb
AM
1558}
1559
1560proc slurp_options { file } {
1561 # If options_regsub(foo) is set to {a b}, then the contents of a
1562 # "#foo:" line will have regsub -all applied to replace a with b.
1563 global options_regsub
1564
1565 if [catch { set f [open $file r] } x] {
1566 #perror "couldn't open `$file': $x"
1567 perror "$x"
1568 return -1
1569 }
1570 set opt_array {}
1571 # whitespace expression
1572 set ws {[ ]*}
1573 set nws {[^ ]*}
1574 # whitespace is ignored anywhere except within the options list;
1575 # option names are alphanumeric plus underscore.
1576 set pat "^#${ws}(\[a-zA-Z0-9_\]*)$ws:${ws}(.*)$ws\$"
1577 while { [gets $f line] != -1 } {
1578 set line [string trim $line]
1579 # Whitespace here is space-tab.
1580 if [regexp $pat $line xxx opt_name opt_val] {
1581 # match!
1582 if [info exists options_regsub($opt_name)] {
1583 set subst $options_regsub($opt_name)
1584 regsub -all -- [lindex $subst 0] $opt_val [lindex $subst 1] \
1585 opt_val
1586 }
1587 lappend opt_array [list $opt_name $opt_val]
1588 } elseif {![regexp "^#" $line ]} {
1589 break
1590 }
1591 }
1592 close $f
1593 return $opt_array
1594}
1595
1596proc file_contents { filename } {
1597 set file [open $filename r]
1598 set contents [read $file]
1599 close $file
1600 return $contents
1601}
1602
1603proc set_file_contents { filename contents } {
1604 set file [open $filename w]
1605 puts $file "$contents"
1606 close $file
1607}
1608
1609# Look for big-endian or little-endian switches in the multlib
1610# options and translate these into a -EB or -EL switch. Note
1611# we cannot rely upon proc process_multilib_options to do this
1612# for us because for some targets the compiler does not support
1613# -EB/-EL but it does support -mbig-endian/-mlittle-endian, and
1614# the site.exp file will include the switch "-mbig-endian"
1615# (rather than "big-endian") which is not detected by proc
1616# process_multilib_options.
1617#
1618proc big_or_little_endian {} {
1619
1620 if [board_info [target_info name] exists multilib_flags] {
1621 set tmp_flags " [board_info [target_info name] multilib_flags]"
1622
1623 foreach x $tmp_flags {
e3696f67
AM
1624 switch -glob $x {
1625 *big*endian -
1626 eb -
1627 EB -
1628 -eb -
1629 -EB -
1630 -mb -
1631 -meb {
8ffb70eb
AM
1632 set flags " -EB"
1633 return $flags
1634 }
e3696f67
AM
1635 *little*endian -
1636 el -
1637 EL -
1638 -el -
1639 -EL -
1640 -ml -
1641 -mel {
8ffb70eb
AM
1642 set flags " -EL"
1643 return $flags
1644 }
1645 }
1646 }
1647 }
1648
1649 set flags ""
1650 return $flags
1651}
1652
1653# Internal procedure: return the names of the standard sections
1654#
1655proc get_standard_section_names {} {
8d3c78e4 1656 if [istarget "rx-*-elf"] {
8ffb70eb
AM
1657 return { "P" "D_1" "B_1" }
1658 }
0b1352e0
AM
1659 if { [istarget "alpha*-*-*vms*"] || [is_som_format] } {
1660 return { {\$CODE\$} {\$DATA\$} {\$BSS\$} }
8ffb70eb
AM
1661 }
1662 return
1663}