| Index: gcc/gcc/testsuite/lib/target-supports.exp
|
| diff --git a/gcc/gcc/testsuite/lib/target-supports.exp b/gcc/gcc/testsuite/lib/target-supports.exp
|
| index fdef5af2ade6c37daf244d653198f9c9df2a676d..5fbad4df1e42ebdcd045b53e2d76a6bc7288d2ff 100644
|
| --- a/gcc/gcc/testsuite/lib/target-supports.exp
|
| +++ b/gcc/gcc/testsuite/lib/target-supports.exp
|
| @@ -1,4 +1,4 @@
|
| -# Copyright (C) 1999, 2001, 2003, 2004, 2005, 2006, 2007, 2008, 2009
|
| +# Copyright (C) 1999, 2001, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
|
| # Free Software Foundation, Inc.
|
|
|
| # This program is free software; you can redistribute it and/or modify
|
| @@ -29,10 +29,17 @@
|
| # If ARGS is not empty, its first element is a string that
|
| # should be added to the command line.
|
| #
|
| -# Assume by default that CONTENTS is C code. C++ code should contain
|
| -# "// C++" and Fortran code should contain "! Fortran".
|
| +# Assume by default that CONTENTS is C code.
|
| +# Otherwise, code should contain:
|
| +# "// C++" for c++,
|
| +# "! Fortran" for Fortran code,
|
| +# "/* ObjC", for ObjC
|
| +# and "// ObjC++" for ObjC++
|
| +# If the tool is ObjC/ObjC++ then we overide the extension to .m/.mm to
|
| +# allow for ObjC/ObjC++ specific flags.
|
| proc check_compile {basename type contents args} {
|
| global tool
|
| + verbose "check_compile tool: $tool for $basename"
|
|
|
| if { [llength $args] > 0 } {
|
| set options [list "additional_flags=[lindex $args 0]"]
|
| @@ -42,8 +49,17 @@ proc check_compile {basename type contents args} {
|
| switch -glob -- $contents {
|
| "*! Fortran*" { set src ${basename}[pid].f90 }
|
| "*// C++*" { set src ${basename}[pid].cc }
|
| - default { set src ${basename}[pid].c }
|
| + "*// ObjC++*" { set src ${basename}[pid].mm }
|
| + "*/* ObjC*" { set src ${basename}[pid].m }
|
| + default {
|
| + switch -- $tool {
|
| + "objc" { set src ${basename}[pid].m }
|
| + "obj-c++" { set src ${basename}[pid].mm }
|
| + default { set src ${basename}[pid].c }
|
| + }
|
| + }
|
| }
|
| +
|
| set compile_type $type
|
| switch -glob $type {
|
| assembly { set output ${basename}[pid].s }
|
| @@ -385,7 +401,7 @@ proc check_gc_sections_available { } {
|
|
|
| # Check if the ld used by gcc supports --gc-sections.
|
| set gcc_spec [${tool}_target_compile "-dumpspecs" "" "none" ""]
|
| - regsub ".*\n\*linker:\[ \t\]*\n(\[^ \t\n\]*).*" "$gcc_spec" {\1} linker
|
| + regsub ".*\n\\*linker:\[ \t\]*\n(\[^ \t\n\]*).*" "$gcc_spec" {\1} linker
|
| set gcc_ld [lindex [${tool}_target_compile "-print-prog-name=$linker" "" "none" ""] 0]
|
| set ld_output [remote_exec host "$gcc_ld" "--help"]
|
| if { [ string first "--gc-sections" $ld_output ] >= 0 } {
|
| @@ -491,14 +507,19 @@ proc check_profiling_available { test_what } {
|
| || [istarget avr-*-*]
|
| || [istarget bfin-*-*]
|
| || [istarget powerpc-*-eabi*]
|
| + || [istarget powerpc-*-elf]
|
| || [istarget cris-*-*]
|
| || [istarget crisv32-*-*]
|
| || [istarget fido-*-elf]
|
| || [istarget h8300-*-*]
|
| - || [istarget m32c-*-elf]
|
| + || [istarget lm32-*-*]
|
| + || [istarget m32c-*-elf]
|
| || [istarget m68k-*-elf]
|
| || [istarget m68k-*-uclinux*]
|
| + || [istarget mep-*-elf]
|
| || [istarget mips*-*-elf*]
|
| + || [istarget moxie-*-elf*]
|
| + || [istarget rx-*-*]
|
| || [istarget xstormy16-*]
|
| || [istarget xtensa*-*-elf]
|
| || [istarget *-*-rtems*]
|
| @@ -611,6 +632,18 @@ proc check_effective_target_pthread {} {
|
| } "-pthread"]
|
| }
|
|
|
| +# Return 1 if compilation with -mpe-aligned-commons is error-free
|
| +# for trivial code, 0 otherwise.
|
| +
|
| +proc check_effective_target_pe_aligned_commons {} {
|
| + if { [istarget *-*-cygwin*] || [istarget *-*-mingw*] } {
|
| + return [check_no_compiler_messages pe_aligned_commons object {
|
| + int foo;
|
| + } "-mpe-aligned-commons"]
|
| + }
|
| + return 0
|
| +}
|
| +
|
| # Return 1 if the target supports -static
|
| proc check_effective_target_static {} {
|
| return [check_no_compiler_messages static executable {
|
| @@ -672,6 +705,18 @@ proc check_effective_target_hard_float { } {
|
| }]
|
| }
|
|
|
| + # This proc is actually checking the availabilty of FPU
|
| + # support for doubles, so on the RX we must fail if the
|
| + # 64-bit double multilib has been selected.
|
| + if { [istarget rx-*-*] } {
|
| + return 0
|
| + # return [check_no_compiler_messages hard_float assembly {
|
| + #if defined __RX_64_BIT_DOUBLES__
|
| + #error FOO
|
| + #endif
|
| + # }]
|
| + }
|
| +
|
| # The generic test equates hard_float with "no call for adding doubles".
|
| return [check_no_messages_and_pattern hard_float "!\\(call" rtl-expand {
|
| double a (double b, double c) { return b + c; }
|
| @@ -727,6 +772,15 @@ proc check_effective_target_mips16_attribute { } {
|
| } [add_options_for_mips16_attribute ""]]
|
| }
|
|
|
| +# Return 1 if the target supports long double larger than double when
|
| +# using the new ABI, 0 otherwise.
|
| +
|
| +proc check_effective_target_mips_newabi_large_long_double { } {
|
| + return [check_no_compiler_messages mips_newabi_large_long_double object {
|
| + int dummy[sizeof(long double) > sizeof(double) ? 1 : -1];
|
| + } "-mabi=64"]
|
| +}
|
| +
|
| # Return 1 if the current multilib does not generate PIC by default.
|
|
|
| proc check_effective_target_nonpic { } {
|
| @@ -856,6 +910,53 @@ proc check_750cl_hw_available { } {
|
| }]
|
| }
|
|
|
| +# Return 1 if the target OS supports running SSE executables, 0
|
| +# otherwise. Cache the result.
|
| +
|
| +proc check_sse_os_support_available { } {
|
| + return [check_cached_effective_target sse_os_support_available {
|
| + # If this is not the right target then we can skip the test.
|
| + if { !([istarget x86_64-*-*] || [istarget i?86-*-*]) } {
|
| + expr 0
|
| + } elseif { [istarget i?86-*-solaris2*] } {
|
| + # The Solaris 2 kernel doesn't save and restore SSE registers
|
| + # before Solaris 9 4/04. Before that, executables die with SIGILL.
|
| + check_runtime_nocache sse_os_support_available {
|
| + int main ()
|
| + {
|
| + __asm__ volatile ("movss %xmm2,%xmm1");
|
| + return 0;
|
| + }
|
| + } "-msse"
|
| + } else {
|
| + expr 1
|
| + }
|
| + }]
|
| +}
|
| +
|
| +# Return 1 if the target supports executing SSE instructions, 0
|
| +# otherwise. Cache the result.
|
| +
|
| +proc check_sse_hw_available { } {
|
| + return [check_cached_effective_target sse_hw_available {
|
| + # If this is not the right target then we can skip the test.
|
| + if { !([istarget x86_64-*-*] || [istarget i?86-*-*]) } {
|
| + expr 0
|
| + } else {
|
| + check_runtime_nocache sse_hw_available {
|
| + #include "cpuid.h"
|
| + int main ()
|
| + {
|
| + unsigned int eax, ebx, ecx, edx = 0;
|
| + if (__get_cpuid (1, &eax, &ebx, &ecx, &edx))
|
| + return !(edx & bit_SSE);
|
| + return 1;
|
| + }
|
| + } ""
|
| + }
|
| + }]
|
| +}
|
| +
|
| # Return 1 if the target supports executing SSE2 instructions, 0
|
| # otherwise. Cache the result.
|
|
|
| @@ -879,6 +980,52 @@ proc check_sse2_hw_available { } {
|
| }]
|
| }
|
|
|
| +# Return 1 if the target supports running SSE executables, 0 otherwise.
|
| +
|
| +proc check_effective_target_sse_runtime { } {
|
| + if { [check_sse_hw_available] && [check_sse_os_support_available] } {
|
| + return 1
|
| + } else {
|
| + return 0
|
| + }
|
| +}
|
| +
|
| +# Return 1 if the target supports running SSE2 executables, 0 otherwise.
|
| +
|
| +proc check_effective_target_sse2_runtime { } {
|
| + if { [check_sse2_hw_available] && [check_sse_os_support_available] } {
|
| + return 1
|
| + } else {
|
| + return 0
|
| + }
|
| +}
|
| +
|
| +# Return 1 if the target supports executing VSX instructions, 0
|
| +# otherwise. Cache the result.
|
| +
|
| +proc check_vsx_hw_available { } {
|
| + return [check_cached_effective_target vsx_hw_available {
|
| + # Some simulators are known to not support VSX instructions.
|
| + # For now, disable on Darwin
|
| + if { [istarget powerpc-*-eabi] || [istarget powerpc*-*-eabispe] || [istarget *-*-darwin*]} {
|
| + expr 0
|
| + } else {
|
| + set options "-mvsx"
|
| + check_runtime_nocache vsx_hw_available {
|
| + int main()
|
| + {
|
| + #ifdef __MACH__
|
| + asm volatile ("xxlor vs0,vs0,vs0");
|
| + #else
|
| + asm volatile ("xxlor 0,0,0");
|
| + #endif
|
| + return 0;
|
| + }
|
| + } $options
|
| + }
|
| + }]
|
| +}
|
| +
|
| # Return 1 if the target supports executing AltiVec instructions, 0
|
| # otherwise. Cache the result.
|
|
|
| @@ -889,12 +1036,13 @@ proc check_vmx_hw_available { } {
|
| expr 0
|
| } else {
|
| # Most targets don't require special flags for this test case, but
|
| - # Darwin does.
|
| + # Darwin does. Just to be sure, make sure VSX is not enabled for
|
| + # the altivec tests.
|
| if { [istarget *-*-darwin*]
|
| || [istarget *-*-aix*] } {
|
| - set options "-maltivec"
|
| + set options "-maltivec -mno-vsx"
|
| } else {
|
| - set options ""
|
| + set options "-mno-vsx"
|
| }
|
| check_runtime_nocache vmx_hw_available {
|
| int main()
|
| @@ -1084,6 +1232,9 @@ proc check_cxa_atexit_available { } {
|
| if { [istarget "hppa*-*-hpux10*"] } {
|
| # HP-UX 10 doesn't have __cxa_atexit but subsequent test passes.
|
| expr 0
|
| + } elseif { [istarget "*-*-vxworks"] } {
|
| + # vxworks doesn't have __cxa_atexit but subsequent test passes.
|
| + expr 0
|
| } else {
|
| check_runtime_nocache cxa_atexit_available {
|
| // C++
|
| @@ -1120,6 +1271,25 @@ proc check_cxa_atexit_available { } {
|
| }]
|
| }
|
|
|
| +proc check_effective_target_objc2 { } {
|
| + return [check_no_compiler_messages objc2 object {
|
| + #ifdef __OBJC2__
|
| + int dummy[1];
|
| + #else
|
| + #error
|
| + #endif
|
| + }]
|
| +}
|
| +
|
| +proc check_effective_target_next_runtime { } {
|
| + return [check_no_compiler_messages objc2 object {
|
| + #ifdef __NEXT_RUNTIME__
|
| + int dummy[1];
|
| + #else
|
| + #error
|
| + #endif
|
| + }]
|
| +}
|
|
|
| # Return 1 if we're generating 32-bit code using default options, 0
|
| # otherwise.
|
| @@ -1200,6 +1370,33 @@ proc check_effective_target_large_long_double { } {
|
| }]
|
| }
|
|
|
| +# Return 1 if the target supports double larger than float,
|
| +# 0 otherwise.
|
| +
|
| +proc check_effective_target_large_double { } {
|
| + return [check_no_compiler_messages large_double object {
|
| + int dummy[sizeof(double) > sizeof(float) ? 1 : -1];
|
| + }]
|
| +}
|
| +
|
| +# Return 1 if the target supports double of 64 bits,
|
| +# 0 otherwise.
|
| +
|
| +proc check_effective_target_double64 { } {
|
| + return [check_no_compiler_messages double64 object {
|
| + int dummy[sizeof(double) == 8 ? 1 : -1];
|
| + }]
|
| +}
|
| +
|
| +# Return 1 if the target supports double of at least 64 bits,
|
| +# 0 otherwise.
|
| +
|
| +proc check_effective_target_double64plus { } {
|
| + return [check_no_compiler_messages double64plus object {
|
| + int dummy[sizeof(double) >= 8 ? 1 : -1];
|
| + }]
|
| +}
|
| +
|
| # Return 1 if the target supports compiling fixed-point,
|
| # 0 otherwise.
|
|
|
| @@ -1215,7 +1412,7 @@ proc check_effective_target_fixed_point { } {
|
| proc check_effective_target_dfp_nocache { } {
|
| verbose "check_effective_target_dfp_nocache: compiling source" 2
|
| set ret [check_no_compiler_messages_nocache dfp object {
|
| - _Decimal32 x; _Decimal64 y; _Decimal128 z;
|
| + float x __attribute__((mode(DD)));
|
| }]
|
| verbose "check_effective_target_dfp_nocache: returning $ret" 2
|
| return $ret
|
| @@ -1223,7 +1420,8 @@ proc check_effective_target_dfp_nocache { } {
|
|
|
| proc check_effective_target_dfprt_nocache { } {
|
| return [check_runtime_nocache dfprt {
|
| - _Decimal32 x = 1.2df; _Decimal64 y = 2.3dd; _Decimal128 z;
|
| + typedef float d64 __attribute__((mode(DD)));
|
| + d64 x = 1.2df, y = 2.3dd, z;
|
| int main () { z = x + y; return 0; }
|
| }]
|
| }
|
| @@ -1240,7 +1438,7 @@ proc check_effective_target_dfp { } {
|
| }
|
|
|
| # Return 1 if the target supports linking and executing Decimal Floating
|
| -# Point, # 0 otherwise.
|
| +# Point, 0 otherwise.
|
| #
|
| # This won't change for different subtargets so cache the result.
|
|
|
| @@ -1250,6 +1448,32 @@ proc check_effective_target_dfprt { } {
|
| }]
|
| }
|
|
|
| +# Return 1 if the target supports compiling and assembling UCN, 0 otherwise.
|
| +
|
| +proc check_effective_target_ucn_nocache { } {
|
| + # -std=c99 is only valid for C
|
| + if [check_effective_target_c] {
|
| + set ucnopts "-std=c99"
|
| + }
|
| + append ucnopts " -fextended-identifiers"
|
| + verbose "check_effective_target_ucn_nocache: compiling source" 2
|
| + set ret [check_no_compiler_messages_nocache ucn object {
|
| + int \u00C0;
|
| + } $ucnopts]
|
| + verbose "check_effective_target_ucn_nocache: returning $ret" 2
|
| + return $ret
|
| +}
|
| +
|
| +# Return 1 if the target supports compiling and assembling UCN, 0 otherwise.
|
| +#
|
| +# This won't change for different subtargets, so cache the result.
|
| +
|
| +proc check_effective_target_ucn { } {
|
| + return [check_cached_effective_target ucn {
|
| + check_effective_target_ucn_nocache
|
| + }]
|
| +}
|
| +
|
| # Return 1 if the target needs a command line argument to enable a SIMD
|
| # instruction set.
|
|
|
| @@ -1354,8 +1578,10 @@ proc check_effective_target_vect_uintfloat_cvt { } {
|
| verbose "check_effective_target_vect_uintfloat_cvt: using cached result" 2
|
| } else {
|
| set et_vect_uintfloat_cvt_saved 0
|
| - if { ([istarget powerpc*-*-*]
|
| - && ![istarget powerpc-*-linux*paired*]) } {
|
| + if { [istarget i?86-*-*]
|
| + || ([istarget powerpc*-*-*]
|
| + && ![istarget powerpc-*-linux*paired*])
|
| + || [istarget x86_64-*-*] } {
|
| set et_vect_uintfloat_cvt_saved 1
|
| }
|
| }
|
| @@ -1430,6 +1656,20 @@ proc check_effective_target_arm_vfp_ok { } {
|
| }
|
| }
|
|
|
| +# Return 1 if this is an ARM target supporting -mfpu=vfp
|
| +# -mfloat-abi=hard. Some multilibs may be incompatible with these
|
| +# options.
|
| +
|
| +proc check_effective_target_arm_hard_vfp_ok { } {
|
| + if { [check_effective_target_arm32] } {
|
| + return [check_no_compiler_messages arm_hard_vfp_ok executable {
|
| + int main() { return 0;}
|
| + } "-mfpu=vfp -mfloat-abi=hard"]
|
| + } else {
|
| + return 0
|
| + }
|
| +}
|
| +
|
| # Return 1 if this is an ARM target supporting -mfpu=neon
|
| # -mfloat-abi=softfp. Some multilibs may be incompatible with these
|
| # options.
|
| @@ -1437,6 +1677,7 @@ proc check_effective_target_arm_vfp_ok { } {
|
| proc check_effective_target_arm_neon_ok { } {
|
| if { [check_effective_target_arm32] } {
|
| return [check_no_compiler_messages arm_neon_ok object {
|
| + #include "arm_neon.h"
|
| int dummy;
|
| } "-mfpu=neon -mfloat-abi=softfp"]
|
| } else {
|
| @@ -1455,6 +1696,17 @@ proc check_effective_target_arm_thumb1_ok { } {
|
| } "-mthumb"]
|
| }
|
|
|
| +# Return 1 is this is an ARM target where -mthumb causes Thumb-2 to be
|
| +# used.
|
| +
|
| +proc check_effective_target_arm_thumb2_ok { } {
|
| + return [check_no_compiler_messages arm_thumb2_ok assembly {
|
| + #if !defined(__thumb2__)
|
| + #error FOO
|
| + #endif
|
| + } "-mthumb"]
|
| +}
|
| +
|
| # Return 1 if the target supports executing NEON instructions, 0
|
| # otherwise. Cache the result.
|
|
|
| @@ -1512,6 +1764,19 @@ proc check_effective_target_arm_eabi { } {
|
| }]
|
| }
|
|
|
| +# Return 1 if this is an ARM target supporting -mcpu=iwmmxt.
|
| +# Some multilibs may be incompatible with this option.
|
| +
|
| +proc check_effective_target_arm_iwmmxt_ok { } {
|
| + if { [check_effective_target_arm32] } {
|
| + return [check_no_compiler_messages arm_iwmmxt_ok object {
|
| + int dummy;
|
| + } "-mcpu=iwmmxt"]
|
| + } else {
|
| + return 0
|
| + }
|
| +}
|
| +
|
| # Return 1 if this is a PowerPC target with floating-point registers.
|
|
|
| proc check_effective_target_powerpc_fprs { } {
|
| @@ -1567,6 +1832,33 @@ proc check_effective_target_powerpc_altivec_ok { } {
|
| }
|
| }
|
|
|
| +# Return 1 if this is a PowerPC target supporting -mvsx
|
| +
|
| +proc check_effective_target_powerpc_vsx_ok { } {
|
| + if { ([istarget powerpc*-*-*]
|
| + && ![istarget powerpc-*-linux*paired*])
|
| + || [istarget rs6000-*-*] } {
|
| + # AltiVec is not supported on AIX before 5.3.
|
| + if { [istarget powerpc*-*-aix4*]
|
| + || [istarget powerpc*-*-aix5.1*]
|
| + || [istarget powerpc*-*-aix5.2*] } {
|
| + return 0
|
| + }
|
| + return [check_no_compiler_messages powerpc_vsx_ok object {
|
| + int main (void) {
|
| +#ifdef __MACH__
|
| + asm volatile ("xxlor vs0,vs0,vs0");
|
| +#else
|
| + asm volatile ("xxlor 0,0,0");
|
| +#endif
|
| + return 0;
|
| + }
|
| + } "-mvsx"]
|
| + } else {
|
| + return 0
|
| + }
|
| +}
|
| +
|
| # Return 1 if this is a PowerPC target supporting -mcpu=cell.
|
|
|
| proc check_effective_target_powerpc_ppu_ok { } {
|
| @@ -2175,6 +2467,27 @@ proc check_effective_target_vect_no_align { } {
|
| return $et_vect_no_align_saved
|
| }
|
|
|
| +# Return 1 if the target supports a vector misalign access, 0 otherwise.
|
| +#
|
| +# This won't change for different subtargets so cache the result.
|
| +
|
| +proc check_effective_target_vect_hw_misalign { } {
|
| + global et_vect_hw_misalign_saved
|
| +
|
| + if [info exists et_vect_hw_misalign_saved] {
|
| + verbose "check_effective_target_vect_hw_misalign: using cached result" 2
|
| + } else {
|
| + set et_vect_hw_misalign_saved 0
|
| + if { ([istarget x86_64-*-*]
|
| + || [istarget i?86-*-*]) } {
|
| + set et_vect_hw_misalign_saved 1
|
| + }
|
| + }
|
| + verbose "check_effective_target_vect_hw_misalign: returning $et_vect_hw_misalign_saved" 2
|
| + return $et_vect_hw_misalign_saved
|
| +}
|
| +
|
| +
|
| # Return 1 if arrays are aligned to the vector alignment
|
| # boundary, 0 otherwise.
|
| #
|
| @@ -2335,8 +2648,8 @@ proc check_effective_target_vect_short_mult { } {
|
| if { [istarget ia64-*-*]
|
| || [istarget spu-*-*]
|
| || [istarget i?86-*-*]
|
| - || [istarget x86_64-*-*]
|
| - || [istarget powerpc*-*-*]
|
| + || [istarget x86_64-*-*]
|
| + || [istarget powerpc*-*-*]
|
| || [check_effective_target_arm32] } {
|
| set et_vect_short_mult_saved 1
|
| }
|
| @@ -2377,7 +2690,9 @@ proc check_effective_target_vect_extract_even_odd { } {
|
| verbose "check_effective_target_vect_extract_even_odd: using cached result" 2
|
| } else {
|
| set et_vect_extract_even_odd_saved 0
|
| - if { [istarget powerpc*-*-*]
|
| + if { [istarget powerpc*-*-*]
|
| + || [istarget i?86-*-*]
|
| + || [istarget x86_64-*-*]
|
| || [istarget spu-*-*] } {
|
| set et_vect_extract_even_odd_saved 1
|
| }
|
| @@ -2476,7 +2791,8 @@ proc check_effective_target_section_anchors { } {
|
| verbose "check_effective_target_section_anchors: using cached result" 2
|
| } else {
|
| set et_section_anchors_saved 0
|
| - if { [istarget powerpc*-*-*] } {
|
| + if { [istarget powerpc*-*-*]
|
| + || [istarget arm*-*-*] } {
|
| set et_section_anchors_saved 1
|
| }
|
| }
|
| @@ -2500,6 +2816,7 @@ proc check_effective_target_sync_int_long { } {
|
| || [istarget i?86-*-*]
|
| || [istarget x86_64-*-*]
|
| || [istarget alpha*-*-*]
|
| + || [istarget bfin*-*linux*]
|
| || [istarget s390*-*-*]
|
| || [istarget powerpc*-*-*]
|
| || [istarget sparc64-*-*]
|
| @@ -2668,7 +2985,8 @@ proc check_effective_target_string_merging { } {
|
| }
|
|
|
| # Return 1 if target has the basic signed and unsigned types in
|
| -# <stdint.h>, 0 otherwise.
|
| +# <stdint.h>, 0 otherwise. This will be obsolete when GCC ensures a
|
| +# working <stdint.h> for all targets.
|
|
|
| proc check_effective_target_stdint_types { } {
|
| return [check_no_compiler_messages stdint_types assembly {
|
| @@ -2678,6 +2996,19 @@ proc check_effective_target_stdint_types { } {
|
| }]
|
| }
|
|
|
| +# Return 1 if target has the basic signed and unsigned types in
|
| +# <inttypes.h>, 0 otherwise. This is for tests that GCC's notions of
|
| +# these types agree with those in the header, as some systems have
|
| +# only <inttypes.h>.
|
| +
|
| +proc check_effective_target_inttypes_types { } {
|
| + return [check_no_compiler_messages inttypes_types assembly {
|
| + #include <inttypes.h>
|
| + int8_t a; int16_t b; int32_t c; int64_t d;
|
| + uint8_t e; uint16_t f; uint32_t g; uint64_t h;
|
| + }]
|
| +}
|
| +
|
| # Return 1 if programs are intended to be run on a simulator
|
| # (i.e. slowly) rather than hardware (i.e. fast).
|
|
|
| @@ -2787,6 +3118,39 @@ proc add_options_for_c99_runtime { flags } {
|
| return $flags
|
| }
|
|
|
| +# Add to FLAGS all the target-specific flags needed to enable
|
| +# full IEEE compliance mode.
|
| +
|
| +proc add_options_for_ieee { flags } {
|
| + if { [istarget "alpha*-*-*"]
|
| + || [istarget "sh*-*-*"] } {
|
| + return "$flags -mieee"
|
| + }
|
| + return $flags
|
| +}
|
| +
|
| +# Add to FLAGS the flags needed to enable functions to bind locally
|
| +# when using pic/PIC passes in the testsuite.
|
| +
|
| +proc add_options_for_bind_pic_locally { flags } {
|
| + if {[check_no_compiler_messages using_pic2 assembly {
|
| + #if __PIC__ != 2
|
| + #error FOO
|
| + #endif
|
| + }]} {
|
| + return "$flags -fPIE"
|
| + }
|
| + if {[check_no_compiler_messages using_pic1 assembly {
|
| + #if __PIC__ != 1
|
| + #error FOO
|
| + #endif
|
| + }]} {
|
| + return "$flags -fpie"
|
| + }
|
| +
|
| + return $flags
|
| +}
|
| +
|
| # Return 1 if the target provides a full C99 runtime.
|
|
|
| proc check_effective_target_c99_runtime { } {
|
| @@ -2836,6 +3200,29 @@ proc check_effective_target_avx { } {
|
| } "-O2 -mavx" ]
|
| }
|
|
|
| +# Return 1 if sse instructions can be compiled.
|
| +proc check_effective_target_sse { } {
|
| + return [check_no_compiler_messages sse object {
|
| + int main ()
|
| + {
|
| + __builtin_ia32_stmxcsr ();
|
| + return 0;
|
| + }
|
| + } "-O2 -msse" ]
|
| +}
|
| +
|
| +# Return 1 if sse2 instructions can be compiled.
|
| +proc check_effective_target_sse2 { } {
|
| + return [check_no_compiler_messages sse2 object {
|
| + typedef long long __m128i __attribute__ ((__vector_size__ (16)));
|
| +
|
| + __m128i _mm_srli_si128 (__m128i __A, int __N)
|
| + {
|
| + return (__m128i)__builtin_ia32_psrldqi128 (__A, 8);
|
| + }
|
| + } "-O2 -msse2" ]
|
| +}
|
| +
|
| # Return 1 if C wchar_t type is compatible with char16_t.
|
|
|
| proc check_effective_target_wchar_t_char16_t_compatible { } {
|
| @@ -2873,7 +3260,8 @@ proc check_effective_target_pow10 { } {
|
|
|
| proc check_effective_target_hard_dfp {} {
|
| return [check_no_messages_and_pattern hard_dfp "!adddd3" assembly {
|
| - _Decimal64 x, y, z;
|
| + typedef float d64 __attribute__((mode(DD)));
|
| + d64 x, y, z;
|
| void foo (void) { z = x + y; }
|
| }]
|
| }
|
| @@ -2895,6 +3283,36 @@ proc check_effective_target_correct_iso_cpp_string_wchar_protos { } {
|
| }]
|
| }
|
|
|
| +# Return 1 if GNU as is used.
|
| +
|
| +proc check_effective_target_gas { } {
|
| + global use_gas_saved
|
| + global tool
|
| +
|
| + if {![info exists use_gas_saved]} {
|
| + # Check if the as used by gcc is GNU as.
|
| + set gcc_as [lindex [${tool}_target_compile "-print-prog-name=as" "" "none" ""] 0]
|
| + # Provide /dev/null as input, otherwise gas times out reading from
|
| + # stdin.
|
| + set status [remote_exec host "$gcc_as" "-v /dev/null"]
|
| + set as_output [lindex $status 1]
|
| + if { [ string first "GNU" $as_output ] >= 0 } {
|
| + set use_gas_saved 1
|
| + } else {
|
| + set use_gas_saved 0
|
| + }
|
| + }
|
| + return $use_gas_saved
|
| +}
|
| +
|
| +# Return 1 if the compiler has been configure with link-time optimization
|
| +# (LTO) support.
|
| +
|
| +proc check_effective_target_lto { } {
|
| + global ENABLE_LTO
|
| + return [info exists ENABLE_LTO]
|
| +}
|
| +
|
| # Return 1 if the language for the compiler under test is C.
|
|
|
| proc check_effective_target_c { } {
|
| @@ -2914,4 +3332,3 @@ proc check_effective_target_c++ { } {
|
| }
|
| return 0
|
| }
|
| -
|
|
|