diff options
author | Daniel Dunbar <daniel@zuster.org> | 2009-09-10 06:49:20 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2009-09-10 06:49:20 +0000 |
commit | 728a512753d85a6ccaae34e81385c8665c2de0e1 (patch) | |
tree | ff8779bef8b3a0d6614b478f6d278f8a66f2d293 /lib/Driver/Tools.cpp | |
parent | b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61b (diff) |
Add code to mangle the triple for LLVM on ARM.
- I think we should get rid of this distinction though, but I need to discuss with the interested parties.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@81435 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Driver/Tools.cpp')
-rw-r--r-- | lib/Driver/Tools.cpp | 62 |
1 files changed, 58 insertions, 4 deletions
diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index ca986e508c..876b34d7b5 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -200,9 +200,11 @@ void Clang::AddPreprocessingOptions(const Driver &D, options::OPT_Xpreprocessor); } +/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targetting. +// +// FIXME: tblgen this. 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? + // FIXME: Warn on inconsistent use of -mcpu and -march. // If we have -mcpu=, use that. if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) @@ -252,6 +254,57 @@ static llvm::StringRef getARMTargetCPU(const ArgList &Args) { return "arm7tdmi"; } +/// getLLVMArchNameForARM - Get the LLVM arch name to use for a particular +/// CPU. +// +// FIXME: This is redundant with -mcpu, why does LLVM use this. +// FIXME: tblgen this, or kill it! +static const char *getLLVMArchNameForARM(llvm::StringRef CPU, bool Thumb) { + if (CPU == "arm7tdmi" || CPU == "arm7tdmi-s" || CPU == "arm710t" || + CPU == "arm720t" || CPU == "arm9" || CPU == "arm9tdmi" || + CPU == "arm920" || CPU == "arm920t" || CPU == "arm922t" || + CPU == "arm940t" || CPU == "ep9312") + return Thumb ? "thumbv4t" : "armv4t"; + + if (CPU == "arm10tdmi" || CPU == "arm1020t") + return Thumb ? "thumb5" : "armv5"; + + if (CPU == "arm9e" || CPU == "arm926ej-s" || CPU == "arm946e-s" || + CPU == "arm966e-s" || CPU == "arm968e-s" || CPU == "arm10e" || + CPU == "arm1020e" || CPU == "arm1022e" || CPU == "xscale" || + CPU == "iwmmxt") + return Thumb ? "thumbv5e" : "armv5e"; + + if (CPU == "arm1136j-s" || CPU == "arm1136jf-s" || CPU == "arm1176jz-s" || + CPU == "arm1176jzf-s" || CPU == "mpcorenovfp" || CPU == "mpcore") + return Thumb ? "thumbv6" : "armv6"; + + if (CPU == "arm1156t2-s" || CPU == "arm1156t2f-s") + return Thumb ? "thumbv6t2" : "armv6t2"; + + if (CPU == "cortex-a8" || CPU == "cortex-a9") + return Thumb ? "thumbv7" : "armv7"; + + return Thumb ? "thumb" : "arm"; +} + +/// getLLVMTriple - Get the LLVM triple to use for a particular toolchain, which +/// may depend on command line arguments. +static std::string getLLVMTriple(const ToolChain &TC, const ArgList &Args) { + switch (TC.getTriple().getArch()) { + default: + return TC.getTripleString(); + + case llvm::Triple::arm: + case llvm::Triple::thumb: { + llvm::Triple Triple = TC.getTriple(); + Triple.setArchName(getLLVMArchNameForARM(getARMTargetCPU(Args), + /*FIXME:Thumb=*/false)); + return Triple.getTriple(); + } + } +} + void Clang::AddARMTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const { // Set the CPU based on -march= and -mcpu=. @@ -320,8 +373,9 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, assert(Inputs.size() == 1 && "Unable to handle multiple inputs."); CmdArgs.push_back("-triple"); + const char *TripleStr = - Args.MakeArgString(getToolChain().getTripleString()); + Args.MakeArgString(getLLVMTriple(getToolChain(), Args)); CmdArgs.push_back(TripleStr); if (isa<AnalyzeJobAction>(JA)) { @@ -1091,7 +1145,7 @@ void darwin::CC1::AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs, for (ArgList::const_iterator it = Args.begin(), ie = Args.end(); it != ie; ++it) { const Arg *A = *it; - if (A->getOption().matches(options::OPT_f_Group) || + if (A->getOption().matches(options::OPT_f_Group) || A->getOption().matches(options::OPT_fsyntax_only)) { if (!A->getOption().matches(options::OPT_fbuiltin_strcat) && !A->getOption().matches(options::OPT_fbuiltin_strcpy)) { |