After trying some other workarounds first, I reverted this and its dependencies in r201775. Details in r201775's change description.
On Thu, Feb 20, 2014 at 1:34 AM, Juergen Ributzka <[email protected]> wrote: > Yeah, that fixed it. Thanks > > -Juergen > > > > On Feb 19, 2014, at 4:32 PM, Warren Hunt <[email protected]> wrote: > > Yeah, these are addressed in: r201734 > > Sorry about that, > -Warren > > > On Wed, Feb 19, 2014 at 4:07 PM, Juergen Ributzka <[email protected]>wrote: > >> Hi Warren, >> >> this is failing on our build bots with: >> ******************** TEST 'Clang :: CodeGen/ms-builtins.c' FAILED >> ******************** >> Script: >> -- >> Release/bin/clang -cc1 -internal-isystem >> /Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.apple-clang-nobootstrap-R_master/clang.roots/BuildRecords/clang-9999.99_install/Objects/x86_64/Release/bin/../lib/clang/6.0/include >> -triple=i686-unknown-unknown -fms-extensions -emit-llvm -o - >> /Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.apple-clang-nobootstrap-R_master/clang.roots/Sources/clang/src/tools/clang/test/CodeGen/ms-builtins.c >> | FileCheck >> /Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.apple-clang-nobootstrap-R_master/clang.roots/Sources/clang/src/tools/clang/test/CodeGen/ms-builtins.c >> -- >> Exit Code: 1 >> >> Command Output (stderr): >> -- >> /Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.apple-clang-nobootstrap-R_master/clang.roots/Sources/clang/src/tools/clang/test/CodeGen/ms-builtins.c:3:13: >> warning: incompatible redeclaration of library function 'printf' >> extern void printf(const char*, ...); >> ^ >> /Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.apple-clang-nobootstrap-R_master/clang.roots/Sources/clang/src/tools/clang/test/CodeGen/ms-builtins.c:3:13: >> note: 'printf' is a builtin with type 'int (const char *, ...)' >> 1 warning generated. >> /Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.apple-clang-nobootstrap-R_master/clang.roots/Sources/clang/src/tools/clang/test/CodeGen/ms-builtins.c:15:11: >> error: expected string not found in input >> // CHECK: call void @llvm.prefetch(i8* %1, i32 0, i32 0, i32 1) >> ^ >> <stdin>:1:1: note: scanning from here >> ; ModuleID = >> '/Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.apple-clang-nobootstrap-R_master/clang.roots/Sources/clang/src/tools/clang/test/CodeGen/ms-builtins.c' >> ^ >> <stdin>:13:2: note: possible intended match here >> call void @llvm.prefetch(i8* %4, i32 0, i32 0, i32 1) >> ^ >> >> Could you please take a look? >> >> Thanks >> >> Cheers, >> Juergen >> >> On Feb 19, 2014, at 3:20 PM, Warren Hunt <[email protected]> wrote: >> >> > Author: whunt >> > Date: Wed Feb 19 17:20:20 2014 >> > New Revision: 201734 >> > >> > URL: http://llvm.org/viewvc/llvm-project?rev=201734&view=rev >> > Log: >> > Add _mm_prefetch and some others as MS builtins >> > >> > This patch adds several built-ins that are required for ms >> > compatibility. _mm_prefetch must be a built-in because it takes a >> > compile-time constant argument and our prior approach of using a #define >> > to the current built-in doesn't work in the presence of re-declaration >> > of _mm_prefetch. The others can be obtained by including the windows >> > system headers. If a user includes the windows system headers but not >> > intrin.h they still need to work and therefore must be built-in because >> > we don't get a chance to implement them in intrin.h in this case. >> > >> > >> > Added: >> > cfe/trunk/test/CodeGen/ms-builtins.c >> > cfe/trunk/test/Headers/mmprefetch.c >> > Modified: >> > cfe/trunk/include/clang/Basic/Builtins.def >> > cfe/trunk/include/clang/Basic/BuiltinsX86.def >> > cfe/trunk/include/clang/Sema/Sema.h >> > cfe/trunk/lib/CodeGen/CGBuiltin.cpp >> > cfe/trunk/lib/Headers/Intrin.h >> > cfe/trunk/lib/Headers/xmmintrin.h >> > cfe/trunk/lib/Sema/SemaChecking.cpp >> > >> > Modified: cfe/trunk/include/clang/Basic/Builtins.def >> > URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Builtins.def?rev=201734&r1=201733&r2=201734&view=diff >> > >> ============================================================================== >> > --- cfe/trunk/include/clang/Basic/Builtins.def (original) >> > +++ cfe/trunk/include/clang/Basic/Builtins.def Wed Feb 19 17:20:20 2014 >> > @@ -679,6 +679,10 @@ LANGBUILTIN(_alloca, "v*z", "n", AL >> > LANGBUILTIN(__assume, "vb", "n", ALL_MS_LANGUAGES) >> > LANGBUILTIN(__noop, "v.", "n", ALL_MS_LANGUAGES) >> > LANGBUILTIN(__debugbreak, "v", "n", ALL_MS_LANGUAGES) >> > +LANGBUILTIN(_InterlockedCompareExchange, "LiLiD*LiLi", "n", >> ALL_MS_LANGUAGES) >> > +LANGBUILTIN(_InterlockedIncrement, "LiLiD*", "n", ALL_MS_LANGUAGES) >> > +LANGBUILTIN(_InterlockedDecrement, "LiLiD*", "n", ALL_MS_LANGUAGES) >> > +LANGBUILTIN(_InterlockedExchangeAdd, "LiLiD*Li", "n", ALL_MS_LANGUAGES) >> > >> > // C99 library functions >> > // C99 stdlib.h >> > >> > Modified: cfe/trunk/include/clang/Basic/BuiltinsX86.def >> > URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/BuiltinsX86.def?rev=201734&r1=201733&r2=201734&view=diff >> > >> ============================================================================== >> > --- cfe/trunk/include/clang/Basic/BuiltinsX86.def (original) >> > +++ cfe/trunk/include/clang/Basic/BuiltinsX86.def Wed Feb 19 17:20:20 >> 2014 >> > @@ -59,6 +59,7 @@ BUILTIN(__builtin_ia32_pswapdsi, "V2iV2i >> > // All MMX instructions will be generated via builtins. Any MMX vector >> > // types (<1 x i64>, <2 x i32>, etc.) that aren't used by these >> builtins will be >> > // expanded by the back-end. >> > +BUILTIN(_mm_prefetch, "vcC*i", "nc") >> > BUILTIN(__builtin_ia32_emms, "v", "") >> > BUILTIN(__builtin_ia32_paddb, "V8cV8cV8c", "") >> > BUILTIN(__builtin_ia32_paddw, "V4sV4sV4s", "") >> > >> > Modified: cfe/trunk/include/clang/Sema/Sema.h >> > URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=201734&r1=201733&r2=201734&view=diff >> > >> ============================================================================== >> > --- cfe/trunk/include/clang/Sema/Sema.h (original) >> > +++ cfe/trunk/include/clang/Sema/Sema.h Wed Feb 19 17:20:20 2014 >> > @@ -7892,6 +7892,7 @@ private: >> > bool CheckARMBuiltinFunctionCall(unsigned BuiltinID, CallExpr >> *TheCall); >> > bool CheckAArch64BuiltinFunctionCall(unsigned BuiltinID, CallExpr >> *TheCall); >> > bool CheckMipsBuiltinFunctionCall(unsigned BuiltinID, CallExpr >> *TheCall); >> > + bool CheckX86BuiltinFunctionCall(unsigned BuiltinID, CallExpr >> *TheCall); >> > >> > bool SemaBuiltinVAStart(CallExpr *TheCall); >> > bool SemaBuiltinUnorderedCompare(CallExpr *TheCall); >> > @@ -7906,6 +7907,7 @@ public: >> > >> > private: >> > bool SemaBuiltinPrefetch(CallExpr *TheCall); >> > + bool SemaBuiltinMMPrefetch(CallExpr *TheCall); >> > bool SemaBuiltinObjectSize(CallExpr *TheCall); >> > bool SemaBuiltinLongjmp(CallExpr *TheCall); >> > ExprResult SemaBuiltinAtomicOverloaded(ExprResult TheCallResult); >> > >> > Modified: cfe/trunk/lib/CodeGen/CGBuiltin.cpp >> > URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGBuiltin.cpp?rev=201734&r1=201733&r2=201734&view=diff >> > >> ============================================================================== >> > --- cfe/trunk/lib/CodeGen/CGBuiltin.cpp (original) >> > +++ cfe/trunk/lib/CodeGen/CGBuiltin.cpp Wed Feb 19 17:20:20 2014 >> > @@ -1500,6 +1500,42 @@ RValue CodeGenFunction::EmitBuiltinExpr( >> > return RValue::get(EmitLValue(E->getArg(0)).getAddress()); >> > case Builtin::BI__noop: >> > return RValue::get(0); >> > + case Builtin::BI_InterlockedCompareExchange: { >> > + AtomicCmpXchgInst *CXI = Builder.CreateAtomicCmpXchg( >> > + EmitScalarExpr(E->getArg(0)), >> > + EmitScalarExpr(E->getArg(2)), >> > + EmitScalarExpr(E->getArg(1)), >> > + SequentiallyConsistent); >> > + CXI->setVolatile(true); >> > + return RValue::get(CXI); >> > + } >> > + case Builtin::BI_InterlockedIncrement: { >> > + AtomicRMWInst *RMWI = Builder.CreateAtomicRMW( >> > + AtomicRMWInst::Add, >> > + EmitScalarExpr(E->getArg(0)), >> > + ConstantInt::get(Int32Ty, 1), >> > + llvm::SequentiallyConsistent); >> > + RMWI->setVolatile(true); >> > + return RValue::get(Builder.CreateAdd(RMWI, >> ConstantInt::get(Int32Ty, 1))); >> > + } >> > + case Builtin::BI_InterlockedDecrement: { >> > + AtomicRMWInst *RMWI = Builder.CreateAtomicRMW( >> > + AtomicRMWInst::Sub, >> > + EmitScalarExpr(E->getArg(0)), >> > + ConstantInt::get(Int32Ty, 1), >> > + llvm::SequentiallyConsistent); >> > + RMWI->setVolatile(true); >> > + return RValue::get(Builder.CreateSub(RMWI, >> ConstantInt::get(Int32Ty, 1))); >> > + } >> > + case Builtin::BI_InterlockedExchangeAdd: { >> > + AtomicRMWInst *RMWI = Builder.CreateAtomicRMW( >> > + AtomicRMWInst::Add, >> > + EmitScalarExpr(E->getArg(0)), >> > + EmitScalarExpr(E->getArg(1)), >> > + llvm::SequentiallyConsistent); >> > + RMWI->setVolatile(true); >> > + return RValue::get(RMWI); >> > + } >> > } >> > >> > // If this is an alias for a lib function (e.g. __builtin_sin), emit >> > @@ -4487,6 +4523,14 @@ Value *CodeGenFunction::EmitX86BuiltinEx >> > >> > switch (BuiltinID) { >> > default: return 0; >> > + case X86::BI_mm_prefetch: { >> > + Value *Address = EmitScalarExpr(E->getArg(0)); >> > + Value *RW = ConstantInt::get(Int32Ty, 0); >> > + Value *Locality = EmitScalarExpr(E->getArg(1)); >> > + Value *Data = ConstantInt::get(Int32Ty, 1); >> > + Value *F = CGM.getIntrinsic(Intrinsic::prefetch); >> > + return Builder.CreateCall4(F, Address, RW, Locality, Data); >> > + } >> > case X86::BI__builtin_ia32_vec_init_v8qi: >> > case X86::BI__builtin_ia32_vec_init_v4hi: >> > case X86::BI__builtin_ia32_vec_init_v2si: >> > >> > Modified: cfe/trunk/lib/Headers/Intrin.h >> > URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/Intrin.h?rev=201734&r1=201733&r2=201734&view=diff >> > >> ============================================================================== >> > --- cfe/trunk/lib/Headers/Intrin.h (original) >> > +++ cfe/trunk/lib/Headers/Intrin.h Wed Feb 19 17:20:20 2014 >> > @@ -623,10 +623,6 @@ static __inline__ short __attribute__((_ >> > _InterlockedExchangeAdd16(short volatile *_Addend, short _Value) { >> > return __atomic_add_fetch(_Addend, _Value, 0) - _Value; >> > } >> > -static __inline__ long __attribute__((__always_inline__, __nodebug__)) >> > -_InterlockedExchangeAdd(long volatile *_Addend, long _Value) { >> > - return __atomic_add_fetch(_Addend, _Value, 0) - _Value; >> > -} >> > #ifdef __x86_64__ >> > static __inline__ __int64 __attribute__((__always_inline__, >> __nodebug__)) >> > _InterlockedExchangeAdd64(__int64 volatile *_Addend, __int64 _Value) { >> > @@ -661,10 +657,6 @@ static __inline__ short __attribute__((_ >> > _InterlockedIncrement16(short volatile *_Value) { >> > return __atomic_add_fetch(_Value, 1, 0); >> > } >> > -static __inline__ long __attribute__((__always_inline__, __nodebug__)) >> > -_InterlockedIncrement(long volatile *_Value) { >> > - return __atomic_add_fetch(_Value, 1, 0); >> > -} >> > #ifdef __x86_64__ >> > static __inline__ __int64 __attribute__((__always_inline__, >> __nodebug__)) >> > _InterlockedIncrement64(__int64 volatile *_Value) { >> > @@ -678,10 +670,6 @@ static __inline__ short __attribute__((_ >> > _InterlockedDecrement16(short volatile *_Value) { >> > return __atomic_sub_fetch(_Value, 1, 0); >> > } >> > -static __inline__ long __attribute__((__always_inline__, __nodebug__)) >> > -_InterlockedDecrement(long volatile *_Value) { >> > - return __atomic_sub_fetch(_Value, 1, 0); >> > -} >> > #ifdef __x86_64__ >> > static __inline__ __int64 __attribute__((__always_inline__, >> __nodebug__)) >> > _InterlockedDecrement64(__int64 volatile *_Value) { >> > @@ -791,12 +779,6 @@ _InterlockedCompareExchange16(short vola >> > __atomic_compare_exchange(_Destination, &_Comparand, &_Exchange, 0, >> 0, 0); >> > return _Comparand; >> > } >> > -static __inline__ long __attribute__((__always_inline__, __nodebug__)) >> > -_InterlockedCompareExchange(long volatile *_Destination, >> > - long _Exchange, long _Comparand) { >> > - __atomic_compare_exchange(_Destination, &_Comparand, &_Exchange, 0, >> 0, 0); >> > - return _Comparand; >> > -} >> > #ifdef __x86_64__ >> > static __inline__ void *__attribute__((__always_inline__, __nodebug__)) >> > _InterlockedCompareExchangePointer(void *volatile *_Destination, >> > >> > Modified: cfe/trunk/lib/Headers/xmmintrin.h >> > URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/xmmintrin.h?rev=201734&r1=201733&r2=201734&view=diff >> > >> ============================================================================== >> > --- cfe/trunk/lib/Headers/xmmintrin.h (original) >> > +++ cfe/trunk/lib/Headers/xmmintrin.h Wed Feb 19 17:20:20 2014 >> > @@ -672,11 +672,6 @@ _mm_storer_ps(float *__p, __m128 __a) >> > #define _MM_HINT_T2 1 >> > #define _MM_HINT_NTA 0 >> > >> > -/* FIXME: We have to #define this because "sel" must be a constant >> integer, and >> > - Sema doesn't do any form of constant propagation yet. */ >> > - >> > -#define _mm_prefetch(a, sel) (__builtin_prefetch((void *)(a), 0, >> (sel))) >> > - >> > static __inline__ void __attribute__((__always_inline__, __nodebug__)) >> > _mm_stream_pi(__m64 *__p, __m64 __a) >> > { >> > >> > Modified: cfe/trunk/lib/Sema/SemaChecking.cpp >> > URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaChecking.cpp?rev=201734&r1=201733&r2=201734&view=diff >> > >> ============================================================================== >> > --- cfe/trunk/lib/Sema/SemaChecking.cpp (original) >> > +++ cfe/trunk/lib/Sema/SemaChecking.cpp Wed Feb 19 17:20:20 2014 >> > @@ -317,6 +317,11 @@ Sema::CheckBuiltinFunctionCall(unsigned >> > if (CheckMipsBuiltinFunctionCall(BuiltinID, TheCall)) >> > return ExprError(); >> > break; >> > + case llvm::Triple::x86: >> > + case llvm::Triple::x86_64: >> > + if (CheckX86BuiltinFunctionCall(BuiltinID, TheCall)) >> > + return ExprError(); >> > + break; >> > default: >> > break; >> > } >> > @@ -655,6 +660,15 @@ bool Sema::CheckMipsBuiltinFunctionCall( >> > return false; >> > } >> > >> > +bool Sema::CheckX86BuiltinFunctionCall(unsigned BuiltinID, CallExpr >> *TheCall) { >> > + switch (BuiltinID) { >> > + case X86::BI_mm_prefetch: >> > + return SemaBuiltinMMPrefetch(TheCall); >> > + break; >> > + } >> > + return false; >> > +} >> > + >> > /// Given a FunctionDecl's FormatAttr, attempts to populate the >> FomatStringInfo >> > /// parameter with the FormatAttr's correct format_idx and firstDataArg. >> > /// Returns true when the format fits the function and the >> FormatStringInfo has >> > @@ -1920,6 +1934,26 @@ bool Sema::SemaBuiltinPrefetch(CallExpr >> > >> > return false; >> > } >> > + >> > +/// SemaBuiltinMMPrefetch - Handle _mm_prefetch. >> > +// This is declared to take (const char*, int) >> > +bool Sema::SemaBuiltinMMPrefetch(CallExpr *TheCall) { >> > + Expr *Arg = TheCall->getArg(1); >> > + >> > + // We can't check the value of a dependent argument. >> > + if (Arg->isTypeDependent() || Arg->isValueDependent()) >> > + return false; >> > + >> > + llvm::APSInt Result; >> > + if (SemaBuiltinConstantArg(TheCall, 1, Result)) >> > + return true; >> > + >> > + if (Result.getLimitedValue() > 3) >> > + return Diag(TheCall->getLocStart(), >> diag::err_argument_invalid_range) >> > + << "0" << "3" << Arg->getSourceRange(); >> > + >> > + return false; >> > +} >> > >> > /// SemaBuiltinConstantArg - Handle a check if argument ArgNum of >> CallExpr >> > /// TheCall is a constant expression. >> > >> > Added: cfe/trunk/test/CodeGen/ms-builtins.c >> > URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/ms-builtins.c?rev=201734&view=auto >> > >> ============================================================================== >> > --- cfe/trunk/test/CodeGen/ms-builtins.c (added) >> > +++ cfe/trunk/test/CodeGen/ms-builtins.c Wed Feb 19 17:20:20 2014 >> > @@ -0,0 +1,22 @@ >> > +// RUN: %clang_cc1 -triple=i686-unknown-unknown -fms-extensions >> -emit-llvm -o - %s | FileCheck %s >> > + >> > +extern void printf(const char*, ...); >> > +void f(char *a, volatile long* b) { >> > + _mm_prefetch(a, 0); >> > + _mm_prefetch(a, 1); >> > + _mm_prefetch(a, 2); >> > + _mm_prefetch(a, 3); >> > + _InterlockedCompareExchange(b, 1, 0); >> > + _InterlockedIncrement(b); >> > + _InterlockedDecrement(b); >> > + _InterlockedExchangeAdd(b, 2); >> > +}; >> > + >> > +// CHECK: call void @llvm.prefetch(i8* %1, i32 0, i32 0, i32 1) >> > +// CHECK: call void @llvm.prefetch(i8* %3, i32 0, i32 1, i32 1) >> > +// CHECK: call void @llvm.prefetch(i8* %5, i32 0, i32 2, i32 1) >> > +// CHECK: call void @llvm.prefetch(i8* %7, i32 0, i32 3, i32 1) >> > +// CHECK: cmpxchg >> > +// CHECK: atomicrmw volatile add >> > +// CHECK: atomicrmw volatile sub >> > +// CHECK: atomicrmw volatile add >> > >> > Added: cfe/trunk/test/Headers/mmprefetch.c >> > URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Headers/mmprefetch.c?rev=201734&view=auto >> > >> ============================================================================== >> > --- cfe/trunk/test/Headers/mmprefetch.c (added) >> > +++ cfe/trunk/test/Headers/mmprefetch.c Wed Feb 19 17:20:20 2014 >> > @@ -0,0 +1,16 @@ >> > +// RUN: %clang_cc1 -triple=x86_64-unknown-unknown -fms-extensions >> -emit-llvm -verify %s >> > + >> > +#include <mmintrin.h> >> > + >> > +// Check to make sure that _mm_prefetch survives redeclaration. >> > +void _mm_prefetch(char const*, int); >> > + >> > +void f(char *a) { >> > + _mm_prefetch(a, 0); >> > + _mm_prefetch(a, 1); >> > + _mm_prefetch(a, 2); >> > + _mm_prefetch(a, 3); >> > + _mm_prefetch(a, 4); // expected-error {{argument should be a value >> from 0 to 3}} >> > + _mm_prefetch(a, 0, 0); // expected-error {{too many arguments to >> function call, expected 2, have 3}} >> > + _mm_prefetch(a); // expected-error {{too few arguments to function >> call, expected 2, have 1}} >> > +}; >> > >> > >> > _______________________________________________ >> > cfe-commits mailing list >> > [email protected] >> > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >> >> > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits > >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
