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

📄 selective.exp

📁 GNU binutils是GNU交叉工具链中的一个源码包
💻 EXP
字号:
# Expect script for LD selective linking tests#   Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004#   Free Software Foundation, Inc.## This file is free software; you can redistribute it and/or modify# it under the terms of the GNU General Public License as published by# the Free Software Foundation; either version 2 of the License, or# (at your option) any later version.## This program is distributed in the hope that it will be useful,# but WITHOUT ANY WARRANTY; without even the implied warranty of# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the# GNU General Public License for more details.## You should have received a copy of the GNU General Public License# along with this program; if not, write to the Free Software# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.## Written by Catherine Moore (clm@cygnus.com)# Make sure that constructors are handled correctly.# Only ELF based ports support selective linkingif ![is_elf_format] {    return}# IA64 does not support selective linkingif {[istarget "ia64-*-*"]} {    return}# List contains test-items with three items followed by four lists:# 1:name 2:test-type (CC or C++; add as needed) 3:filename 4:ld-flags# 5:must-have-symbols 6:must-not-have-symbols 7:xfail-targets.## If a must(-not)-have symbol is a list, then that list must have two# items; the symbol name and a value the symbol must (not) have.## Note: ld_nm trims leading `_' from _start## FIXME: Instead of table, read settings from each source-file.set seltests {  {selective1 C   1.c  {}       {}    {dropme1 dropme2} {}}  {selective2 C   2.c  {}       {}    {foo} {mips*-*}}  {selective3 C   2.c  {-u foo} {foo} {{foo 0}} {mips*-*}}  {selective4 C++ 3.cc {}       {start a A::foo() B::foo()} {A::bar()} {mips*-*}}  {selective5 C++ 4.cc {}       {start a A::bar()} {A::foo() B::foo()} {mips*-*}}  {selective6 C++ 5.cc {}       {start a A::bar()}    {A::foo() B::foo() dropme1() dropme2()} {*-*-*}}}set cflags "-w -O -ffunction-sections -fdata-sections"set cxxflags "-fvtable-gc -fno-exceptions -fno-rtti"set ldflags "--gc-sections -Bstatic"if [istarget sh64*-*-elf] {    # This is what gcc passes to ld by default, plus switch to the    # "usual" ELF _start (shelf32 normally uses just `start' for COFF    # compatibility)    set ldflags "-e _start -mshelf32 $ldflags"}# If we don't have g++ for the target, mark all tests as untested.if { [which $CXX] == 0 } {    foreach testitem $seltests {	untested "[lindex $testitem 0]"    }    return}foreach testitem $seltests {    set testname [lindex $testitem 0]    set testtype [lindex $testitem 1]    set testfile [lindex $testitem 2]    set objfile "tmpdir/[file rootname $testfile].o"    set ldfile "tmpdir/[file rootname $testfile].x"    set failed 0    set ldargs [lindex $testitem 3]    set mustsyms [lindex $testitem 4]    set mustnotsyms [lindex $testitem 5]    set xfails [lindex $testitem 6]    foreach xfail_target $xfails {	setup_xfail $xfail_target    }    setup_xfail "alpha*-*" "arc*-*" "d30v*-*" "dlx*-*" "i370*-*" "i860*-*"    setup_xfail "i960*-*" "mn10200-*" "or32-*" "pj-*" "sparc64*-*"    # It's either C or C++ at the moment.    if { $testtype == "C++" } {	set testflags "$cflags $cxxflags"	if [string match "*gcc*" [lindex $CC 0]] {	    # Starting with 3.4.0, -fvtable-gc is no longer supported and thus	    # the functionality we try to test for cannot be expected to work.	    catch "exec -- $CC -dumpversion" version	    if [regexp "^(\[1-9\]\[0-9\]+|\[4-9\]|3.(\[1-9\]\[0-9\]+|\[4-9\]))\\." $version] {		setup_xfail {*-*-*}	    }	}    } {	set testflags "$cflags"    }    # Note that we do not actually *use* CXX; we just add cxxflags for C++    # tests.  It might have been a buglet originally; now I think better    # leave as is.    if { ![ld_compile "$CC $testflags" $srcdir/$subdir/$testfile $objfile] } {	unresolved $testname	continue    }    # V850 targets need libgcc.a    if [istarget v850*-*-elf] {    	catch "exec $CC -print-libgcc-file-name" libgcc	set objfile "$objfile $libgcc"    }    # ARM targets need libgcc.a in THUMB mode so that __call_via_r3 is provided    if {[istarget arm-*-*] || [istarget xscale-*-*]} {    	catch "exec $CC -print-libgcc-file-name" libgcc	set objfile "$objfile $libgcc"    }    # HPPA linux targets need libgcc.a for millicode routines ($$dyncall).    if [istarget hppa*-*-linux*] {    	catch "exec $CC -print-libgcc-file-name" libgcc	set objfile "$objfile $libgcc"    }    # m6811/m6812 code has references to soft registers.    if {[istarget m6811-*-*] || [istarget m6812-*-*]} {	set objfile "$objfile --defsym _.frame=0 --defsym _.d1=0"	set objfile "$objfile --defsym _.d2=0"    }    if ![ld_simple_link $ld $ldfile "$ldflags [join $ldargs] $objfile"] {	fail $testname	continue    }    if ![ld_nm $nm --demangle $ldfile] {	unresolved $testname	continue    }    # Must make V2 demangled names look like V3    foreach nm_output_key [array names nm_output] {	if [regsub \\(void\\) $nm_output_key () new_nm_output_key] {	    set nm_output($new_nm_output_key) nm_output($nm_output_key)	}    }    # Check each mandated symbol and optionally mandated values.    foreach mustsym $mustsyms {	if { [llength [concat $mustsym]] == 1 } {	    if { ![info exists nm_output($mustsym)] } {		verbose -log "$testname: missing $mustsym"		fail $testname		set failed 1		break	    }	} {	    set mustsymname [lindex $mustsym 0]	    set mustsymvalue [lindex $mustsym 1]	    if { ![info exists nm_output($mustsymname)] } {		verbose -log "$testname: missing $mustsymname"		fail $testname		set failed 1		break	    } {		if { $nm_output($mustsymname) != $mustsymvalue } {		    verbose -log "$testname: $mustsymname != $mustsymvalue"		    verbose -log "is instead $nm_output($mustsymname)"		    fail $testname		    set failed 1		    break		}	    }	}    }    if { $failed != 0 } {	continue    }    # Check each unwanted symbol, or that symbols do not have specific    # values.    foreach mustnotsym $mustnotsyms {	if { [llength [concat $mustnotsym]] == 1 } {	    if { [info exists nm_output($mustnotsym)] } {		verbose -log "$testname: $mustnotsym == $nm_output($mustnotsym)"		fail $testname		set failed 1		break	    }	} {	    set mustnotsymname [lindex $mustnotsym 0]	    set mustnotsymvalue [lindex $mustnotsym 1]	    if { [info exists nm_output($mustnotsymname)] \		    && $nm_output($mustnotsymname) == $mustnotsymvalue} {		verbose -log "$testname: $mustnotsymname == $mustnotsymvalue"		fail $testname		set failed 1		break	    }	}    }    if { $failed == 0 } {	pass $testname    }}

⌨️ 快捷键说明

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