From 5eb1643c2c252821621580cc1a5aeb42516926f0 Mon Sep 17 00:00:00 2001 From: Oleg Endo Date: Sun, 25 Jan 2015 16:54:33 +0000 Subject: [PATCH] re PR libstdc++/29366 (atomics config for sh is weird) 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 | 7 ++ libstdc++-v3/config/cpu/sh/atomicity.h | 91 +++----------------------- 2 files changed, 16 insertions(+), 82 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index c9984d7886e..1620f4e9412 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,10 @@ +2015-01-25 Oleg Endo + + 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 * config/abi/pre/gnu.ver: Tighten GLIBCXX_3.4 patterns to not match diff --git a/libstdc++-v3/config/cpu/sh/atomicity.h b/libstdc++-v3/config/cpu/sh/atomicity.h index e13863f969b..4ae4fc4b039 100644 --- a/libstdc++-v3/config/cpu/sh/atomicity.h +++ b/libstdc++-v3/config/cpu/sh/atomicity.h @@ -22,87 +22,14 @@ // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see // . -#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 - -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 -#include - -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__ */ -- 2.30.2