You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
176 lines
7.1 KiB
176 lines
7.1 KiB
libstdc++: Remove symbols for new std::call_once implementation [PR 99341] |
|
|
|
This removes the new symbols added for the new futex-based |
|
std::call_once implementation. These symbols were new on trunk, so not |
|
in any released version. However, they are already present in some |
|
beta distro releases (Fedora Linux 34) and in Fedora Linux rawhide. This |
|
change can be locally reverted by distros that need to keep the symbols |
|
present until affected packages have been rebuilt. |
|
|
|
Revert: |
|
2021-03-12 Jonathan Wakely <jwakely@redhat.com> |
|
|
|
PR libstdc++/99341 |
|
* config/abi/post/aarch64-linux-gnu/baseline_symbols.txt: Remove |
|
std::once_flag symbols. |
|
* config/abi/post/ia64-linux-gnu/baseline_symbols.txt: Likewise. |
|
* config/abi/post/m68k-linux-gnu/baseline_symbols.txt: Likewise. |
|
* config/abi/post/riscv64-linux-gnu/baseline_symbols.txt: |
|
Likewise. |
|
* config/abi/pre/gnu.ver: Likewise. |
|
* src/c++11/mutex.cc [_GLIBCXX_HAVE_LINUX_FUTEX] |
|
(struct __once_flag_compat): Remove. |
|
(_ZNSt9once_flag11_M_activateEv): Remove. |
|
(_ZNSt9once_flag9_M_finishEb): Remove. |
|
|
|
--- libstdc++-v3/config/abi/post/aarch64-linux-gnu/baseline_symbols.txt |
|
+++ libstdc++-v3/config/abi/post/aarch64-linux-gnu/baseline_symbols.txt |
|
@@ -4086,6 +4086,8 @@ FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Em@@GLIBCXX |
|
FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCXX_3.4 |
|
FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCXX_3.4 |
|
FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCXX_3.4 |
|
+FUNC:_ZNSt9once_flag11_M_activateEv@@GLIBCXX_3.4.29 |
|
+FUNC:_ZNSt9once_flag9_M_finishEb@@GLIBCXX_3.4.29 |
|
FUNC:_ZNSt9strstream3strEv@@GLIBCXX_3.4 |
|
FUNC:_ZNSt9strstream6freezeEb@@GLIBCXX_3.4 |
|
FUNC:_ZNSt9strstreamC1EPciSt13_Ios_Openmode@@GLIBCXX_3.4 |
|
--- libstdc++-v3/config/abi/post/ia64-linux-gnu/baseline_symbols.txt |
|
+++ libstdc++-v3/config/abi/post/ia64-linux-gnu/baseline_symbols.txt |
|
@@ -4086,6 +4086,8 @@ FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Em@@GLIBCXX |
|
FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCXX_3.4 |
|
FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCXX_3.4 |
|
FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCXX_3.4 |
|
+FUNC:_ZNSt9once_flag11_M_activateEv@@GLIBCXX_3.4.29 |
|
+FUNC:_ZNSt9once_flag9_M_finishEb@@GLIBCXX_3.4.29 |
|
FUNC:_ZNSt9strstream3strEv@@GLIBCXX_3.4 |
|
FUNC:_ZNSt9strstream6freezeEb@@GLIBCXX_3.4 |
|
FUNC:_ZNSt9strstreamC1EPciSt13_Ios_Openmode@@GLIBCXX_3.4 |
|
--- libstdc++-v3/config/abi/post/m68k-linux-gnu/baseline_symbols.txt |
|
+++ libstdc++-v3/config/abi/post/m68k-linux-gnu/baseline_symbols.txt |
|
@@ -4086,6 +4086,8 @@ FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Ej@@GLIBCXX |
|
FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCXX_3.4 |
|
FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCXX_3.4 |
|
FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCXX_3.4 |
|
+FUNC:_ZNSt9once_flag11_M_activateEv@@GLIBCXX_3.4.29 |
|
+FUNC:_ZNSt9once_flag9_M_finishEb@@GLIBCXX_3.4.29 |
|
FUNC:_ZNSt9strstream3strEv@@GLIBCXX_3.4 |
|
FUNC:_ZNSt9strstream6freezeEb@@GLIBCXX_3.4 |
|
FUNC:_ZNSt9strstreamC1EPciSt13_Ios_Openmode@@GLIBCXX_3.4 |
|
--- libstdc++-v3/config/abi/post/riscv64-linux-gnu/baseline_symbols.txt |
|
+++ libstdc++-v3/config/abi/post/riscv64-linux-gnu/baseline_symbols.txt |
|
@@ -4086,6 +4086,8 @@ FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Em@@GLIBCXX |
|
FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCXX_3.4 |
|
FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCXX_3.4 |
|
FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCXX_3.4 |
|
+FUNC:_ZNSt9once_flag11_M_activateEv@@GLIBCXX_3.4.29 |
|
+FUNC:_ZNSt9once_flag9_M_finishEb@@GLIBCXX_3.4.29 |
|
FUNC:_ZNSt9strstream3strEv@@GLIBCXX_3.4 |
|
FUNC:_ZNSt9strstream6freezeEb@@GLIBCXX_3.4 |
|
FUNC:_ZNSt9strstreamC1EPciSt13_Ios_Openmode@@GLIBCXX_3.4 |
|
--- libstdc++-v3/config/abi/pre/gnu.ver |
|
+++ libstdc++-v3/config/abi/pre/gnu.ver |
|
@@ -2388,6 +2388,11 @@ GLIBCXX_3.4.29 { |
|
_ZNKRSt7__cxx1118basic_stringstreamI[cw]St11char_traitsI[cw]ESaI[cw]EE3strEv; |
|
_ZNSt7__cxx1118basic_stringstreamI[cw]St11char_traitsI[cw]ESaI[cw]EE3strEONS_12basic_stringI[cw]S2_S3_EE; |
|
|
|
+ # std::once_flag::_M_activate() |
|
+ _ZNSt9once_flag11_M_activateEv; |
|
+ # std::once_flag::_M_finish(bool) |
|
+ _ZNSt9once_flag9_M_finishEb; |
|
+ |
|
# std::to_chars(char*, char*, [float|double|long double]) |
|
_ZSt8to_charsPcS_[def]; |
|
# std::to_chars(char*, char*, [float|double|long double], chars_format) |
|
--- libstdc++-v3/src/c++11/mutex.cc |
|
+++ libstdc++-v3/src/c++11/mutex.cc |
|
@@ -26,6 +26,90 @@ |
|
|
|
#ifdef _GLIBCXX_HAS_GTHREADS |
|
|
|
+#if defined _GLIBCXX_SHARED && ! _GLIBCXX_INLINE_VERSION |
|
+ |
|
+#ifdef _GLIBCXX_HAVE_LINUX_FUTEX |
|
+# include <syscall.h> |
|
+# include <unistd.h> |
|
+# include <limits.h> |
|
+ |
|
+namespace std _GLIBCXX_VISIBILITY(default) |
|
+{ |
|
+_GLIBCXX_BEGIN_NAMESPACE_VERSION |
|
+ |
|
+struct __once_flag_compat |
|
+{ |
|
+ enum _Bits : int { _Init = 0, _Active = 1, _Done = 2 }; |
|
+ int _M_once = 0; |
|
+ bool _M_activate(); |
|
+ void _M_finish(bool returning) noexcept; |
|
+}; |
|
+ |
|
+bool |
|
+__once_flag_compat::_M_activate() |
|
+{ |
|
+ if (__gnu_cxx::__is_single_threaded()) |
|
+ { |
|
+ if (_M_once == _Bits::_Done) |
|
+ return false; |
|
+ _M_once = _Bits::_Active; |
|
+ return true; |
|
+ } |
|
+ |
|
+ while (true) |
|
+ { |
|
+ int expected = _Bits::_Init; |
|
+ constexpr int active = _Bits::_Active; |
|
+ if (__atomic_compare_exchange_n(&_M_once, &expected, active, false, |
|
+ __ATOMIC_ACQ_REL, |
|
+ __ATOMIC_ACQUIRE)) |
|
+ { |
|
+ // This thread is now doing an active execution. |
|
+ return true; |
|
+ } |
|
+ |
|
+ if (expected == _Bits::_Done) |
|
+ return false; // A returning execution happened, this is passive. |
|
+ |
|
+ // Otherwise, an active execution is happening. Wait for it to finish. |
|
+ constexpr int futex_wait = 128; // FUTEX_WAIT_PRIVATE |
|
+ syscall (SYS_futex, &_M_once, futex_wait, expected, 0); |
|
+ } |
|
+} |
|
+ |
|
+void |
|
+std::__once_flag_compat::_M_finish(bool returning) noexcept |
|
+{ |
|
+ const int newval = returning ? _Bits::_Done : _Bits::_Init; |
|
+ if (__gnu_cxx::__is_single_threaded()) |
|
+ { |
|
+ __glibcxx_assert(_M_once == _Bits::_Active); |
|
+ _M_once = newval; |
|
+ } |
|
+ else |
|
+ { |
|
+ int prev [[maybe_unused]] |
|
+ = __atomic_exchange_n(&_M_once, newval, __ATOMIC_RELEASE); |
|
+ __glibcxx_assert(prev & _Bits::_Active); |
|
+ // Wake any other threads waiting for this execution to finish. |
|
+ constexpr int futex_wake = 129; // FUTEX_WAKE_PRIVATE |
|
+ syscall (SYS_futex, &_M_once, futex_wake, INT_MAX); |
|
+ } |
|
+} |
|
+ |
|
+#pragma GCC diagnostic push |
|
+#pragma GCC diagnostic ignored "-Wattribute-alias" |
|
+extern "C" bool _ZNSt9once_flag11_M_activateEv() |
|
+ __attribute__((alias ("_ZNSt18__once_flag_compat11_M_activateEv"))); |
|
+extern "C" void _ZNSt9once_flag9_M_finishEb() noexcept |
|
+ __attribute__((alias ("_ZNSt18__once_flag_compat9_M_finishEb"))); |
|
+#pragma GCC diagnostic pop |
|
+ |
|
+_GLIBCXX_END_NAMESPACE_VERSION |
|
+} // namespace std |
|
+#endif // FUTEX |
|
+#endif // ONCE_FLAG_COMPAT && SHARED && ! INLINE_VERSION |
|
+ |
|
namespace std _GLIBCXX_VISIBILITY(default) |
|
{ |
|
_GLIBCXX_BEGIN_NAMESPACE_VERSION
|
|
|