# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
# MA 02110-1301, USA.
+proc load_common_lib { name } {
+ global srcdir
+ load_file $srcdir/../../binutils/testsuite/lib/$name
+}
+
+load_common_lib binutils-common.exp
+
# Extract and print the version number of ld.
#
proc default_ld_version { ld } {
append flags " --defsym __gccmain=0"
}
+ # Windows targets need __main, prefixed with underscore.
+ if {[istarget *-*-cygwin* ] || [istarget *-*-mingw*]} {
+ append flags " --defsym ___main=0"
+ }
+
# PowerPC EABI code calls __eabi.
if {[istarget powerpc*-*-eabi*] || [istarget powerpc*-*-rtems*]} {
append flags " --defsym __eabi=0"
return $flags
}
-# True if the object format is known to be ELF.
-#
-proc is_elf_format {} {
- if { ![istarget *-*-sysv4*]
- && ![istarget *-*-unixware*]
- && ![istarget *-*-elf*]
- && ![istarget *-*-eabi*]
- && ![istarget *-*-rtems*]
- && ![istarget hppa*64*-*-hpux*]
- && ![istarget ia64-*-hpux*]
- && ![istarget *-*-linux*]
- && ![istarget frv-*-uclinux*]
- && ![istarget bfin-*-uclinux]
- && ![istarget sh*-*-uclinux*]
- && ![istarget *-*-irix5*]
- && ![istarget *-*-irix6*]
- && ![istarget *-*-netbsd*]
- && ![istarget *-*-openbsd*]
- && ![istarget *-*-solaris2*] } {
- return 0
- }
-
- if { [istarget *-*-linux*aout*]
- || [istarget *-*-linux*oldld*]
- || [istarget h8500-*-rtems*]
- || [istarget i960-*-rtems*]
- || [istarget *-*-rtemscoff*] } {
- return 0
- }
-
- if { ![istarget *-*-netbsdelf*]
- && ([istarget *-*-netbsd*aout*]
- || [istarget *-*-netbsdpe*]
- || [istarget arm*-*-netbsd*]
- || [istarget sparc-*-netbsd*]
- || [istarget i*86-*-netbsd*]
- || [istarget m68*-*-netbsd*]
- || [istarget vax-*-netbsd*]
- || [istarget ns32k-*-netbsd*]) } {
- return 0
- }
-
- if { [istarget arm-*-openbsd*]
- || [istarget i386-*-openbsd\[0-2\].*]
- || [istarget i386-*-openbsd3.\[0-2\]]
- || [istarget m68*-*-openbsd*]
- || [istarget ns32k-*-openbsd*]
- || [istarget sparc-*-openbsd\[0-2\].*]
- || [istarget sparc-*-openbsd3.\[0-1\]]
- || [istarget vax-*-openbsd*] } {
- return 0
- }
-
- return 1
-}
-
-# True if the object format is known to be 64-bit ELF.
-#
-proc is_elf64 { binary_file } {
- global READELF
- global READELFFLAGS
-
- set readelf_size ""
- catch "exec $READELF $READELFFLAGS -h $binary_file > readelf.out" got
-
- if ![string match "" $got] then {
- return 0
- }
-
- if { ![regexp "\n\[ \]*Class:\[ \]*ELF(\[0-9\]+)\n" \
- [file_contents readelf.out] nil readelf_size] } {
- return 0
- }
-
- if { $readelf_size == "64" } {
- return 1
- }
-
- return 0
-}
-
-# True if the object format is known to be a.out.
-#
-proc is_aout_format {} {
- if { [istarget *-*-netbsdelf]
- || [istarget sparc64-*-netbsd*]
- || [istarget sparc64-*-openbsd*] } {
- return 0
- }
- if { [istarget *-*-*\[ab\]out*]
- || [istarget *-*-linux*oldld*]
- || [istarget *-*-bsd*]
- || [istarget *-*-msdos*]
- || [istarget arm-*-netbsd*]
- || [istarget arm-*-openbsd*]
- || [istarget arm-*-riscix*]
- || [istarget i?86-*-freebsd\[12\]*]
- || [istarget i?86-*-netbsd*]
- || [istarget i?86-*-openbsd\[0-2\]*]
- || [istarget i?86-*-openbsd3.\[0-2\]*]
- || [istarget i?86-*-vsta]
- || [istarget i?86-*-mach*]
- || [istarget m68*-*-netbsd*]
- || [istarget m68*-*-openbsd*]
- || [istarget ns32k-*-*]
- || [istarget pdp11-*-*]
- || [istarget sparc*-*-sunos4*]
- || [istarget sparc*-*-netbsd*]
- || [istarget sparc*-*-openbsd\[0-2\]*]
- || [istarget sparc*-*-openbsd3.\[0-1\]*]
- || [istarget sparc*-fujitsu-none]
- || [istarget vax-dec-ultrix*]
- || [istarget vax-*-netbsd] } {
- return 1
- }
- return 0
-}
-
-# True if the object format is known to be PE COFF.
-#
-proc is_pecoff_format {} {
- if { ![istarget *-*-mingw*]
- && ![istarget *-*-cygwin*]
- && ![istarget *-*-cegcc*]
- && ![istarget *-*-pe*] } {
- return 0
- }
-
- return 1
-}
-
# Compares two files line-by-line.
# Returns differences if exist.
# Returns null if file(s) cannot be opened.
} else {
verbose "regexp \"^$line_b$\"\nline \"$line_a\"" 3
if ![regexp "^$line_b$" "$line_a"] {
+ verbose "regexp_diff match failure\n" 3
send_log "regexp_diff match failure\n"
send_log "regexp \"^$line_b$\"\nline \"$line_a\"\n"
set differences 1
return $contents
}
+proc set_file_contents { filename contents } {
+ set file [open $filename w]
+ puts $file "$contents"
+ close $file
+}
+
# Create an archive using ar
#
proc ar_simple_create { ar aropts target objects } {
# 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).
+# ld: Don't apply anything on result. Compare output during linking with
+# regex (second arg). Note that this *must* be the first action if it
+# is to be used at all; in all other cases, any output from the linker
+# during linking is treated as a sign of an error and FAILs the test.
#
proc run_ld_link_tests { ldtests } {
global ld
global CC
global CFLAGS
global runtests
+ global exec_output
foreach testitem $ldtests {
set testname [lindex $testitem 0]
set objfiles {}
set is_unresolved 0
set failed 0
+ set maybe_failed 0
+ set ld_output ""
# verbose -log "Testname is $testname"
# verbose -log "ld_options is $ld_options"
set failed 0
}
} elseif { ![ld_simple_link $ld $binfile "-L$srcdir/$subdir $ld_options $objfiles"] } {
- fail $testname
- set failed 1
+ set maybe_failed 1
+ set ld_output "$exec_output"
} else {
set failed 0
}
{ set dump_prog $nm }
readelf
{ set dump_prog $READELF }
+ ld
+ { set dump_prog "ld" }
default
{
perror "Unrecognized action $action"
}
}
- if { $dump_prog != "" } {
+ if { $action == "ld" } {
+ set dumpfile [lindex $actionlist 1]
+ verbose "dumpfile is $dumpfile"
+ set_file_contents "tmpdir/ld.messages" "$ld_output"
+ verbose "ld.messages has '[file_contents tmpdir/ld.messages]'"
+ if { [regexp_diff "tmpdir/ld.messages" "$srcdir/$subdir/$dumpfile"] } then {
+ verbose "output is $ld_output" 2
+ set failed 1
+ break
+ }
+ set maybe_failed 0
+ } elseif { $maybe_failed != 0 } {
+ set failed 1
+ break
+ } elseif { $dump_prog != "" } {
set dumpfile [lindex $actionlist 2]
set binary $dump_prog
return $gc_sections_available_saved
}
+# Returns true if the target ld supports the plugin API.
+proc check_plugin_api_available { } {
+ global plugin_api_available_saved
+ global ld
+ if {![info exists plugin_api_available_saved]} {
+ # Check if the ld used by gcc supports --plugin.
+ set ld_output [remote_exec host $ld "--help"]
+ if { [ string first "-plugin" $ld_output ] >= 0 } {
+ set plugin_api_available_saved 1
+ } else {
+ set plugin_api_available_saved 0
+ }
+ }
+ return $plugin_api_available_saved
+}
+
# Check if the assembler supports CFI statements.
proc check_as_cfi { } {