This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix atomic builtins on arrays (PR target/82112)


Hi!

The powerpc patch I've just posted led me to try __atomic_* builtins
on arrays as in the testcase below.  While it works fine if the
array is just on the first argument or in C, in C++ for arrays in 2nd
or 3rd argument the atomics are rejected (complaining that the argument
is not a pointer), while we should really have performed array-to-pointer
conversion first.

Fixed thusly, bootstrapped/regtested on powerpc64-linux, ok for trunk?

2017-09-07  Jakub Jelinek  <jakub@redhat.com>

	PR target/82112
	* c-common.c (sync_resolve_size): Formatting fix.
	(get_atomic_generic_size): Likewise.  Before testing if parameter
	has pointer type, if it has array type, call for C++
	default_conversion to perform array-to-pointer conversion.

	* c-c++-common/pr82112.c: New test.

--- gcc/c-family/c-common.c.jj	2017-09-01 09:25:35.000000000 +0200
+++ gcc/c-family/c-common.c	2017-09-06 14:47:11.781523252 +0200
@@ -6481,7 +6481,7 @@ sync_resolve_size (tree function, vec<tr
   if (TREE_CODE (type) == ARRAY_TYPE)
     {
       /* Force array-to-pointer decay for C++.  */
-      gcc_assert (c_dialect_cxx());
+      gcc_assert (c_dialect_cxx ());
       (*params)[0] = default_conversion ((*params)[0]);
       type = TREE_TYPE ((*params)[0]);
     }
@@ -6649,7 +6649,7 @@ get_atomic_generic_size (location_t loc,
   if (TREE_CODE (type_0) == ARRAY_TYPE)
     {
       /* Force array-to-pointer decay for C++.  */
-      gcc_assert (c_dialect_cxx());
+      gcc_assert (c_dialect_cxx ());
       (*params)[0] = default_conversion ((*params)[0]);
       type_0 = TREE_TYPE ((*params)[0]);
     }
@@ -6688,6 +6688,13 @@ get_atomic_generic_size (location_t loc,
       /* __atomic_compare_exchange has a bool in the 4th position, skip it.  */
       if (n_param == 6 && x == 3)
         continue;
+      if (TREE_CODE (type) == ARRAY_TYPE)
+	{
+	  /* Force array-to-pointer decay for C++.  */
+	  gcc_assert (c_dialect_cxx ());
+	  (*params)[x] = default_conversion ((*params)[x]);
+	  type = TREE_TYPE ((*params)[x]);
+	}
       if (!POINTER_TYPE_P (type))
 	{
 	  error_at (loc, "argument %d of %qE must be a pointer type", x + 1,
--- gcc/testsuite/c-c++-common/pr82112.c.jj	2017-09-06 15:21:06.720336134 +0200
+++ gcc/testsuite/c-c++-common/pr82112.c	2017-09-06 15:21:25.138116835 +0200
@@ -0,0 +1,13 @@
+/* PR target/82112 */
+/* { dg-do compile } */
+
+int c[10], d[10], e[10], f[10], g[10], h[10], i[10], j[10], k[10], l[10];
+
+void
+foo (void)
+{
+  __atomic_load (c, d, __ATOMIC_ACQUIRE);
+  __atomic_store (e, f, __ATOMIC_SEQ_CST);
+  __atomic_exchange (g, h, i, __ATOMIC_RELAXED);
+  __atomic_compare_exchange (j, k, l, 1, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
+}

	Jakub


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]