diff options
author | Daniel Dunbar <daniel@zuster.org> | 2009-09-04 18:35:31 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2009-09-04 18:35:31 +0000 |
commit | 78dbd580a02759bbc408dbefb6754afa71b2c24c (patch) | |
tree | c127f6d70efce79b8a5a478303c8143741364237 | |
parent | 30392de4681602f1aabc61b0184b1de53bc172f0 (diff) |
Implement darwin::Link::AddDarwinArch for ARM.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@81020 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/Driver/Options.def | 1 | ||||
-rw-r--r-- | lib/Driver/Tools.cpp | 74 |
2 files changed, 74 insertions, 1 deletions
diff --git a/include/clang/Driver/Options.def b/include/clang/Driver/Options.def index 72bc907949..117253b654 100644 --- a/include/clang/Driver/Options.def +++ b/include/clang/Driver/Options.def @@ -508,6 +508,7 @@ OPTION("-m64", m64, Flag, m_Group, INVALID, "d", 0, 0, 0) OPTION("-march=", march_EQ, Joined, m_Group, INVALID, "d", 0, 0, 0) OPTION("-mcmodel=", mcmodel_EQ, Joined, m_Group, INVALID, "d", 0, 0, 0) OPTION("-mconstant-cfstrings", mconstant_cfstrings, Flag, clang_ignored_m_Group, INVALID, "", 0, 0, 0) +OPTION("-mcpu=", mcpu_EQ, Joined, m_Group, INVALID, "d", 0, 0, 0) OPTION("-mdynamic-no-pic", mdynamic_no_pic, Joined, m_Group, INVALID, "q", 0, 0, 0) OPTION("-mfix-and-continue", mfix_and_continue, Flag, clang_ignored_m_Group, INVALID, "", 0, 0, 0) OPTION("-miphoneos-version-min=", miphoneos_version_min_EQ, Joined, m_Group, INVALID, "", 0, 0, 0) diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index 27b34c7676..068ccd34bb 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -1368,11 +1368,83 @@ static bool isMacosxVersionLT(unsigned (&A)[3], return isMacosxVersionLT(A, B); } +// 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::Link::AddDarwinArch(const ArgList &Args, ArgStringList &CmdArgs) const { // Derived from darwin_arch spec. CmdArgs.push_back("-arch"); - CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName().c_str())); + + switch (getToolChain().getTriple().getArch()) { + default: + CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName().c_str())); + break; + + case llvm::Triple::arm: { + // FIXME: gcc isn't actually following this, it looks like the arch is + // getting forced somewhere else (translation?). + + 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"); + CmdArgs.push_back("-force_cpusubtype_ALL"); + return; + } + } } void darwin::Link::AddDarwinSubArch(const ArgList &Args, |