re PR libstdc++/29366 (atomics config for sh is weird)
authorOleg Endo <olegendo@gcc.gnu.org>
Sun, 25 Jan 2015 16:54:33 +0000 (16:54 +0000)
committerOleg Endo <olegendo@gcc.gnu.org>
Sun, 25 Jan 2015 16:54:33 +0000 (16:54 +0000)
libstdc++-v3/
PR target/29366
* config/cpu/sh/atomicity.h (__exchange_and_add, __atomic_add):
Remove SH4A inline asm and lock based implementations and use the
defaults from ext/atomicity.h.

From-SVN: r220094

libstdc++-v3/ChangeLog
libstdc++-v3/config/cpu/sh/atomicity.h

index c9984d7886e03e77ddc37c8ca869c741bed7c15d..1620f4e941254617755600ae1f76e70c3a6eb9ca 100644 (file)
@@ -1,3 +1,10 @@
+2015-01-25  Oleg Endo  <olegendo@gcc.gnu.org>
+
+       PR target/29366
+       * config/cpu/sh/atomicity.h (__exchange_and_add, __atomic_add): 
+       Remove SH4A inline asm and lock based implementations and use the
+       defaults from ext/atomicity.h.
+
 2015-01-23  Jonathan Wakely  <jwakely@redhat.com>
 
        * config/abi/pre/gnu.ver: Tighten GLIBCXX_3.4 patterns to not match
index e13863f969b9efadfb8b4d38fbe37485bd00fe28..4ae4fc4b039fcb04c9f0270efaf47de84d0febbf 100644 (file)
 // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 // <http://www.gnu.org/licenses/>.
 
-#ifdef __SH4A__
+// Use the default atomicity stuff, which will use __atomic* builtins
+// if threads are available, or the *_single functions on single-thread
+// configurations.
+// Actually we wouldn't need this header at all, but because of PR 53579
+// libstdc++'s configury will not pickup the -matomic-model= option when
+// set in the environment.  This makes it impossible to enable the proper
+// atomic model on SH without modifying GCC itself, because libstdc++ always
+// thinks the target doesn't do any atomics and uses the default mutex based
+// implementation from cpu/generic/atomicity/mutex.
 
 #include <ext/atomicity.h>
-
-namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
-{
-_GLIBCXX_BEGIN_NAMESPACE_VERSION
-
-  typedef int _Atomic_word;
-
-  _Atomic_word
-  __attribute__ ((__unused__))
-  __exchange_and_add (volatile _Atomic_word* __mem, int __val) throw ()
-  {
-    _Atomic_word __result;
-
-    __asm__ __volatile__
-      ("0:\n"
-       "\tmovli.l\t@%2,r0\n"
-       "\tmov\tr0,%1\n"
-       "\tadd\t%3,r0\n"
-       "\tmovco.l\tr0,@%2\n"
-       "\tbf\t0b"
-       : "+m" (*__mem), "=&r" (__result)
-       : "r" (__mem), "rI08" (__val)
-       : "r0");
-
-    return __result;
-  }
-
-
-  void
-  __attribute__ ((__unused__))
-  __atomic_add (volatile _Atomic_word* __mem, int __val) throw ()
-  {
-    asm("0:\n"
-       "\tmovli.l\t@%1,r0\n"
-       "\tadd\t%2,r0\n"
-       "\tmovco.l\tr0,@%1\n"
-       "\tbf\t0b"
-       : "+m" (*__mem)
-       : "r" (__mem), "rI08" (__val)
-       : "r0");
-  }
-
-_GLIBCXX_END_NAMESPACE_VERSION
-} // namespace
-
-#else /* !__SH4A__ */
-
-/* This is generic/atomicity.h */
-
-#include <ext/atomicity.h>
-#include <ext/concurrence.h>
-
-namespace 
-{
-  __gnu_cxx::__mutex atomic_mutex;
-} // anonymous namespace
-
-namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
-{
-_GLIBCXX_BEGIN_NAMESPACE_VERSION
-
-  _Atomic_word
-  __attribute__ ((__unused__))
-  __exchange_and_add(volatile _Atomic_word* __mem, int __val) throw ()
-  {
-    __gnu_cxx::__scoped_lock sentry(atomic_mutex);
-    _Atomic_word __result;
-    __result = *__mem;
-    *__mem += __val;
-    return __result;
-  }
-
-  void
-  __attribute__ ((__unused__))
-  __atomic_add(volatile _Atomic_word* __mem, int __val) throw ()
-  { __exchange_and_add(__mem, __val); }
-
-_GLIBCXX_END_NAMESPACE_VERSION
-} // namespace
-
-#endif /* !__SH4A__ */