summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2013-05-14 00:44:24 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2013-05-14 00:44:24 +0000
commit92dbc3183fe26688973e308f988482f3638b77d4 (patch)
tree92dd996aedf58cdbc38dd6a8daa64dc56ea27314
parentca8ca55b5212672d4aaebd815835fc22de4be115 (diff)
downloadbcm5719-llvm-92dbc3183fe26688973e308f988482f3638b77d4.tar.gz
bcm5719-llvm-92dbc3183fe26688973e308f988482f3638b77d4.zip
Use atomic instructions on linux thumb v7.
This matches gcc's behaviour. The patch also explicitly parses the version so that this keeps working when we add support for v8. llvm-svn: 181750
-rw-r--r--clang/lib/Basic/Targets.cpp20
-rw-r--r--clang/test/CodeGen/linux-arm-atomic.c1
2 files changed, 18 insertions, 3 deletions
diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp
index 841ca62ab6e..a622a11aa5a 100644
--- a/clang/lib/Basic/Targets.cpp
+++ b/clang/lib/Basic/Targets.cpp
@@ -3536,9 +3536,23 @@ class ARMTargetInfo : public TargetInfo {
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:
diff --git a/clang/test/CodeGen/linux-arm-atomic.c b/clang/test/CodeGen/linux-arm-atomic.c
index 3fda7f688c1..c7ce1d228bb 100644
--- a/clang/test/CodeGen/linux-arm-atomic.c
+++ b/clang/test/CodeGen/linux-arm-atomic.c
@@ -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) {
OpenPOWER on IntegriCloud