summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRenato Golin <renato.golin@linaro.org>2016-05-25 12:36:31 +0000
committerRenato Golin <renato.golin@linaro.org>2016-05-25 12:36:31 +0000
commit3b8709c58375518dcfdf5a1c1fbf9e2590b8dc39 (patch)
tree8b89b08e7bc58e88b24a5c94ca6e47a77561764c
parent8b42706a6eaf5dda91e8b2fe81c9bce39893cca4 (diff)
downloadbcm5719-llvm-3b8709c58375518dcfdf5a1c1fbf9e2590b8dc39.tar.gz
bcm5719-llvm-3b8709c58375518dcfdf5a1c1fbf9e2590b8dc39.zip
Revert "[AArch64] Using new TargetParser in Clang"
This reverts commit r270688 and r270689. The issue is not a random order, but a different order for some targets and others (prob. Linux vs Darwin). Reverting until we have a better fix. llvm-svn: 270691
-rw-r--r--clang/lib/Basic/Targets.cpp12
-rw-r--r--clang/lib/Driver/Tools.cpp54
-rw-r--r--clang/test/Preprocessor/aarch64-target-features.c5
3 files changed, 48 insertions, 23 deletions
diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp
index 059dd62aea1..4d06ebb724b 100644
--- a/clang/lib/Basic/Targets.cpp
+++ b/clang/lib/Basic/Targets.cpp
@@ -5665,10 +5665,14 @@ public:
}
bool setCPU(const std::string &Name) override {
- if (Name == "generic" || llvm::AArch64::parseCPUArch(Name) != llvm::ARM::AK_INVALID)
- return true;
-
- return false;
+ bool CPUKnown = llvm::StringSwitch<bool>(Name)
+ .Case("generic", true)
+ .Cases("cortex-a53", "cortex-a57", "cortex-a72",
+ "cortex-a35", "exynos-m1", true)
+ .Case("cyclone", true)
+ .Case("kryo", true)
+ .Default(false);
+ return CPUKnown;
}
void getTargetDefines(const LangOptions &Opts,
diff --git a/clang/lib/Driver/Tools.cpp b/clang/lib/Driver/Tools.cpp
index f4d234907f2..7c363e0d9ef 100644
--- a/clang/lib/Driver/Tools.cpp
+++ b/clang/lib/Driver/Tools.cpp
@@ -2262,9 +2262,22 @@ static bool DecodeAArch64Features(const Driver &D, StringRef text,
text.split(Split, StringRef("+"), -1, false);
for (StringRef Feature : Split) {
- const char *FeatureName = llvm::AArch64::getArchExtFeature(Feature);
- if (FeatureName)
- Features.push_back(FeatureName);
+ const char *result = llvm::StringSwitch<const char *>(Feature)
+ .Case("fp", "+fp-armv8")
+ .Case("simd", "+neon")
+ .Case("crc", "+crc")
+ .Case("crypto", "+crypto")
+ .Case("fp16", "+fullfp16")
+ .Case("profile", "+spe")
+ .Case("nofp", "-fp-armv8")
+ .Case("nosimd", "-neon")
+ .Case("nocrc", "-crc")
+ .Case("nocrypto", "-crypto")
+ .Case("nofp16", "-fullfp16")
+ .Case("noprofile", "-spe")
+ .Default(nullptr);
+ if (result)
+ Features.push_back(result);
else if (Feature == "neon" || Feature == "noneon")
D.Diag(diag::err_drv_no_neon_modifier);
else
@@ -2279,16 +2292,20 @@ static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
std::vector<const char *> &Features) {
std::pair<StringRef, StringRef> Split = Mcpu.split("+");
CPU = Split.first;
-
- if (CPU == "generic") {
+ if (CPU == "cortex-a53" || CPU == "cortex-a57" ||
+ CPU == "cortex-a72" || CPU == "cortex-a35" || CPU == "exynos-m1" ||
+ CPU == "kryo") {
+ Features.push_back("+neon");
+ Features.push_back("+crc");
+ Features.push_back("+crypto");
+ } else if (CPU == "cyclone") {
+ Features.push_back("+neon");
+ Features.push_back("+crypto");
+ } else if (CPU == "generic") {
Features.push_back("+neon");
} else {
- unsigned ArchKind = llvm::AArch64::parseCPUArch(CPU);
- unsigned Extersion = llvm::AArch64::getDefaultExtensions(CPU,ArchKind);
-
- if (!llvm::AArch64::getExtensionFeatures(Extersion,Features))
- return false;
- }
+ return false;
+ }
if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
return false;
@@ -2300,13 +2317,20 @@ static bool
getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
const ArgList &Args,
std::vector<const char *> &Features) {
- unsigned ArchKind;
std::string MarchLowerCase = March.lower();
std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
- ArchKind = llvm::AArch64::parseArch(Split.first);
- if (ArchKind == llvm::ARM::AK_INVALID || !llvm::AArch64::getArchFeatures(ArchKind, Features) ||
- (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features)))
+ if (Split.first == "armv8-a" || Split.first == "armv8a") {
+ // ok, no additional features.
+ } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
+ Features.push_back("+v8.1a");
+ } else if (Split.first == "armv8.2-a" || Split.first == "armv8.2a" ) {
+ Features.push_back("+v8.2a");
+ } else {
+ return false;
+ }
+
+ if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
return false;
return true;
diff --git a/clang/test/Preprocessor/aarch64-target-features.c b/clang/test/Preprocessor/aarch64-target-features.c
index 0fa95451c32..f218e5eb109 100644
--- a/clang/test/Preprocessor/aarch64-target-features.c
+++ b/clang/test/Preprocessor/aarch64-target-features.c
@@ -94,10 +94,7 @@
// RUN: %clang -target aarch64 -mcpu=cortex-a72 -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-MCPU-A72 %s
// RUN: %clang -target aarch64 -mcpu=exynos-m1 -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-MCPU-M1 %s
// RUN: %clang -target aarch64 -mcpu=kryo -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-MCPU-KRYO %s
-// CHECK-MCPU-CYCLONE: "-cc1"{{.*}} "-triple" "aarch64{{.*}}" "-target-feature" "+neon"
-// CHECK-MCPU-CYCLONE-DAG: "-target-feature" "+crypto"
-// CHECK-MCPU-CYCLONE-DAG: "-target-feature" "+zcm"
-// CHECK-MCPU-CYCLONE-DAG: "-target-feature" "+zcz"
+// CHECK-MCPU-CYCLONE: "-cc1"{{.*}} "-triple" "aarch64{{.*}}" "-target-feature" "+neon" "-target-feature" "+crypto" "-target-feature" "+zcm" "-target-feature" "+zcz"
// CHECK-MCPU-A35: "-cc1"{{.*}} "-triple" "aarch64{{.*}}" "-target-feature" "+neon" "-target-feature" "+crc" "-target-feature" "+crypto"
// CHECK-MCPU-A53: "-cc1"{{.*}} "-triple" "aarch64{{.*}}" "-target-feature" "+neon" "-target-feature" "+crc" "-target-feature" "+crypto"
// CHECK-MCPU-A57: "-cc1"{{.*}} "-triple" "aarch64{{.*}}" "-target-feature" "+neon" "-target-feature" "+crc" "-target-feature" "+crypto"
OpenPOWER on IntegriCloud