binutils-gdb/ld/testsuite/ld-i386/i386.exp

185 lines
5.2 KiB
Plaintext

# Expect script for ld-i386 tests
# Copyright (C) 2000, 2001, 2002 Free Software Foundation
#
# 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.
#
# Test i386 linking; all types of relocs. This tests the assembler and
# tools like objdump as well as the linker.
if { !([istarget "i?86-*-elf*"]
|| ([istarget "i?86-*-linux*"]
&& ![istarget "*-*-*aout*"]
&& ![istarget "*-*-*oldld*"])) } {
return
}
# FIXME: This isn't set by testsuite/config/default.exp; make it.
if ![info exists readelf] then {
set readelf [findfile $base_dir/../binutils/readelf]
}
# 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).
set i386tests {
{"TLS -fpic -shared transitions" "-shared -melf_i386"
"--32" {tlspic1.s tlspic2.s}
{{readelf -Ssrl tlspic.rd} {objdump -drj.text tlspic.dd}
{objdump -sj.got tlspic.sd} {objdump -sj.tdata tlspic.td}}
"libtlspic.so"}
{"Helper shared library" "-shared -melf_i386"
"--32" {tlslib.s} {} "libtlslib.so"}
{"TLS -fpic and -fno-pic exec transitions"
"-melf_i386 tmpdir/libtlslib.so" "--32" {tlsbinpic.s tlsbin.s}
{{readelf -Ssrl tlsbin.rd} {objdump -drj.text tlsbin.dd}
{objdump -sj.got tlsbin.sd} {objdump -sj.tdata tlsbin.td}}
"tlsbin"}
{"TLS -fno-pic -shared" "-shared -melf_i386"
"--32" {tlsnopic1.s tlsnopic2.s}
{{readelf -Ssrl tlsnopic.rd} {objdump -drj.text tlsnopic.dd}
{objdump -sj.got tlsnopic.sd}} "libtlsnopic.so"}
}
# FIXME: Generalize and move this to ld-lib.exp
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
}
}
}
run_ld_link_tests $i386tests