From: Hans Wennborg Date: Fri, 5 Feb 2016 22:15:03 +0000 (+0000) Subject: Merging r259931: X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2d49f0a0ae8366964a93e3b7b26e29679bee7160;p=clang Merging r259931: ------------------------------------------------------------------------ r259931 | uweigand | 2016-02-05 13:34:28 -0800 (Fri, 05 Feb 2016) | 33 lines [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. ------------------------------------------------------------------------ git-svn-id: https://llvm.org/svn/llvm-project/cfe/branches/release_38@259939 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp index 1bc6c51b9b..4f0b124895 100644 --- a/lib/Basic/Targets.cpp +++ b/lib/Basic/Targets.cpp @@ -6151,6 +6151,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) diff --git a/test/Preprocessor/predefined-arch-macros.c b/test/Preprocessor/predefined-arch-macros.c index 66a96e431f..ea98e7fb0f 100644 --- a/test/Preprocessor/predefined-arch-macros.c +++ b/test/Preprocessor/predefined-arch-macros.c @@ -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