This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Fix 32-bit __atomic_*_16 problems (hopefully)
- From: "Joseph S. Myers" <joseph at codesourcery dot com>
- To: <gcc-patches at gcc dot gnu dot org>
- Cc: Uros Bizjak <ubizjak at gmail dot com>, Andreas Schwab <schwab at linux-m68k dot org>, Dominique Dhumieres <dominiq at lps dot ens dot fr>
- Date: Fri, 8 Nov 2013 22:30:15 +0000
- Subject: Fix 32-bit __atomic_*_16 problems (hopefully)
- Authentication-results: sourceware.org; auth=none
I hope this patch will fix the issues people have seen with atomics
tests failing on 32-bit architectures with missing __atomic_*_16 (or
at least replace them by different problems). I'm running tests on
x86_64-unknown-linux-gnu; perhaps someone seeing the 32-bit problems
could test it there?
2013-11-08 Joseph Myers <joseph@codesourcery.com>
* c-common.c (atomic_size_supported_p): New function.
(resolve_overloaded_atomic_exchange)
(resolve_overloaded_atomic_compare_exchange)
(resolve_overloaded_atomic_load, resolve_overloaded_atomic_store):
Use it instead of comparing size with a local list of sizes.
Index: c-family/c-common.c
===================================================================
--- c-family/c-common.c (revision 204602)
+++ c-family/c-common.c (working copy)
@@ -10403,6 +10403,27 @@ add_atomic_size_parameter (unsigned n, location_t
}
+/* Return whether atomic operations for naturally aligned N-byte
+ arguments are supported, whether inline or through libatomic. */
+static bool
+atomic_size_supported_p (int n)
+{
+ switch (n)
+ {
+ case 1:
+ case 2:
+ case 4:
+ case 8:
+ return true;
+
+ case 16:
+ return targetm.scalar_mode_supported_p (TImode);
+
+ default:
+ return false;
+ }
+}
+
/* This will process an __atomic_exchange function call, determine whether it
needs to be mapped to the _N variation, or turned into a library call.
LOC is the location of the builtin call.
@@ -10428,7 +10449,7 @@ resolve_overloaded_atomic_exchange (location_t loc
}
/* If not a lock-free size, change to the library generic format. */
- if (n != 1 && n != 2 && n != 4 && n != 8 && n != 16)
+ if (!atomic_size_supported_p (n))
{
*new_return = add_atomic_size_parameter (n, loc, function, params);
return true;
@@ -10493,7 +10514,7 @@ resolve_overloaded_atomic_compare_exchange (locati
}
/* If not a lock-free size, change to the library generic format. */
- if (n != 1 && n != 2 && n != 4 && n != 8 && n != 16)
+ if (!atomic_size_supported_p (n))
{
/* The library generic format does not have the weak parameter, so
remove it from the param list. Since a parameter has been removed,
@@ -10569,7 +10590,7 @@ resolve_overloaded_atomic_load (location_t loc, tr
}
/* If not a lock-free size, change to the library generic format. */
- if (n != 1 && n != 2 && n != 4 && n != 8 && n != 16)
+ if (!atomic_size_supported_p (n))
{
*new_return = add_atomic_size_parameter (n, loc, function, params);
return true;
@@ -10629,7 +10650,7 @@ resolve_overloaded_atomic_store (location_t loc, t
}
/* If not a lock-free size, change to the library generic format. */
- if (n != 1 && n != 2 && n != 4 && n != 8 && n != 16)
+ if (!atomic_size_supported_p (n))
{
*new_return = add_atomic_size_parameter (n, loc, function, params);
return true;
--
Joseph S. Myers
joseph@codesourcery.com