diff options
| author | Richard Smith <richard-llvm@metafoo.co.uk> | 2012-04-11 17:55:32 +0000 |
|---|---|---|
| committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2012-04-11 17:55:32 +0000 |
| commit | b1e36c662bcba0ece7893c575dd7b17b2c5ac985 (patch) | |
| tree | a30596980098cdd37e91e5ce57962b9c3f50f542 /clang/lib | |
| parent | 6e536de1a184fcdf517aa46d39f5b50d3af0ada4 (diff) | |
| download | bcm5719-llvm-b1e36c662bcba0ece7893c575dd7b17b2c5ac985.tar.gz bcm5719-llvm-b1e36c662bcba0ece7893c575dd7b17b2c5ac985.zip | |
Provide, and document, a set of __c11_atomic_* intrinsics to implement C11's
<stdatomic.h> header.
In passing, fix LanguageExtensions to note that C11 and C++11 are no longer
"upcoming standards" but are now actually standardized.
llvm-svn: 154513
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/AST/ExprConstant.cpp | 3 | ||||
| -rw-r--r-- | clang/lib/AST/StmtPrinter.cpp | 22 | ||||
| -rw-r--r-- | clang/lib/CodeGen/CGBuiltin.cpp | 7 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaChecking.cpp | 21 |
4 files changed, 34 insertions, 19 deletions
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index 435d94c1d47..ce413083445 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -4365,7 +4365,8 @@ bool IntExprEvaluator::VisitCallExpr(const CallExpr *E) { return Error(E); - case Builtin::BI__atomic_is_lock_free: { + case Builtin::BI__atomic_is_lock_free: + case Builtin::BI__c11_atomic_is_lock_free: { APSInt SizeVal; if (!EvaluateInteger(E->getArg(0), SizeVal, Info)) return false; diff --git a/clang/lib/AST/StmtPrinter.cpp b/clang/lib/AST/StmtPrinter.cpp index ef5eefb306c..651b88b5d32 100644 --- a/clang/lib/AST/StmtPrinter.cpp +++ b/clang/lib/AST/StmtPrinter.cpp @@ -1109,37 +1109,37 @@ void StmtPrinter::VisitAtomicExpr(AtomicExpr *Node) { const char *Name = 0; switch (Node->getOp()) { case AtomicExpr::Init: - Name = "__atomic_init("; + Name = "__c11_atomic_init("; break; case AtomicExpr::Load: - Name = "__atomic_load("; + Name = "__c11_atomic_load("; break; case AtomicExpr::Store: - Name = "__atomic_store("; + Name = "__c11_atomic_store("; break; case AtomicExpr::CmpXchgStrong: - Name = "__atomic_compare_exchange_strong("; + Name = "__c11_atomic_compare_exchange_strong("; break; case AtomicExpr::CmpXchgWeak: - Name = "__atomic_compare_exchange_weak("; + Name = "__c11_atomic_compare_exchange_weak("; break; case AtomicExpr::Xchg: - Name = "__atomic_exchange("; + Name = "__c11_atomic_exchange("; break; case AtomicExpr::Add: - Name = "__atomic_fetch_add("; + Name = "__c11_atomic_fetch_add("; break; case AtomicExpr::Sub: - Name = "__atomic_fetch_sub("; + Name = "__c11_atomic_fetch_sub("; break; case AtomicExpr::And: - Name = "__atomic_fetch_and("; + Name = "__c11_atomic_fetch_and("; break; case AtomicExpr::Or: - Name = "__atomic_fetch_or("; + Name = "__c11_atomic_fetch_or("; break; case AtomicExpr::Xor: - Name = "__atomic_fetch_xor("; + Name = "__c11_atomic_fetch_xor("; break; } OS << Name; diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index eb849f6e99c..5eab5db94a5 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -967,9 +967,12 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD, } case Builtin::BI__atomic_thread_fence: - case Builtin::BI__atomic_signal_fence: { + case Builtin::BI__atomic_signal_fence: + case Builtin::BI__c11_atomic_thread_fence: + case Builtin::BI__c11_atomic_signal_fence: { llvm::SynchronizationScope Scope; - if (BuiltinID == Builtin::BI__atomic_signal_fence) + if (BuiltinID == Builtin::BI__atomic_signal_fence || + BuiltinID == Builtin::BI__c11_atomic_signal_fence) Scope = llvm::SingleThread; else Scope = llvm::CrossThread; diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index 74832fd32ed..c4ed0b0e529 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -251,28 +251,39 @@ Sema::CheckBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) { case Builtin::BI__sync_swap_16: return SemaBuiltinAtomicOverloaded(move(TheCallResult)); case Builtin::BI__atomic_load: + case Builtin::BI__c11_atomic_load: return SemaAtomicOpsOverloaded(move(TheCallResult), AtomicExpr::Load); case Builtin::BI__atomic_store: + case Builtin::BI__c11_atomic_store: return SemaAtomicOpsOverloaded(move(TheCallResult), AtomicExpr::Store); case Builtin::BI__atomic_init: + case Builtin::BI__c11_atomic_init: return SemaAtomicOpsOverloaded(move(TheCallResult), AtomicExpr::Init); case Builtin::BI__atomic_exchange: + case Builtin::BI__c11_atomic_exchange: return SemaAtomicOpsOverloaded(move(TheCallResult), AtomicExpr::Xchg); case Builtin::BI__atomic_compare_exchange_strong: + case Builtin::BI__c11_atomic_compare_exchange_strong: return SemaAtomicOpsOverloaded(move(TheCallResult), AtomicExpr::CmpXchgStrong); case Builtin::BI__atomic_compare_exchange_weak: + case Builtin::BI__c11_atomic_compare_exchange_weak: return SemaAtomicOpsOverloaded(move(TheCallResult), AtomicExpr::CmpXchgWeak); case Builtin::BI__atomic_fetch_add: + case Builtin::BI__c11_atomic_fetch_add: return SemaAtomicOpsOverloaded(move(TheCallResult), AtomicExpr::Add); case Builtin::BI__atomic_fetch_sub: + case Builtin::BI__c11_atomic_fetch_sub: return SemaAtomicOpsOverloaded(move(TheCallResult), AtomicExpr::Sub); case Builtin::BI__atomic_fetch_and: + case Builtin::BI__c11_atomic_fetch_and: return SemaAtomicOpsOverloaded(move(TheCallResult), AtomicExpr::And); case Builtin::BI__atomic_fetch_or: + case Builtin::BI__c11_atomic_fetch_or: return SemaAtomicOpsOverloaded(move(TheCallResult), AtomicExpr::Or); case Builtin::BI__atomic_fetch_xor: + case Builtin::BI__c11_atomic_fetch_xor: return SemaAtomicOpsOverloaded(move(TheCallResult), AtomicExpr::Xor); case Builtin::BI__builtin_annotation: if (CheckBuiltinAnnotationString(*this, TheCall->getArg(1))) @@ -510,11 +521,11 @@ Sema::SemaAtomicOpsOverloaded(ExprResult TheCallResult, AtomicExpr::AtomicOp Op) DeclRefExpr *DRE =cast<DeclRefExpr>(TheCall->getCallee()->IgnoreParenCasts()); // All these operations take one of the following four forms: - // T __atomic_load(_Atomic(T)*, int) (loads) - // T* __atomic_add(_Atomic(T*)*, ptrdiff_t, int) (pointer add/sub) - // int __atomic_compare_exchange_strong(_Atomic(T)*, T*, T, int, int) - // (cmpxchg) - // T __atomic_exchange(_Atomic(T)*, T, int) (everything else) + // T __c11_atomic_load(_Atomic(T)*, int) (loads) + // T* __c11_atomic_add(_Atomic(T*)*, ptrdiff_t, int) (pointer add/sub) + // int __c11_atomic_compare_exchange_strong(_Atomic(T)*, T*, T, int, int) + // (cmpxchg) + // T __c11_atomic_exchange(_Atomic(T)*, T, int) (everything else) // where T is an appropriate type, and the int paremeterss are for orderings. unsigned NumVals = 1; unsigned NumOrders = 1; |

