1# Expect script for ld-sh tests
2#   Copyright (C) 2001-2017 Free Software Foundation, Inc.
3#
4# This file is part of the GNU Binutils.
5#
6# This program is free software; you can redistribute it and/or modify
7# it under the terms of the GNU General Public License as published by
8# the Free Software Foundation; either version 3 of the License, or
9# (at your option) any later version.
10#
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY; without even the implied warranty of
13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14# GNU General Public License for more details.
15#
16# You should have received a copy of the GNU General Public License
17# along with this program; if not, write to the Free Software
18# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19# MA 02110-1301, USA.
20#
21
22# Test SH reloc failures - that is, cases that ld must not allow.
23
24if ![istarget sh64-*-*] {
25    return
26}
27
28if [istarget sh64-*-linux*] {
29    set emul32 "shlelf32_linux"
30    set oformat32 "elf32-sh64-linux"
31    set startsym "_start"
32    set doabi64 0
33} elseif { [istarget sh64*-*-netbsd*] || [istarget sh5*-*-netbsd*] } then {
34    set emul32 "shelf32_nbsd"
35    set oformat32 "elf32-sh64-nbsd"
36    set startsym "__start"
37    set doabi64 1
38    set emul64 "shelf64_nbsd"
39    set oformat64 "elf64-sh64-nbsd"
40} else {
41    set emul32 "shelf32"
42    set oformat32 "elf32-sh64"
43    set startsym "start"
44    set doabi64 1
45    set emul64 "shelf64"
46    set oformat64 "elf64-sh64"
47}
48
49# opcode, asflags, ldflags, expected or "" for fail
50# opcode blank means rebuild relfail.o and set default as/ld options
51
52set sh64abi32relfailtests {
53
54    { "" "-isa=shcompact -abi=32" "-m $emul32 -Ttext 0x1000 --oformat $oformat32" "" }
55    { "mov.l lab,r0;.align 3;lab:nop" "" "" "mov.l 1008" }
56    { "mov.l to0,r0" "" "" "mov.l 1010" }
57    { "mov.l to1,r0" "" "" "" }
58    { "mov.l to2,r0" "" "" "" }
59    { "mov.l to3,r0" "" "" "" }
60    { "mov.l to4,r0" "" "" "mov.l 1014" }
61
62    { "" "-isa=shmedia -abi=32 -no-expand" "-m $emul32 -Ttext 0x1000 --oformat $oformat32" "" }
63    { "pta lab,tr0;.align 3;lab:nop" "" "" "pta.*1008" }
64
65    { "ld.q r0,datalabel to0 - 0x1000,r0" "" "" "ld.q.*,16," }
66    { "ld.q r0,datalabel to1 - 0x1000,r0" "" "" "" }
67    { "ld.q r0,datalabel to2 - 0x1000,r0" "" "" "" }
68    { "ld.q r0,datalabel to3 - 0x1000,r0" "" "" "" }
69    { "ld.q r0,datalabel to4 - 0x1000,r0" "" "" "" }
70
71    { "ld.l r0,datalabel to0 - 0x1000,r0" "" "" "ld.l.*,16," }
72    { "ld.l r0,datalabel to1 - 0x1000,r0" "" "" "" }
73    { "ld.l r0,datalabel to2 - 0x1000,r0" "" "" "" }
74    { "ld.l r0,datalabel to3 - 0x1000,r0" "" "" "" }
75    { "ld.l r0,datalabel to4 - 0x1000,r0" "" "" "ld.l.*,20," }
76
77    { "ld.w r0,datalabel to0 - 0x1000,r0" "" "" "ld.w.*,16," }
78    { "ld.w r0,datalabel to1 - 0x1000,r0" "" "" "" }
79    { "ld.w r0,datalabel to2 - 0x1000,r0" "" "" "ld.w.*,18," }
80    { "ld.w r0,datalabel to3 - 0x1000,r0" "" "" "" }
81    { "ld.w r0,datalabel to4 - 0x1000,r0" "" "" "ld.w.*,20," }
82
83}
84
85set sh64abi64relfailtests {
86
87    { "" "-isa=shmedia -abi=64 -no-expand" "-m $emul64 -Ttext 0x1000 --oformat $oformat64" "" }
88    { "pta lab,tr0;.align 3;lab:nop" "" "" "pta.*1008" }
89    { "pta datalabel to0,tr0" "" "" "pta.*1010" }
90    { "pta datalabel to1,tr0" "" "" "pta.*1011" }
91    { "pta datalabel to2,tr0" "" "" "" }
92    { "pta datalabel to3,tr0" "" "" "" }
93    { "pta datalabel to4,tr0" "" "" "pta.*1014" }
94
95    { "ld.q r0,datalabel to0 - 0x1000,r0" "" "" "ld.q.*,16," }
96    { "ld.q r0,datalabel to1 - 0x1000,r0" "" "" "" }
97    { "ld.q r0,datalabel to2 - 0x1000,r0" "" "" "" }
98    { "ld.q r0,datalabel to3 - 0x1000,r0" "" "" "" }
99    { "ld.q r0,datalabel to4 - 0x1000,r0" "" "" "" }
100
101    { "ld.l r0,datalabel to0 - 0x1000,r0" "" "" "ld.l.*,16," }
102    { "ld.l r0,datalabel to1 - 0x1000,r0" "" "" "" }
103    { "ld.l r0,datalabel to2 - 0x1000,r0" "" "" "" }
104    { "ld.l r0,datalabel to3 - 0x1000,r0" "" "" "" }
105    { "ld.l r0,datalabel to4 - 0x1000,r0" "" "" "ld.l.*,20," }
106
107    { "ld.w r0,datalabel to0 - 0x1000,r0" "" "" "ld.w.*,16," }
108    { "ld.w r0,datalabel to1 - 0x1000,r0" "" "" "" }
109    { "ld.w r0,datalabel to2 - 0x1000,r0" "" "" "ld.w.*,18," }
110    { "ld.w r0,datalabel to3 - 0x1000,r0" "" "" "" }
111    { "ld.w r0,datalabel to4 - 0x1000,r0" "" "" "ld.w.*,20," }
112
113}
114
115proc run_sh64relfailtests {sh64relfailtests} {
116    global ld
117    global as
118    global nm
119    global objdump
120    global readelf
121    global srcdir
122    global subdir
123    global emul32
124    global emul64
125    global oformat32
126    global oformat64
127    global startsym
128
129    set testindex 0
130    set is_unresolved 0
131
132    foreach testentry $sh64relfailtests {
133	set opcode [lindex $testentry 0]
134	set as_options [lindex $testentry 1]
135	set ld_options [subst [lindex $testentry 2]]
136	set expect_fail [lindex $testentry 3]
137
138	set testname "SH64 relfail $opcode $as_options $ld_options"
139
140	set objfiles {}
141
142	incr testindex
143
144	if {$opcode == ""} {
145	    set def_as_options $as_options
146	    set def_ld_options $ld_options
147	    set is_unresolved 0
148	    set baseobj "tmpdir/relfail-$testindex.o"
149	    if ![ld_assemble $as "$as_options $srcdir/$subdir/relfail.s" $baseobj] {
150		set is_unresolved 1
151	    }
152	    continue
153	}
154
155	if {$as_options == ""} {
156	    set as_options $def_as_options
157	}
158	if {$ld_options == ""} {
159	    set ld_options $def_ld_options
160	}
161
162	if { $is_unresolved } {
163	    unresolved $testname
164	    continue
165	}
166
167	set asm [open "tmpdir/relfail-$testindex.s" "w"]
168	puts $asm " .text"
169	puts $asm " .global $startsym"
170	puts $asm "$startsym:"
171	puts $asm " $opcode"
172	close $asm
173
174	if ![ld_assemble $as "$as_options tmpdir/relfail-$testindex.s" "tmpdir/relfail-$testindex.o"] {
175	    unresolved $testname
176	    continue
177	}
178
179	set binfile "tmpdir/relfail-$testindex.x"
180
181	file delete $binfile
182	set objects "tmpdir/relfail-$testindex.o $baseobj"
183	set result [ld_simple_link $ld $binfile "--no-warn-mismatch $ld_options $objects"]
184
185	set exists [file exists $binfile]
186	if {$exists && $expect_fail == ""} {
187	    verbose "$testname: file $binfile exists when it shouldn't" 1
188	    catch "exec $objdump -d $binfile" objdump_output
189	    verbose $objdump_output 1
190	    fail "$testname (file exists)"
191	    continue
192	}
193	if {!$exists && $expect_fail != ""} {
194	    verbose "$testname: file $binfile doesn't exist when it should" 1
195	    fail "$testname (file missing)"
196	    continue
197	}
198
199	if {$exists} {
200	    catch "exec $objdump -d $binfile" objdump_output
201	    regsub -all {[ 	][ 	]*} $objdump_output " " objdump_short
202	    if ![regexp $expect_fail $objdump_short junk] {
203		verbose $objdump_output 1
204		fail "$testname (incorrect reloc)"
205		continue
206	    }
207	}
208
209	file delete "tmpdir/relfail-$testindex.s"
210	file delete "tmpdir/relfail-$testindex.o"
211	file delete $binfile
212	pass $testname
213    }
214}
215
216run_sh64relfailtests $sh64abi32relfailtests
217if {$doabi64} {
218    run_sh64relfailtests $sh64abi64relfailtests
219}
220