From: Rafael Espindola Date: Tue, 14 May 2013 00:44:24 +0000 (+0000) Subject: Use atomic instructions on linux thumb v7. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=69db555a7a4d0aa11d65001ffc25669c354a5de0;p=clang 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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@181750 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp index 841ca62ab6..a622a11aa5 100644 --- a/lib/Basic/Targets.cpp +++ b/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/test/CodeGen/linux-arm-atomic.c b/test/CodeGen/linux-arm-atomic.c index 3fda7f688c..c7ce1d228b 100644 --- a/test/CodeGen/linux-arm-atomic.c +++ b/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) {