diff options
| author | Amara Emerson <amara.emerson@arm.com> | 2013-10-31 09:32:33 +0000 |
|---|---|---|
| committer | Amara Emerson <amara.emerson@arm.com> | 2013-10-31 09:32:33 +0000 |
| commit | 703da2ea9883a534467a2e04a07c85243e08bf5d (patch) | |
| tree | bcd1181775019b77650485de0ccce7bff9cff3cd /clang | |
| parent | f80f95fcc7e85c6129ac239721cb5a8b1ca82652 (diff) | |
| download | bcm5719-llvm-703da2ea9883a534467a2e04a07c85243e08bf5d.tar.gz bcm5719-llvm-703da2ea9883a534467a2e04a07c85243e08bf5d.zip | |
[AArch64] Add some CPU targets for "generic", A-53 and A-57.
Enables the clang driver to begin targeting specific CPUs. Introduced a
"generic" CPU which will ensure that the optional FP feature is enabled
by default when it gets to LLVM, without needing any extra arguments.
Cortex-A53 and A-57 are also introduced with tests, although backend
handling of them does not yet exist.
llvm-svn: 193740
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/Basic/Targets.cpp | 7 | ||||
| -rw-r--r-- | clang/lib/Driver/Tools.cpp | 23 | ||||
| -rw-r--r-- | clang/lib/Driver/Tools.h | 2 | ||||
| -rw-r--r-- | clang/test/Driver/aarch64-cpus.c | 10 | ||||
| -rw-r--r-- | clang/test/Driver/aarch64-mfpu.c | 26 |
5 files changed, 68 insertions, 0 deletions
diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp index a7e99647154..29efa2c74ea 100644 --- a/clang/lib/Basic/Targets.cpp +++ b/clang/lib/Basic/Targets.cpp @@ -3472,6 +3472,13 @@ public: return Feature == "aarch64" || (Feature == "neon" && FPU == NeonMode); } + virtual bool setCPU(const std::string &Name) { + return llvm::StringSwitch<bool>(Name) + .Case("generic", true) + .Cases("cortex-a53", "cortex-a57", true) + .Default(false); + } + virtual bool handleTargetFeatures(std::vector<std::string> &Features, DiagnosticsEngine &Diags) { FPU = FPUMode; diff --git a/clang/lib/Driver/Tools.cpp b/clang/lib/Driver/Tools.cpp index 680f89a75ca..646fb613638 100644 --- a/clang/lib/Driver/Tools.cpp +++ b/clang/lib/Driver/Tools.cpp @@ -539,6 +539,26 @@ static std::string getARMTargetCPU(const ArgList &Args, .Default("arm7tdmi"); } +/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are targeting. +// +// FIXME: tblgen this. +static std::string getAArch64TargetCPU(const ArgList &Args, + const llvm::Triple &Triple) { + // FIXME: Warn on inconsistent use of -mcpu and -march. + + // If we have -mcpu=, use that. + if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) { + StringRef MCPU = A->getValue(); + // Handle -mcpu=native. + if (MCPU == "native") + return llvm::sys::getHostCPUName(); + else + return MCPU; + } + + return "generic"; +} + // FIXME: Move to target hook. static bool isSignedCharDefault(const llvm::Triple &Triple) { switch (Triple.getArch()) { @@ -1304,6 +1324,9 @@ static std::string getCPUName(const ArgList &Args, const llvm::Triple &T) { default: return ""; + case llvm::Triple::aarch64: + return getAArch64TargetCPU(Args, T); + case llvm::Triple::arm: case llvm::Triple::thumb: return getARMTargetCPU(Args, T); diff --git a/clang/lib/Driver/Tools.h b/clang/lib/Driver/Tools.h index 4a0626d1846..d5b2848c9b0 100644 --- a/clang/lib/Driver/Tools.h +++ b/clang/lib/Driver/Tools.h @@ -49,6 +49,8 @@ using llvm::opt::ArgStringList; const InputInfo &Output, const InputInfoList &Inputs) const; + void AddAArch64TargetArgs(const llvm::opt::ArgList &Args, + llvm::opt::ArgStringList &CmdArgs) const; void AddARMTargetArgs(const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs, bool KernelOrKext) const; diff --git a/clang/test/Driver/aarch64-cpus.c b/clang/test/Driver/aarch64-cpus.c new file mode 100644 index 00000000000..74068203e7e --- /dev/null +++ b/clang/test/Driver/aarch64-cpus.c @@ -0,0 +1,10 @@ +// Check target CPUs are correctly passed. + +// RUN: %clang -target aarch64 -### -c %s 2>&1 | FileCheck -check-prefix=GENERIC %s +// GENERIC: "-cc1"{{.*}} "-triple" "aarch64" {{.*}} "-target-cpu" "generic" + +// RUN: %clang -target aarch64 -mcpu=cortex-a53 -### -c %s 2>&1 | FileCheck -check-prefix=CA53 %s +// CA53: "-cc1"{{.*}} "-triple" "aarch64" {{.*}} "-target-cpu" "cortex-a53" + +// RUN: %clang -target aarch64 -mcpu=cortex-a57 -### -c %s 2>&1 | FileCheck -check-prefix=CA57 %s +// CA57: "-cc1"{{.*}} "-triple" "aarch64" {{.*}} "-target-cpu" "cortex-a57" diff --git a/clang/test/Driver/aarch64-mfpu.c b/clang/test/Driver/aarch64-mfpu.c new file mode 100644 index 00000000000..234401bcb21 --- /dev/null +++ b/clang/test/Driver/aarch64-mfpu.c @@ -0,0 +1,26 @@ +// Test that different values of -mfpu pick correct AArch64 FPU target-feature(s). + +// RUN: %clang -target aarch64-linux-eabi -mfpu=neon %s -### -o %t.o 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-NEON %s +// CHECK-NEON: "-target-feature" "+neon" + +// RUN: %clang -target aarch64-linux-eabi -mfpu=fp-armv8 %s -### -o %t.o 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-FP-ARMV8 %s +// CHECK-FP-ARMV8: "-target-feature" "+fp-armv8" + +// RUN: %clang -target aarch64-linux-eabi -mfpu=neon-fp-armv8 %s -### 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-NEON-FP-ARMV8 %s +// CHECK-NEON-FP-ARMV8: "-target-feature" "+fp-armv8" +// CHECK-NEON-FP-ARMV8: "-target-feature" "+neon" + +// RUN: %clang -target aarch64-linux-eabi -mfpu=crypto-neon-fp-armv8 %s -### 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-CRYPTO-NEON-FP-ARMV8 %s +// CHECK-CRYPTO-NEON-FP-ARMV8: "-target-feature" "+fp-armv8" +// CHECK-CRYPTO-NEON-FP-ARMV8: "-target-feature" "+neon" +// CHECK-CRYPTO-NEON-FP-ARMV8: "-target-feature" "+crypto" + +// RUN: %clang -target aarch64-linux-eabi -mfpu=none %s -### 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-NO-FP %s +// CHECK-NO-FP: "-target-feature" "-fp-armv8" +// CHECK-NO-FP: "-target-feature" "-crypto" +// CHECK-NO-FP: "-target-feature" "-neon" |

