diff options
| author | Reid Kleckner <rnk@google.com> | 2017-04-07 16:54:32 +0000 | 
|---|---|---|
| committer | Reid Kleckner <rnk@google.com> | 2017-04-07 16:54:32 +0000 | 
| commit | 3ae87c4650fec9764e5dd0178e20c416002bb0c0 (patch) | |
| tree | b81b03d159b3d2e38d9f3590a3c3feb65f8769f2 /compiler-rt/lib/builtins | |
| parent | 426e864182d70fc27419d0f372a8bbff26854c74 (diff) | |
| download | bcm5719-llvm-3ae87c4650fec9764e5dd0178e20c416002bb0c0.tar.gz bcm5719-llvm-3ae87c4650fec9764e5dd0178e20c416002bb0c0.zip | |
[builtins] Fix MSVC build
Avoid __attribute__((constructor)) in cpu_model.c.
Use more C99 _Complex emulation in divtc3.c. Joerg Sonnenberger added
this builtin just after the last round of C99 _Complex emulation landed
in r249514 (Oct 2015).
llvm-svn: 299784
Diffstat (limited to 'compiler-rt/lib/builtins')
| -rw-r--r-- | compiler-rt/lib/builtins/cpu_model.c | 19 | ||||
| -rw-r--r-- | compiler-rt/lib/builtins/divtc3.c | 22 | 
2 files changed, 24 insertions, 17 deletions
| diff --git a/compiler-rt/lib/builtins/cpu_model.c b/compiler-rt/lib/builtins/cpu_model.c index 9a3737020a4..5ff6baf4387 100644 --- a/compiler-rt/lib/builtins/cpu_model.c +++ b/compiler-rt/lib/builtins/cpu_model.c @@ -27,6 +27,10 @@  #include <intrin.h>  #endif +#ifndef __has_attribute +#define __has_attribute(attr) 0 +#endif +  enum VendorSignatures {    SIG_INTEL = 0x756e6547 /* Genu */,    SIG_AMD = 0x68747541 /* Auth */ @@ -720,14 +724,17 @@ static unsigned getAvailableFeatures(unsigned int ECX, unsigned int EDX,    return Features;  } -#ifdef HAVE_INIT_PRIORITY -#define CONSTRUCTOR_PRIORITY (101) +#if defined(HAVE_INIT_PRIORITY) +#define CONSTRUCTOR_ATTRIBUTE __attribute__((__constructor__ 101)) +#elif __has_attribute(__constructor__) +#define CONSTRUCTOR_ATTRIBUTE __attribute__((__constructor__))  #else -#define CONSTRUCTOR_PRIORITY +// FIXME: For MSVC, we should make a function pointer global in .CRT$X?? so that +// this runs during initialization. +#define CONSTRUCTOR_ATTRIBUTE  #endif -int __cpu_indicator_init(void) -    __attribute__((constructor CONSTRUCTOR_PRIORITY)); +int __cpu_indicator_init(void) CONSTRUCTOR_ATTRIBUTE;  struct __processor_model {    unsigned int __cpu_vendor; @@ -742,7 +749,7 @@ struct __processor_model {     the priority set.  However, it still runs after ifunc initializers and     needs to be called explicitly there.  */ -int __attribute__((constructor CONSTRUCTOR_PRIORITY)) +int CONSTRUCTOR_ATTRIBUTE  __cpu_indicator_init(void) {    unsigned int EAX, EBX, ECX, EDX;    unsigned int MaxLeaf = 5; diff --git a/compiler-rt/lib/builtins/divtc3.c b/compiler-rt/lib/builtins/divtc3.c index 04693df471f..16e538ba4a3 100644 --- a/compiler-rt/lib/builtins/divtc3.c +++ b/compiler-rt/lib/builtins/divtc3.c @@ -17,7 +17,7 @@  /* Returns: the quotient of (a + ib) / (c + id) */ -COMPILER_RT_ABI long double _Complex +COMPILER_RT_ABI Lcomplex  __divtc3(long double __a, long double __b, long double __c, long double __d)  {      int __ilogbw = 0; @@ -29,31 +29,31 @@ __divtc3(long double __a, long double __b, long double __c, long double __d)          __d = crt_scalbnl(__d, -__ilogbw);      }      long double __denom = __c * __c + __d * __d; -    long double _Complex z; -    __real__ z = crt_scalbnl((__a * __c + __b * __d) / __denom, -__ilogbw); -    __imag__ z = crt_scalbnl((__b * __c - __a * __d) / __denom, -__ilogbw); -    if (crt_isnan(__real__ z) && crt_isnan(__imag__ z)) +    Lcomplex z; +    COMPLEX_REAL(z) = crt_scalbnl((__a * __c + __b * __d) / __denom, -__ilogbw); +    COMPLEX_IMAGINARY(z) = crt_scalbnl((__b * __c - __a * __d) / __denom, -__ilogbw); +    if (crt_isnan(COMPLEX_REAL(z)) && crt_isnan(COMPLEX_IMAGINARY(z)))      {          if ((__denom == 0.0) && (!crt_isnan(__a) || !crt_isnan(__b)))          { -            __real__ z = crt_copysignl(CRT_INFINITY, __c) * __a; -            __imag__ z = crt_copysignl(CRT_INFINITY, __c) * __b; +            COMPLEX_REAL(z) = crt_copysignl(CRT_INFINITY, __c) * __a; +            COMPLEX_IMAGINARY(z) = crt_copysignl(CRT_INFINITY, __c) * __b;          }          else if ((crt_isinf(__a) || crt_isinf(__b)) &&                   crt_isfinite(__c) && crt_isfinite(__d))          {              __a = crt_copysignl(crt_isinf(__a) ? 1.0 : 0.0, __a);              __b = crt_copysignl(crt_isinf(__b) ? 1.0 : 0.0, __b); -            __real__ z = CRT_INFINITY * (__a * __c + __b * __d); -            __imag__ z = CRT_INFINITY * (__b * __c - __a * __d); +            COMPLEX_REAL(z) = CRT_INFINITY * (__a * __c + __b * __d); +            COMPLEX_IMAGINARY(z) = CRT_INFINITY * (__b * __c - __a * __d);          }          else if (crt_isinf(__logbw) && __logbw > 0.0 &&                   crt_isfinite(__a) && crt_isfinite(__b))          {              __c = crt_copysignl(crt_isinf(__c) ? 1.0 : 0.0, __c);              __d = crt_copysignl(crt_isinf(__d) ? 1.0 : 0.0, __d); -            __real__ z = 0.0 * (__a * __c + __b * __d); -            __imag__ z = 0.0 * (__b * __c - __a * __d); +            COMPLEX_REAL(z) = 0.0 * (__a * __c + __b * __d); +            COMPLEX_IMAGINARY(z) = 0.0 * (__b * __c - __a * __d);          }      }      return z; | 

