Commit | Line | Data |
---|---|---|
1b19eb81 AO |
1 | # Expect script for ld-sh tests |
2 | # Copyright (C) 2000, 2001, 2002 Free Software Foundation | |
3 | # | |
4 | # This file is free software; you can redistribute it and/or modify | |
5 | # it under the terms of the GNU General Public License as published by | |
6 | # the Free Software Foundation; either version 2 of the License, or | |
7 | # (at your option) any later version. | |
3e8cba19 | 8 | # |
1b19eb81 AO |
9 | # This program is distributed in the hope that it will be useful, |
10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 | # GNU General Public License for more details. | |
3e8cba19 | 13 | # |
1b19eb81 AO |
14 | # You should have received a copy of the GNU General Public License |
15 | # along with this program; if not, write to the Free Software | |
16 | # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |
17 | # | |
18 | ||
19 | # Test SH linking; all types of relocs. This tests the assembler and | |
20 | # tools like objdump as well as the linker. | |
21 | ||
22 | if ![istarget sh64-*-*] { | |
23 | return | |
24 | } | |
25 | ||
26 | # FIXME: This isn't set by testsuite/config/default.exp; make it. | |
27 | if ![info exists readelf] then { | |
28 | set readelf [findfile $base_dir/../binutils/readelf] | |
29 | } | |
30 | ||
31 | # List contains test-items with 3 items followed by 2 lists: | |
32 | # 0:name 1:ld options 2:assembler options | |
33 | # 3:filenames of assembler files 4: action and options. | |
34 | ||
35 | # Actions: | |
36 | # objdump: Apply objdump options on result. Compare with regex (last arg). | |
37 | # nm: Apply nm options on result. Compare with regex (last arg). | |
38 | ||
39 | # Note that the contents dump is the same for "inter-file datalabel | |
40 | # references, 64-bit ABI" as for 32-bit ABI and ELF so we re-use it. | |
41 | ||
42 | set sh64tests { | |
43 | {"SH64 linking, 64-bit ABI" "-mshelf64" | |
44 | "--abi=64" {sh64-1.s sh64-2.s} | |
45 | {{objdump -sr abi64.sd} {objdump -x abi64.xd}}} | |
46 | {"SH64 linking, 64-bit ABI, -no-expand" "-mshelf64" | |
47 | "--abi=64 -no-expand" {sh64-1.s sh64-2.s} | |
48 | {{objdump -sr abixx-noexp.sd}}} | |
49 | {"SH64 linking, 32-bit ABI" "-mshelf32" | |
50 | "--abi=32" {sh64-1.s sh64-2.s} | |
51 | {{objdump -sr abi32.sd} {objdump -x abi32.xd}}} | |
52 | {"SH64 linking, 32-bit ABI, -no-expand" "-mshelf32" | |
53 | "--abi=32 -no-expand" {sh64-1.s sh64-2.s} | |
54 | {{objdump -sr abixx-noexp.sd}}} | |
55 | {"SH64 linking, single multi-ISA object" "-mshelf32" | |
56 | "--abi=32" {shmix-1.s} | |
57 | {{objdump -sr mix1.sd} {objdump -x mix1.xd}}} | |
58 | {"SH64 linking, single multi-ISA object, -no-expand" "-mshelf32" | |
59 | "--abi=32 -no-expand" {shmix-1.s} | |
60 | {{objdump -sr mix1-noexp.sd}}} | |
61 | {"SH64 linking, two different-ISA objects" "-mshelf32" | |
62 | "--abi=32" {shmix-2.s shmix-3.s} | |
63 | {{objdump -sr mix2.sd} {objdump -x mix2.xd}}} | |
64 | {"SH64 linking, two different-ISA objects, -no-expand" "-mshelf32" | |
65 | "--abi=32 -no-expand" {shmix-2.s shmix-3.s} | |
66 | {{objdump -sr mix2-noexp.sd}}} | |
67 | {"SH64 linking, single SHcompact" "-mshelf32" | |
68 | "--isa=SHcompact" {shcmp-1.s} | |
69 | {{objdump -sr cmpct1.sd} {objdump -x cmpct1.xd}}} | |
70 | {"SH64 inter-file datalabel references, 64-bit ABI" "-mshelf64" | |
71 | "--abi=64" {shdl-1.s shdl-2.s} | |
72 | {{objdump -sr shdl64.sd} {objdump -x shdl64.xd}}} | |
73 | {"SH64 inter-file datalabel references, 32-bit ABI" "-mshelf32" | |
74 | "--abi=32" {shdl-1.s shdl-2.s} | |
75 | {{objdump -sr shdl64.sd} {objdump -x shdl32.xd}}} | |
0b65791f SC |
76 | {"SH64 inter-file datalabel references and gc-sections, 32-bit ABI" "-mshelf32 --gc-sections" |
77 | "--abi=32" {dlsection-1.s } | |
78 | {{objdump -sr dlsection.sd}}} | |
79 | {"SH64 inter-file datalabel references and gc-sections, 64-bit ABI" "-mshelf64 --gc-sections" | |
80 | "--abi=64" {dlsection-1.s } | |
81 | {{objdump -sr dlsection.sd}}} | |
1b19eb81 AO |
82 | {"SH64 simple partial linking, 32-bit ABI" "-mshelf32 -r" |
83 | "--abi=32" {rel-1.s rel-2.s} | |
84 | {{objdump -sx rel32.xd}}} | |
85 | {"SH64 simple partial linking, 64-bit ABI" "-mshelf64 -r" | |
86 | "--abi=64" {rel-1.s rel-2.s} | |
87 | {{objdump -sx rel64.xd}}} | |
88 | {"SH64 partial linking with datalabel references, 32-bit ABI" "-mshelf32 -r" | |
89 | "--abi=32" {reldl-1.s reldl-2.s} | |
90 | {{readelf {-s -r -x 1 -x 3} reldl32.rd}}} | |
91 | {"SH64 partial linking with datalabel references, 64-bit ABI" "-mshelf64 -r" | |
92 | "--abi=64" {reldl-1.s reldl-2.s} | |
93 | {{readelf {-s -r -x 1 -x 3} reldl64.rd}}} | |
94 | {"Handling SH64 assembler-generated .cranges" "-mshelf32" | |
95 | "--abi=32" {crange-2a.s crange-1.s} | |
96 | {{readelf {-S -s -r -x 1 -x 2 -x 9} crange1.rd}}} | |
97 | {"Handling SH64 assembler-generated .cranges, partial linking" "-mshelf32 -r" | |
98 | "--abi=32" {crange-2a.s} | |
99 | {{readelf {-S -s -r -x 2 -x 5} crangerel1.rd}}} | |
100 | {"Mixing SH64 assembler-generated with linker-generated .cranges" "-mshelf32" | |
101 | "--abi=32" {crange-2a.s crange-2b.s crange-1.s} | |
102 | {{readelf {-S -s -r -x 2 -x 9} crange2.rd}}} | |
103 | {"Mixing SH64 assembler-generated with linker-generated .cranges, partial linking" | |
104 | "-mshelf32 -r" | |
105 | "--abi=32" {crange-2a.s crange-2c.s crange-2d.s crange-2e.s} | |
106 | {{readelf {-S -s -r -x 2 -x 5} crangerel2.rd}}} | |
107 | {"Merge and use of SH64 .cranges, some not originally in order" "-mshelf32" | |
108 | "--abi=32" | |
109 | {crange-2e.s crange-2f.s crange-2g.s crange-2a.s crange-2d.s crange-2i.s | |
110 | crange-2h.s crange-1.s} | |
111 | {{readelf {-S -s -x 2 -x 9} crange3.rd} {objdump -d crange3.dd}}} | |
112 | {"Sorted SH64 .cranges, entry at SHcompact code" "-mshelf32 --entry diversion" | |
113 | "--abi=32" | |
114 | {crange-2e.s crange-2f.s crange-2g.s crange-2a.s crange-2d.s crange-2i.s | |
115 | crange-2h.s crange-1.s} | |
116 | {{readelf {-h -S -s -x 2 -x 9} crange3-cmpct.rd}}} | |
117 | {"Sorted SH64 .cranges, entry at SHmedia code" "-mshelf32 --entry diversion2" | |
118 | "--abi=32" | |
119 | {crange-2e.s crange-2f.s crange-2g.s crange-2a.s crange-2d.s crange-2i.s | |
120 | crange-2h.s crange-1.s} | |
121 | {{readelf {-h -S -s -x 2 -x 9} crange3-media.rd}}} | |
122 | {"SH64 Big Endianness" "-mshelf64 -Tendian.ld" | |
123 | "--abi=64" {endian.s} | |
124 | {{objdump -s endian.sbd} {objdump -d endian.dbd}}} | |
125 | {"SH64 Little Endianness" "-mshlelf64 -Tendian.ld" | |
126 | "--abi=64 --little" {endian.s} | |
127 | {{objdump -s endian.sld} {objdump -d endian.dld}}} | |
3e8cba19 | 128 | |
1b19eb81 AO |
129 | } |
130 | ||
131 | # FIXME: Generalize and move this to ld-lib.exp | |
132 | ||
133 | proc run_ld_link_tests { ldtests } { | |
134 | global ld | |
135 | global as | |
136 | global nm | |
137 | global objdump | |
138 | global readelf | |
139 | global srcdir | |
140 | global subdir | |
3e8cba19 | 141 | global env |
1b19eb81 AO |
142 | |
143 | set binfile "tmpdir/linked" | |
144 | ||
145 | foreach testitem $ldtests { | |
146 | set testname [lindex $testitem 0] | |
147 | set ld_options [lindex $testitem 1] | |
148 | set as_options [lindex $testitem 2] | |
149 | set as_files [lindex $testitem 3] | |
150 | set actions [lindex $testitem 4] | |
151 | set objfiles {} | |
152 | set is_unresolved 0 | |
153 | set failed 0 | |
154 | ||
155 | # verbose -log "Testname is $testname" | |
156 | # verbose -log "ld_options is $ld_options" | |
157 | # verbose -log "as_options is $as_options" | |
158 | # verbose -log "as_files is $as_files" | |
159 | # verbose -log "actions is $actions" | |
160 | ||
161 | # Assemble each file in the test. | |
162 | foreach as_file $as_files { | |
163 | set objfile "tmpdir/[file rootname $as_file].o" | |
164 | lappend objfiles $objfile | |
165 | ||
166 | if ![ld_assemble $as "$as_options $srcdir/$subdir/$as_file" $objfile] { | |
167 | set is_unresolved 1 | |
168 | break | |
169 | } | |
170 | } | |
171 | ||
172 | # Catch assembler errors. | |
173 | if { $is_unresolved != 0 } { | |
174 | unresolved $testname | |
175 | continue | |
176 | } | |
177 | ||
178 | if ![ld_simple_link $ld $binfile "-L$srcdir/$subdir $ld_options $objfiles"] { | |
179 | fail $testname | |
180 | } else { | |
181 | set failed 0 | |
182 | foreach actionlist $actions { | |
183 | set action [lindex $actionlist 0] | |
184 | set progopts [lindex $actionlist 1] | |
185 | ||
186 | # There are actions where we run regexp_diff on the | |
187 | # output, and there are other actions (presumably). | |
188 | # Handling of the former look the same. | |
189 | set dump_prog "" | |
190 | switch -- $action { | |
191 | objdump | |
192 | { set dump_prog $objdump } | |
193 | nm | |
194 | { set dump_prog $nm } | |
195 | readelf | |
196 | { set dump_prog $readelf } | |
197 | default | |
198 | { | |
199 | perror "Unrecognized action $action" | |
200 | set is_unresolved 1 | |
201 | break | |
202 | } | |
203 | } | |
204 | ||
205 | if { $dump_prog != "" } { | |
206 | set dumpfile [lindex $actionlist 2] | |
207 | set binary $dump_prog | |
208 | ||
3e8cba19 AM |
209 | # Ensure consistent sorting of symbols |
210 | if {[info exists env(LC_ALL)]} { | |
211 | set old_lc_all $env(LC_ALL) | |
212 | } | |
213 | set env(LC_ALL) "C" | |
214 | set cmd "$binary $progopts $binfile > dump.out" | |
215 | send_log "$cmd\n" | |
216 | catch "exec $cmd" comp_output | |
217 | if {[info exists old_lc_all]} { | |
218 | set env(LC_ALL) $old_lc_all | |
219 | } else { | |
220 | unset env(LC_ALL) | |
221 | } | |
1b19eb81 AO |
222 | set comp_output [prune_warnings $comp_output] |
223 | ||
224 | if ![string match "" $comp_output] then { | |
225 | send_log "$comp_output\n" | |
226 | set failed 1 | |
227 | break | |
228 | } | |
229 | ||
230 | if { [regexp_diff "dump.out" "$srcdir/$subdir/$dumpfile"] } then { | |
231 | verbose "output is [file_contents "dump.out"]" 2 | |
232 | set failed 1 | |
233 | break | |
234 | } | |
235 | } | |
236 | } | |
237 | ||
238 | if { $failed != 0 } { | |
239 | fail $testname | |
240 | } else { if { $is_unresolved == 0 } { | |
241 | pass $testname | |
242 | } } | |
243 | } | |
244 | ||
245 | # Catch action errors. | |
246 | if { $is_unresolved != 0 } { | |
247 | unresolved $testname | |
248 | continue | |
249 | } | |
250 | } | |
251 | } | |
252 | ||
253 | # FIXME: Move this to ld-lib.exp or higher up. | |
254 | ||
255 | # regexp_diff, based on simple_diff taken from ld test suite | |
256 | # compares two files line-by-line | |
257 | # file1 contains strings, file2 contains regexps and #-comments | |
258 | # blank lines are ignored in either file | |
259 | # returns non-zero if differences exist | |
260 | # | |
261 | proc regexp_diff { file_1 file_2 } { | |
262 | ||
263 | set eof -1 | |
264 | set end_1 0 | |
265 | set end_2 0 | |
266 | set differences 0 | |
267 | set diff_pass 0 | |
268 | ||
269 | if [file exists $file_1] then { | |
270 | set file_a [open $file_1 r] | |
271 | } else { | |
272 | warning "$file_1 doesn't exist" | |
273 | return 1 | |
274 | } | |
275 | ||
276 | if [file exists $file_2] then { | |
277 | set file_b [open $file_2 r] | |
278 | } else { | |
279 | fail "$file_2 doesn't exist" | |
280 | close $file_a | |
281 | return 1 | |
282 | } | |
283 | ||
284 | verbose " Regexp-diff'ing: $file_1 $file_2" 2 | |
285 | ||
286 | while { 1 } { | |
287 | set line_a "" | |
288 | set line_b "" | |
289 | while { [string length $line_a] == 0 } { | |
290 | if { [gets $file_a line_a] == $eof } { | |
291 | set end_1 1 | |
292 | break | |
293 | } | |
294 | } | |
295 | while { [string length $line_b] == 0 || [string match "#*" $line_b] } { | |
296 | if [ string match "#pass" $line_b ] { | |
297 | set end_2 1 | |
298 | set diff_pass 1 | |
299 | break | |
300 | } elseif [ string match "#..." $line_b ] { | |
301 | if { [gets $file_b line_b] == $eof } { | |
302 | set end_2 1 | |
303 | break | |
304 | } | |
305 | verbose "looking for \"^$line_b$\"" 3 | |
306 | while { ![regexp "^$line_b$" "$line_a"] } { | |
307 | verbose "skipping \"$line_a\"" 3 | |
308 | if { [gets $file_a line_a] == $eof } { | |
309 | set end_1 1 | |
310 | break | |
311 | } | |
312 | } | |
313 | break | |
314 | } | |
315 | if { [gets $file_b line_b] == $eof } { | |
316 | set end_2 1 | |
317 | break | |
318 | } | |
319 | } | |
320 | ||
3e8cba19 AM |
321 | if { $diff_pass } { |
322 | break | |
323 | } elseif { $end_1 && $end_2 } { | |
1b19eb81 AO |
324 | break |
325 | } elseif { $end_1 } { | |
326 | send_log "extra regexps in $file_2 starting with \"^$line_b$\"\nEOF from $file_1\n" | |
327 | verbose "extra regexps in $file_2 starting with \"^$line_b$\"\nEOF from $file_1" 3 | |
328 | set differences 1 | |
329 | break | |
330 | } elseif { $end_2 } { | |
331 | send_log "extra lines in $file_1 starting with \"^$line_a$\"\nEOF from $file_2\n" | |
332 | verbose "extra lines in $file_1 starting with \"^$line_a$\"\nEOF from $file_2\n" 3 | |
333 | set differences 1 | |
334 | break | |
335 | } else { | |
336 | verbose "regexp \"^$line_b$\"\nline \"$line_a\"" 3 | |
337 | if ![regexp "^$line_b$" "$line_a"] { | |
338 | send_log "regexp_diff match failure\n" | |
339 | send_log "regexp \"^$line_b$\"\nline \"$line_a\"\n" | |
340 | set differences 1 | |
341 | } | |
342 | } | |
343 | } | |
344 | ||
345 | if { $differences == 0 && !$diff_pass && [eof $file_a] != [eof $file_b] } { | |
346 | send_log "$file_1 and $file_2 are different lengths\n" | |
347 | verbose "$file_1 and $file_2 are different lengths" 3 | |
348 | set differences 1 | |
349 | } | |
350 | ||
351 | close $file_a | |
352 | close $file_b | |
353 | ||
354 | return $differences | |
355 | } | |
356 | ||
357 | proc file_contents { filename } { | |
358 | set file [open $filename r] | |
359 | set contents [read $file] | |
360 | close $file | |
361 | return $contents | |
362 | } | |
363 | ||
364 | run_ld_link_tests $sh64tests |