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 | fafbf06732746f3ceca21d452d77b144ba8652ae (patch) | |
tree | 828df18dd161d468f4d3be6f25fcad877d37afce /lib/Sema/SemaChecking.cpp | |
parent | 5d70cfddc8a8a450d1425e190f10512a51352e5d (diff) |
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.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@154513 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaChecking.cpp')
-rw-r--r-- | lib/Sema/SemaChecking.cpp | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/lib/Sema/SemaChecking.cpp b/lib/Sema/SemaChecking.cpp index 74832fd32e..c4ed0b0e52 100644 --- a/lib/Sema/SemaChecking.cpp +++ b/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; |