summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVladimir Sukharev <vladimir.sukharev@arm.com>2015-08-19 14:50:18 +0000
committerVladimir Sukharev <vladimir.sukharev@arm.com>2015-08-19 14:50:18 +0000
commit457d34193e796e260258b036a1e6e7c175bd0b5c (patch)
treef88db5e2a308577cf687500b1ec670eb6c1d546b
parentd966fb6fef351da66768cbe560c90dceeb6bf07a (diff)
downloadbcm5719-llvm-457d34193e796e260258b036a1e6e7c175bd0b5c.tar.gz
bcm5719-llvm-457d34193e796e260258b036a1e6e7c175bd0b5c.zip
[ARM] Proper generic cpus handling
"generic" cpu was wrongly handled as exact real CPU name of ARMv8.1A architecture. This has been fixed, now it is abstract name, suitable for any arch. Reviewers: rengolin Subscribers: cfe-commits Differential Revision: http://reviews.llvm.org/D11640 llvm-svn: 245445
-rw-r--r--clang/lib/Basic/Targets.cpp22
-rw-r--r--clang/lib/Driver/Tools.cpp6
-rw-r--r--clang/test/Driver/arm-cortex-cpus.c19
3 files changed, 32 insertions, 15 deletions
diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp
index 0ebe8a23c36..081b4caafd2 100644
--- a/clang/lib/Basic/Targets.cpp
+++ b/clang/lib/Basic/Targets.cpp
@@ -4257,21 +4257,18 @@ class ARMTargetInfo : public TargetInfo {
ArchISA = llvm::ARMTargetParser::parseArchISA(ArchName);
DefaultCPU = getDefaultCPU(ArchName);
- // SubArch is specified by the target triple
- if (!DefaultCPU.empty())
- setArchInfo(DefaultCPU);
- else
- // FIXME ArchInfo should be based on ArchName from triple, not on
- // a hard-coded CPU name. Doing so currently causes regressions:
- // test/Preprocessor/init.c: __ARM_ARCH_6J__ not defined
- setArchInfo(CPU);
+ unsigned ArchKind = llvm::ARMTargetParser::parseArch(ArchName);
+ if (ArchKind == llvm::ARM::AK_INVALID)
+ // set arch of the CPU, either provided explicitly or hardcoded default
+ ArchKind = llvm::ARMTargetParser::parseCPUArch(CPU);
+ setArchInfo(ArchKind);
}
- void setArchInfo(StringRef CPU) {
+ void setArchInfo(unsigned Kind) {
StringRef SubArch;
// cache TargetParser info
- ArchKind = llvm::ARMTargetParser::parseCPUArch(CPU);
+ ArchKind = Kind;
SubArch = llvm::ARMTargetParser::getSubArch(ArchKind);
ArchProfile = llvm::ARMTargetParser::parseArchProfile(SubArch);
ArchVersion = llvm::ARMTargetParser::parseArchVersion(SubArch);
@@ -4570,10 +4567,11 @@ public:
}
bool setCPU(const std::string &Name) override {
- unsigned ArchKind = llvm::ARMTargetParser::parseCPUArch(Name);
+ if (Name != "generic")
+ setArchInfo(llvm::ARMTargetParser::parseCPUArch(Name));
+
if (ArchKind == llvm::ARM::AK_INVALID)
return false;
- setArchInfo(Name);
setAtomic();
CPU = Name;
return true;
diff --git a/clang/lib/Driver/Tools.cpp b/clang/lib/Driver/Tools.cpp
index 79d8dfb2a94..87111fa601f 100644
--- a/clang/lib/Driver/Tools.cpp
+++ b/clang/lib/Driver/Tools.cpp
@@ -6002,9 +6002,9 @@ std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
/// CPU (or Arch, if CPU is generic).
// FIXME: This is redundant with -mcpu, why does LLVM use this.
const char *arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch) {
- if (CPU == "generic" &&
- llvm::ARMTargetParser::parseArch(Arch) == llvm::ARM::AK_ARMV8_1A)
- return "v8.1a";
+ if (CPU == "generic")
+ return llvm::ARMTargetParser::getSubArch(
+ llvm::ARMTargetParser::parseArch(Arch));
unsigned ArchKind = llvm::ARMTargetParser::parseCPUArch(CPU);
if (ArchKind == llvm::ARM::AK_INVALID)
diff --git a/clang/test/Driver/arm-cortex-cpus.c b/clang/test/Driver/arm-cortex-cpus.c
index ef3056deb5f..75c336b12fb 100644
--- a/clang/test/Driver/arm-cortex-cpus.c
+++ b/clang/test/Driver/arm-cortex-cpus.c
@@ -134,6 +134,18 @@
// RUN: %clang -target arm -mlittle-endian -march=armv8-a -mlittle-endian -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V8A %s
// CHECK-V8A: "-cc1"{{.*}} "-triple" "armv8-{{.*}}" "-target-cpu" "cortex-a53"
+// RUN: %clang -mcpu=generic -target armv8 -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V8A-GENERIC %s
+// RUN: %clang -mcpu=generic -target arm -march=armv8 -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V8A-GENERIC %s
+// RUN: %clang -mcpu=generic -target armv8a -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V8A-GENERIC %s
+// RUN: %clang -mcpu=generic -target arm -march=armv8a -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V8A-GENERIC %s
+// RUN: %clang -mcpu=generic -target arm -march=armv8-a -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V8A-GENERIC %s
+// RUN: %clang -mcpu=generic -target armv8 -mlittle-endian -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V8A-GENERIC %s
+// RUN: %clang -mcpu=generic -target arm -march=armv8 -mlittle-endian -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V8A-GENERIC %s
+// RUN: %clang -mcpu=generic -target armv8a -mlittle-endian -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V8A-GENERIC %s
+// RUN: %clang -mcpu=generic -target arm -march=armv8a -mlittle-endian -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V8A-GENERIC %s
+// RUN: %clang -mcpu=generic -target arm -mlittle-endian -march=armv8-a -mlittle-endian -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V8A-GENERIC %s
+// CHECK-V8A-GENERIC: "-cc1"{{.*}} "-triple" "armv8-{{.*}}" "-target-cpu" "generic"
+
// RUN: %clang -target armebv8 -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-BE-V8A %s
// RUN: %clang -target armeb -march=armebv8 -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-BE-V8A %s
// RUN: %clang -target armebv8a -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-BE-V8A %s
@@ -173,6 +185,13 @@
// RUN: %clang -target armv8.1a -mlittle-endian -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V81A %s
// RUN: %clang -target arm -march=armv8.1a -mlittle-endian -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V81A %s
// RUN: %clang -target arm -mlittle-endian -march=armv8.1-a -mlittle-endian -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V81A %s
+// RUN: %clang -mcpu=generic -target arm -march=armv8.1a -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V81A %s
+// RUN: %clang -mcpu=generic -target armv8.1a -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V81A %s
+// RUN: %clang -mcpu=generic -target arm -march=armv8.1-a -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V81A %s
+// RUN: %clang -mcpu=generic -target arm -march=armv8.1a -mlittle-endian -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V81A %s
+// RUN: %clang -mcpu=generic -target armv8.1a -mlittle-endian -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V81A %s
+// RUN: %clang -mcpu=generic -target arm -march=armv8.1a -mlittle-endian -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V81A %s
+// RUN: %clang -mcpu=generic -target arm -mlittle-endian -march=armv8.1-a -mlittle-endian -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V81A %s
// CHECK-V81A: "-cc1"{{.*}} "-triple" "armv8.1a-{{.*}}" "-target-cpu" "generic" "-target-feature" "+v8.1a"
// RUN: %clang -target armebv8.1a -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-BE-V81A %s
OpenPOWER on IntegriCloud