123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- # 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
- }
|