mirror of
https://git.proxmox.com/git/llvm-toolchain
synced 2025-08-03 14:42:44 +00:00
Fix "cannot compile this atomic library call"
Thanks to Francisco Facioni for the refresh (Closes: #705115)
This commit is contained in:
parent
6d6fb79caf
commit
88b38540d6
2
debian/changelog
vendored
2
debian/changelog
vendored
@ -6,6 +6,8 @@ llvm-toolchain-3.3 (1:3.3-10) unstable; urgency=low
|
||||
* Ship the lldb headers into lldb-X.Y-dev (Closes: #723743)
|
||||
I might create a liblldb-X.Y library at some point but I think it is too
|
||||
early.
|
||||
* Fix "cannot compile this atomic library call"
|
||||
Thanks to Francisco Facioni for the refresh (Closes: #705115)
|
||||
|
||||
-- Sylvestre Ledru <sylvestre@debian.org> Mon, 09 Sep 2013 14:35:08 +0200
|
||||
|
||||
|
45
debian/patches/atomic_library_1.diff
vendored
Normal file
45
debian/patches/atomic_library_1.diff
vendored
Normal file
@ -0,0 +1,45 @@
|
||||
Index: llvm-toolchain-3.3-3.3/clang/lib/Basic/Targets.cpp
|
||||
===================================================================
|
||||
--- llvm-toolchain-3.3-3.3.orig/clang/lib/Basic/Targets.cpp 2013-09-25 18:22:44.000000000 +0200
|
||||
+++ llvm-toolchain-3.3-3.3/clang/lib/Basic/Targets.cpp 2013-09-25 18:22:44.000000000 +0200
|
||||
@@ -3579,6 +3579,20 @@
|
||||
return Version >= 7;
|
||||
}
|
||||
|
||||
+ static bool shouldUseInlineAtomic(const llvm::Triple &T) {
|
||||
+ // On linux, binaries targeting old cpus call functions in libgcc to
|
||||
+ // perform atomic operations. The implementation in libgcc then calls into
|
||||
+ // the kernel which on armv6 and newer uses ldrex and strex. The net result
|
||||
+ // is that if we assume the kernel is at least as recent as the hardware,
|
||||
+ // it is safe to use atomic instructions on armv6 and newer.
|
||||
+ if (T.getOS() != llvm::Triple::Linux)
|
||||
+ return false;
|
||||
+ StringRef ArchName = T.getArchName();
|
||||
+ if (ArchName.startswith("armv6") || ArchName.startswith("armv7"))
|
||||
+ return true;
|
||||
+ return false;
|
||||
+ }
|
||||
+
|
||||
public:
|
||||
ARMTargetInfo(const std::string &TripleStr)
|
||||
: TargetInfo(TripleStr), ABI("aapcs-linux"), CPU("arm1136j-s"), IsAAPCS(true)
|
||||
Index: llvm-toolchain-3.3-3.3/clang/test/CodeGen/linux-arm-atomic.c
|
||||
===================================================================
|
||||
--- llvm-toolchain-3.3-3.3.orig/clang/test/CodeGen/linux-arm-atomic.c 2013-09-25 18:22:44.000000000 +0200
|
||||
+++ llvm-toolchain-3.3-3.3/clang/test/CodeGen/linux-arm-atomic.c 2013-09-25 18:22:44.000000000 +0200
|
||||
@@ -1,5 +1,15 @@
|
||||
// RUN: %clang_cc1 %s -emit-llvm -o - -triple=armv7-unknown-linux | FileCheck %s
|
||||
// RUN: %clang_cc1 %s -emit-llvm -o - -triple=armv6-unknown-linux | FileCheck %s
|
||||
+
|
||||
+typedef int _Atomic_word;
|
||||
+_Atomic_word exchange_and_add(volatile _Atomic_word *__mem, int __val) {
|
||||
+ return __atomic_fetch_add(__mem, __val, __ATOMIC_ACQ_REL);
|
||||
+}
|
||||
+
|
||||
+// CHECK: define {{.*}} @exchange_and_add
|
||||
+// CHECK: atomicrmw {{.*}} add
|
||||
+// RUN: %clang_cc1 %s -emit-llvm -o - -triple=armv7-unknown-linux | FileCheck %s
|
||||
+// RUN: %clang_cc1 %s -emit-llvm -o - -triple=armv6-unknown-linux | FileCheck %s
|
||||
// RUN: %clang_cc1 %s -emit-llvm -o - -triple=thumbv7-unknown-linux | FileCheck %s
|
||||
|
||||
typedef int _Atomic_word;
|
42
debian/patches/atomic_library_2.diff
vendored
Normal file
42
debian/patches/atomic_library_2.diff
vendored
Normal file
@ -0,0 +1,42 @@
|
||||
Index: llvm-toolchain-3.3-3.3/clang/test/CodeGen/linux-arm-atomic.c
|
||||
===================================================================
|
||||
--- llvm-toolchain-3.3-3.3.orig/clang/test/CodeGen/linux-arm-atomic.c 2013-09-25 18:23:43.000000000 +0200
|
||||
+++ llvm-toolchain-3.3-3.3/clang/test/CodeGen/linux-arm-atomic.c 2013-09-25 18:23:42.000000000 +0200
|
||||
@@ -1,5 +1,6 @@
|
||||
// RUN: %clang_cc1 %s -emit-llvm -o - -triple=armv7-unknown-linux | FileCheck %s
|
||||
// RUN: %clang_cc1 %s -emit-llvm -o - -triple=armv6-unknown-linux | FileCheck %s
|
||||
+// RUN: %clang_cc1 %s -emit-llvm -o - -triple=thumbv7-unknown-linux | FileCheck %s
|
||||
|
||||
typedef int _Atomic_word;
|
||||
_Atomic_word exchange_and_add(volatile _Atomic_word *__mem, int __val) {
|
||||
Index: llvm-toolchain-3.3-3.3/clang/lib/Basic/Targets.cpp
|
||||
===================================================================
|
||||
--- llvm-toolchain-3.3-3.3.orig/clang/lib/Basic/Targets.cpp 2013-09-25 18:23:43.000000000 +0200
|
||||
+++ llvm-toolchain-3.3-3.3/clang/lib/Basic/Targets.cpp 2013-09-25 18:23:42.000000000 +0200
|
||||
@@ -3588,9 +3588,23 @@
|
||||
if (T.getOS() != llvm::Triple::Linux)
|
||||
return false;
|
||||
StringRef ArchName = T.getArchName();
|
||||
- if (ArchName.startswith("armv6") || ArchName.startswith("armv7"))
|
||||
- return true;
|
||||
- return false;
|
||||
+ if (T.getArch() == llvm::Triple::arm) {
|
||||
+ if (!ArchName.startswith("armv"))
|
||||
+ return false;
|
||||
+ StringRef VersionStr = ArchName.substr(4);
|
||||
+ unsigned Version;
|
||||
+ if (VersionStr.getAsInteger(10, Version))
|
||||
+ return false;
|
||||
+ return Version >= 6;
|
||||
+ }
|
||||
+ assert(T.getArch() == llvm::Triple::thumb);
|
||||
+ if (!ArchName.startswith("thumbv"))
|
||||
+ return false;
|
||||
+ StringRef VersionStr = ArchName.substr(6);
|
||||
+ unsigned Version;
|
||||
+ if (VersionStr.getAsInteger(10, Version))
|
||||
+ return false;
|
||||
+ return Version >= 7;
|
||||
}
|
||||
|
||||
public:
|
2
debian/patches/series
vendored
2
debian/patches/series
vendored
@ -36,3 +36,5 @@ lldb-hurd.diff
|
||||
libstdc++-header-i386.diff
|
||||
kfreebsd_target_info_clang33.diff
|
||||
lldb-install-headers.diff
|
||||
atomic_library_1.diff
|
||||
atomic_library_2.diff
|
||||
|
Loading…
Reference in New Issue
Block a user