summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorAmara Emerson <amara.emerson@arm.com>2013-10-31 09:32:33 +0000
committerAmara Emerson <amara.emerson@arm.com>2013-10-31 09:32:33 +0000
commit703da2ea9883a534467a2e04a07c85243e08bf5d (patch)
treebcd1181775019b77650485de0ccce7bff9cff3cd /clang/lib
parentf80f95fcc7e85c6129ac239721cb5a8b1ca82652 (diff)
downloadbcm5719-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/lib')
-rw-r--r--clang/lib/Basic/Targets.cpp7
-rw-r--r--clang/lib/Driver/Tools.cpp23
-rw-r--r--clang/lib/Driver/Tools.h2
3 files changed, 32 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;
OpenPOWER on IntegriCloud