nvptx.c (write_fn_proto): Handle BUILT_IN_ATOMIC_COMPARE_EXCHANGE_n oddity.
authorNathan Sidwell <nathan@acm.org>
Fri, 13 May 2016 12:57:50 +0000 (12:57 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Fri, 13 May 2016 12:57:50 +0000 (12:57 +0000)
gcc/
* config/nvptx/nvptx.c (write_fn_proto): Handle
BUILT_IN_ATOMIC_COMPARE_EXCHANGE_n oddity.

gcc/testsuite/
* gcc.dg/atomic-noinline-aux.c: Include stddef.h. Fix
__atomic_is_lock_free declaration.

From-SVN: r236209

gcc/ChangeLog
gcc/config/nvptx/nvptx.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/atomic-noinline-aux.c

index 14c37d769b474f2e77427c44ad5532520bb1cc75..005b7010f5b528d937f46adad631bb72618c2a5d 100644 (file)
@@ -1,3 +1,8 @@
+2016-05-13  Nathan Sidwell  <nathan@acm.org>
+
+       * config/nvptx/nvptx.c (write_fn_proto): Handle
+       BUILT_IN_ATOMIC_COMPARE_EXCHANGE_n oddity.
+
 2016-05-13  Martin Liska  <mliska@suse.cz>
 
        * tree-ssa-loop-ivopts.c (create_new_ivs): Use HOST_WIDE_INT_PRINT_DEC
index a6c90b633f91c32695ee6b4cbb2f6dd19829559e..1631dae8fd9788594c08918b00f925c607cef660 100644 (file)
@@ -751,6 +751,26 @@ write_fn_proto (std::stringstream &s, bool is_defn,
   tree fntype = TREE_TYPE (decl);
   tree result_type = TREE_TYPE (fntype);
 
+  /* atomic_compare_exchange_$n builtins have an exceptional calling
+     convention.  */
+  int not_atomic_weak_arg = -1;
+  if (DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL)
+    switch (DECL_FUNCTION_CODE (decl))
+      {
+      case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_1:
+      case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_2:
+      case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_4:
+      case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_8:
+      case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_16:
+       /* These atomics skip the 'weak' parm in an actual library
+          call.  We must skip it in the prototype too.  */
+       not_atomic_weak_arg = 3;
+       break;
+
+      default:
+       break;
+      }
+
   /* Declare the result.  */
   bool return_in_mem = write_return_type (s, true, result_type);
 
@@ -775,11 +795,14 @@ write_fn_proto (std::stringstream &s, bool is_defn,
       prototyped = false;
     }
 
-  for (; args; args = TREE_CHAIN (args))
+  for (; args; args = TREE_CHAIN (args), not_atomic_weak_arg--)
     {
       tree type = prototyped ? TREE_VALUE (args) : TREE_TYPE (args);
-
-      argno = write_arg_type (s, -1, argno, type, prototyped);
+      
+      if (not_atomic_weak_arg)
+       argno = write_arg_type (s, -1, argno, type, prototyped);
+      else
+       gcc_assert (type == boolean_type_node);
     }
 
   if (stdarg_p (fntype))
index 57b7580edafe71637fe8c789934f35b5b0f34997..3e971cd7d907931990d653718f60d20ea5e822cb 100644 (file)
@@ -1,3 +1,8 @@
+2016-05-13  Nathan Sidwell  <nathan@acm.org>
+
+       * gcc.dg/atomic-noinline-aux.c: Include stddef.h. Fix
+       __atomic_is_lock_free declaration.
+
 2016-05-13  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/42587
index 97989798fe5beaa388a049ab3ca2ffae9af39e43..f0e3387b980b12d0d083fc4f3296e9ffa6e9ca2a 100644 (file)
@@ -7,6 +7,7 @@
    the exact entry points the test file will require.  All these routines
    simply set the first parameter to 1, and the caller will test for that.  */
 
+#include <stddef.h>
 #include <stdlib.h>
 #include <stdbool.h>
 #include <string.h>
@@ -64,7 +65,7 @@ __atomic_fetch_nand_1 (unsigned char *p, unsigned char v, int i)
   return ret;
 }
 
-bool __atomic_is_lock_free (int i, void *p)
+bool __atomic_is_lock_free (size_t i, void *p)
 {
   *(short *)p = 1;
   return true;