diff options
author | Daniel Dunbar <daniel@zuster.org> | 2010-01-22 02:04:58 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2010-01-22 02:04:58 +0000 |
commit | dcc3b657f26cde3777a068a2b55b66b3119dc0a9 (patch) | |
tree | 6060c6dfa34509969e451d4403b01cbc89295ebf /clang/lib | |
parent | a48823fdbeb43c552c30eb7422faa1f89e788850 (diff) | |
download | bcm5719-llvm-dcc3b657f26cde3777a068a2b55b66b3119dc0a9.tar.gz bcm5719-llvm-dcc3b657f26cde3777a068a2b55b66b3119dc0a9.zip |
Driver/Darwin/ld: Factor out getDarwinArchName, for getting the "Darwin" arch
name being used in an driver invocation.
llvm-svn: 94139
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Driver/ToolChains.cpp | 63 | ||||
-rw-r--r-- | clang/lib/Driver/ToolChains.h | 5 | ||||
-rw-r--r-- | clang/lib/Driver/Tools.cpp | 73 |
3 files changed, 73 insertions, 68 deletions
diff --git a/clang/lib/Driver/ToolChains.cpp b/clang/lib/Driver/ToolChains.cpp index a05d85aa1e0..90aede7c613 100644 --- a/clang/lib/Driver/ToolChains.cpp +++ b/clang/lib/Driver/ToolChains.cpp @@ -47,6 +47,69 @@ Darwin::Darwin(const HostInfo &Host, const llvm::Triple& Triple, IPhoneOSVersionMin = "3.0"; } +// FIXME: Can we tablegen this? +static const char *GetArmArchForMArch(llvm::StringRef Value) { + if (Value == "armv6k") + return "armv6"; + + if (Value == "armv5tej") + return "armv5"; + + if (Value == "xscale") + return "xscale"; + + if (Value == "armv4t") + return "armv4t"; + + if (Value == "armv7" || Value == "armv7-a" || Value == "armv7-r" || + Value == "armv7-m" || Value == "armv7a" || Value == "armv7r" || + Value == "armv7m") + return "armv7"; + + return 0; +} + +// FIXME: Can we tablegen this? +static const char *GetArmArchForMCpu(llvm::StringRef Value) { + if (Value == "arm10tdmi" || Value == "arm1020t" || Value == "arm9e" || + Value == "arm946e-s" || Value == "arm966e-s" || + Value == "arm968e-s" || Value == "arm10e" || + Value == "arm1020e" || Value == "arm1022e" || Value == "arm926ej-s" || + Value == "arm1026ej-s") + return "armv5"; + + if (Value == "xscale") + return "xscale"; + + if (Value == "arm1136j-s" || Value == "arm1136jf-s" || + Value == "arm1176jz-s" || Value == "arm1176jzf-s") + return "armv6"; + + if (Value == "cortex-a8" || Value == "cortex-r4" || Value == "cortex-m3") + return "armv7"; + + return 0; +} + +llvm::StringRef Darwin::getDarwinArchName(const ArgList &Args) const { + switch (getTriple().getArch()) { + default: + return getArchName(); + + case llvm::Triple::arm: { + if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) + if (const char *Arch = GetArmArchForMArch(A->getValue(Args))) + return Arch; + + if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) + if (const char *Arch = GetArmArchForMCpu(A->getValue(Args))) + return Arch; + + return "arm"; + } + } +} + DarwinGCC::DarwinGCC(const HostInfo &Host, const llvm::Triple& Triple, const unsigned (&DarwinVersion)[3], const unsigned (&_GCCVersion)[3], bool IsIPhoneOS) diff --git a/clang/lib/Driver/ToolChains.h b/clang/lib/Driver/ToolChains.h index 374ad8c6bb8..3ca6ad88972 100644 --- a/clang/lib/Driver/ToolChains.h +++ b/clang/lib/Driver/ToolChains.h @@ -85,6 +85,11 @@ public: Res[2] = DarwinVersion[1]; } + /// getDarwinArchName - Get the "Darwin" arch name for a particular compiler + /// invocation. For example, Darwin treats different ARM variations as + /// distinct architectures. + llvm::StringRef getDarwinArchName(const ArgList &Args) const; + /// getMacosxVersionMin - Get the effective -mmacosx-version-min, which is /// either the -mmacosx-version-min, or the current version if unspecified. void getMacosxVersionMin(const ArgList &Args, unsigned (&Res)[3]) const; diff --git a/clang/lib/Driver/Tools.cpp b/clang/lib/Driver/Tools.cpp index 857f0d643b3..d5d6004ac44 100644 --- a/clang/lib/Driver/Tools.cpp +++ b/clang/lib/Driver/Tools.cpp @@ -1849,80 +1849,17 @@ static bool isSourceSuffix(const char *Str) { .Default(false); } -// FIXME: Can we tablegen this? -static const char *GetArmArchForMArch(llvm::StringRef Value) { - if (Value == "armv6k") - return "armv6"; - - if (Value == "armv5tej") - return "armv5"; - - if (Value == "xscale") - return "xscale"; - - if (Value == "armv4t") - return "armv4t"; - - if (Value == "armv7" || Value == "armv7-a" || Value == "armv7-r" || - Value == "armv7-m" || Value == "armv7a" || Value == "armv7r" || - Value == "armv7m") - return "armv7"; - - return 0; -} - -// FIXME: Can we tablegen this? -static const char *GetArmArchForMCpu(llvm::StringRef Value) { - if (Value == "arm10tdmi" || Value == "arm1020t" || Value == "arm9e" || - Value == "arm946e-s" || Value == "arm966e-s" || - Value == "arm968e-s" || Value == "arm10e" || - Value == "arm1020e" || Value == "arm1022e" || Value == "arm926ej-s" || - Value == "arm1026ej-s") - return "armv5"; - - if (Value == "xscale") - return "xscale"; - - if (Value == "arm1136j-s" || Value == "arm1136jf-s" || - Value == "arm1176jz-s" || Value == "arm1176jzf-s") - return "armv6"; - - if (Value == "cortex-a8" || Value == "cortex-r4" || Value == "cortex-m3") - return "armv7"; - - return 0; -} - void darwin::DarwinTool::AddDarwinArch(const ArgList &Args, ArgStringList &CmdArgs) const { + llvm::StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args); + // Derived from darwin_arch spec. CmdArgs.push_back("-arch"); + CmdArgs.push_back(Args.MakeArgString(ArchName)); - switch (getToolChain().getTriple().getArch()) { - default: - CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName())); - break; - - case llvm::Triple::arm: { - if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) { - if (const char *Arch = GetArmArchForMArch(A->getValue(Args))) { - CmdArgs.push_back(Arch); - return; - } - } - - if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) { - if (const char *Arch = GetArmArchForMCpu(A->getValue(Args))) { - CmdArgs.push_back(Arch); - return; - } - } - - CmdArgs.push_back("arm"); + // FIXME: Is this needed anymore? + if (ArchName == "arm") CmdArgs.push_back("-force_cpusubtype_ALL"); - return; - } - } } void darwin::Link::AddLinkArgs(const ArgList &Args, |