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 /test | |
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 'test')
-rw-r--r-- | test/CodeGen/atomic-ops.c | 36 | ||||
-rw-r--r-- | test/CodeGen/atomic_init.c | 4 | ||||
-rw-r--r-- | test/Preprocessor/feature_tests.c | 1 | ||||
-rw-r--r-- | test/Sema/atomic-ops.c | 52 |
4 files changed, 47 insertions, 46 deletions
diff --git a/test/CodeGen/atomic-ops.c b/test/CodeGen/atomic-ops.c index 2285cca723..c94f14023e 100644 --- a/test/CodeGen/atomic-ops.c +++ b/test/CodeGen/atomic-ops.c @@ -7,9 +7,9 @@ #ifndef ALREADY_INCLUDED #define ALREADY_INCLUDED -// Basic IRGen tests for __atomic_* +// Basic IRGen tests for __c11_atomic_* -// FIXME: Need to implement __atomic_is_lock_free +// FIXME: Need to implement __c11_atomic_is_lock_free typedef enum memory_order { memory_order_relaxed, memory_order_consume, memory_order_acquire, @@ -19,74 +19,74 @@ typedef enum memory_order { int fi1(_Atomic(int) *i) { // CHECK: @fi1 // CHECK: load atomic i32* {{.*}} seq_cst - return __atomic_load(i, memory_order_seq_cst); + return __c11_atomic_load(i, memory_order_seq_cst); } void fi2(_Atomic(int) *i) { // CHECK: @fi2 // CHECK: store atomic i32 {{.*}} seq_cst - __atomic_store(i, 1, memory_order_seq_cst); + __c11_atomic_store(i, 1, memory_order_seq_cst); } void fi3(_Atomic(int) *i) { // CHECK: @fi3 // CHECK: atomicrmw and - __atomic_fetch_and(i, 1, memory_order_seq_cst); + __c11_atomic_fetch_and(i, 1, memory_order_seq_cst); } void fi4(_Atomic(int) *i) { // CHECK: @fi4 // CHECK: cmpxchg i32* int cmp = 0; - __atomic_compare_exchange_strong(i, &cmp, 1, memory_order_acquire, memory_order_acquire); + __c11_atomic_compare_exchange_strong(i, &cmp, 1, memory_order_acquire, memory_order_acquire); } float ff1(_Atomic(float) *d) { // CHECK: @ff1 // CHECK: load atomic i32* {{.*}} monotonic - return __atomic_load(d, memory_order_relaxed); + return __c11_atomic_load(d, memory_order_relaxed); } void ff2(_Atomic(float) *d) { // CHECK: @ff2 // CHECK: store atomic i32 {{.*}} release - __atomic_store(d, 1, memory_order_release); + __c11_atomic_store(d, 1, memory_order_release); } float ff3(_Atomic(float) *d) { - return __atomic_exchange(d, 2, memory_order_seq_cst); + return __c11_atomic_exchange(d, 2, memory_order_seq_cst); } int* fp1(_Atomic(int*) *p) { // CHECK: @fp1 // CHECK: load atomic i32* {{.*}} seq_cst - return __atomic_load(p, memory_order_seq_cst); + return __c11_atomic_load(p, memory_order_seq_cst); } int* fp2(_Atomic(int*) *p) { // CHECK: @fp2 // CHECK: store i32 4 // CHECK: atomicrmw add {{.*}} monotonic - return __atomic_fetch_add(p, 1, memory_order_relaxed); + return __c11_atomic_fetch_add(p, 1, memory_order_relaxed); } _Complex float fc(_Atomic(_Complex float) *c) { // CHECK: @fc // CHECK: atomicrmw xchg i64* - return __atomic_exchange(c, 2, memory_order_seq_cst); + return __c11_atomic_exchange(c, 2, memory_order_seq_cst); } typedef struct X { int x; } X; X fs(_Atomic(X) *c) { // CHECK: @fs // CHECK: atomicrmw xchg i32* - return __atomic_exchange(c, (X){2}, memory_order_seq_cst); + return __c11_atomic_exchange(c, (X){2}, memory_order_seq_cst); } int lock_free() { // CHECK: @lock_free // CHECK: ret i32 1 - return __atomic_is_lock_free(sizeof(_Atomic(int))); + return __c11_atomic_is_lock_free(sizeof(_Atomic(int))); } // Tests for atomic operations on big values. These should call the functions @@ -102,18 +102,18 @@ _Atomic(struct foo) bigAtomic; void structAtomicStore() { // CHECK: @structAtomicStore struct foo f = {0}; - __atomic_store(&bigAtomic, f, 5); + __c11_atomic_store(&bigAtomic, f, 5); // CHECK: call void @__atomic_store(i32 512, i8* bitcast (%struct.foo* @bigAtomic to i8*), } void structAtomicLoad() { // CHECK: @structAtomicLoad - struct foo f = __atomic_load(&bigAtomic, 5); + struct foo f = __c11_atomic_load(&bigAtomic, 5); // CHECK: call void @__atomic_load(i32 512, i8* bitcast (%struct.foo* @bigAtomic to i8*), } struct foo structAtomicExchange() { // CHECK: @structAtomicExchange struct foo f = {0}; - return __atomic_exchange(&bigAtomic, f, 5); + return __c11_atomic_exchange(&bigAtomic, f, 5); // CHECK: call void @__atomic_exchange(i32 512, i8* bitcast (%struct.foo* @bigAtomic to i8*), } int structAtomicCmpExchange() { @@ -121,7 +121,7 @@ int structAtomicCmpExchange() { struct foo f = {0}; struct foo g = {0}; g.big[12] = 12; - return __atomic_compare_exchange_strong(&bigAtomic, &f, g, 5, 5); + return __c11_atomic_compare_exchange_strong(&bigAtomic, &f, g, 5, 5); // CHECK: call zeroext i1 @__atomic_compare_exchange(i32 512, i8* bitcast (%struct.foo* @bigAtomic to i8*), } diff --git a/test/CodeGen/atomic_init.c b/test/CodeGen/atomic_init.c index 243eb602cb..6f773bef48 100644 --- a/test/CodeGen/atomic_init.c +++ b/test/CodeGen/atomic_init.c @@ -9,6 +9,6 @@ void foo() { _Atomic(int) j = 12; // CHECK: store // CHECK-NOT: atomic - __atomic_init(&j, 42); // CHECK: store - // CHECK-NOT: atomic + __c11_atomic_init(&j, 42); // CHECK: store + // CHECK-NOT: atomic } diff --git a/test/Preprocessor/feature_tests.c b/test/Preprocessor/feature_tests.c index be9c62d780..b78a2517b1 100644 --- a/test/Preprocessor/feature_tests.c +++ b/test/Preprocessor/feature_tests.c @@ -12,6 +12,7 @@ #if !__has_builtin(__builtin_huge_val) || \ !__has_builtin(__builtin_shufflevector) || \ !__has_builtin(__builtin_trap) || \ + !__has_builtin(__c11_atomic_init) || \ !__has_feature(attribute_analyzer_noreturn) || \ !__has_feature(attribute_overloadable) #error Clang should have these diff --git a/test/Sema/atomic-ops.c b/test/Sema/atomic-ops.c index 51b46bd5d0..0560a747ab 100644 --- a/test/Sema/atomic-ops.c +++ b/test/Sema/atomic-ops.c @@ -1,8 +1,8 @@ // RUN: %clang_cc1 %s -verify -fsyntax-only -// Basic parsing/Sema tests for __atomic_* +// Basic parsing/Sema tests for __c11_atomic_* -// FIXME: Need to implement __atomic_is_lock_free +// FIXME: Need to implement __c11_atomic_is_lock_free typedef enum memory_order { memory_order_relaxed, memory_order_consume, memory_order_acquire, @@ -10,28 +10,28 @@ typedef enum memory_order { } memory_order; void f(_Atomic(int) *i, _Atomic(int*) *p, _Atomic(float) *d) { - __atomic_load(0); // expected-error {{too few arguments to function}} - __atomic_load(0,0,0); // expected-error {{too many arguments to function}} - __atomic_store(0,0,0); // expected-error {{first argument to atomic operation}} - __atomic_store((int*)0,0,0); // expected-error {{first argument to atomic operation}} - - __atomic_load(i, memory_order_seq_cst); - __atomic_load(p, memory_order_seq_cst); - __atomic_load(d, memory_order_seq_cst); - - __atomic_store(i, 1, memory_order_seq_cst); - __atomic_store(p, 1, memory_order_seq_cst); // expected-warning {{incompatible integer to pointer conversion}} - (int)__atomic_store(d, 1, memory_order_seq_cst); // expected-error {{operand of type 'void'}} - - __atomic_fetch_add(i, 1, memory_order_seq_cst); - __atomic_fetch_add(p, 1, memory_order_seq_cst); - __atomic_fetch_add(d, 1, memory_order_seq_cst); // expected-error {{must be a pointer to atomic integer or pointer}} - - __atomic_fetch_and(i, 1, memory_order_seq_cst); - __atomic_fetch_and(p, 1, memory_order_seq_cst); // expected-error {{must be a pointer to atomic integer}} - __atomic_fetch_and(d, 1, memory_order_seq_cst); // expected-error {{must be a pointer to atomic integer}} - - __atomic_compare_exchange_strong(i, 0, 1, memory_order_seq_cst, memory_order_seq_cst); - __atomic_compare_exchange_strong(p, 0, (int*)1, memory_order_seq_cst, memory_order_seq_cst); - __atomic_compare_exchange_strong(d, (int*)0, 1, memory_order_seq_cst, memory_order_seq_cst); // expected-warning {{incompatible pointer types}} + __c11_atomic_load(0); // expected-error {{too few arguments to function}} + __c11_atomic_load(0,0,0); // expected-error {{too many arguments to function}} + __c11_atomic_store(0,0,0); // expected-error {{first argument to atomic operation}} + __c11_atomic_store((int*)0,0,0); // expected-error {{first argument to atomic operation}} + + __c11_atomic_load(i, memory_order_seq_cst); + __c11_atomic_load(p, memory_order_seq_cst); + __c11_atomic_load(d, memory_order_seq_cst); + + __c11_atomic_store(i, 1, memory_order_seq_cst); + __c11_atomic_store(p, 1, memory_order_seq_cst); // expected-warning {{incompatible integer to pointer conversion}} + (int)__c11_atomic_store(d, 1, memory_order_seq_cst); // expected-error {{operand of type 'void'}} + + __c11_atomic_fetch_add(i, 1, memory_order_seq_cst); + __c11_atomic_fetch_add(p, 1, memory_order_seq_cst); + __c11_atomic_fetch_add(d, 1, memory_order_seq_cst); // expected-error {{must be a pointer to atomic integer or pointer}} + + __c11_atomic_fetch_and(i, 1, memory_order_seq_cst); + __c11_atomic_fetch_and(p, 1, memory_order_seq_cst); // expected-error {{must be a pointer to atomic integer}} + __c11_atomic_fetch_and(d, 1, memory_order_seq_cst); // expected-error {{must be a pointer to atomic integer}} + + __c11_atomic_compare_exchange_strong(i, 0, 1, memory_order_seq_cst, memory_order_seq_cst); + __c11_atomic_compare_exchange_strong(p, 0, (int*)1, memory_order_seq_cst, memory_order_seq_cst); + __c11_atomic_compare_exchange_strong(d, (int*)0, 1, memory_order_seq_cst, memory_order_seq_cst); // expected-warning {{incompatible pointer types}} } |