Added expected failure of tests 1 and 2 for ARM coff targets.
[external/binutils.git] / ld / testsuite / ld-srec / srec.exp
1 # Test linking directly to S-records.
2 # By Ian Lance Taylor, Cygnus Support.
3 # Public domain.
4
5 # Get the offset from an S-record line to the start of the data.
6
7 proc srec_off { l } {
8     if [string match "S1*" $l] {
9         return 8
10     } else { if [string match "S2*" $l] {
11         return 10
12     } else { if [string match "S3*" $l] {
13         return 12
14     } else {
15         return -1
16     } } }
17 }
18
19 # See if an S-record line contains only zero data.
20
21 proc srec_zero { l } {
22     if [string match "S\[0789\]*" $l] {
23         return 1
24     }
25
26     # Strip the address and checksum.
27     if [string match "S\[123\]*" $l] {
28         set l [string range $l [srec_off $l] [expr [string length $l] - 3]]
29     } else {
30         return 0
31     }
32
33     # The rest must be zero.
34     return [string match "" [string trim $l "0"]]
35 }
36
37 # Get the address of an S-record line.
38
39 proc srec_addr { l } {
40     if [string match "S\[123\]*" $l] {
41         set addr [string range $l 4 [expr [srec_off $l] - 1]]
42     } else {
43         return -1
44     }
45
46     return "0x$addr"
47 }
48
49 # Get the number of data bytes in an S-record line.
50
51 proc srec_len { l } {
52     if ![string match "S\[123\]*" $l] {
53         return 0
54     }
55
56     return [expr "0x[string range $l 2 3]" - ([srec_off $l] - 4) / 2 - 1]
57 }
58
59 # Extract bytes from an S-record line.
60
61 proc srec_extract { l start len } {
62     set off [srec_off $l]
63     set rlen [srec_len $l]
64     set stop [expr $start + $len]
65     if { $stop > $rlen } {
66         set stop [expr $rlen]
67     }
68     set start [expr $start * 2 + $off]
69     set stop [expr $stop * 2 + $off - 1]
70     return [string range $l $start $stop]
71 }
72
73 # See if a range of bytes in an S-record line is all zeroes.
74
75 proc srec_zero_range { l start len } {
76     return [string match "" [string trim [srec_extract $l $start $len] "0"]]
77 }
78
79 # Trim an S-record line such that the specified number of bytes remain
80 # at the end.
81
82 proc srec_trim { l leave } {
83     set off [srec_off $l]
84     set addr [srec_addr $l]
85     set len [srec_len $l]
86
87     if { $leave >= $len } {
88         return $l
89     }
90
91     set s1 [string range $l 0 1]
92     set s2 [format "%02x" [expr ($off - 4) / 2 + $leave + 1]]
93     set s3 [format "%0[expr $off - 4]x" [expr $addr + $len - $leave]]
94     set s4 [string range $l [expr [string length $l] - ($leave * 2) - 2] end]
95     set s "${s1}${s2}${s3}${s4}"
96
97     verbose "srec_trim { '$l' $leave } returning '$s'" 2
98
99     return $s
100 }
101
102 # Report failure when comparing S-record lines
103
104 proc srec_compare_fail { which l1 l2 } {
105     send_log "comparison failure $which:\n$l1\n$l2\n"
106     verbose "comparison failure $which:\n$l1\n$l2"
107 }
108
109 # Compare S-record files.  We don't want to fuss about things like
110 # extra zeroes.  Note that BFD always sorts S-records by address.
111
112 proc srec_compare { f1 f2 } {
113     set e1 [gets $f1 l1]
114     set e2 [gets $f2 l2]
115
116     while { $e1 != -1 } {
117         set l1 [string trimright $l1 "\r\n"]
118         set l2 [string trimright $l2 "\r\n"]
119         if { $e2 == -1 } {
120             # If l1 contains data, it must be zero.
121             if ![srec_zero $l1] {
122                 send_log "data after EOF: $l1\n"
123                 verbose "data after EOF: $l1"
124                 return 0
125             }
126         } else { if { [string compare $l1 $l2] == 0 } {
127             set e1 [gets $f1 l1]
128             set e2 [gets $f2 l2]
129         } else { if { [srec_zero $l1] } {
130             set e1 [gets $f1 l1]
131         } else { if { [srec_zero $l2] } {
132             set e2 [gets $f2 l2]
133         } else {
134             # The strings are not the same, and neither is all zeroes.
135             set a1 [srec_addr $l1]
136             set n1 [srec_len $l1]
137             set a2 [srec_addr $l2]
138             set n2 [srec_len $l2]
139
140             if { $a1 < $a2 && ![srec_zero_range $l1 0 [expr $a2 - $a1]] } {
141                 verbose "$a1 $a2 [srec_extract $l1 0 [expr $a2 - $a1]]" 2
142                 srec_compare_fail 1 $l1 $l2
143                 return 0
144             }
145             if { $a2 < $a1 && ![srec_zero_range $l2 0 [expr $a1 - $a2]] } {
146                 srec_compare_fail 2 $l1 $l2
147                 return 0
148             }
149
150             # Here we know that any initial data in both lines is
151             # zero.  Now make sure that any overlapping data matches.
152             if { $a1 < $a2 } {
153                 set os1 [expr $a2 - $a1]
154                 set os2 0
155             } else {
156                 set os1 0
157                 set os2 [expr $a1 - $a2]
158             }
159             if { $a1 + $n1 < $a2 + $n2 } {
160                 set ol [expr $n1 - $os1]
161             } else {
162                 set ol [expr $n2 - $os2]
163             }
164
165             set x1 [srec_extract $l1 $os1 $ol]
166             set x2 [srec_extract $l2 $os2 $ol]
167             if { [string compare $x1 $x2] != 0 } {
168                 verbose "$os1 $ol $x1" 2
169                 verbose "$os2 $ol $x2" 2
170                 srec_compare_fail 3 $l1 $l2
171                 return 0
172             }
173
174             # These strings match.  Trim the data from the larger
175             # string, read a new copy of the smaller string, and
176             # continue.
177             if { $a1 + $n1 < $a2 + $n2 } {
178                 set l2 [srec_trim $l2 [expr ($a2 + $n2) - ($a1 + $n1)]]
179                 set e1 [gets $f1 l1]
180             } else { if { $a1 + $n1 > $a2 + $n2 } {
181                 set l1 [srec_trim $l1 [expr ($a1 + $n1) - ($a2 + $n2)]]
182                 set e2 [gets $f2 l2]
183             } else {
184                 set e1 [gets $f1 l1]
185                 set e2 [gets $f2 l2]
186             } }
187         } } } }
188     }
189
190     # We've reached the end of the first file.  The remainder of the
191     # second file must contain only zeroes.
192     while { $e2 != -1 } {
193         set l2 [string trimright $l2 "\r\n"]
194         if ![srec_zero $l2] {
195             send_log "data after EOF: $l2\n"
196             verbose "data after EOF: $l2"
197             return 0
198         }
199         set e2 [gets $f2 l2]
200     }
201
202     return 1
203 }
204
205 # Link twice, objcopy, and compare
206
207 proc run_srec_test { test objs } {
208     global ld
209     global objcopy
210     global sizeof_headers
211     global host_triplet
212
213     set flags ""
214
215     # g++ sometimes generates references to __get_dynamic_handler_chain.
216     set flags "$flags --defsym __get_dynamic_handler_chain=0"
217     set flags "$flags --defsym ___get_dynamic_handler_chain=0"
218
219     # The mn10200 has out of line prologues and epilogues which the
220     # comiler uses when compiling the testcase.   Define them so that
221     # we don't need to bring in libgcc.a
222     if [istarget mn10200-*-*] {
223         set flags "$flags --defsym ___prologue=0"
224         set flags "$flags --defsym ___epilogue_noreturn=0"
225         set flags "$flags --defsym ___epilogue_d0=0"
226         set flags "$flags --defsym ___epilogue_a0=0"
227     }
228
229     # If the linker script uses SIZEOF_HEADERS, use a -Ttext argument
230     # to force both the normal link and the S-record link to be put in
231     # the same place.  We don't always use -Ttext because it interacts
232     # poorly with a.out.
233
234     if { $sizeof_headers } {
235         set flags "$flags -Ttext 0x1000"
236     }
237
238     # The a29k compiled code calls V_SPILL and V_FILL.  Since we don't
239     # need to run this code, but we don't have definitions for those
240     # functions, we just define them out.
241     if [istarget a29k*-*-*] {
242         set flags "$flags --defsym V_SPILL=0 --defsym V_FILL=0"
243     }
244
245     # PowerPC EABI code calls __eabi.
246     if [istarget powerpc*-*-eabi*] {
247         set flags "$flags --defsym __eabi=0"
248     }
249
250     if { ![ld_simple_link $ld tmpdir/sr1 "$flags $objs"] \
251          || ![ld_simple_link $ld tmpdir/sr2.sr "$flags -oformat srec $objs"] } {
252         setup_xfail "hppa*-*-*elf*"
253         fail $test
254         return
255     }
256
257     send_log "$objcopy -O srec tmpdir/sr1 tmpdir/sr1.sr\n"
258     verbose "$objcopy -O srec tmpdir/sr1 tmpdir/sr1.sr"
259     catch "exec $objcopy -O srec tmpdir/sr1 tmpdir/sr1.sr" exec_output
260     set exec_output [prune_warnings $exec_output]
261     if ![string match "" $exec_output] {
262         send_log "$exec_output\n"
263         verbose "$exec_output"
264         unresolved $test
265         return
266     }
267
268     set f1 [open tmpdir/sr1.sr r]
269     set f2 [open tmpdir/sr2.sr r]
270     if [srec_compare $f1 $f2] {
271         pass $test
272     } else {
273         fail $test
274     }
275     close $f1
276     close $f2
277 }
278
279 set test1 "S-records"
280 set test2 "S-records with constructors"
281
282 # See whether the default linker script uses SIZEOF_HEADERS.
283 catch "exec $ld --verbose" exec_output
284 set sizeof_headers [string match "*SIZEOF_HEADERS*" $exec_output]
285
286 # First test linking a C program.  We don't require any libraries.  We
287 # link it normally, and objcopy to the S-record format, and then link
288 # directly to the S-record format, and require that the two files
289 # contain the same data.
290
291 if { [which $CC] == 0 } {
292     untested $test1
293     untested $test2
294     return
295 }
296
297 if { ![ld_compile $CC $srcdir/$subdir/sr1.c tmpdir/sr1.o] \
298      || ![ld_compile $CC $srcdir/$subdir/sr2.c tmpdir/sr2.o] } {
299     unresolved $test1
300     unresolved $test2
301     return
302 }
303
304 # The i386-aout target is confused: the linker does not put the
305 # sections where objdump finds them.  I don't know which is wrong.
306 setup_xfail "i*86-*-aout*"
307
308 # These tests fail on the native MIPS ELF targets because the GP value
309 # in the .reginfo section is not updated when the S-record version is
310 # written out.  The mips-elf target itself does not use a .reginfo section.
311 setup_xfail "mips*-*-irix5*" "mips*-*-irix6*"
312
313 # The S-record linker doesn't do the magic TOC handling that XCOFF
314 # linkers do.
315 setup_xfail "*-*-aix*" "*-*-xcoff*"
316 setup_xfail "arm-*-coff"
317
318 run_srec_test $test1 "tmpdir/sr1.o tmpdir/sr2.o"
319
320 # Now try linking a C++ program with global constructors and
321 # destructors.  Note that since we are not linking against any
322 # libraries, this program won't actually work or anything.
323
324 if { [which $CXX] == 0 } {
325     untested $test2
326     return
327 }
328
329 if ![ld_compile "$CXX $CXXFLAGS -fgnu-linker" $srcdir/$subdir/sr3.cc tmpdir/sr3.o] {
330     unresolved $test2
331     return
332 }
333
334 # See above.
335 setup_xfail "i*86-*-aout*"
336 setup_xfail "mips*-*-irix5*" "mips*-*-irix6*"
337 setup_xfail "*-*-aix*" "*-*-xcoff*"
338 setup_xfail "arm-*-coff"
339
340 run_srec_test $test2 "tmpdir/sr3.o"