From 9f36062866e6e4bbbfd3efce85fcfb1ce62df97f Mon Sep 17 00:00:00 2001 From: Akira Hatanaka Date: Mon, 26 Sep 2011 21:07:52 +0000 Subject: [PATCH] Make necessary changes in AddMIPSTargetArgs for targeting Mips64. Enable use of -mcpu. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@140562 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Driver/Tools.cpp | 68 +++++++++++++++++++++++++++++++++----------- 1 file changed, 52 insertions(+), 16 deletions(-) diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index dba4c22d7d..8fafbee30d 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -752,33 +752,69 @@ void Clang::AddARMTargetArgs(const ArgList &Args, } } +// Get default architecture. +static const char* getMipsArchFromCPU(StringRef CPUName) { + if (CPUName == "mips32r1" || CPUName == "4ke") + return "mips"; + + assert((CPUName == "mips64r1" || CPUName == "mips64r2") && + "Unexpected cpu name."); + + return "mips64"; +} + +// Get default target cpu. +static const char* getMipsCPUFromArch(StringRef ArchName, const Driver &D) { + if (ArchName == "mips" || ArchName == "mipsel") + return "mips32r1"; + else if (ArchName == "mips64" || ArchName == "mips64el") + return "mips64r1"; + else + D.Diag(diag::err_drv_invalid_arch_name) << ArchName; + + return 0; +} + +// Get default ABI. +static const char* getMipsABIFromArch(StringRef ArchName) { + if (ArchName == "mips" || ArchName == "mipsel") + return "o32"; + + assert((ArchName == "mips64" || ArchName == "mips64el") && + "Unexpected arch name."); + return "n64"; +} + void Clang::AddMIPSTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const { const Driver &D = getToolChain().getDriver(); + StringRef ArchName; + const char *CPUName; + + // Set target cpu and architecture. + if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) { + CPUName = A->getValue(Args); + ArchName = getMipsArchFromCPU(CPUName); + } + else { + ArchName = Args.MakeArgString(getToolChain().getArchName()); + CPUName = getMipsCPUFromArch(ArchName, D); + } + + CmdArgs.push_back("-target-cpu"); + CmdArgs.push_back(CPUName); + // Select the ABI to use. const char *ABIName = 0; - if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) { + if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) ABIName = A->getValue(Args); - } else { - ABIName = "o32"; - } + else + ABIName = getMipsABIFromArch(ArchName); CmdArgs.push_back("-target-abi"); CmdArgs.push_back(ABIName); - if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) { - StringRef MArch = A->getValue(Args); - CmdArgs.push_back("-target-cpu"); - - if ((MArch == "r2000") || (MArch == "r3000")) - CmdArgs.push_back("mips1"); - else if (MArch == "r6000") - CmdArgs.push_back("mips2"); - else - CmdArgs.push_back(Args.MakeArgString(MArch)); - } - // Select the float ABI as determined by -msoft-float, -mhard-float, and StringRef FloatABI; if (Arg *A = Args.getLastArg(options::OPT_msoft_float, -- 2.40.0