mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-27 04:52:05 +08:00
a2c5833233
The result of running etc/update-copyright.py --this-year, fixing all the files whose mode is changed by the script, plus a build with --enable-maintainer-mode --enable-cgen-maint=yes, then checking out */po/*.pot which we don't update frequently. The copy of cgen was with commit d1dd5fcc38ead reverted as that commit breaks building of bfp opcodes files.
184 lines
5.4 KiB
Plaintext
184 lines
5.4 KiB
Plaintext
# Expect script for ld-sh tests
|
|
# Copyright (C) 1995-2022 Free Software Foundation, Inc.
|
|
#
|
|
# This file is part of the GNU Binutils.
|
|
#
|
|
# This program 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 3 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., 51 Franklin Street - Fifth Floor, Boston,
|
|
# MA 02110-1301, USA.
|
|
#
|
|
# Written by Ian Lance Taylor (ian@cygnus.com)
|
|
#
|
|
|
|
# Test SH relaxing. This tests the compiler and assembler as well as
|
|
# the linker.
|
|
|
|
if ![istarget sh*-*-*] {
|
|
return
|
|
}
|
|
|
|
set testsimple "SH simple relaxing"
|
|
|
|
if { ![is_elf_format] } {
|
|
unsupported $testsimple
|
|
} elseif { ![ld_assemble $as "-relax $srcdir/$subdir/sh1.s" tmpdir/sh1.o] } {
|
|
fail $testsimple
|
|
} elseif { ![ld_link $ld tmpdir/sh1 "-relax tmpdir/sh1.o"] } {
|
|
fail $testsimple
|
|
} elseif { ![ld_nm $nm "" tmpdir/sh1] } {
|
|
fail $testsimple
|
|
} elseif { ![info exists nm_output(bar)]
|
|
|| ![info exists nm_output(foo)]} {
|
|
send_log "bad output from nm\n"
|
|
verbose "bad output from nm"
|
|
fail $testsimple
|
|
} elseif {$nm_output(bar) != $nm_output(foo) + 0xc} {
|
|
send_log "foo == $nm_output(foo)\n"
|
|
verbose "foo == $nm_output(foo)"
|
|
send_log "bar == $nm_output(bar)\n"
|
|
verbose "bar == $nm_output(bar)"
|
|
fail $testsimple
|
|
} else {
|
|
pass $testsimple
|
|
}
|
|
|
|
set testsrec "SH relaxing to S-records"
|
|
|
|
if { ![remote_file host exists tmpdir/sh1] } {
|
|
unsupported $testsrec
|
|
} else {
|
|
if { [istarget sh*-linux-*] || [istarget sh-*-vxworks] } {
|
|
# On these "non-embedded" targets, the default ELF and srec start
|
|
# addresses will be SIZEOF_HEADERS bytes apart. Ensure consistency
|
|
# by feeding the ELF start address to the srec link line.
|
|
catch "exec $objdump -x tmpdir/sh1 | grep start\\ address | sed s/start\\ address//" entry_addr
|
|
set srec_relax_arg "-Ttext $entry_addr -relax --oformat srec tmpdir/sh1.o"
|
|
} else {
|
|
set srec_relax_arg "-relax --oformat srec tmpdir/sh1.o"
|
|
}
|
|
if ![ld_link $ld tmpdir/sh1.s1 $srec_relax_arg ] {
|
|
fail $testsrec
|
|
} else {
|
|
# The file name is embedded in the S-records, so create both
|
|
# files with the same name.
|
|
catch "exec rm -f tmpdir/sh1.s2" exec_output
|
|
send_log "mv tmpdir/sh1.s1 tmpdir/sh1.s2\n"
|
|
verbose "mv tmpdir/sh1.s1 tmpdir/sh1.s2"
|
|
catch "exec mv tmpdir/sh1.s1 tmpdir/sh1.s2" exec_output
|
|
if ![string match "" $exec_output] {
|
|
send_log "$exec_output\n"
|
|
verbose "$exec_output"
|
|
fail $testsrec
|
|
} else {
|
|
send_log "$objcopy -O srec tmpdir/sh1 tmpdir/sh1.s1\n"
|
|
verbose "$objcopy -O srec tmpdir/sh1 tmpdir/sh1.s1"
|
|
catch "exec $objcopy -O srec tmpdir/sh1 tmpdir/sh1.s1" exec_output
|
|
if ![string match "" $exec_output] {
|
|
send_log "$exec_output\n"
|
|
verbose "$exec_output"
|
|
fail $testsrec
|
|
} else {
|
|
send_log "cmp tmpdir/sh1.s1 tmpdir/sh1.s2\n"
|
|
verbose "cmp tmpdir/sh1.s1 tmpdir/sh1.s2"
|
|
catch "exec cmp tmpdir/sh1.s1 tmpdir/sh1.s2" exec_output
|
|
set exec_output [prune_warnings $exec_output]
|
|
if ![string match "" $exec_output] {
|
|
send_log "$exec_output\n"
|
|
verbose "$exec_output"
|
|
fail $testsrec
|
|
} else {
|
|
pass $testsrec
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
set testadjsw8 "SH switch8 adjustment after relax"
|
|
if { ![is_elf_format] } {
|
|
unsupported $testadjsw8
|
|
} elseif { ![ld_assemble $as "-relax $srcdir/$subdir/adjsw8.s" tmpdir/adjsw8.o] } {
|
|
fail $testadjsw8
|
|
} elseif { ![ld_link $ld tmpdir/adjsw8 "-relax tmpdir/adjsw8.o"] } {
|
|
fail $testadjsw8
|
|
} else {
|
|
send_log "exec $objdump -s tmpdir/adjsw8\n"
|
|
verbose "exec $objdump -s tmpdir/adjsw8"
|
|
catch "exec $objdump -s tmpdir/adjsw8" exec_output
|
|
if [string match "*04080c00*" $exec_output] {
|
|
pass $testadjsw8
|
|
} else {
|
|
send_log "bad switch table\n"
|
|
verbose "bad switch table"
|
|
fail $testadjsw8
|
|
}
|
|
}
|
|
|
|
set testlink "SH relaxing"
|
|
set testjsr "SH confirm relaxing"
|
|
set testrun "SH relaxing execution"
|
|
|
|
if { ![check_compiler_available] } {
|
|
untested $testlink
|
|
untested $testjsr
|
|
untested $testrun
|
|
return
|
|
}
|
|
|
|
if [istarget sh*-*linux*] {
|
|
exec sed -e s/_main/main/ -e s/_trap/trap/ -e s/_stack/stack/ \
|
|
< $srcdir/$subdir/start.s >tmpdir/start.s
|
|
} else {
|
|
exec cp $srcdir/$subdir/start.s tmpdir/start.s
|
|
}
|
|
|
|
if {![ld_assemble $as "-relax tmpdir/start.s" tmpdir/start.o] \
|
|
|| ![ld_compile $CC_FOR_TARGET "-O -mrelax -foptimize-sibling-calls $srcdir/$subdir/sh2.c" tmpdir/sh2.o]} {
|
|
unsupported $testlink
|
|
unsupported $testjsr
|
|
unsupported $testrun
|
|
return
|
|
}
|
|
|
|
if ![ld_link $ld tmpdir/sh2 "-relax tmpdir/start.o tmpdir/sh2.o"] {
|
|
fail $testlink
|
|
unsupported $testjsr
|
|
unsupported $testrun
|
|
return
|
|
}
|
|
|
|
pass $testlink
|
|
|
|
send_log "$objdump -d tmpdir/sh2\n"
|
|
verbose "$objdump -d tmpdir/sh2"
|
|
catch "exec $objdump -d tmpdir/sh2" exec_output
|
|
if {[string match "*jsr*" $exec_output]
|
|
|| [string match "*jmp*" $exec_output]} {
|
|
fail $testjsr
|
|
} else {
|
|
pass $testjsr
|
|
}
|
|
|
|
if { ![info exists SIM] || [which $SIM] == 0 } {
|
|
untested $testrun
|
|
return
|
|
}
|
|
|
|
set status [catch "exec $SIM tmpdir/sh2" exec_output]
|
|
if { $status == 0 } {
|
|
pass $testrun
|
|
} else {
|
|
fail $testrun
|
|
}
|