forked from OSchip/llvm-project
[SystemZ] Define __GCC_HAVE_SYNC_COMPARE_AND_SWAP macros
Define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_[1248] macros on SystemZ. This fixes a miscompile of GCC C++11 standard library headers due to use of those macros in an ABI-changing manner. See e.g. /usr/include/c++/4.8.5/ext/concurrence.h: // Compile time constant that indicates prefered locking policy in // the current configuration. static const _Lock_policy __default_lock_policy = #ifdef __GTHREADS #if (defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2) \ && defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4)) _S_atomic; #else _S_mutex; #endif #else _S_single; #endif A different choice of __default_lock_policy causes different sizes of several of the C++11 data structures, which are then incompatible when inlined in clang-compiled code with what the (GCC-compiled) external library expects. This in turn leads to various crashes when using std::thread in code compiled with clang, as see e.g. via the ThreadPool unit tests. See PR 26473 for an example. llvm-svn: 259931
This commit is contained in:
parent
a090a00e45
commit
b038a5268f
|
@ -6166,6 +6166,12 @@ public:
|
|||
Builder.defineMacro("__s390x__");
|
||||
Builder.defineMacro("__zarch__");
|
||||
Builder.defineMacro("__LONG_DOUBLE_128__");
|
||||
|
||||
Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
|
||||
Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
|
||||
Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
|
||||
Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
|
||||
|
||||
if (HasTransactionalExecution)
|
||||
Builder.defineMacro("__HTM__");
|
||||
if (Opts.ZVector)
|
||||
|
|
|
@ -1787,6 +1787,10 @@
|
|||
// RUN: -target s390x-unknown-linux \
|
||||
// RUN: | FileCheck %s -check-prefix=CHECK_SYSTEMZ_Z10
|
||||
//
|
||||
// CHECK_SYSTEMZ_Z10: #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1
|
||||
// CHECK_SYSTEMZ_Z10: #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2
|
||||
// CHECK_SYSTEMZ_Z10: #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4
|
||||
// CHECK_SYSTEMZ_Z10: #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8
|
||||
// CHECK_SYSTEMZ_Z10: #define __LONG_DOUBLE_128__ 1
|
||||
// CHECK_SYSTEMZ_Z10: #define __s390__ 1
|
||||
// CHECK_SYSTEMZ_Z10: #define __s390x__ 1
|
||||
|
@ -1796,6 +1800,10 @@
|
|||
// RUN: -target s390x-unknown-linux \
|
||||
// RUN: | FileCheck %s -check-prefix=CHECK_SYSTEMZ_ZEC12
|
||||
//
|
||||
// CHECK_SYSTEMZ_ZEC12: #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1
|
||||
// CHECK_SYSTEMZ_ZEC12: #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2
|
||||
// CHECK_SYSTEMZ_ZEC12: #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4
|
||||
// CHECK_SYSTEMZ_ZEC12: #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8
|
||||
// CHECK_SYSTEMZ_ZEC12: #define __HTM__ 1
|
||||
// CHECK_SYSTEMZ_ZEC12: #define __LONG_DOUBLE_128__ 1
|
||||
// CHECK_SYSTEMZ_ZEC12: #define __s390__ 1
|
||||
|
|
Loading…
Reference in New Issue