mirror of
https://git.proxmox.com/git/llvm-toolchain
synced 2025-06-12 11:06:17 +00:00
55 lines
2.1 KiB
Diff
55 lines
2.1 KiB
Diff
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_4.0~svn291557/clang/lib/Basic/Targets.cpp
|
|
===================================================================
|
|
--- llvm-toolchain-snapshot_4.0~svn291557.orig/clang/lib/Basic/Targets.cpp
|
|
+++ llvm-toolchain-snapshot_4.0~svn291557/clang/lib/Basic/Targets.cpp
|
|
@@ -2761,7 +2761,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) {
|
|
@@ -2882,6 +2885,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!
|
|
@@ -3949,7 +3954,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");
|
|
}
|
|
|
|
@@ -4250,8 +4255,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 {
|