Commit ac3d02e2 by Nathan Sidwell Committed by Nathan Sidwell

nvptx.c (write_fn_proto): Handle BUILT_IN_ATOMIC_COMPARE_EXCHANGE_n oddity.

	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
parent 7549163c
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> 2016-05-13 Martin Liska <mliska@suse.cz>
* tree-ssa-loop-ivopts.c (create_new_ivs): Use HOST_WIDE_INT_PRINT_DEC * tree-ssa-loop-ivopts.c (create_new_ivs): Use HOST_WIDE_INT_PRINT_DEC
......
...@@ -751,6 +751,26 @@ write_fn_proto (std::stringstream &s, bool is_defn, ...@@ -751,6 +751,26 @@ write_fn_proto (std::stringstream &s, bool is_defn,
tree fntype = TREE_TYPE (decl); tree fntype = TREE_TYPE (decl);
tree result_type = TREE_TYPE (fntype); 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. */ /* Declare the result. */
bool return_in_mem = write_return_type (s, true, result_type); bool return_in_mem = write_return_type (s, true, result_type);
...@@ -775,11 +795,14 @@ write_fn_proto (std::stringstream &s, bool is_defn, ...@@ -775,11 +795,14 @@ write_fn_proto (std::stringstream &s, bool is_defn,
prototyped = false; 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); 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)) if (stdarg_p (fntype))
......
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> 2016-05-13 Richard Biener <rguenther@suse.de>
PR tree-optimization/42587 PR tree-optimization/42587
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
the exact entry points the test file will require. All these routines 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. */ simply set the first parameter to 1, and the caller will test for that. */
#include <stddef.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdbool.h> #include <stdbool.h>
#include <string.h> #include <string.h>
...@@ -64,7 +65,7 @@ __atomic_fetch_nand_1 (unsigned char *p, unsigned char v, int i) ...@@ -64,7 +65,7 @@ __atomic_fetch_nand_1 (unsigned char *p, unsigned char v, int i)
return ret; return ret;
} }
bool __atomic_is_lock_free (int i, void *p) bool __atomic_is_lock_free (size_t i, void *p)
{ {
*(short *)p = 1; *(short *)p = 1;
return true; return true;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment