r281375 - Add some MS aliases for existing intrinsics

Nico Weber via cfe-commits cfe-commits at lists.llvm.org
Tue Sep 13 14:25:07 PDT 2016


This breaks building Chromium,
https://build.chromium.org/p/chromium.fyi/builders/ClangToTWin64%28dbg%29/builds/7125/steps/compile/logs/stdio

FAILED: obj/components/webcrypto/webcrypto/aes_gcm.obj
../../third_party/llvm-build/Release+Asserts/bin/clang-cl.exe /nologo
/showIncludes /FC @obj/components/webcrypto/webcrypto/aes_gcm.obj.rsp /c
../../components/webcrypto/algorithms/aes_gcm.cc
/Foobj/components/webcrypto/webcrypto/aes_gcm.obj
/Fd"obj/components/webcrypto/webcrypto_cc.pdb"
In file included from ../../components/webcrypto/algorithms/aes_gcm.cc:5:
In file included from
../../third_party/boringssl/src/include\openssl/evp.h:60:
In file included from
../../third_party/boringssl/src/include\openssl/base.h:313:
In file included from
C:\b\depot_tools\win_toolchain\vs_files\d5dc33b15d1b2c086f2f6632e2fd15882f80dbd3\win_sdk\bin\..\..\VC\include\memory:6:
In file included from
C:\b\depot_tools\win_toolchain\vs_files\d5dc33b15d1b2c086f2f6632e2fd15882f80dbd3\win_sdk\bin\..\..\VC\include\xmemory:6:
In file included from
C:\b\depot_tools\win_toolchain\vs_files\d5dc33b15d1b2c086f2f6632e2fd15882f80dbd3\win_sdk\bin\..\..\VC\include\xmemory0:1151:
In file included from
C:\b\c\b\ClangToTWin64_dbg_\src\third_party\llvm-build\Release+Asserts\bin\..\lib\clang\4.0.0\include\intrin.h:34:
In file included from
C:\b\c\b\ClangToTWin64_dbg_\src\third_party\llvm-build\Release+Asserts\bin\..\lib\clang\4.0.0\include\x86intrin.h:29:
In file included from
C:\b\c\b\ClangToTWin64_dbg_\src\third_party\llvm-build\Release+Asserts\bin\..\lib\clang\4.0.0\include\immintrin.h:32:
C:\b\c\b\ClangToTWin64_dbg_\src\third_party\llvm-build\Release+Asserts\lib\clang\4.0.0\include\xmmintrin.h(2097,6):
 error: declaration of '_mm_sfence' has a different language linkage
void _mm_sfence(void);
     ^
C:\b\c\b\ClangToTWin64_dbg_\src\third_party\llvm-build\Release+Asserts\lib\clang\4.0.0\include\xmmintrin.h(2097,6):
 note: previous implicit declaration is here
C:\b\c\b\ClangToTWin64_dbg_\src\third_party\llvm-build\Release+Asserts\lib\clang\4.0.0\include\xmmintrin.h(2407,14):
 error: declaration of '_mm_getcsr' has a different language linkage
unsigned int _mm_getcsr(void);
             ^

It looks like just including memory like in
https://cs.chromium.org/chromium/src/third_party/boringssl/src/include/openssl/base.h?type=cs&q=third_party/boringssl/src/include/openssl/base.h&sq=package:chromium&l=313
is enough to repro, so this looks like it probably breaks all users of
clang-cl. Please revert.

On Tue, Sep 13, 2016 at 3:26 PM, Albert Gutowski via cfe-commits <
cfe-commits at lists.llvm.org> wrote:

> Author: agutowski
> Date: Tue Sep 13 14:26:42 2016
> New Revision: 281375
>
> URL: http://llvm.org/viewvc/llvm-project?rev=281375&view=rev
> Log:
> Add some MS aliases for existing intrinsics
>
> Reviewers: thakis, compnerd, majnemer, rsmith, rnk
>
> Subscribers: cfe-commits
>
> Differential Revision: https://reviews.llvm.org/D24330
>
> Added:
>     cfe/trunk/test/Sema/implicit-intel-builtin-decl.c
>     cfe/trunk/test/Sema/implicit-ms-builtin-decl.c
> Modified:
>     cfe/trunk/include/clang/Basic/Builtins.def
>     cfe/trunk/include/clang/Basic/Builtins.h
>     cfe/trunk/include/clang/Basic/BuiltinsX86.def
>     cfe/trunk/lib/Basic/Targets.cpp
>     cfe/trunk/lib/CodeGen/CGBuiltin.cpp
>     cfe/trunk/lib/Headers/emmintrin.h
>     cfe/trunk/lib/Headers/ia32intrin.h
>     cfe/trunk/lib/Headers/intrin.h
>     cfe/trunk/lib/Headers/xmmintrin.h
>     cfe/trunk/lib/Sema/SemaDecl.cpp
>     cfe/trunk/test/CodeGen/builtins-x86.c
>
> Modified: cfe/trunk/include/clang/Basic/Builtins.def
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/
> clang/Basic/Builtins.def?rev=281375&r1=281374&r2=281375&view=diff
> ============================================================
> ==================
> --- cfe/trunk/include/clang/Basic/Builtins.def (original)
> +++ cfe/trunk/include/clang/Basic/Builtins.def Tue Sep 13 14:26:42 2016
> @@ -74,6 +74,7 @@
>  //  f -> this is a libc/libm function without the '__builtin_' prefix. It
> can
>  //       be followed by ':headername:' to state which header this function
>  //       comes from.
> +//  h -> this function requires a specific header or an explicit
> declaration.
>  //  i -> this is a runtime library implemented function without the
>  //       '__builtin_' prefix. It will be implemented in compiler-rt or
> libgcc.
>  //  p:N: -> this is a printf-like function whose Nth argument is the
> format
> @@ -708,6 +709,9 @@ BUILTIN(__builtin_rindex, "c*cC*i", "Fn"
>  // Microsoft builtins.  These are only active with -fms-extensions.
>  LANGBUILTIN(_alloca,          "v*z", "n", ALL_MS_LANGUAGES)
>  LANGBUILTIN(__assume,         "vb",  "n", ALL_MS_LANGUAGES)
> +LIBBUILTIN(_byteswap_ushort, "UsUs",     "fnc", "stdlib.h",
> ALL_MS_LANGUAGES)
> +LIBBUILTIN(_byteswap_ulong,  "ULiULi",   "fnc", "stdlib.h",
> ALL_MS_LANGUAGES)
> +LIBBUILTIN(_byteswap_uint64, "ULLiULLi", "fnc", "stdlib.h",
> ALL_MS_LANGUAGES)
>  LANGBUILTIN(__debugbreak,     "v",   "n", ALL_MS_LANGUAGES)
>  LANGBUILTIN(__exception_code, "ULi", "n", ALL_MS_LANGUAGES)
>  LANGBUILTIN(_exception_code,  "ULi", "n", ALL_MS_LANGUAGES)
> @@ -724,6 +728,9 @@ LANGBUILTIN(_InterlockedExchange,
>  LANGBUILTIN(_InterlockedExchangePointer, "v*v*D*v*",   "n",
> ALL_MS_LANGUAGES)
>  LANGBUILTIN(_InterlockedIncrement,       "LiLiD*",     "n",
> ALL_MS_LANGUAGES)
>  LANGBUILTIN(__noop,           "i.",  "n", ALL_MS_LANGUAGES)
> +LANGBUILTIN(__popcnt16, "UsUs",     "nc", ALL_MS_LANGUAGES)
> +LANGBUILTIN(__popcnt,   "UiUi",     "nc", ALL_MS_LANGUAGES)
> +LANGBUILTIN(__popcnt64, "ULLiULLi", "nc", ALL_MS_LANGUAGES)
>  LANGBUILTIN(__readfsdword,    "ULiULi", "n", ALL_MS_LANGUAGES)
>  LANGBUILTIN(_rotl8,  "UcUcUc",    "n", ALL_MS_LANGUAGES)
>  LANGBUILTIN(_rotl16, "UsUsUc",    "n", ALL_MS_LANGUAGES)
>
> Modified: cfe/trunk/include/clang/Basic/Builtins.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/
> clang/Basic/Builtins.h?rev=281375&r1=281374&r2=281375&view=diff
> ============================================================
> ==================
> --- cfe/trunk/include/clang/Basic/Builtins.h (original)
> +++ cfe/trunk/include/clang/Basic/Builtins.h Tue Sep 13 14:26:42 2016
> @@ -139,6 +139,13 @@ public:
>      return strchr(getRecord(ID).Attributes, 'f') != nullptr;
>    }
>
> +  // \brief Returns true if this builtin requires appropriate header in
> other
> +  // compilers. In Clang it will work even without including it, but we
> can emit
> +  // a warning about missing header.
> +  bool isHeaderDependentFunction(unsigned ID) const {
> +    return strchr(getRecord(ID).Attributes, 'h') != nullptr;
> +  }
> +
>    /// \brief Determines whether this builtin is a predefined
> compiler-rt/libgcc
>    /// function, such as "__clear_cache", where we know the signature a
>    /// priori.
>
> Modified: cfe/trunk/include/clang/Basic/BuiltinsX86.def
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/
> clang/Basic/BuiltinsX86.def?rev=281375&r1=281374&r2=281375&view=diff
> ============================================================
> ==================
> --- cfe/trunk/include/clang/Basic/BuiltinsX86.def (original)
> +++ cfe/trunk/include/clang/Basic/BuiltinsX86.def Tue Sep 13 14:26:42 2016
> @@ -23,6 +23,10 @@
>  #   define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) BUILTIN(ID, TYPE,
> ATTRS)
>  #endif
>
> +#if defined(BUILTIN) && !defined(TARGET_HEADER_BUILTIN)
> +#  define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANG, FEATURE)
> BUILTIN(ID, TYPE, ATTRS)
> +#endif
> +
>  // FIXME: Are these nothrow/const?
>
>  // Miscellaneous builtin for checking x86 cpu features.
> @@ -301,7 +305,9 @@ TARGET_BUILTIN(__builtin_ia32_pabsw128,
>  TARGET_BUILTIN(__builtin_ia32_pabsd128, "V4iV4i", "", "ssse3")
>
>  TARGET_BUILTIN(__builtin_ia32_ldmxcsr, "vUi", "", "sse")
> +TARGET_HEADER_BUILTIN(_mm_setcsr, "vUi", "h","xmmintrin.h",
> ALL_LANGUAGES, "sse")
>  TARGET_BUILTIN(__builtin_ia32_stmxcsr, "Ui", "", "sse")
> +TARGET_HEADER_BUILTIN(_mm_getcsr, "Ui", "h", "xmmintrin.h",
> ALL_LANGUAGES, "sse")
>  TARGET_BUILTIN(__builtin_ia32_cvtss2si, "iV4f", "", "sse")
>  TARGET_BUILTIN(__builtin_ia32_cvttss2si, "iV4f", "", "sse")
>  TARGET_BUILTIN(__builtin_ia32_cvtss2si64, "LLiV4f", "", "sse")
> @@ -310,6 +316,7 @@ TARGET_BUILTIN(__builtin_ia32_storehps,
>  TARGET_BUILTIN(__builtin_ia32_storelps, "vV2i*V4f", "", "sse")
>  TARGET_BUILTIN(__builtin_ia32_movmskps, "iV4f", "", "sse")
>  TARGET_BUILTIN(__builtin_ia32_sfence, "v", "", "sse")
> +TARGET_HEADER_BUILTIN(_mm_sfence, "v", "h", "xmmintrin.h",
> ALL_LANGUAGES, "sse")
>  TARGET_BUILTIN(__builtin_ia32_rcpps, "V4fV4f", "", "sse")
>  TARGET_BUILTIN(__builtin_ia32_rcpss, "V4fV4f", "", "sse")
>  TARGET_BUILTIN(__builtin_ia32_rsqrtps, "V4fV4f", "", "sse")
> @@ -337,9 +344,13 @@ TARGET_BUILTIN(__builtin_ia32_cvtsd2ss,
>  TARGET_BUILTIN(__builtin_ia32_cvtps2dq, "V4iV4f", "", "sse2")
>  TARGET_BUILTIN(__builtin_ia32_cvttps2dq, "V4iV4f", "", "sse2")
>  TARGET_BUILTIN(__builtin_ia32_clflush, "vvC*", "", "sse2")
> +TARGET_HEADER_BUILTIN(_mm_clflush, "vvC*", "h", "emmintrin.h",
> ALL_LANGUAGES, "sse2")
>  TARGET_BUILTIN(__builtin_ia32_lfence, "v", "", "sse2")
> +TARGET_HEADER_BUILTIN(_mm_lfence, "v", "h", "emmintrin.h",
> ALL_LANGUAGES, "sse2")
>  TARGET_BUILTIN(__builtin_ia32_mfence, "v", "", "sse2")
> +TARGET_HEADER_BUILTIN(_mm_mfence, "v", "h", "emmintrin.h",
> ALL_LANGUAGES, "sse2")
>  TARGET_BUILTIN(__builtin_ia32_pause, "v", "", "sse2")
> +TARGET_HEADER_BUILTIN(_mm_pause, "v", "h", "emmintrin.h", ALL_LANGUAGES,
> "sse2")
>  TARGET_BUILTIN(__builtin_ia32_pmuludq128, "V2LLiV4iV4i", "", "sse2")
>  TARGET_BUILTIN(__builtin_ia32_psraw128, "V8sV8sV8s", "", "sse2")
>  TARGET_BUILTIN(__builtin_ia32_psrad128, "V4iV4iV4i", "", "sse2")
> @@ -894,6 +905,7 @@ TARGET_BUILTIN(__builtin_ia32_xtest, "i"
>
>  BUILTIN(__builtin_ia32_rdpmc, "ULLii", "")
>  BUILTIN(__builtin_ia32_rdtsc, "ULLi", "")
> +BUILTIN(__rdtsc, "ULLi", "")
>  BUILTIN(__builtin_ia32_rdtscp, "ULLiUi*", "")
>  // PKU
>  TARGET_BUILTIN(__builtin_ia32_rdpkru, "Ui", "", "pku")
> @@ -2059,3 +2071,4 @@ TARGET_BUILTIN(__builtin_ia32_mwaitx, "v
>
>  #undef BUILTIN
>  #undef TARGET_BUILTIN
> +#undef TARGET_HEADER_BUILTIN
>
> Modified: cfe/trunk/lib/Basic/Targets.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/
> Targets.cpp?rev=281375&r1=281374&r2=281375&view=diff
> ============================================================
> ==================
> --- cfe/trunk/lib/Basic/Targets.cpp (original)
> +++ cfe/trunk/lib/Basic/Targets.cpp Tue Sep 13 14:26:42 2016
> @@ -2303,6 +2303,8 @@ const Builtin::Info BuiltinInfo[] = {
>    { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
>  #define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE)
>      \
>    { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
> +#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE)
>      \
> +  { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
>  #include "clang/Basic/BuiltinsX86.def"
>  };
>
>
> Modified: cfe/trunk/lib/CodeGen/CGBuiltin.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/
> CGBuiltin.cpp?rev=281375&r1=281374&r2=281375&view=diff
> ============================================================
> ==================
> --- cfe/trunk/lib/CodeGen/CGBuiltin.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGBuiltin.cpp Tue Sep 13 14:26:42 2016
> @@ -681,6 +681,9 @@ RValue CodeGenFunction::EmitBuiltinExpr(
>                                       "cast");
>      return RValue::get(Result);
>    }
> +  case Builtin::BI__popcnt16:
> +  case Builtin::BI__popcnt:
> +  case Builtin::BI__popcnt64:
>    case Builtin::BI__builtin_popcount:
>    case Builtin::BI__builtin_popcountl:
>    case Builtin::BI__builtin_popcountll: {
> @@ -6932,6 +6935,25 @@ Value *CodeGenFunction::EmitX86BuiltinEx
>      Value *F = CGM.getIntrinsic(Intrinsic::prefetch);
>      return Builder.CreateCall(F, {Address, RW, Locality, Data});
>    }
> +  case X86::BI_mm_clflush: {
> +    return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_
> sse2_clflush),
> +                              Ops[0]);
> +  }
> +  case X86::BI_mm_lfence: {
> +    return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_
> sse2_lfence));
> +  }
> +  case X86::BI_mm_mfence: {
> +    return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_
> sse2_mfence));
> +  }
> +  case X86::BI_mm_sfence: {
> +    return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_
> sse_sfence));
> +  }
> +  case X86::BI_mm_pause: {
> +    return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_
> sse2_pause));
> +  }
> +  case X86::BI__rdtsc: {
> +    return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_rdtsc));
> +  }
>    case X86::BI__builtin_ia32_undef128:
>    case X86::BI__builtin_ia32_undef256:
>    case X86::BI__builtin_ia32_undef512:
> @@ -6944,12 +6966,14 @@ Value *CodeGenFunction::EmitX86BuiltinEx
>    case X86::BI__builtin_ia32_vec_ext_v2si:
>      return Builder.CreateExtractElement(Ops[0],
>                                    llvm::ConstantInt::get(Ops[1]->getType(),
> 0));
> +  case X86::BI_mm_setcsr:
>    case X86::BI__builtin_ia32_ldmxcsr: {
>      Address Tmp = CreateMemTemp(E->getArg(0)->getType());
>      Builder.CreateStore(Ops[0], Tmp);
>      return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_
> sse_ldmxcsr),
>                            Builder.CreateBitCast(Tmp.getPointer(),
> Int8PtrTy));
>    }
> +  case X86::BI_mm_getcsr:
>    case X86::BI__builtin_ia32_stmxcsr: {
>      Address Tmp = CreateMemTemp(E->getType());
>      Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_sse_stmxcsr),
>
> Modified: cfe/trunk/lib/Headers/emmintrin.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/
> emmintrin.h?rev=281375&r1=281374&r2=281375&view=diff
> ============================================================
> ==================
> --- cfe/trunk/lib/Headers/emmintrin.h (original)
> +++ cfe/trunk/lib/Headers/emmintrin.h Tue Sep 13 14:26:42 2016
> @@ -2457,11 +2457,7 @@ _mm_stream_si64(long long *__p, long lon
>  /// \param __p
>  ///    A pointer to the memory location used to identify the cache line
> to be
>  ///    flushed.
> -static __inline__ void __DEFAULT_FN_ATTRS
> -_mm_clflush(void const *__p)
> -{
> -  __builtin_ia32_clflush(__p);
> -}
> +void _mm_clflush(void const *);
>
>  /// \brief Forces strong memory ordering (serialization) between load
>  ///    instructions preceding this instruction and load instructions
> following
> @@ -2472,11 +2468,7 @@ _mm_clflush(void const *__p)
>  ///
>  /// This intrinsic corresponds to the \c LFENCE instruction.
>  ///
> -static __inline__ void __DEFAULT_FN_ATTRS
> -_mm_lfence(void)
> -{
> -  __builtin_ia32_lfence();
> -}
> +void _mm_lfence(void);
>
>  /// \brief Forces strong memory ordering (serialization) between load and
> store
>  ///    instructions preceding this instruction and load and store
> instructions
> @@ -2487,11 +2479,7 @@ _mm_lfence(void)
>  ///
>  /// This intrinsic corresponds to the \c MFENCE instruction.
>  ///
> -static __inline__ void __DEFAULT_FN_ATTRS
> -_mm_mfence(void)
> -{
> -  __builtin_ia32_mfence();
> -}
> +void _mm_mfence(void);
>
>  /// \brief Converts 16-bit signed integers from both 128-bit integer
> vector
>  ///    operands into 8-bit signed integers, and packs the results into the
> @@ -3213,11 +3201,7 @@ _mm_castsi128_pd(__m128i __a)
>  ///
>  /// This intrinsic corresponds to the \c PAUSE instruction.
>  ///
> -static __inline__ void __DEFAULT_FN_ATTRS
> -_mm_pause(void)
> -{
> -  __builtin_ia32_pause();
> -}
> +void _mm_pause(void);
>
>  #undef __DEFAULT_FN_ATTRS
>
>
> Modified: cfe/trunk/lib/Headers/ia32intrin.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/
> ia32intrin.h?rev=281375&r1=281374&r2=281375&view=diff
> ============================================================
> ==================
> --- cfe/trunk/lib/Headers/ia32intrin.h (original)
> +++ cfe/trunk/lib/Headers/ia32intrin.h Tue Sep 13 14:26:42 2016
> @@ -60,12 +60,6 @@ __rdpmc(int __A) {
>    return __builtin_ia32_rdpmc(__A);
>  }
>
> -/* __rdtsc */
> -static __inline__ unsigned long long __attribute__((__always_inline__,
> __nodebug__))
> -__rdtsc(void) {
> -  return __builtin_ia32_rdtsc();
> -}
> -
>  /* __rdtscp */
>  static __inline__ unsigned long long __attribute__((__always_inline__,
> __nodebug__))
>  __rdtscp(unsigned int *__A) {
>
> Modified: cfe/trunk/lib/Headers/intrin.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/
> intrin.h?rev=281375&r1=281374&r2=281375&view=diff
> ============================================================
> ==================
> --- cfe/trunk/lib/Headers/intrin.h (original)
> +++ cfe/trunk/lib/Headers/intrin.h Tue Sep 13 14:26:42 2016
> @@ -463,14 +463,6 @@ _BitScanReverse(unsigned long *_Index, u
>    *_Index = 31 - __builtin_clzl(_Mask);
>    return 1;
>  }
> -static __inline__ unsigned short __DEFAULT_FN_ATTRS
> -__popcnt16(unsigned short _Value) {
> -  return __builtin_popcount((int)_Value);
> -}
> -static __inline__ unsigned int __DEFAULT_FN_ATTRS
> -__popcnt(unsigned int _Value) {
> -  return __builtin_popcount(_Value);
> -}
>  static __inline__ unsigned char __DEFAULT_FN_ATTRS
>  _bittest(long const *_BitBase, long _BitPos) {
>    return (*_BitBase >> _BitPos) & 1;
> @@ -513,11 +505,6 @@ _BitScanReverse64(unsigned long *_Index,
>    *_Index = 63 - __builtin_clzll(_Mask);
>    return 1;
>  }
> -static __inline__
> -unsigned __int64 __DEFAULT_FN_ATTRS
> -__popcnt64(unsigned __int64 _Value) {
> -  return __builtin_popcountll(_Value);
> -}
>  static __inline__ unsigned char __DEFAULT_FN_ATTRS
>  _bittest64(__int64 const *_BitBase, __int64 _BitPos) {
>    return (*_BitBase >> _BitPos) & 1;
>
> Modified: cfe/trunk/lib/Headers/xmmintrin.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/
> xmmintrin.h?rev=281375&r1=281374&r2=281375&view=diff
> ============================================================
> ==================
> --- cfe/trunk/lib/Headers/xmmintrin.h (original)
> +++ cfe/trunk/lib/Headers/xmmintrin.h Tue Sep 13 14:26:42 2016
> @@ -2094,11 +2094,7 @@ _mm_stream_ps(float *__p, __m128 __a)
>  ///
>  /// This intrinsic corresponds to the \c SFENCE instruction.
>  ///
> -static __inline__ void __DEFAULT_FN_ATTRS
> -_mm_sfence(void)
> -{
> -  __builtin_ia32_sfence();
> -}
> +void _mm_sfence(void);
>
>  /// \brief Extracts 16-bit element from a 64-bit vector of [4 x i16] and
>  ///    returns it, as specified by the immediate integer operand.
> @@ -2408,11 +2404,7 @@ _mm_sad_pu8(__m64 __a, __m64 __b)
>  ///
>  /// \returns A 32-bit unsigned integer containing the contents of the
> MXCSR
>  ///    register.
> -static __inline__ unsigned int __DEFAULT_FN_ATTRS
> -_mm_getcsr(void)
> -{
> -  return __builtin_ia32_stmxcsr();
> -}
> +unsigned int _mm_getcsr(void);
>
>  /// \brief Sets the MXCSR register with the 32-bit unsigned integer
> value. There
>  ///    are several groups of macros associated with this intrinsic,
> including:
> @@ -2450,11 +2442,7 @@ _mm_getcsr(void)
>  ///
>  /// \param __i
>  ///    A 32-bit unsigned integer value to be written to the MXCSR
> register.
> -static __inline__ void __DEFAULT_FN_ATTRS
> -_mm_setcsr(unsigned int __i)
> -{
> -  __builtin_ia32_ldmxcsr(__i);
> -}
> +void _mm_setcsr(unsigned int);
>
>  /// \brief Selects 4 float values from the 128-bit operands of [4 x
> float], as
>  ///    specified by the immediate value operand.
>
> Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/
> SemaDecl.cpp?rev=281375&r1=281374&r2=281375&view=diff
> ============================================================
> ==================
> --- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDecl.cpp Tue Sep 13 14:26:42 2016
> @@ -1791,7 +1791,9 @@ NamedDecl *Sema::LazilyCreateBuiltin(Ide
>      return nullptr;
>    }
>
> -  if (!ForRedeclaration && Context.BuiltinInfo.isPredefinedLibFunction(ID))
> {
> +  if (!ForRedeclaration &&
> +      (Context.BuiltinInfo.isPredefinedLibFunction(ID) ||
> +       Context.BuiltinInfo.isHeaderDependentFunction(ID))) {
>      Diag(Loc, diag::ext_implicit_lib_function_decl)
>          << Context.BuiltinInfo.getName(ID) << R;
>      if (Context.BuiltinInfo.getHeaderName(ID) &&
>
> Modified: cfe/trunk/test/CodeGen/builtins-x86.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/
> CodeGen/builtins-x86.c?rev=281375&r1=281374&r2=281375&view=diff
> ============================================================
> ==================
> --- cfe/trunk/test/CodeGen/builtins-x86.c (original)
> +++ cfe/trunk/test/CodeGen/builtins-x86.c Tue Sep 13 14:26:42 2016
> @@ -262,7 +262,9 @@ void f0() {
>    tmp_i = __builtin_ia32_vec_ext_v2si(tmp_V2i, 0);
>
>    (void) __builtin_ia32_ldmxcsr(tmp_Ui);
> +  (void) _mm_setcsr(tmp_Ui);
>    tmp_Ui = __builtin_ia32_stmxcsr();
> +  tmp_Ui = _mm_getcsr();
>    (void)__builtin_ia32_fxsave(tmp_vp);
>    (void)__builtin_ia32_fxsave64(tmp_vp);
>    (void)__builtin_ia32_fxrstor(tmp_vp);
> @@ -290,6 +292,7 @@ void f0() {
>    tmp_i = __builtin_ia32_cvttss2si(tmp_V4f);
>
>    tmp_i = __builtin_ia32_rdtsc();
> +  tmp_i = __rdtsc();
>    tmp_i = __builtin_ia32_rdtscp(&tmp_Ui);
>    tmp_LLi = __builtin_ia32_rdpmc(tmp_i);
>  #ifdef USE_64
> @@ -304,6 +307,7 @@ void f0() {
>    tmp_i = __builtin_ia32_pmovmskb(tmp_V8c);
>    (void) __builtin_ia32_movntq(tmp_V1LLip, tmp_V1LLi);
>    (void) __builtin_ia32_sfence();
> +  (void) _mm_sfence();
>
>    tmp_V4s = __builtin_ia32_psadbw(tmp_V8c, tmp_V8c);
>    tmp_V4f = __builtin_ia32_rcpps(tmp_V4f);
> @@ -339,8 +343,13 @@ void f0() {
>    tmp_V4i = __builtin_ia32_cvtps2dq(tmp_V4f);
>    tmp_V4i = __builtin_ia32_cvttps2dq(tmp_V4f);
>    (void) __builtin_ia32_clflush(tmp_vCp);
> +  (void) _mm_clflush(tmp_vCp);
>    (void) __builtin_ia32_lfence();
> +  (void) _mm_lfence();
>    (void) __builtin_ia32_mfence();
> +  (void) _mm_mfence();
> +  (void) __builtin_ia32_pause();
> +  (void) _mm_pause();
>    tmp_V4s = __builtin_ia32_psllwi(tmp_V4s, tmp_i);
>    tmp_V2i = __builtin_ia32_pslldi(tmp_V2i, tmp_i);
>    tmp_V1LLi = __builtin_ia32_psllqi(tmp_V1LLi, tmp_i);
>
> Added: cfe/trunk/test/Sema/implicit-intel-builtin-decl.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/
> implicit-intel-builtin-decl.c?rev=281375&view=auto
> ============================================================
> ==================
> --- cfe/trunk/test/Sema/implicit-intel-builtin-decl.c (added)
> +++ cfe/trunk/test/Sema/implicit-intel-builtin-decl.c Tue Sep 13 14:26:42
> 2016
> @@ -0,0 +1,40 @@
> +// RUN: %clang_cc1 -triple x86_64-unknown-unknown -target-feature +sse2
> -fsyntax-only -verify %s
> +// RUN: %clang_cc1 -triple x86_64-unknown-unknown -target-feature +sse2
> -fsyntax-only -verify %s -x c++
> +
> +void f() {
> +  (void)_mm_getcsr(); // expected-warning{{implicitly declaring library
> function '_mm_getcsr'}} \
> +  // expected-note{{include the header <xmmintrin.h> or explicitly
> provide a declaration for '_mm_getcsr'}}
> +  _mm_setcsr(1); // expected-warning{{implicitly declaring library
> function '_mm_setcsr'}} \
> +  // expected-note{{include the header <xmmintrin.h> or explicitly
> provide a declaration for '_mm_setcsr'}}
> +  _mm_sfence(); // expected-warning{{implicitly declaring library
> function '_mm_sfence'}} \
> +  // expected-note{{include the header <xmmintrin.h> or explicitly
> provide a declaration for '_mm_sfence'}}
> +
> +  _mm_clflush((void*)0); // expected-warning{{implicitly declaring
> library function '_mm_clflush'}} \
> +  // expected-note{{include the header <emmintrin.h> or explicitly
> provide a declaration for '_mm_clflush'}}
> +  _mm_lfence(); // expected-warning{{implicitly declaring library
> function '_mm_lfence'}} \
> +  // expected-note{{include the header <emmintrin.h> or explicitly
> provide a declaration for '_mm_lfence'}}
> +  _mm_mfence(); // expected-warning{{implicitly declaring library
> function '_mm_mfence'}} \
> +  // expected-note{{include the header <emmintrin.h> or explicitly
> provide a declaration for '_mm_mfence'}}
> +  _mm_pause(); // expected-warning{{implicitly declaring library function
> '_mm_pause'}} \
> +  // expected-note{{include the header <emmintrin.h> or explicitly
> provide a declaration for '_mm_pause'}}
> +}
> +
> +unsigned int _mm_getcsr();
> +void _mm_setcsr(unsigned int);
> +void _mm_sfence();
> +
> +void _mm_clflush(void const *);
> +void _mm_lfence();
> +void _mm_mfence();
> +void _mm_pause();
> +
> +void g() {
> +  (void)_mm_getcsr();
> +  _mm_setcsr(1);
> +  _mm_sfence();
> +
> +  _mm_clflush((void*)0);
> +  _mm_lfence();
> +  _mm_mfence();
> +  _mm_pause();
> +}
>
> Added: cfe/trunk/test/Sema/implicit-ms-builtin-decl.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/
> implicit-ms-builtin-decl.c?rev=281375&view=auto
> ============================================================
> ==================
> --- cfe/trunk/test/Sema/implicit-ms-builtin-decl.c (added)
> +++ cfe/trunk/test/Sema/implicit-ms-builtin-decl.c Tue Sep 13 14:26:42
> 2016
> @@ -0,0 +1,19 @@
> +// RUN: %clang_cc1 -fsyntax-only -verify %s -fms-extensions
> +
> +void f() {
> +  (void)_byteswap_ushort(42); // expected-warning{{implicitly declaring
> library function '_byteswap_ushort}} \
> +  // expected-note{{include the header <stdlib.h> or explicitly provide a
> declaration for '_byteswap_ushort'}}
> +  (void)_byteswap_uint64(42LL); // expected-warning{{implicitly declaring
> library function '_byteswap_uint64}} \
> +  // expected-note{{include the header <stdlib.h> or explicitly provide a
> declaration for '_byteswap_uint64'}}
> +}
> +
> +void _byteswap_ulong(); // expected-warning{{incompatible redeclaration
> of library function '_byteswap_ulong'}} \
> +// expected-note{{'_byteswap_ulong' is a builtin}}
> +
> +unsigned short _byteswap_ushort(unsigned short);
> +unsigned long long _byteswap_uint64(unsigned long long);
> +
> +void g() {
> +  (void)_byteswap_ushort(42);
> +  (void)_byteswap_uint64(42LL);
> +}
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160913/96127686/attachment-0001.html>


More information about the cfe-commits mailing list