aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.9/gcc/testsuite/gcc.dg/atomic-generic-aux.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc-4.9/gcc/testsuite/gcc.dg/atomic-generic-aux.c')
-rw-r--r--gcc-4.9/gcc/testsuite/gcc.dg/atomic-generic-aux.c58
1 files changed, 58 insertions, 0 deletions
diff --git a/gcc-4.9/gcc/testsuite/gcc.dg/atomic-generic-aux.c b/gcc-4.9/gcc/testsuite/gcc.dg/atomic-generic-aux.c
new file mode 100644
index 000000000..73e1ed853
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/gcc.dg/atomic-generic-aux.c
@@ -0,0 +1,58 @@
+/* Supply a set of generic atomic functions to test the compiler make the
+ calls properly. */
+/* { dg-do compile } */
+/* { dg-options "-w" } */
+
+/* Test that the generic builtins make calls as expected. */
+
+#include <stdlib.h>
+#include <stdbool.h>
+#include <string.h>
+
+void
+__atomic_exchange (size_t size, void *obj, void *val, void *ret, int model)
+{
+ /* Copy old value into *ret. */
+ memcpy (ret, obj, size);
+ /* Copy val into object. */
+ memcpy (obj, val, size);
+}
+
+
+/* Note that the external version of this routine has the boolean weak/strong
+ parameter removed. This is required by the external library. */
+bool
+__atomic_compare_exchange (size_t size, void *obj, void *expected,
+ void *desired, int model1, int model2)
+{
+ bool ret;
+ if (!memcmp (obj, expected, size))
+ {
+ memcpy (obj, desired, size);
+ ret = true;
+ }
+ else
+ {
+ memcpy (expected, obj, size);
+ ret = false;
+ }
+
+ /* Make sure the parameters have been properly adjusted for the external
+ function call (no weak/strong parameter. */
+ if (model1 != __ATOMIC_SEQ_CST || model2 != __ATOMIC_ACQUIRE)
+ ret = !ret;
+
+ return ret;
+}
+
+
+void __atomic_load (size_t size, void *obj, void *ret, int model)
+{
+ memcpy (ret, obj, size);
+}
+
+
+void __atomic_store (size_t size, void *obj, void *val, int model)
+{
+ memcpy (obj, val, size);
+}