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

📄 ld-lib.exp

📁 俄罗斯高人Mamaich的Pocket gcc编译器(运行在PocketPC上)的全部源代码。
💻 EXP
📖 第 1 页 / 共 2 页
字号:
    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	}    }    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 }	}    } elseif { $opts(error) != "" } {	# It's meaningless to require an output-testing method when we	# expect an error.  For simplicity, we fake an arbitrary method.	set program "nm"    } else {	# Guess which program to run, by seeing which option was specified.	set program ""	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 == ""} {	    perror "dump program unspecified in $file.d"	    unresolved $subdir/$name	    return	}    }    set progopts1 $opts($program)    eval set progopts \$[string toupper $program]FLAGS    eval set binary \$[string toupper $program]    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"	    } {		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]	# We accept errors at assembly stage too, unless we're supposed to	# link something.	if { $cmdret != 0 || ![string match "" $comp_output] } then {	    send_log "$comp_output\n"	    verbose "$comp_output" 3	    if { $opts(error) != "" && $run_ld == 0 } {		if [regexp $opts(error) $comp_output] {		    pass $testname		    return		}	    }	    fail $testname	    return	}    }    # 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]	if { $cmdret != 0 || ![string match "" $comp_output] } then {	    verbose -log "failed with: <$comp_output>, expected: <$opts(error)>"	    send_log "$comp_output\n"	    verbose "$comp_output" 3	    if { $opts(error) != "" && $run_objcopy == 0 } {		if [regexp $opts(error) $comp_output] {		    pass $testname		    return		}	    }	    fail $testname	    return	}	if { $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]	    set comp_output [prune_warnings $comp_output]	    if { $cmdret != 0 || ![string match "" $comp_output] } then {		verbose -log "failed with: <$comp_output>, expected: <$opts(error)>"		send_log "$comp_output\n"		verbose "$comp_output" 3		if { $opts(error) != "" } {		    if [regexp $opts(error) $comp_output] {			pass $testname			return		    }		}		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    }    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:# 0:name 1:ld options 2:assembler options# 3:filenames of assembler files 4: action and options. 5: name of output file# 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    foreach testitem $ldtests {	set testname [lindex $testitem 0]	set ld_options [lindex $testitem 1]	set as_options [lindex $testitem 2]	set as_files  [lindex $testitem 3]	set actions [lindex $testitem 4]	set binfile tmpdir/[lindex $testitem 5]	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 "as_files is $as_files"#	verbose -log "actions is $actions"#	verbose -log "binfile is $binfile"	# Assemble each file in the test.	foreach as_file $as_files {	    set objfile "tmpdir/[file rootname $as_file].o"	    lappend objfiles $objfile	    if ![ld_assemble $as "$as_options $srcdir/$subdir/$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 + -