diff options
author | Daniel Dunbar <daniel@zuster.org> | 2009-09-10 04:57:17 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2009-09-10 04:57:17 +0000 |
commit | b163ef7e7a5d904ef0962a7c38c460be083c4d63 (patch) | |
tree | 9c65f3de2efe7d8eaa56fb3288b2137f4caa18a7 /lib/Driver/Tools.cpp | |
parent | 5cea4bd1f81c1289894ec3ecf644aa353184c97d (diff) |
ARM: Pass -mcpu to clang-cc based on -march= and -mcpu=.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@81429 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Driver/Tools.cpp')
-rw-r--r-- | lib/Driver/Tools.cpp | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index c52ae96e51..ad335b3121 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -200,6 +200,68 @@ void Clang::AddPreprocessingOptions(const Driver &D, options::OPT_Xpreprocessor); } +static llvm::StringRef getARMTargetCPU(const ArgList &Args) { + // FIXME: Check the relative priority of these options against gcc. Also, what + // happens if the -mcpu and -march mismatch? + + // If we have -mcpu=, use that. + if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) + return A->getValue(Args); + + // Otherwise, if we have -march= choose the base CPU for that arch. + if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) { + llvm::StringRef MArch = A->getValue(Args); + + if (MArch == "armv2" || MArch == "armv2a") + return "arm2"; + if (MArch == "armv3") + return "arm6"; + if (MArch == "armv3m") + return "arm7m"; + if (MArch == "armv4" || MArch == "armv4t") + return "arm7tdmi"; + if (MArch == "armv5" || MArch == "armv5t") + return "arm10tdmi"; + if (MArch == "armv5e" || MArch == "armv5te") + return "arm1026ejs"; + if (MArch == "armv5tej") + return "arm926ejs"; + if (MArch == "armv6" || MArch == "armv6k") + return "arm1136jf-s"; + if (MArch == "armv6j") + return "arm1136j-s"; + if (MArch == "armv6z" || MArch == "armv6zk") + return "arm1176jzf-s"; + if (MArch == "armv6t2") + return "arm1156t2-s"; + if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a") + return "cortex-a8"; + if (MArch == "armv7r" || MArch == "armv7-r") + return "cortex-r4"; + if (MArch == "armv7m" || MArch == "armv7-m") + return "cortex-m3"; + if (MArch == "ep9312") + return "ep9312"; + if (MArch == "iwmmxt") + return "iwmmxt"; + if (MArch == "xscale") + return "xscale"; + } + + // Otherwise return the most base CPU LLVM supports. + return "arm7tdmi"; +} + +void Clang::AddARMTargetArgs(const ArgList &Args, + ArgStringList &CmdArgs) const { + // Set the CPU based on -march= and -mcpu=. + CmdArgs.push_back(Args.MakeArgString("-mcpu=" + getARMTargetCPU(Args))); + + // FIXME: Set the "neon" feature. + // FIXME: Set -soft-float. + // FIXME: Set -float-abi=hard. +} + void Clang::AddX86TargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const { if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) { @@ -427,6 +489,11 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, default: break; + case llvm::Triple::arm: + case llvm::Triple::thumb: + AddARMTargetArgs(Args, CmdArgs); + break; + case llvm::Triple::x86: case llvm::Triple::x86_64: AddX86TargetArgs(Args, CmdArgs); |