diff options
Diffstat (limited to 'debian/patches/clang-fix-cmpxchg8-detection-on-i386.patch')
-rw-r--r-- | debian/patches/clang-fix-cmpxchg8-detection-on-i386.patch | 54 |
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 { |