OpenCores
URL https://opencores.org/ocsvn/open8_urisc/open8_urisc/trunk

Subversion Repositories open8_urisc

[/] [open8_urisc/] [trunk/] [gnu/] [binutils/] [ld/] [testsuite/] [lib/] [ld-lib.exp] - Blame information for rev 163

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.