From: Amara Emerson Date: Thu, 31 Oct 2013 09:32:33 +0000 (+0000) Subject: [AArch64] Add some CPU targets for "generic", A-53 and A-57. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3bb1b5c953fc38d4b87525258cf27b7c908988b1;p=clang [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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@193740 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp index a7e9964715..29efa2c74e 100644 --- a/lib/Basic/Targets.cpp +++ b/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(Name) + .Case("generic", true) + .Cases("cortex-a53", "cortex-a57", true) + .Default(false); + } + virtual bool handleTargetFeatures(std::vector &Features, DiagnosticsEngine &Diags) { FPU = FPUMode; diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index 680f89a75c..646fb61363 100644 --- a/lib/Driver/Tools.cpp +++ b/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/lib/Driver/Tools.h b/lib/Driver/Tools.h index 4a0626d184..d5b2848c9b 100644 --- a/lib/Driver/Tools.h +++ b/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/test/Driver/aarch64-cpus.c b/test/Driver/aarch64-cpus.c new file mode 100644 index 0000000000..74068203e7 --- /dev/null +++ b/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/test/Driver/aarch64-mfpu.c b/test/Driver/aarch64-mfpu.c new file mode 100644 index 0000000000..234401bcb2 --- /dev/null +++ b/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"