📄 ld-lib.exp
字号:
if { [istarget *-*-*\[ab\]out*] \ || [istarget *-*-linux*oldld*] \ || [istarget *-*-msdos*] \ || [istarget arm-*-netbsd] \ || [istarget i?86-*-netbsd] \ || [istarget i?86-*-mach*] \ || [istarget i?86-*-vsta] \ || [istarget pdp11-*-*] \ || [istarget m68*-ericsson-ose] \ || [istarget m68k-hp-bsd*] \ || [istarget m68*-*-hpux*] \ || [istarget m68*-*-netbsd] \ || [istarget m68*-*-netbsd*4k*] \ || [istarget m68k-sony-*] \ || [istarget m68*-sun-sunos\[34\]*] \ || [istarget m68*-wrs-vxworks*] \ || [istarget ns32k-*-*] \ || [istarget sparc*-*-netbsd] \ || [istarget sparc-sun-sunos4*] \ || [istarget vax-dec-ultrix*] \ || [istarget vax-*-netbsd] } { return 1 } return 0}## is_pecoff_format# true if the object format is known to be PECOFF#proc is_pecoff_format {} { if { ![istarget *-*-mingw32*] \ && ![istarget *-*-cygwin*] \ && ![istarget *-*-pe*] } { return 0 } return 1}## simple_diff# compares two files line-by-line# returns differences if exist# returns null if file(s) cannot be opened#proc simple_diff { file_1 file_2 } { global target set eof -1 set differences 0 if [file exists $file_1] then { set file_a [open $file_1 r] } else { warning "$file_1 doesn't exist" return } if [file exists $file_2] then { set file_b [open $file_2 r] } else { fail "$file_2 doesn't exist" return } verbose "# Diff'ing: $file_1 $file_2\n" 2 while { [gets $file_a line] != $eof } { if [regexp "^#.*$" $line] then { continue } else { lappend list_a $line } } close $file_a while { [gets $file_b line] != $eof } { if [regexp "^#.*$" $line] then { continue } else { lappend list_b $line } } close $file_b for { set i 0 } { $i < [llength $list_a] } { incr i } { set line_a [lindex $list_a $i] set line_b [lindex $list_b $i] verbose "\t$file_1: $i: $line_a\n" 3 verbose "\t$file_2: $i: $line_b\n" 3 if [string compare $line_a $line_b] then { verbose -log "\t$file_1: $i: $line_a\n" verbose -log "\t$file_2: $i: $line_b\n" fail "Test: $target" return } } if { [llength $list_a] != [llength $list_b] } { fail "Test: $target" return } if $differences<1 then { pass "Test: $target" }}# run_dump_test FILE# Copied from gas testsuite, tweaked and further extended.## Assemble a .s file, then run some utility on it and check the output.## There should be an assembly language file named FILE.s in the test# suite directory, and a pattern file called FILE.d. `run_dump_test'# will assemble FILE.s, run some tool like `objdump', `objcopy', or# `nm' on the .o file to produce textual output, and then analyze that# with regexps. The FILE.d file specifies what program to run, and# what to expect in its output.## The FILE.d file begins with zero or more option lines, which specify# flags to pass to the assembler, the program to run to dump the# assembler's output, and the options it wants. The option lines have# the syntax:## # OPTION: VALUE## OPTION is the name of some option, like "name" or "objdump", and# VALUE is OPTION's value. The valid options are described below.# Whitespace is ignored everywhere, except within VALUE. The option# list ends with the first line that doesn't match the above syntax# (hmm, not great for error detection).## The interesting options are:## name: TEST-NAME# The name of this test, passed to DejaGNU's `pass' and `fail'# commands. If omitted, this defaults to FILE, the root of the# .s and .d files' names.## as: FLAGS# When assembling, pass FLAGS to the assembler.# If assembling several files, you can pass different assembler# options in the "source" directives. See below.## ld: FLAGS# Link assembled files using FLAGS, in the order of the "source"# directives, when using multiple files.## objcopy_linked_file: FLAGS# Run objcopy on the linked file with the specified flags.# This lets you transform the linked file using objcopy, before the# result is analyzed by an analyzer program specified below (which# may in turn *also* be objcopy).## PROG: PROGRAM-NAME# The name of the program to run to analyze the .o file produced# by the assembler or the linker output. This can be omitted;# run_dump_test will guess which program to run by seeing which of# the flags options below is present.## objdump: FLAGS# nm: FLAGS# objcopy: FLAGS# Use the specified program to analyze the assembler or linker# output file, and pass it FLAGS, in addition to the output name.# Note that they are run with LC_ALL=C in the environment to give# consistent sorting of symbols.## source: SOURCE [FLAGS]# Assemble the file SOURCE.s using the flags in the "as" directive# and the (optional) FLAGS. If omitted, the source defaults to# FILE.s.# This is useful if several .d files want to share a .s file.# More than one "source" directive can be given, which is useful# when testing linking.## xfail: TARGET# The test is expected to fail on TARGET. This may occur more than# once.## target: TARGET# Only run the test for TARGET. This may occur more than once; the# target being tested must match at least one.## notarget: TARGET# Do not run the test for TARGET. This may occur more than once;# the target being tested must not match any of them.## error: REGEX# An error with message matching REGEX must be emitted for the test# to pass. The PROG, objdump, nm and objcopy options have no# meaning and need not supplied if this is present.## warning: REGEX# Expect a linker warning matching REGEX. It is an error to issue# both "error" and "warning".## Each option may occur at most once unless otherwise mentioned.## After the option lines come regexp lines. `run_dump_test' calls# `regexp_diff' to compare the output of the dumping tool against the# regexps in FILE.d. `regexp_diff' is defined later in this file; see# further comments there.proc run_dump_test { name } { global subdir srcdir global OBJDUMP NM AS OBJCOPY READELF LD global OBJDUMPFLAGS NMFLAGS ASFLAGS OBJCOPYFLAGS READELFFLAGS LDFLAGS global host_triplet runtests global env if [string match "*/*" $name] { set file $name set name [file tail $name] } else { set file "$srcdir/$subdir/$name" } if ![runtest_file_p $runtests $name] then { return } set opt_array [slurp_options "${file}.d"] if { $opt_array == -1 } { perror "error reading options from $file.d" unresolved $subdir/$name return } set dumpfile tmpdir/dump.out set run_ld 0 set run_objcopy 0 set opts(as) {} set opts(ld) {} set opts(xfail) {} set opts(target) {} set opts(notarget) {} set opts(objdump) {} set opts(nm) {} set opts(objcopy) {} set opts(readelf) {} set opts(name) {} set opts(PROG) {} set opts(source) {} set opts(error) {} set opts(warning) {} set opts(objcopy_linked_file) {} set asflags(${file}.s) {} foreach i $opt_array { set opt_name [lindex $i 0] set opt_val [lindex $i 1] if ![info exists opts($opt_name)] { perror "unknown option $opt_name in file $file.d" unresolved $subdir/$name return } switch -- $opt_name { xfail {} target {} notarget {} source { # Move any source-specific as-flags to a separate array to # simplify processing. if { [llength $opt_val] > 1 } { set asflags([lindex $opt_val 0]) [lrange $opt_val 1 end] set opt_val [lindex $opt_val 0] } else { set asflags($opt_val) {} } } default { if [string length $opts($opt_name)] { perror "option $opt_name multiply set in $file.d" unresolved $subdir/$name return } # A single "# ld:" with no options should do the right thing. if { $opt_name == "ld" } { set run_ld 1 } # Likewise objcopy_linked_file. if { $opt_name == "objcopy_linked_file" } { set run_objcopy 1 } } } set opts($opt_name) [concat $opts($opt_name) $opt_val] } # Decide early whether we should run the test for this target. if { [llength $opts(target)] > 0 } { set targmatch 0 foreach targ $opts(target) { if [istarget $targ] { set targmatch 1 break } } if { $targmatch == 0 } { return } } foreach targ $opts(notarget) { if [istarget $targ] { return } } set program "" # It's meaningless to require an output-testing method when we # expect an error. if { $opts(error) == "" } { if {$opts(PROG) != ""} { switch -- $opts(PROG) { objdump { set program objdump } nm { set program nm } objcopy { set program objcopy } readelf { set program readelf } default { perror "unrecognized program option $opts(PROG) in $file.d" unresolved $subdir/$name return } } } else { # Guess which program to run, by seeing which option was specified. foreach p {objdump objcopy nm readelf} { if {$opts($p) != ""} { if {$program != ""} { perror "ambiguous dump program in $file.d" unresolved $subdir/$name return } else { set program $p } } } } if { $program == "" && $opts(warning) == "" } { perror "dump program unspecified in $file.d" unresolved $subdir/$name return } } if { $opts(name) == "" } { set testname "$subdir/$name" } else { set testname $opts(name) } if { $opts(source) == "" } { set sourcefiles [list ${file}.s] } else { set sourcefiles {} foreach sf $opts(source) { if { [string match "/*" $sf] } { lappend sourcefiles "$sf" } else { lappend sourcefiles "$srcdir/$subdir/$sf" } # Must have asflags indexed on source name. set asflags($srcdir/$subdir/$sf) $asflags($sf) } } # Time to setup xfailures. foreach targ $opts(xfail) { setup_xfail $targ } # Assemble each file. set objfiles {} for { set i 0 } { $i < [llength $sourcefiles] } { incr i } { set sourcefile [lindex $sourcefiles $i] set objfile "tmpdir/dump$i.o" lappend objfiles $objfile set cmd "$AS $ASFLAGS $opts(as) $asflags($sourcefile) -o $objfile $sourcefile" send_log "$cmd\n" set cmdret [catch "exec $cmd" comp_output] set comp_output [prune_warnings $comp_output] if { $cmdret != 0 || ![string match "" $comp_output] } then { send_log "$comp_output\n" verbose "$comp_output" 3 set exitstat "succeeded" if { $cmdret != 0 } { set exitstat "failed" } verbose -log "$exitstat with: <$comp_output>" fail $testname return } } set expmsg $opts(error) if { $opts(warning) != "" } { if { $expmsg != "" } { perror "$testname: mixing error and warning test-directives" return } set expmsg $opts(warning) } # Perhaps link the file(s). if { $run_ld } { set objfile "tmpdir/dump" # Add -L$srcdir/$subdir so that the linker command can use # linker scripts in the source directory. set cmd "$LD $LDFLAGS -L$srcdir/$subdir \ $opts(ld) -o $objfile $objfiles" send_log "$cmd\n" set cmdret [catch "exec $cmd" comp_output] set comp_output [prune_warnings $comp_output]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -