diff options
Diffstat (limited to 'clang/lib/Driver/ToolChain.cpp')
-rw-r--r-- | clang/lib/Driver/ToolChain.cpp | 52 |
1 files changed, 30 insertions, 22 deletions
diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp index 7dd1fa13cc1..b4491d6a556 100644 --- a/clang/lib/Driver/ToolChain.cpp +++ b/clang/lib/Driver/ToolChain.cpp @@ -267,46 +267,52 @@ Tool *ToolChain::getTool(Action::ActionClass AC) const { llvm_unreachable("Invalid tool kind."); } -static StringRef getArchNameForCompilerRTLib(const ToolChain &TC, - const ArgList &Args) { - const llvm::Triple &Triple = TC.getTriple(); - bool IsWindows = Triple.isOSWindows(); - - if (Triple.isWindowsMSVCEnvironment() && TC.getArch() == llvm::Triple::x86) +static StringRef +getArchNameForCompilerRTLib(const ToolChain &TC, + const llvm::Triple &EffectiveTriple, + const ArgList &Args) { + bool IsWindows = EffectiveTriple.isOSWindows(); + + if (EffectiveTriple.isWindowsMSVCEnvironment() && + TC.getArch() == llvm::Triple::x86) return "i386"; if (TC.getArch() == llvm::Triple::arm || TC.getArch() == llvm::Triple::armeb) - return (arm::getARMFloatABI(TC, Args) == arm::FloatABI::Hard && !IsWindows) + return (arm::getARMFloatABI(TC, EffectiveTriple, Args) == + arm::FloatABI::Hard && + !IsWindows) ? "armhf" : "arm"; return TC.getArchName(); } -std::string ToolChain::getCompilerRT(const ArgList &Args, StringRef Component, +std::string ToolChain::getCompilerRT(const llvm::Triple &EffectiveTriple, + const ArgList &Args, StringRef Component, bool Shared) const { - const llvm::Triple &TT = getTriple(); - const char *Env = TT.isAndroid() ? "-android" : ""; - bool IsITANMSVCWindows = - TT.isWindowsMSVCEnvironment() || TT.isWindowsItaniumEnvironment(); + const char *Env = EffectiveTriple.isAndroid() ? "-android" : ""; + bool IsITANMSVCWindows = EffectiveTriple.isWindowsMSVCEnvironment() || + EffectiveTriple.isWindowsItaniumEnvironment(); - StringRef Arch = getArchNameForCompilerRTLib(*this, Args); + StringRef Arch = getArchNameForCompilerRTLib(*this, EffectiveTriple, Args); const char *Prefix = IsITANMSVCWindows ? "" : "lib"; - const char *Suffix = Shared ? (Triple.isOSWindows() ? ".dll" : ".so") + const char *Suffix = Shared ? (EffectiveTriple.isOSWindows() ? ".dll" : ".so") : (IsITANMSVCWindows ? ".lib" : ".a"); SmallString<128> Path(getDriver().ResourceDir); - StringRef OSLibName = Triple.isOSFreeBSD() ? "freebsd" : getOS(); + StringRef OSLibName = EffectiveTriple.isOSFreeBSD() ? "freebsd" : getOS(); llvm::sys::path::append(Path, "lib", OSLibName); llvm::sys::path::append(Path, Prefix + Twine("clang_rt.") + Component + "-" + Arch + Env + Suffix); return Path.str(); } -const char *ToolChain::getCompilerRTArgString(const llvm::opt::ArgList &Args, - StringRef Component, - bool Shared) const { - return Args.MakeArgString(getCompilerRT(Args, Component, Shared)); +const char * +ToolChain::getCompilerRTArgString(const llvm::Triple &EffectiveTriple, + const llvm::opt::ArgList &Args, + StringRef Component, bool Shared) const { + return Args.MakeArgString( + getCompilerRT(EffectiveTriple, Args, Component, Shared)); } bool ToolChain::needsProfileRT(const ArgList &Args) { @@ -517,11 +523,13 @@ void ToolChain::addClangTargetOptions(const ArgList &DriverArgs, void ToolChain::addClangWarningOptions(ArgStringList &CC1Args) const {} -void ToolChain::addProfileRTLibs(const llvm::opt::ArgList &Args, +void ToolChain::addProfileRTLibs(const llvm::Triple &EffectiveTriple, + const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const { - if (!needsProfileRT(Args)) return; + if (!needsProfileRT(Args)) + return; - CmdArgs.push_back(getCompilerRTArgString(Args, "profile")); + CmdArgs.push_back(getCompilerRTArgString(EffectiveTriple, Args, "profile")); } ToolChain::RuntimeLibType ToolChain::GetRuntimeLibType( |