⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ld-lib.exp

📁 GNU binutils是GNU交叉工具链中的一个源码包
💻 EXP
📖 第 1 页 / 共 3 页
字号:
	if { $cmdret != 0 } then {	    # If the executed program writes to stderr and stderr is not	    # redirected, exec *always* returns failure, regardless of the	    # program exit code.  Thankfully, we can retrieve the true	    # return status from a special variable.  Redirection would	    # cause a tcl-specific message to be appended, and we'd rather	    # not deal with that if we can help it.	    global errorCode	    if { [lindex $errorCode 0] == "NONE" } {		set cmdret 0	    }	}	if { $cmdret == 0 && $run_objcopy } {	    set infile $objfile	    set objfile "tmpdir/dump1"	    # Note that we don't use OBJCOPYFLAGS here; any flags must be	    # explicitly specified.	    set cmd "$OBJCOPY $opts(objcopy_linked_file) $infile $objfile"	    send_log "$cmd\n"	    set cmdret [catch "exec $cmd" comp_output]	    append comp_output [prune_warnings $comp_output]	    if { $cmdret != 0 } then {		global errorCode		if { [lindex $errorCode 0] == "NONE" } {		    set cmdret 0		}	    }	}	if { $cmdret != 0 || $comp_output != "" || $expmsg != "" } then {	    set exitstat "succeeded"	    if { $cmdret != 0 } { set exitstat "failed" }	    verbose -log "$exitstat with: <$comp_output>, expected: <$expmsg>"	    send_log "$comp_output\n"	    verbose "$comp_output" 3	    if { [regexp $expmsg $comp_output] \		    && (($cmdret == 0) == ($opts(warning) != "")) } {		# We have the expected output from ld.		if { $opts(error) != "" || $program == "" } {		    pass $testname		    return		}	    } else {		verbose -log "$exitstat with: <$comp_output>, expected: <$expmsg>"		fail $testname		return	    }	}    } else {	set objfile "tmpdir/dump0.o"    }    # We must not have expected failure if we get here.    if { $opts(error) != "" } {	fail $testname	return    }    set progopts1 $opts($program)    eval set progopts \$[string toupper $program]FLAGS    eval set binary \$[string toupper $program]    if { [which $binary] == 0 } {	untested $testname	return    }    if { $progopts1 == "" } { set $progopts1 "-r" }    verbose "running $binary $progopts $progopts1" 3    # Objcopy, unlike the other two, won't send its output to stdout,    # so we have to run it specially.    set cmd "$binary $progopts $progopts1 $objfile > $dumpfile"    if { $program == "objcopy" } {	set cmd "$binary $progopts $progopts1 $objfile $dumpfile"    }    # Ensure consistent sorting of symbols    if {[info exists env(LC_ALL)]} {	set old_lc_all $env(LC_ALL)    }    set env(LC_ALL) "C"    send_log "$cmd\n"    catch "exec $cmd" comp_output    if {[info exists old_lc_all]} {	set env(LC_ALL) $old_lc_all    } else {	unset env(LC_ALL)    }    set comp_output [prune_warnings $comp_output]    if ![string match "" $comp_output] then {	send_log "$comp_output\n"	fail $testname	return    }    verbose_eval {[file_contents $dumpfile]} 3    if { [regexp_diff $dumpfile "${file}.d"] } then {	fail $testname	verbose "output is [file_contents $dumpfile]" 2	return    }    pass $testname}proc slurp_options { file } {    if [catch { set f [open $file r] } x] {	#perror "couldn't open `$file': $x"	perror "$x"	return -1    }    set opt_array {}    # whitespace expression    set ws  {[ 	]*}    set nws {[^ 	]*}    # whitespace is ignored anywhere except within the options list;    # option names are alphabetic plus underscore only.    set pat "^#${ws}(\[a-zA-Z_\]*)$ws:${ws}(.*)$ws\$"    while { [gets $f line] != -1 } {	set line [string trim $line]	# Whitespace here is space-tab.	if [regexp $pat $line xxx opt_name opt_val] {	    # match!	    lappend opt_array [list $opt_name $opt_val]	} else {	    break	}    }    close $f    return $opt_array}# regexp_diff, copied from gas, based on simple_diff above.#	compares two files line-by-line#	file1 contains strings, file2 contains regexps and #-comments#	blank lines are ignored in either file#	returns non-zero if differences exist#proc regexp_diff { file_1 file_2 } {    set eof -1    set end_1 0    set end_2 0    set differences 0    set diff_pass 0    if [file exists $file_1] then {	set file_a [open $file_1 r]    } else {	warning "$file_1 doesn't exist"	return 1    }    if [file exists $file_2] then {	set file_b [open $file_2 r]    } else {	fail "$file_2 doesn't exist"	close $file_a	return 1    }    verbose " Regexp-diff'ing: $file_1 $file_2" 2    while { 1 } {	set line_a ""	set line_b ""	while { [string length $line_a] == 0 } {	    if { [gets $file_a line_a] == $eof } {		set end_1 1		break	    }	}	while { [string length $line_b] == 0 || [string match "#*" $line_b] } {	    if [ string match "#pass" $line_b ] {		set end_2 1		set diff_pass 1		break	    } elseif [ string match "#..." $line_b ] {		if { [gets $file_b line_b] == $eof } {		    set end_2 1		    break		}		verbose "looking for \"^$line_b$\"" 3		while { ![regexp "^$line_b$" "$line_a"] } {		    verbose "skipping    \"$line_a\"" 3		    if { [gets $file_a line_a] == $eof } {			set end_1 1			break		    }		}		break	    }	    if { [gets $file_b line_b] == $eof } {		set end_2 1		break	    }	}        if { $diff_pass } {            break        } elseif { $end_1 && $end_2 } {            break        } elseif { $end_1 } {            send_log "extra regexps in $file_2 starting with \"^$line_b$\"\nEOF from $file_1\n"            verbose "extra regexps in $file_2 starting with \"^$line_b$\"\nEOF from $file_1" 3            set differences 1            break        } elseif { $end_2 } {            send_log "extra lines in $file_1 starting with \"^$line_a$\"\nEOF from $file_2\n"            verbose "extra lines in $file_1 starting with \"^$line_a$\"\nEOF from $file_2\n" 3            set differences 1            break        } else {            verbose "regexp \"^$line_b$\"\nline   \"$line_a\"" 3            if ![regexp "^$line_b$" "$line_a"] {		send_log "regexp_diff match failure\n"		send_log "regexp \"^$line_b$\"\nline   \"$line_a\"\n"		set differences 1            }        }    }    if { $differences == 0 && !$diff_pass && [eof $file_a] != [eof $file_b] } {	send_log "$file_1 and $file_2 are different lengths\n"	verbose "$file_1 and $file_2 are different lengths" 3	set differences 1    }    close $file_a    close $file_b    return $differences}proc file_contents { filename } {    set file [open $filename r]    set contents [read $file]    close $file    return $contents}# List contains test-items with 3 items followed by 2 lists, one item and# one optional item:# 0:name 1:ld options 2:assembler options# 3:filenames of assembler files 4: action and options. 5: name of output file# 6:compiler flags (optional)# Actions:# objdump: Apply objdump options on result.  Compare with regex (last arg).# nm: Apply nm options on result.  Compare with regex (last arg).# readelf: Apply readelf options on result.  Compare with regex (last arg).proc run_ld_link_tests { ldtests } {    global ld    global as    global nm    global objdump    global READELF    global srcdir    global subdir    global env    global CC    global CFLAGS    foreach testitem $ldtests {	set testname [lindex $testitem 0]	set ld_options [lindex $testitem 1]	set as_options [lindex $testitem 2]	set src_files  [lindex $testitem 3]	set actions [lindex $testitem 4]	set binfile tmpdir/[lindex $testitem 5]	set cflags [lindex $testitem 6]	set objfiles {}	set is_unresolved 0	set failed 0#	verbose -log "Testname is $testname"#	verbose -log "ld_options is $ld_options"#	verbose -log "as_options is $as_options"#	verbose -log "src_files is $src_files"#	verbose -log "actions is $actions"#	verbose -log "binfile is $binfile"	# Assemble each file in the test.	foreach src_file $src_files {	    set objfile "tmpdir/[file rootname $src_file].o"	    lappend objfiles $objfile	    if { [file extension $src_file] == ".c" } {		set as_file "tmpdir/[file rootname $src_file].s"		if ![ld_compile "$CC -S $CFLAGS $cflags" $srcdir/$subdir/$src_file $as_file] {		    set is_unresolved 1		    break		}	    } else {		set as_file "$srcdir/$subdir/$src_file"	    }	    if ![ld_assemble $as "$as_options $as_file" $objfile] {		set is_unresolved 1		break	    }	}	# Catch assembler errors.	if { $is_unresolved != 0 } {	    unresolved $testname	    continue	}	if ![ld_simple_link $ld $binfile "-L$srcdir/$subdir $ld_options $objfiles"] {	    fail $testname	} else {	    set failed 0	    foreach actionlist $actions {		set action [lindex $actionlist 0]		set progopts [lindex $actionlist 1]		# There are actions where we run regexp_diff on the		# output, and there are other actions (presumably).		# Handling of the former look the same.		set dump_prog ""		switch -- $action {		    objdump		        { set dump_prog $objdump }		    nm		        { set dump_prog $nm }		    readelf		        { set dump_prog $READELF }		    default			{			    perror "Unrecognized action $action"			    set is_unresolved 1			    break			}		    }		if { $dump_prog != "" } {		    set dumpfile [lindex $actionlist 2]		    set binary $dump_prog		    # Ensure consistent sorting of symbols		    if {[info exists env(LC_ALL)]} {			set old_lc_all $env(LC_ALL)		    }		    set env(LC_ALL) "C"		    set cmd "$binary $progopts $binfile > dump.out"		    send_log "$cmd\n"		    catch "exec $cmd" comp_output		    if {[info exists old_lc_all]} {			set env(LC_ALL) $old_lc_all		    } else {			unset env(LC_ALL)		    }		    set comp_output [prune_warnings $comp_output]		    if ![string match "" $comp_output] then {			send_log "$comp_output\n"			set failed 1			break		    }		    if { [regexp_diff "dump.out" "$srcdir/$subdir/$dumpfile"] } then {			verbose "output is [file_contents "dump.out"]" 2			set failed 1			break		    }		}	    }	    if { $failed != 0 } {		fail $testname	    } else { if { $is_unresolved == 0 } {		pass $testname	    } }	}	# Catch action errors.	if { $is_unresolved != 0 } {	    unresolved $testname	    continue	}    }}proc verbose_eval { expr { level 1 } } {    global verbose    if $verbose>$level then { eval verbose "$expr" $level }}# This definition is taken from an unreleased version of DejaGnu.  Once# that version gets released, and has been out in the world for a few# months at least, it may be safe to delete this copy.if ![string length [info proc prune_warnings]] {    #    # prune_warnings -- delete various system verbosities from TEXT    #    # An example is:    # ld.so: warning: /usr/lib/libc.so.1.8.1 has older revision than expected 9    #    # Sites with particular verbose os's may wish to override this in site.exp.    #    proc prune_warnings { text } {	# This is from sun4's.  Do it for all machines for now.	# The "\\1" is to try to preserve a "\n" but only if necessary.	regsub -all "(^|\n)(ld.so: warning:\[^\n\]*\n?)+" $text "\\1" text	# It might be tempting to get carried away and delete blank lines, etc.	# Just delete *exactly* what we're ask to, and that's it.	return $text    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -