OSDN Git Service

* lib/target-supports.exp
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / lib / target-supports.exp
1 #   Copyright (C) 1999, 2001, 2003, 2004, 2005 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 2 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 # gcc-patches@gcc.gnu.org
19
20 # This file defines procs for determining features supported by the target.
21
22 # Try to compile some code and return the messages printed by the compiler.
23 #
24 # BASENAME is a basename to use for temporary files.
25 # TYPE is the type of compilation to perform (see target_compile).
26 # CONTENTS gives the contents of the input file.
27 # The rest is optional:
28 # OPTIONS: additional compiler options to use.
29 proc get_compiler_messages {basename type contents args} {
30     global tool
31
32     if { [llength $args] > 0 } {
33         set options "additional_flags=[lindex $args 0]"
34     } else {
35         set options ""
36     }
37
38     set src ${basename}[pid].c
39     switch $type {
40         assembly { set output ${basename}[pid].s }
41         object { set output ${basename}[pid].o }
42     }
43     set f [open $src "w"]
44     puts $f $contents
45     close $f
46     set lines [${tool}_target_compile $src $output $type "$options"]
47     file delete $src
48     remote_file build delete $output
49
50     return $lines
51 }
52
53 proc current_target_name { } {
54     global target_info
55     if [info exists target_info(target,name)] {
56         set answer $target_info(target,name)
57     } else {
58         set answer ""
59     }
60     return $answer
61 }
62
63 ###############################
64 # proc check_weak_available { }
65 ###############################
66
67 # weak symbols are only supported in some configs/object formats
68 # this proc returns 1 if they're supported, 0 if they're not, or -1 if unsure
69
70 proc check_weak_available { } {
71     global target_triplet
72     global target_cpu
73
74     # All mips targets should support it
75
76     if { [ string first "mips" $target_cpu ] >= 0 } {
77         return 1
78     }
79
80     # All solaris2 targets should support it
81
82     if { [regexp ".*-solaris2.*" $target_triplet] } {
83         return 1
84     }
85
86     # DEC OSF/1/Digital UNIX/Tru64 UNIX supports it
87
88     if { [regexp "alpha.*osf.*" $target_triplet] } {
89         return 1
90     }
91
92     # Windows targets Cygwin and MingW32 support it
93
94     if { [regexp ".*mingw32|.*cygwin" $target_triplet] } {
95         return 1
96     }
97
98     # HP-UX 10.X doesn't support it
99
100     if { [regexp "hppa.*hpux10" $target_triplet] } {
101         return 0
102     }
103
104     # ELF and ECOFF support it. a.out does with gas/gld but may also with
105     # other linkers, so we should try it
106
107     set objformat [gcc_target_object_format]
108
109     switch $objformat {
110         elf      { return 1 }
111         ecoff    { return 1 }
112         a.out    { return 1 }
113         mach-o   { return 1 }
114         som      { return 1 }
115         unknown  { return -1 }
116         default  { return 0 }
117     }
118 }
119
120 ###############################
121 # proc check_visibility_available { what_kind }
122 ###############################
123
124 # The visibility attribute is only support in some object formats
125 # This proc returns 1 if it is supported, 0 if not.
126 # The argument is the kind of visibility, default/protected/hidden/internal.
127
128 proc check_visibility_available { what_kind } {
129     global visibility_available_saved
130     global tool
131     global target_triplet
132
133     # On NetWare, support makes no sense.
134     if { [string match "*-*-netware*" $target_triplet] } {
135         return 0
136     }
137
138     if [string match "" $what_kind] { set what_kind "hidden" }
139
140     if { [info exists visibility_available_saved] } {
141         verbose "Saved result is <$visibility_available_saved>" 1
142         if { [ lsearch -exact $visibility_available_saved $what_kind ] != -1 } {
143             return 1
144         } elseif { [ lsearch -exact $visibility_available_saved "!$what_kind" ] != -1 } {
145             return 0
146         }
147     }
148
149     set lines [get_compiler_messages visibility object "
150         void f() __attribute__((visibility(\"$what_kind\")));
151         void f() {}
152     "]
153     if [string match "" $lines] then {
154         set answer 1
155         lappend visibility_available_saved $what_kind
156     } else {
157         set answer 0
158         lappend visibility_available_saved "!$what_kind"
159     }
160     return $answer
161 }
162
163 ###############################
164 # proc check_alias_available { }
165 ###############################
166
167 # Determine if the target toolchain supports the alias attribute.
168
169 # Returns 2 if the target supports aliases.  Returns 1 if the target
170 # only supports weak aliased.  Returns 0 if the target does not
171 # support aliases at all.  Returns -1 if support for aliases could not
172 # be determined.
173
174 proc check_alias_available { } {
175     global alias_available_saved
176     global tool
177
178     if [info exists alias_available_saved] {
179         verbose "check_alias_available  returning saved $alias_available_saved" 2
180     } else {
181         set src alias[pid].c
182         set obj alias[pid].o
183         verbose "check_alias_available  compiling testfile $src" 2
184         set f [open $src "w"]
185         # Compile a small test program.  The definition of "g" is
186         # necessary to keep the Solaris assembler from complaining
187         # about the program.
188         puts $f "#ifdef __cplusplus\nextern \"C\"\n#endif\n"
189         puts $f "void g() {} void f() __attribute__((alias(\"g\")));"
190         close $f
191         set lines [${tool}_target_compile $src $obj object ""]
192         file delete $src
193         remote_file build delete $obj
194
195         if [string match "" $lines] then {
196             # No error messages, everything is OK.
197             set alias_available_saved 2
198         } else {
199             if [regexp "alias definitions not supported" $lines] {
200                 verbose "check_alias_available  target does not support aliases" 2
201
202                 set objformat [gcc_target_object_format]
203
204                 if { $objformat == "elf" } {
205                     verbose "check_alias_available  but target uses ELF format, so it ought to" 2
206                     set alias_available_saved -1
207                 } else {
208                     set alias_available_saved 0
209                 }
210             } else {
211                 if [regexp "only weak aliases are supported" $lines] {
212                 verbose "check_alias_available  target supports only weak aliases" 2
213                 set alias_available_saved 1
214                 } else {
215                     set alias_available_saved -1
216                 }
217             }
218         }
219
220         verbose "check_alias_available  returning $alias_available_saved" 2
221     }
222
223     return $alias_available_saved
224 }
225
226 # Returns true if --gc-sections is supported on the target.
227
228 proc check_gc_sections_available { } {
229     global gc_sections_available_saved
230     global tool
231
232     if {![info exists gc_sections_available_saved]} {
233         # Some targets don't support gc-sections despite whatever's
234         # advertised by ld's options.
235         if { [istarget alpha*-*-*]
236              || [istarget ia64-*-*] } {
237             set gc_sections_available_saved 0
238             return 0
239         }
240
241         # Check if the ld used by gcc supports --gc-sections.
242         set gcc_spec [${tool}_target_compile "-dumpspecs" "" "none" ""]
243         regsub ".*\n\*linker:\[ \t\]*\n(\[^ \t\n\]*).*" "$gcc_spec" {\1} linker
244         set gcc_ld [lindex [${tool}_target_compile "-print-prog-name=$linker" "" "none" ""] 0]
245         set ld_output [remote_exec host "$gcc_ld" "--help"]
246         if { [ string first "--gc-sections" $ld_output ] >= 0 } {
247             set gc_sections_available_saved 1
248         } else {
249             set gc_sections_available_saved 0
250         }
251     }
252     return $gc_sections_available_saved
253 }
254
255 # Return true if profiling is supported on the target.
256
257 proc check_profiling_available { test_what } {
258     global profiling_available_saved
259
260     verbose "Profiling argument is <$test_what>" 1
261
262     # These conditions depend on the argument so examine them before
263     # looking at the cache variable.
264
265     # Support for -p on solaris2 relies on mcrt1.o which comes with the
266     # vendor compiler.  We cannot reliably predict the directory where the
267     # vendor compiler (and thus mcrt1.o) is installed so we can't
268     # necessarily find mcrt1.o even if we have it.
269     if { [istarget *-*-solaris2*] && [lindex $test_what 1] == "-p" } {
270         return 0
271     }
272
273     # Support for -p on irix relies on libprof1.a which doesn't appear to
274     # exist on any irix6 system currently posting testsuite results.
275     # Support for -pg on irix relies on gcrt1.o which doesn't exist yet.
276     # See: http://gcc.gnu.org/ml/gcc/2002-10/msg00169.html
277     if { [istarget mips*-*-irix*]
278     && ([lindex $test_what 1] == "-p" || [lindex $test_what 1] == "-pg") } {
279         return 0
280     }
281
282     # Now examine the cache variable.
283     if {![info exists profiling_available_saved]} {
284         # Some targets don't have any implementation of __bb_init_func or are
285         # missing other needed machinery.
286         if { [istarget mmix-*-*]
287              || [istarget arm*-*-eabi*]
288              || [istarget arm*-*-elf]
289              || [istarget arm*-*-symbianelf*]
290              || [istarget powerpc-*-eabi*]
291              || [istarget strongarm*-*-elf]
292              || [istarget xscale*-*-elf]
293              || [istarget cris-*-*]
294              || [istarget h8300-*-*]
295              || [istarget mips*-*-elf]
296              || [istarget xtensa-*-elf]
297              || [istarget *-*-windiss] } {
298             set profiling_available_saved 0
299         } else {
300             set profiling_available_saved 1
301         }
302     }
303
304     return $profiling_available_saved
305 }
306
307 # Return 1 if target has packed layout of structure members by
308 # default, 0 otherwise.  Note that this is slightly different than
309 # whether the target has "natural alignment": both attributes may be
310 # false.
311
312 proc check_effective_target_default_packed { } {
313     global et_default_packed_saved
314     global et_default_packed_target_name
315
316     if { ![info exists et_default_packed_target_name] } {
317         set et_default_packed_target_name ""
318     }
319
320     # If the target has changed since we set the cached value, clear it.
321     set current_target [current_target_name]
322     if { $current_target != $et_default_packed_target_name } {
323         verbose "check_effective_target_default_packed: `$et_default_packed_target_name'" 2
324         set et_default_packed_target_name $current_target
325         if [info exists et_default_packed_saved] {
326             verbose "check_effective_target_default_packed: removing cached result" 2
327             unset et_default_packed_saved
328         }
329     }
330
331     if [info exists et_default_packed_saved] {
332         verbose "check_effective_target_default_packed: using cached result" 2
333     } else {
334         verbose "check_effective_target_default_packed: compiling source" 2
335
336         set et_default_packed_saved \
337             [string match "" [get_compiler_messages default_packed assembly {
338             struct x { char a; long b; } c;
339             int s[sizeof (c) == sizeof (char) + sizeof (long) ? 1 : -1];
340         } ]]
341
342     }
343     verbose "check_effective_target_default_packed: returning $et_default_packed_saved" 2
344     return $et_default_packed_saved
345 }
346
347 # Return 1 if target has PCC_BITFIELD_TYPE_MATTERS defined.  See
348 # documentation, where the test also comes from.
349
350 proc check_effective_target_pcc_bitfield_type_matters { } {
351     global et_pcc_bitfield_type_matters_saved
352     global et_pcc_bitfield_type_matters_target_name
353
354     if { ![info exists et_pcc_bitfield_type_matters_target_name] } {
355         set et_pcc_bitfield_type_matters_target_name ""
356     }
357
358     # If the target has changed since we set the cached value, clear it.
359     set current_target [current_target_name]
360     if { $current_target != $et_pcc_bitfield_type_matters_target_name } {
361         verbose "check_effective_target_pcc_bitfield_type_matters: `$et_pcc_bitfield_type_matters_target_name'" 2
362         set et_pcc_bitfield_type_matters_target_name $current_target
363         if [info exists et_pcc_bitfield_type_matters_saved] {
364             verbose "check_effective_target_pcc_bitfield_type_matters: removing cached result" 2
365             unset et_pcc_bitfield_type_matters_saved
366         }
367     }
368
369     if [info exists et_pcc_bitfield_type_matters_saved] {
370         verbose "check_effective_target_pcc_bitfield_type_matters: using cached result" 2
371     } else {
372         verbose "check_effective_target_pcc_bitfield_type_matters: compiling source" 2
373
374         # PCC_BITFIELD_TYPE_MATTERS isn't just about unnamed or empty
375         # bitfields, but let's stick to the example code from the docs.
376         set et_pcc_bitfield_type_matters_saved \
377             [string match "" [get_compiler_messages pcc_bitfield_type_matters assembly {
378             struct foo1 { char x; char :0; char y; };
379             struct foo2 { char x; int :0; char y; };
380             int s[sizeof (struct foo1) != sizeof (struct foo2) ? 1 : -1];
381         } ]]
382     }
383     verbose "check_effective_target_pcc_bitfield_type_matters: returning $et_pcc_bitfield_type_matters_saved" 2
384     return $et_pcc_bitfield_type_matters_saved
385 }
386
387 # Return 1 if -fpic and -fPIC are supported, as in no warnings or errors
388 # emitted, 0 otherwise.  Whether a shared library can actually be built is
389 # out of scope for this test.
390 #
391 # When the target name changes, replace the cached result.
392
393 proc check_effective_target_fpic { } {
394     global et_fpic_saved
395     global et_fpic_target_name
396
397     if { ![info exists et_fpic_target_name] } {
398         set et_fpic_target_name ""
399     }
400
401     # If the target has changed since we set the cached value, clear it.
402     set current_target [current_target_name]
403     if { $current_target != $et_fpic_target_name } {
404         verbose "check_effective_target_fpic: `$et_fpic_target_name'" 2
405         set et_fpic_target_name $current_target
406         if [info exists et_fpic_saved] {
407             verbose "check_effective_target_fpic: removing cached result" 2
408             unset et_fpic_saved
409         }
410     }
411
412     if [info exists et_fpic_saved] {
413         verbose "check_effective_target_fpic: using cached result" 2
414     } else {
415         verbose "check_effective_target_fpic: compiling source" 2
416
417         # Note that M68K has a multilib that supports -fpic but not
418         # -fPIC, so we need to check both.  We test with a program that
419         # requires GOT references.
420         set et_fpic_saved [string match "" [get_compiler_messages fpic object {
421             extern int foo (void); extern int bar;
422             int baz (void) { return foo () + bar; }
423         } "-fpic"]]
424
425         if { $et_fpic_saved != 0 } {
426             set et_fpic_saved [string match "" [get_compiler_messages fpic object {
427                 extern int foo (void); extern int bar;
428                 int baz (void) { return foo () + bar; }
429             } "-fPIC"]]
430         }
431     }
432     verbose "check_effective_target_fpic: returning $et_fpic_saved" 2
433     return $et_fpic_saved
434 }
435
436 # Return true if iconv is supported on the target. In particular IBM1047.
437
438 proc check_iconv_available { test_what } {
439     global tool
440     global libiconv
441
442     set result ""
443
444     set src iconv[pid].c
445     set exe iconv[pid].x
446     verbose "check_iconv_available compiling testfile $src" 2
447     set f [open $src "w"]
448     # Compile a small test program.
449     puts $f "#include <iconv.h>\n"
450     puts $f "int main (void)\n {\n iconv_t cd; \n"
451     puts $f "cd = iconv_open (\"[lindex $test_what 1]\", \"UTF-8\");\n"
452     puts $f "if (cd == (iconv_t) -1)\n return 1;\n"
453     puts $f "return 0;\n}"
454     close $f
455
456     # If the tool configuration file has not set libiconv, try "-liconv"
457     if { ![info exists libiconv] } {
458         set libiconv "-liconv"
459     }
460     set lines [${tool}_target_compile $src $exe executable "libs=$libiconv" ]
461     file delete $src
462
463     if [string match "" $lines] then {
464         # No error messages, everything is OK.
465
466         set result [${tool}_load "./$exe" "" ""]
467         set status [lindex $result 0]
468         remote_file build delete $exe
469
470         verbose "check_iconv_available status is <$status>" 2
471
472         if { $status == "pass" } then {
473             return 1
474         }
475     }
476
477     return 0
478 }
479
480 # Return true if named sections are supported on this target.
481 # This proc does not cache results, because the answer may vary
482 # when cycling over subtarget options (e.g. irix o32/n32/n64) in
483 # the same test run.
484 proc check_named_sections_available { } {
485     verbose "check_named_sections_available: compiling source" 2
486     set answer [string match "" [get_compiler_messages named object {
487         int __attribute__ ((section("whatever"))) foo;
488     }]]
489     verbose "check_named_sections_available: returning $answer" 2
490     return $answer
491 }
492
493 # Return 1 if the target supports Fortran real kinds larger than real(8),
494 # 0 otherwise.
495 #
496 # When the target name changes, replace the cached result.
497
498 proc check_effective_target_fortran_large_real { } {
499     global et_fortran_large_real_saved
500     global et_fortran_large_real_target_name
501     global tool
502
503     if { ![info exists et_fortran_large_real_target_name] } {
504         set et_fortran_large_real_target_name ""
505     }
506
507     # If the target has changed since we set the cached value, clear it.
508     set current_target [current_target_name]
509     if { $current_target != $et_fortran_large_real_target_name } {
510         verbose "check_effective_target_fortran_large_real: `$et_fortran_large_real_target_name' `$current_target'" 2
511         set et_fortran_large_real_target_name $current_target
512         if [info exists et_fortran_large_real_saved] {
513             verbose "check_effective_target_fortran_large_real: removing cached result" 2
514             unset et_fortran_large_real_saved
515         }
516     }
517
518     if [info exists et_fortran_large_real_saved] {
519         verbose "check_effective_target_fortran_large_real returning saved $et_fortran_large_real_saved" 2
520     } else {
521         set et_fortran_large_real_saved 0
522
523         # Set up, compile, and execute a test program using large real
524         # kinds.  Include the current process ID in the file names to
525         # prevent conflicts with invocations for multiple testsuites.
526         set src real[pid].f90
527         set exe real[pid].x
528
529         set f [open $src "w"]
530         puts $f "integer,parameter :: k = &"
531         puts $f "  selected_real_kind (precision (0.0_8) + 1)"
532         puts $f "real(kind=k) :: x"
533         puts $f "end"
534         close $f
535
536         verbose "check_effective_target_fortran_large_real compiling testfile $src" 2
537         set lines [${tool}_target_compile $src $exe executable ""]
538         file delete $src
539
540         if [string match "" $lines] then {
541             # No error message, compilation succeeded.
542             set et_fortran_large_real_saved 1
543         }
544     }
545
546     return $et_fortran_large_real_saved
547 }
548
549 # Return 1 if the target supports Fortran integer kinds larger than
550 # integer(8), 0 otherwise.
551 #
552 # When the target name changes, replace the cached result.
553
554 proc check_effective_target_fortran_large_int { } {
555     global et_fortran_large_int_saved
556     global et_fortran_large_int_target_name
557     global tool
558
559     if { ![info exists et_fortran_large_int_target_name] } {
560         set et_fortran_large_int_target_name ""
561     }
562
563     # If the target has changed since we set the cached value, clear it.
564     set current_target [current_target_name]
565     if { $current_target != $et_fortran_large_int_target_name } {
566         verbose "check_effective_target_fortran_large_int: `$et_fortran_large_int_target_name' `$current_target'" 2
567         set et_fortran_large_int_target_name $current_target
568         if [info exists et_fortran_large_int_saved] {
569             verbose "check_effective_target_fortran_large_int: removing cached result" 2
570             unset et_fortran_large_int_saved
571         }
572     }
573
574     if [info exists et_fortran_large_int_saved] {
575         verbose "check_effective_target_fortran_large_int returning saved $et_fortran_large_int_saved" 2
576     } else {
577         set et_fortran_large_int_saved 0
578
579         # Set up, compile, and execute a test program using large integer
580         # kinds.  Include the current process ID in the file names to
581         # prevent conflicts with invocations for multiple testsuites.
582         set src int[pid].f90
583         set exe int[pid].x
584
585         set f [open $src "w"]
586         puts $f "integer,parameter :: k = &"
587         puts $f "  selected_int_kind (range (0_8) + 1)"
588         puts $f "integer(kind=k) :: i"
589         puts $f "end"
590         close $f
591
592         verbose "check_effective_target_fortran_large_int compiling testfile $src" 2
593         set lines [${tool}_target_compile $src $exe executable ""]
594         file delete $src
595
596         if [string match "" $lines] then {
597             # No error message, compilation succeeded.
598             set et_fortran_large_int_saved 1
599         }
600     }
601
602     return $et_fortran_large_int_saved
603 }
604
605 # Return 1 if the target supports executing AltiVec instructions, 0
606 # otherwise.  Cache the result.
607
608 proc check_vmx_hw_available { } {
609     global vmx_hw_available_saved
610     global tool
611
612     if [info exists vmx_hw_available_saved] {
613         verbose "check_hw_available  returning saved $vmx_hw_available_saved" 2
614     } else {
615         set vmx_hw_available_saved 0
616
617         # Some simulators are known to not support VMX instructions.
618         if { [istarget powerpc-*-eabi] || [istarget powerpc*-*-eabispe] } {
619             verbose "check_hw_available  returning 0" 2
620             return $vmx_hw_available_saved
621         }
622
623         # Set up, compile, and execute a test program containing VMX
624         # instructions.  Include the current process ID in the file
625         # names to prevent conflicts with invocations for multiple
626         # testsuites.
627         set src vmx[pid].c
628         set exe vmx[pid].x
629
630         set f [open $src "w"]
631         puts $f "int main() {"
632         puts $f "#ifdef __MACH__"
633         puts $f "  asm volatile (\"vor v0,v0,v0\");"
634         puts $f "#else"
635         puts $f "  asm volatile (\"vor 0,0,0\");"
636         puts $f "#endif"
637         puts $f "  return 0; }"
638         close $f
639
640         # Most targets don't require special flags for this test case, but
641         # Darwin does.
642         if [istarget *-*-darwin*] {
643           set opts "additional_flags=-maltivec"
644         } else {
645           set opts ""
646         }
647
648         verbose "check_vmx_hw_available  compiling testfile $src" 2
649         set lines [${tool}_target_compile $src $exe executable "$opts"]
650         file delete $src
651
652         if [string match "" $lines] then {
653             # No error message, compilation succeeded.
654             set result [${tool}_load "./$exe" "" ""]
655             set status [lindex $result 0]
656             remote_file build delete $exe
657             verbose "check_vmx_hw_available testfile status is <$status>" 2
658
659             if { $status == "pass" } then {
660                 set vmx_hw_available_saved 1
661             }
662         } else {
663             verbose "check_vmx_hw_availalble testfile compilation failed" 2
664         }
665     }
666
667     return $vmx_hw_available_saved
668 }
669
670 # GCC 3.4.0 for powerpc64-*-linux* included an ABI fix for passing
671 # complex float arguments.  This affects gfortran tests that call cabsf
672 # in libm built by an earlier compiler.  Return 1 if libm uses the same
673 # argument passing as the compiler under test, 0 otherwise.
674 #
675 # When the target name changes, replace the cached result.
676
677 proc check_effective_target_broken_cplxf_arg { } {
678     global et_broken_cplxf_arg_saved
679     global et_broken_cplxf_arg_target_name
680     global tool
681
682     # Skip the work for targets known not to be affected.
683     if { ![istarget powerpc64-*-linux*] } {
684         return 0
685     } elseif { [is-effective-target ilp32] } {
686         return 0
687     }
688
689     if { ![info exists et_broken_cplxf_arg_target_name] } {
690         set et_broken_cplxf_arg_target_name ""
691     }
692
693     # If the target has changed since we set the cached value, clear it.
694     set current_target [current_target_name]
695     if { $current_target != $et_broken_cplxf_arg_target_name } {
696         verbose "check_effective_target_broken_cplxf_arg: `$et_broken_cplxf_arg_target_name'" 2
697         set et_broken_cplxf_arg_target_name $current_target
698         if [info exists et_broken_cplxf_arg_saved] {
699             verbose "check_effective_target_broken_cplxf_arg: removing cached result" 2
700             unset et_broken_cplxf_arg_saved
701         }
702     }
703
704     if [info exists et_broken_cplxf_arg_saved] {
705         verbose "check_effective_target_broken_cplxf_arg: using cached result" 2
706     } else {
707         set et_broken_cplxf_arg_saved 0
708         # This is only known to affect one target.
709         if { ![istarget powerpc64-*-linux*] || ![is-effective-target lp64] } {
710             set et_broken_cplxf_arg_saved 0
711             verbose "check_effective_target_broken_cplxf_arg: caching 0" 2
712             return $et_broken_cplxf_arg_saved
713         }
714
715         # Set up, compile, and execute a C test program that calls cabsf.
716         set src cabsf[pid].c
717         set exe cabsf[pid].x
718
719         set f [open $src "w"]
720         puts $f "#include <complex.h>"
721         puts $f "extern void abort (void);"
722         puts $f "float fabsf (float);"
723         puts $f "float cabsf (_Complex float);"
724         puts $f "int main ()"
725         puts $f "{"
726         puts $f "  _Complex float cf;"
727         puts $f "  float f;"
728         puts $f "  cf = 3 + 4.0fi;"
729         puts $f "  f = cabsf (cf);"
730         puts $f "  if (fabsf (f - 5.0) > 0.0001) abort ();"
731         puts $f "  return 0;"
732         puts $f "}"
733         close $f
734
735         set lines [${tool}_target_compile $src $exe executable "-lm"]
736         file delete $src
737
738         if [string match "" $lines] {
739             # No error message, compilation succeeded.
740             set result [${tool}_load "./$exe" "" ""]
741             set status [lindex $result 0]
742             remote_file build delete $exe
743
744             verbose "check_effective_target_broken_cplxf_arg: status is <$status>" 2
745
746             if { $status != "pass" } {
747                 set et_broken_cplxf_arg_saved 1
748             }
749         } else {
750             verbose "check_effective_target_broken_cplxf_arg: compilation failed" 2
751         }
752     }
753     return $et_broken_cplxf_arg_saved
754 }
755
756 proc check_alpha_max_hw_available { } {
757     global alpha_max_hw_available_saved
758     global tool
759
760     if [info exists alpha_max_hw_available_saved] {
761         verbose "check_alpha_max_hw_available returning saved $alpha_max_hw_available_saved" 2
762     } else {
763         set alpha_max_hw_available_saved 0
764
765         # Set up, compile, and execute a test program probing bit 8 of the
766         # architecture mask, which indicates presence of MAX instructions.
767         set src max[pid].c
768         set exe max[pid].x
769
770         set f [open $src "w"]
771         puts $f "int main() { return __builtin_alpha_amask(1<<8) != 0; }"
772         close $f
773
774         verbose "check_alpha_max_hw_available compiling testfile $src" 2
775         set lines [${tool}_target_compile $src $exe executable ""]
776         file delete $src
777
778         if [string match "" $lines] then {
779             # No error message, compilation succeeded.
780             set result [${tool}_load "./$exe" "" ""]
781             set status [lindex $result 0]
782             remote_file build delete $exe
783             verbose "check_alpha_max_hw_available testfile status is <$status>" 2
784
785             if { $status == "pass" } then {
786                 set alpha_max_hw_available_saved 1
787             }
788         } else {
789             verbose "check_alpha_max_hw_availalble testfile compilation failed" 2
790         }
791     }
792
793     return $alpha_max_hw_available_saved
794 }
795
796 # Returns true iff the FUNCTION is available on the target system.
797 # (This is essentially a Tcl implementation of Autoconf's
798 # AC_CHECK_FUNC.)
799
800 proc check_function_available { function } {
801     set var "${function}_available_saved"
802     global $var
803     global tool
804
805     if {![info exists $var]} {
806         # Assume it exists.
807         set $var 1
808         # Check to make sure.
809         set src "function[pid].c"
810         set exe "function[pid].exe"
811
812         set f [open $src "w"]
813         puts $f "int main () { $function (); }"
814         close $f
815
816         set lines [${tool}_target_compile $src $exe executable ""]
817         file delete $src
818         file delete $exe
819
820         if {![string match "" $lines]} then {
821             set $var 0
822             verbose -log "$function is not available"
823         } else {
824             verbose -log "$function is available"
825         }
826     }
827
828     eval return \$$var
829 }
830
831 # Returns true iff "fork" is available on the target system.
832
833 proc check_fork_available {} {
834     return [check_function_available "fork"]
835 }
836
837 # Returns true iff "mkfifo" is available on the target system.
838
839 proc check_mkfifo_available {} {
840     if {[istarget *-*-cygwin*]} {
841        # Cygwin has mkfifo, but support is incomplete.
842        return 0
843      }
844
845     return [check_function_available "mkfifo"]
846 }
847
848 # Return 1 if we're generating 32-bit code using default options, 0
849 # otherwise.
850 #
851 # When the target name changes, replace the cached result.
852
853 proc check_effective_target_ilp32 { } {
854     global et_ilp32_saved
855     global et_ilp32_target_name
856
857     if { ![info exists et_ilp32_target_name] } {
858         set et_ilp32_target_name ""
859     }
860
861     # If the target has changed since we set the cached value, clear it.
862     set current_target [current_target_name]
863     if { $current_target != $et_ilp32_target_name } {
864         verbose "check_effective_target_ilp32: `$et_ilp32_target_name' `$current_target'" 2
865         set et_ilp32_target_name $current_target
866         if { [info exists et_ilp32_saved] } {
867             verbose "check_effective_target_ilp32: removing cached result" 2
868             unset et_ilp32_saved
869         }
870     }
871
872     if [info exists et_ilp32_saved] {
873         verbose "check-effective_target_ilp32: using cached result" 2
874     } else {
875         verbose "check_effective_target_ilp32: compiling source" 2
876         set et_ilp32_saved [string match "" [get_compiler_messages ilp32 object {
877             int dummy[(sizeof (int) == 4 && sizeof (void *) == 4 && sizeof (long) == 4 ) ? 1 : -1];
878         }]]
879     }
880     verbose "check_effective_target_ilp32: returning $et_ilp32_saved" 2
881     return $et_ilp32_saved
882 }
883
884 # Return 1 if we're generating 64-bit code using default options, 0
885 # otherwise.
886 #
887 # When the target name changes, replace the cached result.
888
889 proc check_effective_target_lp64 { } {
890     global et_lp64_saved
891     global et_lp64_target_name
892
893     if { ![info exists et_lp64_target_name] } {
894         set et_lp64_target_name ""
895     }
896
897     # If the target has changed since we set the cached value, clear it.
898     set current_target [current_target_name]
899     if { $current_target != $et_lp64_target_name } {
900         verbose "check_effective_target_lp64: `$et_lp64_target_name' `$current_target'" 2
901         set et_lp64_target_name $current_target
902         if [info exists et_lp64_saved] {
903             verbose "check_effective_target_lp64: removing cached result" 2
904             unset et_lp64_saved
905         }
906     }
907
908     if [info exists et_lp64_saved] {
909         verbose "check_effective_target_lp64: using cached result" 2
910     } else {
911         verbose "check_effective_target_lp64: compiling source" 2
912         set et_lp64_saved [string match "" [get_compiler_messages lp64 object {
913             int dummy[(sizeof (int) == 4 && sizeof (void *) == 8 && sizeof (long) == 8 ) ? 1 : -1];
914         }]]
915     }
916     verbose "check_effective_target_lp64: returning $et_lp64_saved" 2
917     return $et_lp64_saved
918 }
919
920 # Return 1 if the target needs a command line argument to enable a SIMD
921 # instruction set.
922 #
923 # This won't change for different subtargets so cache the result.
924
925 proc check_effective_target_vect_cmdline_needed { } {
926     global et_vect_cmdline_needed_saved
927
928     if [info exists et_vect_cmdline_needed_saved] {
929         verbose "check_effective_target_vect_cmdline_needed: using cached result" 2
930     } else {
931         set et_vect_cmdline_needed_saved 1
932         if { [istarget ia64-*-*]
933               || [istarget x86_64-*-*] } {
934            set et_vect_cmdline_needed_saved 0
935         }
936     }
937
938     verbose "check_effective_target_vect_cmdline_needed: returning $et_vect_cmdline_needed_saved" 2
939     return $et_vect_cmdline_needed_saved
940 }
941
942 # Return 1 if the target supports hardware vectors of int, 0 otherwise.
943 #
944 # This won't change for different subtargets so cache the result.
945
946 proc check_effective_target_vect_int { } {
947     global et_vect_int_saved
948
949     if [info exists et_vect_int_saved] {
950         verbose "check_effective_target_vect_int: using cached result" 2
951     } else {
952         set et_vect_int_saved 0
953         if { [istarget i?86-*-*]
954               || [istarget powerpc*-*-*]
955               || [istarget x86_64-*-*]
956               || [istarget sparc*-*-*]
957               || [istarget alpha*-*-*]
958               || [istarget ia64-*-*] } {
959            set et_vect_int_saved 1
960         }
961     }
962
963     verbose "check_effective_target_vect_int: returning $et_vect_int_saved" 2
964     return $et_vect_int_saved
965 }
966
967 # Return 1 is this is an arm target using 32-bit instructions
968 proc check_effective_target_arm32 { } {
969     global et_arm32_saved
970     global et_arm32_target_name
971     global compiler_flags
972
973     if { ![info exists et_arm32_target_name] } {
974         set et_arm32_target_name ""
975     }
976
977     # If the target has changed since we set the cached value, clear it.
978     set current_target [current_target_name]
979     if { $current_target != $et_arm32_target_name } {
980         verbose "check_effective_target_arm32: `$et_arm32_target_name' `$current_target'" 2
981         set et_arm32_target_name $current_target
982         if { [info exists et_arm32_saved] } {
983             verbose "check_effective_target_arm32: removing cached result" 2
984             unset et_arm32_saved
985         }
986     }
987
988     if [info exists et_arm32_saved] {
989         verbose "check-effective_target_arm32: using cached result" 2
990     } else {
991         set et_arm32_saved 0
992         if { [istarget arm-*-*]
993               || [istarget strongarm*-*-*]
994               || [istarget xscale-*-*] } {
995             if ![string match "*-mthumb *" $compiler_flags] {
996                 set et_arm32_saved 1
997             }
998         }
999     }
1000     verbose "check_effective_target_arm32: returning $et_arm32_saved" 2
1001     return $et_arm32_saved
1002 }
1003
1004 # Return 1 if the target supports hardware vector shift operation.
1005
1006 proc check_effective_target_vect_shift { } {
1007     global et_vect_shift_saved
1008
1009     if [info exists et_vect_shift_saved] {
1010         verbose "check_effective_target_vect_shift: using cached result" 2
1011     } else {
1012         set et_vect_shift_saved 0
1013         if { [istarget powerpc*-*-*]
1014              || [istarget ia64-*-*]
1015              || [istarget i?86-*-*]
1016              || [istarget x86_64-*-*] } {
1017            set et_vect_shift_saved 1
1018         }
1019     }
1020
1021     verbose "check_effective_target_vect_shift: returning $et_vect_shift_saved" 2
1022     return $et_vect_shift_saved
1023 }
1024
1025 # Return 1 if the target supports hardware vectors of long, 0 otherwise.
1026 #
1027 # This can change for different subtargets so do not cache the result.
1028
1029 proc check_effective_target_vect_long { } {
1030     if { [istarget i?86-*-*]
1031          || ([istarget powerpc*-*-*] && [check_effective_target_ilp32])
1032          || [istarget x86_64-*-*]
1033          || ([istarget sparc*-*-*] && [check_effective_target_ilp32]) } {
1034         set answer 1
1035     } else {
1036         set answer 0
1037     }
1038
1039     verbose "check_effective_target_vect_long: returning $answer" 2
1040     return $answer
1041 }
1042
1043 # Return 1 if the target supports hardware vectors of float, 0 otherwise.
1044 #
1045 # This won't change for different subtargets so cache the result.
1046
1047 proc check_effective_target_vect_float { } {
1048     global et_vect_float_saved
1049
1050     if [info exists et_vect_float_saved] {
1051         verbose "check_effective_target_vect_float: using cached result" 2
1052     } else {
1053         set et_vect_float_saved 0
1054         if { [istarget i?86-*-*]
1055               || [istarget powerpc*-*-*]
1056               || [istarget mipsisa64*-*-*]
1057               || [istarget x86_64-*-*]
1058               || [istarget ia64-*-*] } {
1059            set et_vect_float_saved 1
1060         }
1061     }
1062
1063     verbose "check_effective_target_vect_float: returning $et_vect_float_saved" 2
1064     return $et_vect_float_saved
1065 }
1066
1067 # Return 1 if the target supports hardware vectors of double, 0 otherwise.
1068 #
1069 # This won't change for different subtargets so cache the result.
1070
1071 proc check_effective_target_vect_double { } {
1072     global et_vect_double_saved
1073
1074     if [info exists et_vect_double_saved] {
1075         verbose "check_effective_target_vect_double: using cached result" 2
1076     } else {
1077         set et_vect_double_saved 0
1078         if { [istarget i?86-*-*]
1079               || [istarget x86_64-*-*] } {
1080            set et_vect_double_saved 1
1081         }
1082     }
1083
1084     verbose "check_effective_target_vect_double: returning $et_vect_double_saved" 2
1085     return $et_vect_double_saved
1086 }
1087
1088 # Return 1 if the target plus current options does not support a vector
1089 # max instruction on "int", 0 otherwise.
1090 #
1091 # This won't change for different subtargets so cache the result.
1092
1093 proc check_effective_target_vect_no_int_max { } {
1094     global et_vect_no_int_max_saved
1095
1096     if [info exists et_vect_no_int_max_saved] {
1097         verbose "check_effective_target_vect_no_int_max: using cached result" 2
1098     } else {
1099         set et_vect_no_int_max_saved 0
1100         if { [istarget sparc*-*-*]
1101              || [istarget alpha*-*-*] } {
1102             set et_vect_no_int_max_saved 1
1103         }
1104     }
1105     verbose "check_effective_target_vect_no_int_max: returning $et_vect_no_int_max_saved" 2
1106     return $et_vect_no_int_max_saved
1107 }
1108
1109 # Return 1 if the target plus current options does not support a vector
1110 # add instruction on "int", 0 otherwise.
1111 #
1112 # This won't change for different subtargets so cache the result.
1113
1114 proc check_effective_target_vect_no_int_add { } {
1115     global et_vect_no_int_add_saved
1116
1117     if [info exists et_vect_no_int_add_saved] {
1118         verbose "check_effective_target_vect_no_int_add: using cached result" 2
1119     } else {
1120         set et_vect_no_int_add_saved 0
1121         # Alpha only supports vector add on V8QI and V4HI.
1122         if { [istarget alpha*-*-*] } {
1123             set et_vect_no_int_add_saved 1
1124         }
1125     }
1126     verbose "check_effective_target_vect_no_int_add: returning $et_vect_no_int_add_saved" 2
1127     return $et_vect_no_int_add_saved
1128 }
1129
1130 # Return 1 if the target plus current options does not support vector
1131 # bitwise instructions, 0 otherwise.
1132 #
1133 # This won't change for different subtargets so cache the result.
1134
1135 proc check_effective_target_vect_no_bitwise { } {
1136     global et_vect_no_bitwise_saved
1137
1138     if [info exists et_vect_no_bitwise_saved] {
1139         verbose "check_effective_target_vect_no_bitwise: using cached result" 2
1140     } else {
1141         set et_vect_no_bitwise_saved 0
1142     }
1143     verbose "check_effective_target_vect_no_bitwise: returning $et_vect_no_bitwise_saved" 2
1144     return $et_vect_no_bitwise_saved
1145 }
1146
1147 # Return 1 if the target plus current options does not support a vector
1148 # alignment mechanism, 0 otherwise.
1149 #
1150 # This won't change for different subtargets so cache the result.
1151
1152 proc check_effective_target_vect_no_align { } {
1153     global et_vect_no_align_saved
1154
1155     if [info exists et_vect_no_align_saved] {
1156         verbose "check_effective_target_vect_no_align: using cached result" 2
1157     } else {
1158         set et_vect_no_align_saved 0
1159         if { [istarget mipsisa64*-*-*]
1160              || [istarget sparc*-*-*]
1161              || [istarget ia64-*-*] } {
1162             set et_vect_no_align_saved 1
1163         }
1164     }
1165     verbose "check_effective_target_vect_no_align: returning $et_vect_no_align_saved" 2
1166     return $et_vect_no_align_saved
1167 }
1168
1169 # Return 1 if the target supports vector conditional operations, 0 otherwise.
1170
1171 proc check_effective_target_vect_condition { } {
1172     global et_vect_cond_saved
1173
1174     if [info exists et_vect_cond_saved] {
1175         verbose "check_effective_target_vect_cond: using cached result" 2
1176     } else {
1177         set et_vect_cond_saved 0
1178         if { [istarget powerpc*-*-*]
1179              || [istarget ia64-*-*]
1180              || [istarget i?86-*-*]
1181              || [istarget x86_64-*-*] } {
1182            set et_vect_cond_saved 1
1183         }
1184     }
1185
1186     verbose "check_effective_target_vect_cond: returning $et_vect_cond_saved" 2
1187     return $et_vect_cond_saved
1188 }
1189
1190 # Return 1 if the target supports vector int multiplication, 0 otherwise.
1191
1192 proc check_effective_target_vect_int_mult { } {
1193     global et_vect_int_mult_saved
1194
1195     if [info exists et_vect_int_mult_saved] {
1196         verbose "check_effective_target_vect_int_mult: using cached result" 2
1197     } else {
1198         set et_vect_int_mult_saved 0
1199         if { [istarget powerpc*-*-*]
1200              || [istarget i?86-*-*]
1201              || [istarget x86_64-*-*] } {
1202            set et_vect_int_mult_saved 1
1203         }
1204     }
1205
1206     verbose "check_effective_target_vect_int_mult: returning $et_vect_int_mult_saved" 2
1207     return $et_vect_int_mult_saved
1208 }
1209
1210 # Return 1 if the target supports atomic operations on "int" and "long".
1211
1212 proc check_effective_target_sync_int_long { } {
1213     global et_sync_int_long_saved
1214
1215     if [info exists et_sync_int_long_saved] {
1216         verbose "check_effective_target_sync_int_long: using cached result" 2
1217     } else {
1218         set et_sync_int_long_saved 0
1219 # This is intentionally powerpc but not rs6000, rs6000 doesn't have the
1220 # load-reserved/store-conditional instructions.
1221         if { [istarget ia64-*-*]
1222              || [istarget i?86-*-*]
1223              || [istarget x86_64-*-*]
1224              || [istarget alpha*-*-*] 
1225              || [istarget s390*-*-*] 
1226              || [istarget powerpc*-*-*] } {
1227            set et_sync_int_long_saved 1
1228         }
1229     }
1230
1231     verbose "check_effective_target_sync_int_long: returning $et_sync_int_long_saved" 2
1232     return $et_sync_int_long_saved
1233 }
1234
1235 # Return 1 if the target supports atomic operations on "char" and "short".
1236
1237 proc check_effective_target_sync_char_short { } {
1238     global et_sync_char_short_saved
1239
1240     if [info exists et_sync_char_short_saved] {
1241         verbose "check_effective_target_sync_char_short: using cached result" 2
1242     } else {
1243         set et_sync_char_short_saved 0
1244 # This is intentionally powerpc but not rs6000, rs6000 doesn't have the
1245 # load-reserved/store-conditional instructions.
1246         if { [istarget ia64-*-*]
1247              || [istarget i?86-*-*]
1248              || [istarget x86_64-*-*]
1249              || [istarget alpha*-*-*] 
1250              || [istarget powerpc*-*-*] } {
1251            set et_sync_char_short_saved 1
1252         }
1253     }
1254
1255     verbose "check_effective_target_sync_char_short: returning $et_sync_char_short_saved" 2
1256     return $et_sync_char_short_saved
1257 }
1258
1259 # Return 1 if the target matches the effective target 'arg', 0 otherwise.
1260 # This can be used with any check_* proc that takes no argument and
1261 # returns only 1 or 0.  It could be used with check_* procs that take
1262 # arguments with keywords that pass particular arguments.
1263
1264 proc is-effective-target { arg } {
1265     set selected 0
1266     if { [info procs check_effective_target_${arg}] != [list] } {
1267         set selected [check_effective_target_${arg}]
1268     } else {
1269         switch $arg {
1270           "vmx_hw"         { set selected [check_vmx_hw_available] }
1271           "named_sections" { set selected [check_named_sections_available] }
1272           "gc_sections"    { set selected [check_gc_sections_available] }
1273           default          { error "unknown effective target keyword `$arg'" }
1274         }
1275     }
1276     verbose "is-effective-target: $arg $selected" 2
1277     return $selected
1278 }
1279
1280 # Return 1 if the argument is an effective-target keyword, 0 otherwise.
1281
1282 proc is-effective-target-keyword { arg } {
1283     if { [info procs check_effective_target_${arg}] != [list] } {
1284         return 1
1285     } else {
1286         # These have different names for their check_* procs.
1287         switch $arg {
1288           "vmx_hw"         { return 1 }
1289           "named_sections" { return 1 }
1290           "gc_sections"    { return 1 }
1291           default          { return 0 }
1292         }
1293     }
1294 }