r259931 - [SystemZ] Define __GCC_HAVE_SYNC_COMPARE_AND_SWAP macros

Hal Finkel via cfe-commits cfe-commits at lists.llvm.org
Fri Feb 5 14:14:54 PST 2016


Just a general comment: I believe we've now fixed this bug for at least four different architectures (each time as a separate effort). Is there some kind of auditing we could do to make sure we don't run into this again?

 -Hal

----- Original Message -----
> From: "Ulrich Weigand via cfe-commits" <cfe-commits at lists.llvm.org>
> To: cfe-commits at lists.llvm.org
> Sent: Friday, February 5, 2016 3:34:29 PM
> Subject: r259931 - [SystemZ] Define __GCC_HAVE_SYNC_COMPARE_AND_SWAP macros
> 
> Author: uweigand
> Date: Fri Feb  5 15:34:28 2016
> New Revision: 259931
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=259931&view=rev
> Log:
> [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.
> 
> 
> Modified:
>     cfe/trunk/lib/Basic/Targets.cpp
>     cfe/trunk/test/Preprocessor/predefined-arch-macros.c
> 
> Modified: cfe/trunk/lib/Basic/Targets.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Targets.cpp?rev=259931&r1=259930&r2=259931&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Basic/Targets.cpp (original)
> +++ cfe/trunk/lib/Basic/Targets.cpp Fri Feb  5 15:34:28 2016
> @@ -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)
> 
> Modified: cfe/trunk/test/Preprocessor/predefined-arch-macros.c
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Preprocessor/predefined-arch-macros.c?rev=259931&r1=259930&r2=259931&view=diff
> ==============================================================================
> --- cfe/trunk/test/Preprocessor/predefined-arch-macros.c (original)
> +++ cfe/trunk/test/Preprocessor/predefined-arch-macros.c Fri Feb  5
> 15:34:28 2016
> @@ -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
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
> 

-- 
Hal Finkel
Assistant Computational Scientist
Leadership Computing Facility
Argonne National Laboratory


More information about the cfe-commits mailing list