summaryrefslogtreecommitdiff
path: root/debian/patches/clang-fix-cmpxchg8-detection-on-i386.patch
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches/clang-fix-cmpxchg8-detection-on-i386.patch')
-rw-r--r--debian/patches/clang-fix-cmpxchg8-detection-on-i386.patch54
1 files changed, 54 insertions, 0 deletions
diff --git a/debian/patches/clang-fix-cmpxchg8-detection-on-i386.patch b/debian/patches/clang-fix-cmpxchg8-detection-on-i386.patch
new file mode 100644
index 0000000..868e76a
--- /dev/null
+++ b/debian/patches/clang-fix-cmpxchg8-detection-on-i386.patch
@@ -0,0 +1,54 @@
+libcxx atomic tests for old i386 fail with wrong Atomic inline width.
+cmpxchg8b instruction is required for 8 byte atomics that clang was
+assuming.
+
+Too bad _GCC_ATOMIC_LLONG_LOCK_FREE 2 isn't supported even with this change
+because llvm doesn't support unaligned atomic compare and exchange operation.
+Fallback calls to libatomic.so should handle long long lock free but clang
+can't tell program if libatomic is always lock free.
+
+Related bug: https://llvm.org/bugs/show_bug.cgi?id=19355
+
+Index: llvm-toolchain-snapshot_5.0~svn304075/clang/lib/Basic/Targets.cpp
+===================================================================
+--- llvm-toolchain-snapshot_5.0~svn304075.orig/clang/lib/Basic/Targets.cpp
++++ llvm-toolchain-snapshot_5.0~svn304075/clang/lib/Basic/Targets.cpp
+@@ -2913,7 +2913,10 @@ class X86TargetInfo : public TargetInfo
+ FP_SSE,
+ FP_387
+ } FPMath = FP_Default;
+-
++protected:
++ bool isCmpXChg8Supported() const {
++ return CPU >= CK_i586;
++ }
+ public:
+ X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
+ : TargetInfo(Triple) {
+@@ -3034,6 +3037,8 @@ public:
+ // acceptable.
+ // FIXME: This results in terrible diagnostics. Clang just says the CPU is
+ // invalid without explaining *why*.
++ if (!isCmpXChg8Supported())
++ MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
+ switch (CPU) {
+ case CK_Generic:
+ // No processor selected!
+@@ -4163,7 +4168,7 @@ void X86TargetInfo::getTargetDefines(con
+ Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
+ Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
+ }
+- if (CPU >= CK_i586)
++ if (isCmpXChg8Supported())
+ Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
+
+ if (HasFloat128)
+@@ -4469,8 +4474,6 @@ public:
+ (1 << TargetInfo::LongDouble));
+
+ // x86-32 has atomics up to 8 bytes
+- // FIXME: Check that we actually have cmpxchg8b before setting
+- // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
+ MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
+ }
+ BuiltinVaListKind getBuiltinVaListKind() const override {