• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#   Copyright (C) 1995-2014 Free Software Foundation, Inc.
2
3# This program is free software; you can redistribute it and/or modify
4# it under the terms of the GNU General Public License as published by
5# the Free Software Foundation; either version 3 of the License, or
6# (at your option) any later version.
7#
8# This program is distributed in the hope that it will be useful,
9# but WITHOUT ANY WARRANTY; without even the implied warranty of
10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11# GNU General Public License for more details.
12#
13# You should have received a copy of the GNU General Public License
14# along with this program; if not, write to the Free Software
15# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
16
17# Please email any bugs, comments, and/or additions to this file to:
18# bug-dejagnu@prep.ai.mit.edu
19
20# Written by Ian Lance Taylor <ian@cygnus.com>
21
22if ![is_remote host] {
23    if {[which $AR] == 0} then {
24        perror "$AR does not exist"
25        return
26    }
27}
28
29# send_user "Version [binutil_version $AR]"
30
31# Test long file name support
32
33proc long_filenames { bfdtests } {
34    global AR
35    global host_triplet
36    global base_dir
37
38    set testname "ar long file names"
39
40    set n1 "abcdefghijklmnopqrstuvwxyz1"
41    set n2 "abcdefghijklmnopqrstuvwxyz2"
42    set file1 tmpdir/$n1
43    set file2 tmpdir/$n2
44
45    remote_file build delete $file1
46    remote_file host delete $n1
47
48    # Some file systems truncate file names at 14 characters, which
49    # makes it impossible to run this test.  Check for that now.
50    set status [catch "set f [open tmpdir/$n1 w]" errs]
51    if { $status != 0 } {
52	verbose -log "open tmpdir/$n1 returned $errs"
53	unsupported $testname
54	return
55    }
56    puts $f "first"
57    close $f
58
59    remote_file build delete $file2
60    remote_file host delete $n2
61
62    set status [catch "set f [open tmpdir/$n2 w]" errs]
63    if { $status != 0 } {
64	verbose -log "open tmpdir/$n2 returned $errs"
65	unsupported $testname
66	return
67    }
68    puts $f "second"
69    close $f
70
71    if [is_remote host] {
72	set file1 [remote_download host $file1]
73	set file2 [remote_download host $file2]
74	set dest artest.a
75    } else {
76	set dest tmpdir/artest.a
77    }
78
79    remote_file host delete $dest
80
81    set got [binutils_run $AR "rc $dest $file1 $file2"]
82    if [is_remote host] {
83	remote_upload host $file1 tmpdir/$n1
84    }
85
86    set f [open tmpdir/$n1 r]
87    gets $f string
88    close $f
89    if ![string match "first" $string] {
90	verbose -log "reading tmpdir/$n1 returned $string"
91	unsupported $testname
92	return
93    }
94
95    remote_file host delete $dest
96    set got [binutils_run $AR "rc $dest $file1 $file2"]
97
98    if ![string match "" $got] {
99	fail $testname
100	return
101    }
102
103    remote_file build delete tmpdir/$n1
104    remote_file build delete tmpdir/$n2
105
106    set got [binutils_run $AR "t $dest"]
107    regsub "\[\r\n \t\]*$" "$got" "" got
108    if ![string match "$n1*$n2" $got] {
109	fail $testname
110	return
111    }
112
113    if [is_remote host] {
114	remote_file host delete $file1
115	remote_file host delete $file2
116    }
117
118    set exec_output [binutils_run $AR "x $dest"]
119    set exec_output [prune_warnings $exec_output]
120    if ![string match "" $exec_output] {
121	verbose -log $exec_output
122	fail $testname
123	return
124    }
125
126    foreach bfdtest $bfdtests {
127	set exec_output [binutils_run "$base_dir/$bfdtest" "$dest"]
128	if ![string match "" $exec_output] {
129	    verbose -log $exec_output
130	    fail "$testname ($bfdtest)"
131	    return
132	}
133    }
134
135    if [is_remote host] {
136	remote_upload host $n1 tmpdir/$n1
137	remote_upload host $n2 tmpdir/$n2
138	set file1 tmpdir/$n1
139	set file2 tmpdir/$n2
140    } else {
141	set file1 $n1
142	set file2 $n2
143    }
144
145    if ![file exists $file1] {
146	verbose -log "$file1 does not exist"
147	fail $testname
148	return
149    }
150    if ![file exists $file2] {
151	verbose -log "$file2 does not exist"
152	fail $testname
153	return
154    }
155
156    set f [open $file1 r]
157    if { [gets $f line] == -1 || $line != "first" } {
158	verbose -log "$file1 contents:"
159	verbose -log "$line"
160	close $f
161	fail $testname
162	return
163    }
164    close $f
165
166    set f [open $file2 r]
167    if { [gets $f line] == -1 || $line != "second" } {
168	verbose -log "$file2 contents:"
169	verbose -log "$line"
170	close $f
171	fail $testname
172	return
173    }
174    close $f
175
176    file delete $file1 $file2
177    pass $testname
178}
179
180# Test building the symbol table.
181
182proc symbol_table { } {
183    global AR
184    global AS
185    global NM
186    global srcdir
187    global subdir
188
189    set testname "ar symbol table"
190
191    if ![binutils_assemble $srcdir/$subdir/bintest.s tmpdir/bintest.o] {
192	unresolved $testname
193	return
194    }
195
196    if [is_remote host] {
197	set archive artest.a
198	set objfile [remote_download host tmpdir/bintest.o]
199	remote_file host delete $archive
200    } else {
201	set archive tmpdir/artest.a
202	set objfile tmpdir/bintest.o
203    }
204
205    remote_file build delete tmpdir/artest.a
206
207    set got [binutils_run $AR "rc $archive ${objfile}"]
208    if ![string match "" $got] {
209	fail $testname
210	return
211    }
212
213    set got [binutils_run $NM "--print-armap $archive"]
214    if { ![string match "*text_symbol in bintest.o*" $got] \
215	 || ![string match "*data_symbol in bintest.o*" $got] \
216	 || ![string match "*common_symbol in bintest.o*" $got] \
217	 || [string match "*static_text_symbol in bintest.o*" $got] \
218	 || [string match "*static_data_symbol in bintest.o*" $got] \
219	 || [string match "*external_symbol in bintest.o*" $got] } {
220	fail $testname
221	return
222    }
223
224    pass $testname
225}
226
227# Test building a thin archive.
228
229proc thin_archive { bfdtests } {
230    global AR
231    global AS
232    global NM
233    global srcdir
234    global subdir
235    global base_dir
236
237    set testname "ar thin archive"
238
239    if ![binutils_assemble $srcdir/$subdir/bintest.s tmpdir/bintest.o] {
240	unresolved $testname
241	return
242    }
243
244    if [is_remote host] {
245	set archive artest.a
246	set objfile [remote_download host tmpdir/bintest.o]
247	remote_file host delete $archive
248    } else {
249	set archive tmpdir/artest.a
250	set objfile tmpdir/bintest.o
251    }
252
253    remote_file build delete tmpdir/artest.a
254
255    set got [binutils_run $AR "rcT $archive ${objfile}"]
256    if ![string match "" $got] {
257	fail $testname
258	return
259    }
260
261    foreach bfdtest $bfdtests {
262	set exec_output [binutils_run "$base_dir/$bfdtest" "$archive"]
263	if ![string match "" $exec_output] {
264	    verbose -log $exec_output
265	    fail "$testname ($bfdtest)"
266	    return
267	}
268    }
269
270    set got [binutils_run $NM "--print-armap $archive"]
271    if { ![string match "*text_symbol in *bintest.o*" $got] \
272	 || ![string match "*data_symbol in *bintest.o*" $got] \
273	 || ![string match "*common_symbol in *bintest.o*" $got] \
274	 || [string match "*static_text_symbol in *bintest.o*" $got] \
275	 || [string match "*static_data_symbol in *bintest.o*" $got] \
276	 || [string match "*external_symbol in *bintest.o*" $got] } {
277	fail $testname
278	return
279    }
280
281    pass $testname
282}
283
284# Test building a thin archive with a nested archive.
285
286proc thin_archive_with_nested { bfdtests } {
287    global AR
288    global AS
289    global NM
290    global srcdir
291    global subdir
292    global base_dir
293
294    set testname "ar thin archive with nested archive"
295
296    if ![binutils_assemble $srcdir/$subdir/bintest.s tmpdir/bintest.o] {
297	unresolved $testname
298	return
299    }
300
301    if [is_remote host] {
302	set archive artest.a
303	set archive2 artest2.a
304	set objfile [remote_download host tmpdir/bintest.o]
305	remote_file host delete $archive
306    } else {
307	set archive tmpdir/artest.a
308	set archive2 tmpdir/artest2.a
309	set objfile tmpdir/bintest.o
310    }
311
312    remote_file build delete tmpdir/artest.a
313
314    set got [binutils_run $AR "rc $archive ${objfile}"]
315    if ![string match "" $got] {
316	fail $testname
317	return
318    }
319
320    remote_file build delete tmpdir/artest2.a
321
322    set got [binutils_run $AR "rcT $archive2 ${archive}"]
323    if ![string match "" $got] {
324	fail $testname
325	return
326    }
327
328    foreach bfdtest $bfdtests {
329	set exec_output [binutils_run "$base_dir/$bfdtest" "$archive"]
330	if ![string match "" $exec_output] {
331	    verbose -log $exec_output
332	    fail "$testname ($bfdtest)"
333	    return
334	}
335
336	set exec_output [binutils_run "$base_dir/$bfdtest" "$archive2"]
337	if ![string match "" $exec_output] {
338	    verbose -log $exec_output
339	    fail "$testname ($bfdtest)"
340	    return
341	}
342    }
343
344    set got [binutils_run $NM "--print-armap $archive"]
345    if { ![string match "*text_symbol in *bintest.o*" $got] \
346	 || ![string match "*data_symbol in *bintest.o*" $got] \
347	 || ![string match "*common_symbol in *bintest.o*" $got] \
348	 || [string match "*static_text_symbol in *bintest.o*" $got] \
349	 || [string match "*static_data_symbol in *bintest.o*" $got] \
350	 || [string match "*external_symbol in *bintest.o*" $got] } {
351	fail $testname
352	return
353    }
354
355    pass $testname
356}
357
358# Test POSIX-compatible argument parsing.
359
360proc argument_parsing { } {
361    global AR
362    global AS
363    global srcdir
364    global subdir
365
366    set testname "ar argument parsing"
367
368    if ![binutils_assemble $srcdir/$subdir/bintest.s tmpdir/bintest.o] {
369	unresolved $testname
370	return
371    }
372
373    if [is_remote host] {
374	set archive artest.a
375	set objfile [remote_download host tmpdir/bintest.o]
376	remote_file host delete $archive
377    } else {
378	set archive tmpdir/artest.a
379	set objfile tmpdir/bintest.o
380    }
381
382    remote_file build delete tmpdir/artest.a
383
384    set got [binutils_run $AR "-r -c $archive ${objfile}"]
385    if ![string match "" $got] {
386	fail $testname
387	return
388    }
389
390    pass $testname
391}
392
393# Test building a deterministic archive.
394
395proc deterministic_archive { } {
396    global AR
397    global AS
398    global NM
399    global srcdir
400    global subdir
401
402    set testname "ar deterministic archive"
403
404    if ![binutils_assemble $srcdir/$subdir/bintest.s tmpdir/bintest.o] {
405	unresolved $testname
406	return
407    }
408
409    if [is_remote host] {
410	set archive artest.a
411	set objfile [remote_download host tmpdir/bintest.o]
412	remote_file host delete $archive
413    } else {
414	set archive tmpdir/artest.a
415	set objfile tmpdir/bintest.o
416    }
417
418    remote_file build delete tmpdir/artest.a
419
420    set got [binutils_run $AR "rcD $archive ${objfile}"]
421    if ![string match "" $got] {
422	fail $testname
423	return
424    }
425
426    set got [binutils_run $AR "tv $archive"]
427    # This only checks the file mode and uid/gid.  We can't easily match
428    # date because it's printed with the user's timezone.
429    if ![string match "rw-r--r-- 0/0 *bintest.o*" $got] {
430	fail $testname
431	return
432    }
433
434    pass $testname
435}
436
437proc unique_symbol { } {
438    global AR
439    global AS
440    global NM
441    global srcdir
442    global subdir
443
444    set testname "ar unique symbol in archive"
445
446    if ![binutils_assemble $srcdir/$subdir/unique.s tmpdir/unique.o] {
447	unresolved $testname
448    }
449
450    if [is_remote host] {
451	set archive artest.a
452	set objfile [remote_download host tmpdir/unique.o]
453	remote_file host delete $archive
454    } else {
455	set archive tmpdir/artest.a
456	set objfile tmpdir/unique.o
457    }
458
459    remote_file build delete tmpdir/artest.a
460
461    set got [binutils_run $AR "-s -r -c $archive ${objfile}"]
462    if ![string match "" $got] {
463	fail $testname
464	return
465    }
466
467    set got [binutils_run $NM "--print-armap $archive"]
468    if ![string match "*foo in *unique.o*" $got] {
469	fail $testname
470	return
471    }
472
473    pass $testname
474}
475
476# Test deleting an element.
477
478proc delete_an_element { } {
479    global AR
480    global AS
481    global srcdir
482    global subdir
483
484    set testname "ar deleting an element"
485
486    if ![binutils_assemble $srcdir/$subdir/bintest.s tmpdir/bintest.o] {
487	unresolved $testname
488	return
489    }
490
491    if [is_remote host] {
492	set archive artest.a
493	set objfile [remote_download host tmpdir/bintest.o]
494	remote_file host delete $archive
495    } else {
496	set archive tmpdir/artest.a
497	set objfile tmpdir/bintest.o
498    }
499
500    remote_file build delete tmpdir/artest.a
501
502    set got [binutils_run $AR "-r -c $archive ${objfile}"]
503    if ![string match "" $got] {
504	fail $testname
505	return
506    }
507
508    set got [binutils_run $AR "-d $archive ${objfile}"]
509    if ![string match "" $got] {
510	fail $testname
511	return
512    }
513
514    pass $testname
515}
516
517# Test moving an element.
518
519proc move_an_element { } {
520    global AR
521    global AS
522    global srcdir
523    global subdir
524
525    set testname "ar moving an element"
526
527    if ![binutils_assemble $srcdir/$subdir/bintest.s tmpdir/bintest.o] {
528	unresolved $testname
529	return
530    }
531
532    if [is_remote host] {
533	set archive artest.a
534	set objfile [remote_download host tmpdir/bintest.o]
535	remote_file host delete $archive
536    } else {
537	set archive tmpdir/artest.a
538	set objfile tmpdir/bintest.o
539    }
540
541    remote_file build delete tmpdir/artest.a
542
543    set got [binutils_run $AR "-r -c $archive ${objfile}"]
544    if ![string match "" $got] {
545	fail $testname
546	return
547    }
548
549    set got [binutils_run $AR "-m $archive ${objfile}"]
550    if ![string match "" $got] {
551	fail $testname
552	return
553    }
554
555    pass $testname
556}
557
558# Run the tests.
559
560# Only run the bfdtest checks if the programs exist.  Since these
561# programs are built but not installed, running the testsuite on an
562# installed toolchain will produce ERRORs about missing bfdtest1 and
563# bfdtest2 executables.
564if { [file exists $base_dir/bfdtest1] && [file exists $base_dir/bfdtest2] } {
565    set bfdtests [list bfdtest1 bfdtest2]
566
567    long_filenames $bfdtests
568    thin_archive $bfdtests
569    thin_archive_with_nested $bfdtests
570}
571
572symbol_table
573argument_parsing
574deterministic_archive
575delete_an_element
576move_an_element
577
578if { [is_elf_format]
579     && ![istarget "*-*-hpux*"]
580     && ![istarget "msp*-*-*"] } {
581    unique_symbol
582}
583