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