<div dir="ltr">... this is pretty crazy. I think that you needed to plumb the effective triple through everything means that it really needs to be owned somewhere else and cached.<div><br></div><div>Can you rethink this? In general it doesn't make sense to have everything need this passed down.</div><div><br></div><div>Thanks!</div><div><br></div><div>-eric</div></div><br><div class="gmail_quote"><div dir="ltr">On Mon, Jul 18, 2016 at 1:04 PM Vedant Kumar via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: vedantk<br>
Date: Mon Jul 18 14:56:38 2016<br>
New Revision: 275895<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=275895&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=275895&view=rev</a><br>
Log:<br>
[Driver] Compute effective target triples once per job (NFCI)<br>
<br>
Compute an effective target triple exactly once in ConstructJob(), and<br>
then simply pass around references to it. This eliminates wasteful<br>
re-computation of effective triples (e.g in getARMFloatABI()).<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D22290" rel="noreferrer" target="_blank">https://reviews.llvm.org/D22290</a><br>
<br>
Modified:<br>
cfe/trunk/docs/ReleaseNotes.rst<br>
cfe/trunk/include/clang/Driver/SanitizerArgs.h<br>
cfe/trunk/include/clang/Driver/Tool.h<br>
cfe/trunk/include/clang/Driver/ToolChain.h<br>
cfe/trunk/lib/Driver/Driver.cpp<br>
cfe/trunk/lib/Driver/SanitizerArgs.cpp<br>
cfe/trunk/lib/Driver/ToolChain.cpp<br>
cfe/trunk/lib/Driver/ToolChains.cpp<br>
cfe/trunk/lib/Driver/ToolChains.h<br>
cfe/trunk/lib/Driver/Tools.cpp<br>
cfe/trunk/lib/Driver/Tools.h<br>
<br>
Modified: cfe/trunk/docs/ReleaseNotes.rst<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/ReleaseNotes.rst?rev=275895&r1=275894&r2=275895&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/ReleaseNotes.rst?rev=275895&r1=275894&r2=275895&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/docs/ReleaseNotes.rst (original)<br>
+++ cfe/trunk/docs/ReleaseNotes.rst Mon Jul 18 14:56:38 2016<br>
@@ -121,7 +121,8 @@ These are major API changes that have ha<br>
Clang. If upgrading an external codebase that uses Clang as a library,<br>
this section should help get you past the largest hurdles of upgrading.<br>
<br>
-- ...<br>
+- Classes which inherit from ``driver::Tool`` must be updated to use effective<br>
+ target triples when constructing jobs.<br>
<br>
AST Matchers<br>
------------<br>
<br>
Modified: cfe/trunk/include/clang/Driver/SanitizerArgs.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/SanitizerArgs.h?rev=275895&r1=275894&r2=275895&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/SanitizerArgs.h?rev=275895&r1=275894&r2=275895&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/include/clang/Driver/SanitizerArgs.h (original)<br>
+++ cfe/trunk/include/clang/Driver/SanitizerArgs.h Mon Jul 18 14:56:38 2016<br>
@@ -16,6 +16,10 @@<br>
#include <string><br>
#include <vector><br>
<br>
+namespace llvm {<br>
+class Triple;<br>
+}<br>
+<br>
namespace clang {<br>
namespace driver {<br>
<br>
@@ -66,7 +70,8 @@ class SanitizerArgs {<br>
bool requiresPIE() const;<br>
bool needsUnwindTables() const;<br>
bool linkCXXRuntimes() const { return LinkCXXRuntimes; }<br>
- void addArgs(const ToolChain &TC, const llvm::opt::ArgList &Args,<br>
+ void addArgs(const ToolChain &TC, const llvm::Triple &EffectiveTriple,<br>
+ const llvm::opt::ArgList &Args,<br>
llvm::opt::ArgStringList &CmdArgs, types::ID InputType) const;<br>
};<br>
<br>
<br>
Modified: cfe/trunk/include/clang/Driver/Tool.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Tool.h?rev=275895&r1=275894&r2=275895&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Tool.h?rev=275895&r1=275894&r2=275895&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/include/clang/Driver/Tool.h (original)<br>
+++ cfe/trunk/include/clang/Driver/Tool.h Mon Jul 18 14:56:38 2016<br>
@@ -14,6 +14,7 @@<br>
#include "llvm/Support/Program.h"<br>
<br>
namespace llvm {<br>
+class Triple;<br>
namespace opt {<br>
class ArgList;<br>
}<br>
@@ -127,6 +128,7 @@ public:<br>
virtual void ConstructJob(Compilation &C, const JobAction &JA,<br>
const InputInfo &Output,<br>
const InputInfoList &Inputs,<br>
+ const llvm::Triple &EffectiveTriple,<br>
const llvm::opt::ArgList &TCArgs,<br>
const char *LinkingOutput) const = 0;<br>
};<br>
<br>
Modified: cfe/trunk/include/clang/Driver/ToolChain.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/ToolChain.h?rev=275895&r1=275894&r2=275895&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/ToolChain.h?rev=275895&r1=275894&r2=275895&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/include/clang/Driver/ToolChain.h (original)<br>
+++ cfe/trunk/include/clang/Driver/ToolChain.h Mon Jul 18 14:56:38 2016<br>
@@ -260,11 +260,13 @@ public:<br>
return ToolChain::CST_Libstdcxx;<br>
}<br>
<br>
- virtual std::string getCompilerRT(const llvm::opt::ArgList &Args,<br>
+ virtual std::string getCompilerRT(const llvm::Triple &EffectiveTriple,<br>
+ const llvm::opt::ArgList &Args,<br>
StringRef Component,<br>
bool Shared = false) const;<br>
<br>
- const char *getCompilerRTArgString(const llvm::opt::ArgList &Args,<br>
+ const char *getCompilerRTArgString(const llvm::Triple &EffectiveTriple,<br>
+ const llvm::opt::ArgList &Args,<br>
StringRef Component,<br>
bool Shared = false) const;<br>
/// needsProfileRT - returns true if instrumentation profile is on.<br>
@@ -410,7 +412,8 @@ public:<br>
const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const;<br>
/// addProfileRTLibs - When -fprofile-instr-profile is specified, try to pass<br>
/// a suitable profile runtime library to the linker.<br>
- virtual void addProfileRTLibs(const llvm::opt::ArgList &Args,<br>
+ virtual void addProfileRTLibs(const llvm::Triple &EffectiveTriple,<br>
+ const llvm::opt::ArgList &Args,<br>
llvm::opt::ArgStringList &CmdArgs) const;<br>
<br>
/// \brief Add arguments to use system-specific CUDA includes.<br>
<br>
Modified: cfe/trunk/lib/Driver/Driver.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Driver.cpp?rev=275895&r1=275894&r2=275895&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Driver.cpp?rev=275895&r1=275894&r2=275895&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Driver/Driver.cpp (original)<br>
+++ cfe/trunk/lib/Driver/Driver.cpp Mon Jul 18 14:56:38 2016<br>
@@ -2256,7 +2256,21 @@ InputInfo Driver::BuildJobsForActionNoCa<br>
TC->getTriple().normalize()),<br>
BaseInput);<br>
<br>
+ llvm::Triple EffectiveTriple;<br>
+ const ArgList &Args = C.getArgsForToolChain(TC, BoundArch);<br>
+ if (InputInfos.size() != 1) {<br>
+ EffectiveTriple = llvm::Triple(<br>
+ T->getToolChain().ComputeEffectiveClangTriple(Args));<br>
+ } else {<br>
+ // Pass along the input type if it can be unambiguously determined.<br>
+ EffectiveTriple =<br>
+ llvm::Triple(T->getToolChain().ComputeEffectiveClangTriple(<br>
+ Args, InputInfos[0].getType()));<br>
+ }<br>
+<br>
if (CCCPrintBindings && !CCGenDiagnostics) {<br>
+ // FIXME: We should be able to use the effective triple here, but doing so<br>
+ // breaks some multi-arch tests.<br>
llvm::errs() << "# \"" << T->getToolChain().getTripleString() << '"'<br>
<< " - \"" << T->getName() << "\", inputs: [";<br>
for (unsigned i = 0, e = InputInfos.size(); i != e; ++i) {<br>
@@ -2266,7 +2280,7 @@ InputInfo Driver::BuildJobsForActionNoCa<br>
}<br>
llvm::errs() << "], output: " << Result.getAsString() << "\n";<br>
} else {<br>
- T->ConstructJob(C, *JA, Result, InputInfos,<br>
+ T->ConstructJob(C, *JA, Result, InputInfos, EffectiveTriple,<br>
C.getArgsForToolChain(TC, BoundArch), LinkingOutput);<br>
}<br>
return Result;<br>
<br>
Modified: cfe/trunk/lib/Driver/SanitizerArgs.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/SanitizerArgs.cpp?rev=275895&r1=275894&r2=275895&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/SanitizerArgs.cpp?rev=275895&r1=275894&r2=275895&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Driver/SanitizerArgs.cpp (original)<br>
+++ cfe/trunk/lib/Driver/SanitizerArgs.cpp Mon Jul 18 14:56:38 2016<br>
@@ -602,7 +602,9 @@ static void addIncludeLinkerOption(const<br>
CmdArgs.push_back(Args.MakeArgString(LinkerOptionFlag));<br>
}<br>
<br>
-void SanitizerArgs::addArgs(const ToolChain &TC, const llvm::opt::ArgList &Args,<br>
+void SanitizerArgs::addArgs(const ToolChain &TC,<br>
+ const llvm::Triple &EffectiveTriple,<br>
+ const llvm::opt::ArgList &Args,<br>
llvm::opt::ArgStringList &CmdArgs,<br>
types::ID InputType) const {<br>
// Translate available CoverageFeatures to corresponding clang-cc1 flags.<br>
@@ -626,21 +628,24 @@ void SanitizerArgs::addArgs(const ToolCh<br>
// Instruct the code generator to embed linker directives in the object file<br>
// that cause the required runtime libraries to be linked.<br>
CmdArgs.push_back(Args.MakeArgString(<br>
- "--dependent-lib=" + TC.getCompilerRT(Args, "ubsan_standalone")));<br>
+ "--dependent-lib=" +<br>
+ TC.getCompilerRT(EffectiveTriple, Args, "ubsan_standalone")));<br>
if (types::isCXX(InputType))<br>
CmdArgs.push_back(Args.MakeArgString(<br>
- "--dependent-lib=" + TC.getCompilerRT(Args, "ubsan_standalone_cxx")));<br>
+ "--dependent-lib=" +<br>
+ TC.getCompilerRT(EffectiveTriple, Args, "ubsan_standalone_cxx")));<br>
}<br>
if (TC.getTriple().isOSWindows() && needsStatsRt()) {<br>
- CmdArgs.push_back(Args.MakeArgString("--dependent-lib=" +<br>
- TC.getCompilerRT(Args, "stats_client")));<br>
+ CmdArgs.push_back(Args.MakeArgString(<br>
+ "--dependent-lib=" +<br>
+ TC.getCompilerRT(EffectiveTriple, Args, "stats_client")));<br>
<br>
// The main executable must export the stats runtime.<br>
// FIXME: Only exporting from the main executable (e.g. based on whether the<br>
// translation unit defines main()) would save a little space, but having<br>
// multiple copies of the runtime shouldn't hurt.<br>
- CmdArgs.push_back(Args.MakeArgString("--dependent-lib=" +<br>
- TC.getCompilerRT(Args, "stats")));<br>
+ CmdArgs.push_back(Args.MakeArgString(<br>
+ "--dependent-lib=" + TC.getCompilerRT(EffectiveTriple, Args, "stats")));<br>
addIncludeLinkerOption(TC, Args, CmdArgs, "__sanitizer_stats_register");<br>
}<br>
<br>
<br>
Modified: cfe/trunk/lib/Driver/ToolChain.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChain.cpp?rev=275895&r1=275894&r2=275895&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChain.cpp?rev=275895&r1=275894&r2=275895&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Driver/ToolChain.cpp (original)<br>
+++ cfe/trunk/lib/Driver/ToolChain.cpp Mon Jul 18 14:56:38 2016<br>
@@ -267,46 +267,52 @@ Tool *ToolChain::getTool(Action::ActionC<br>
llvm_unreachable("Invalid tool kind.");<br>
}<br>
<br>
-static StringRef getArchNameForCompilerRTLib(const ToolChain &TC,<br>
- const ArgList &Args) {<br>
- const llvm::Triple &Triple = TC.getTriple();<br>
- bool IsWindows = Triple.isOSWindows();<br>
+static StringRef<br>
+getArchNameForCompilerRTLib(const ToolChain &TC,<br>
+ const llvm::Triple &EffectiveTriple,<br>
+ const ArgList &Args) {<br>
+ bool IsWindows = EffectiveTriple.isOSWindows();<br>
<br>
- if (Triple.isWindowsMSVCEnvironment() && TC.getArch() == llvm::Triple::x86)<br>
+ if (EffectiveTriple.isWindowsMSVCEnvironment() &&<br>
+ TC.getArch() == llvm::Triple::x86)<br>
return "i386";<br>
<br>
if (TC.getArch() == llvm::Triple::arm || TC.getArch() == llvm::Triple::armeb)<br>
- return (arm::getARMFloatABI(TC, Args) == arm::FloatABI::Hard && !IsWindows)<br>
+ return (arm::getARMFloatABI(TC, EffectiveTriple, Args) ==<br>
+ arm::FloatABI::Hard &&<br>
+ !IsWindows)<br>
? "armhf"<br>
: "arm";<br>
<br>
return TC.getArchName();<br>
}<br>
<br>
-std::string ToolChain::getCompilerRT(const ArgList &Args, StringRef Component,<br>
+std::string ToolChain::getCompilerRT(const llvm::Triple &EffectiveTriple,<br>
+ const ArgList &Args, StringRef Component,<br>
bool Shared) const {<br>
- const llvm::Triple &TT = getTriple();<br>
- const char *Env = TT.isAndroid() ? "-android" : "";<br>
- bool IsITANMSVCWindows =<br>
- TT.isWindowsMSVCEnvironment() || TT.isWindowsItaniumEnvironment();<br>
+ const char *Env = EffectiveTriple.isAndroid() ? "-android" : "";<br>
+ bool IsITANMSVCWindows = EffectiveTriple.isWindowsMSVCEnvironment() ||<br>
+ EffectiveTriple.isWindowsItaniumEnvironment();<br>
<br>
- StringRef Arch = getArchNameForCompilerRTLib(*this, Args);<br>
+ StringRef Arch = getArchNameForCompilerRTLib(*this, EffectiveTriple, Args);<br>
const char *Prefix = IsITANMSVCWindows ? "" : "lib";<br>
- const char *Suffix = Shared ? (Triple.isOSWindows() ? ".dll" : ".so")<br>
+ const char *Suffix = Shared ? (EffectiveTriple.isOSWindows() ? ".dll" : ".so")<br>
: (IsITANMSVCWindows ? ".lib" : ".a");<br>
<br>
SmallString<128> Path(getDriver().ResourceDir);<br>
- StringRef OSLibName = Triple.isOSFreeBSD() ? "freebsd" : getOS();<br>
+ StringRef OSLibName = EffectiveTriple.isOSFreeBSD() ? "freebsd" : getOS();<br>
llvm::sys::path::append(Path, "lib", OSLibName);<br>
llvm::sys::path::append(Path, Prefix + Twine("clang_rt.") + Component + "-" +<br>
Arch + Env + Suffix);<br>
return Path.str();<br>
}<br>
<br>
-const char *ToolChain::getCompilerRTArgString(const llvm::opt::ArgList &Args,<br>
- StringRef Component,<br>
- bool Shared) const {<br>
- return Args.MakeArgString(getCompilerRT(Args, Component, Shared));<br>
+const char *<br>
+ToolChain::getCompilerRTArgString(const llvm::Triple &EffectiveTriple,<br>
+ const llvm::opt::ArgList &Args,<br>
+ StringRef Component, bool Shared) const {<br>
+ return Args.MakeArgString(<br>
+ getCompilerRT(EffectiveTriple, Args, Component, Shared));<br>
}<br>
<br>
bool ToolChain::needsProfileRT(const ArgList &Args) {<br>
@@ -517,11 +523,13 @@ void ToolChain::addClangTargetOptions(co<br>
<br>
void ToolChain::addClangWarningOptions(ArgStringList &CC1Args) const {}<br>
<br>
-void ToolChain::addProfileRTLibs(const llvm::opt::ArgList &Args,<br>
+void ToolChain::addProfileRTLibs(const llvm::Triple &EffectiveTriple,<br>
+ const llvm::opt::ArgList &Args,<br>
llvm::opt::ArgStringList &CmdArgs) const {<br>
- if (!needsProfileRT(Args)) return;<br>
+ if (!needsProfileRT(Args))<br>
+ return;<br>
<br>
- CmdArgs.push_back(getCompilerRTArgString(Args, "profile"));<br>
+ CmdArgs.push_back(getCompilerRTArgString(EffectiveTriple, Args, "profile"));<br>
}<br>
<br>
ToolChain::RuntimeLibType ToolChain::GetRuntimeLibType(<br>
<br>
Modified: cfe/trunk/lib/Driver/ToolChains.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains.cpp?rev=275895&r1=275894&r2=275895&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains.cpp?rev=275895&r1=275894&r2=275895&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Driver/ToolChains.cpp (original)<br>
+++ cfe/trunk/lib/Driver/ToolChains.cpp Mon Jul 18 14:56:38 2016<br>
@@ -380,13 +380,16 @@ StringRef Darwin::getOSLibraryNameSuffix<br>
llvm_unreachable("Unsupported platform");<br>
}<br>
<br>
-void Darwin::addProfileRTLibs(const ArgList &Args,<br>
+void Darwin::addProfileRTLibs(const llvm::Triple &EffectiveTriple,<br>
+ const ArgList &Args,<br>
ArgStringList &CmdArgs) const {<br>
- if (!needsProfileRT(Args)) return;<br>
+ if (!needsProfileRT(Args))<br>
+ return;<br>
<br>
- AddLinkRuntimeLib(Args, CmdArgs, (Twine("libclang_rt.profile_") +<br>
- getOSLibraryNameSuffix() + ".a").str(),<br>
- /*AlwaysLink*/ true);<br>
+ AddLinkRuntimeLib(<br>
+ Args, CmdArgs,<br>
+ (Twine("libclang_rt.profile_") + getOSLibraryNameSuffix() + ".a").str(),<br>
+ /*AlwaysLink*/ true);<br>
}<br>
<br>
void DarwinClang::AddLinkSanitizerLibArgs(const ArgList &Args,<br>
@@ -400,7 +403,8 @@ void DarwinClang::AddLinkSanitizerLibArg<br>
/*AddRPath*/ true);<br>
}<br>
<br>
-void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args,<br>
+void DarwinClang::AddLinkRuntimeLibArgs(const llvm::Triple &EffectiveTriple,<br>
+ const ArgList &Args,<br>
ArgStringList &CmdArgs) const {<br>
// Darwin only supports the compiler-rt based runtime libraries.<br>
switch (GetRuntimeLibType(Args)) {<br>
@@ -1012,16 +1016,17 @@ DerivedArgList *MachO::TranslateArgs(con<br>
return DAL;<br>
}<br>
<br>
-void MachO::AddLinkRuntimeLibArgs(const ArgList &Args,<br>
+void MachO::AddLinkRuntimeLibArgs(const llvm::Triple &EffectiveTriple,<br>
+ const ArgList &Args,<br>
ArgStringList &CmdArgs) const {<br>
// Embedded targets are simple at the moment, not supporting sanitizers and<br>
// with different libraries for each member of the product { static, PIC } x<br>
// { hard-float, soft-float }<br>
llvm::SmallString<32> CompilerRT = StringRef("libclang_rt.");<br>
- CompilerRT +=<br>
- (tools::arm::getARMFloatABI(*this, Args) == tools::arm::FloatABI::Hard)<br>
- ? "hard"<br>
- : "soft";<br>
+ CompilerRT += (tools::arm::getARMFloatABI(*this, EffectiveTriple, Args) ==<br>
+ tools::arm::FloatABI::Hard)<br>
+ ? "hard"<br>
+ : "soft";<br>
CompilerRT += Args.hasArg(options::OPT_fPIC) ? "_pic.a" : "_static.a";<br>
<br>
AddLinkRuntimeLib(Args, CmdArgs, CompilerRT, false, true);<br>
@@ -2858,9 +2863,10 @@ void MipsLLVMToolChain::AddCXXStdlibLibA<br>
CmdArgs.push_back("-lunwind");<br>
}<br>
<br>
-std::string MipsLLVMToolChain::getCompilerRT(const ArgList &Args,<br>
- StringRef Component,<br>
- bool Shared) const {<br>
+std::string<br>
+MipsLLVMToolChain::getCompilerRT(const llvm::Triple &EffectiveTriple,<br>
+ const ArgList &Args, StringRef Component,<br>
+ bool Shared) const {<br>
SmallString<128> Path(getDriver().ResourceDir);<br>
llvm::sys::path::append(Path, SelectedMultilib.osSuffix(), "lib" + LibSuffix,<br>
getOS());<br>
@@ -4237,9 +4243,9 @@ std::string Linux::getDynamicLinker(cons<br>
case llvm::Triple::thumb:<br>
case llvm::Triple::armeb:<br>
case llvm::Triple::thumbeb: {<br>
- const bool HF =<br>
- Triple.getEnvironment() == llvm::Triple::GNUEABIHF ||<br>
- tools::arm::getARMFloatABI(*this, Args) == tools::arm::FloatABI::Hard;<br>
+ const bool HF = Triple.getEnvironment() == llvm::Triple::GNUEABIHF ||<br>
+ tools::arm::getARMFloatABI(*this, Triple, Args) ==<br>
+ tools::arm::FloatABI::Hard;<br>
<br>
LibDir = "lib";<br>
Loader = HF ? "ld-linux-armhf.so.3" : "ld-linux.so.3";<br>
@@ -4631,16 +4637,18 @@ SanitizerMask Linux::getSupportedSanitiz<br>
return Res;<br>
}<br>
<br>
-void Linux::addProfileRTLibs(const llvm::opt::ArgList &Args,<br>
+void Linux::addProfileRTLibs(const llvm::Triple &EffectiveTriple,<br>
+ const llvm::opt::ArgList &Args,<br>
llvm::opt::ArgStringList &CmdArgs) const {<br>
- if (!needsProfileRT(Args)) return;<br>
+ if (!needsProfileRT(Args))<br>
+ return;<br>
<br>
// Add linker option -u__llvm_runtime_variable to cause runtime<br>
// initialization module to be linked in.<br>
if (!Args.hasArg(options::OPT_coverage))<br>
CmdArgs.push_back(Args.MakeArgString(<br>
Twine("-u", llvm::getInstrProfRuntimeHookVarName())));<br>
- ToolChain::addProfileRTLibs(Args, CmdArgs);<br>
+ ToolChain::addProfileRTLibs(EffectiveTriple, Args, CmdArgs);<br>
}<br>
<br>
/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.<br>
<br>
Modified: cfe/trunk/lib/Driver/ToolChains.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains.h?rev=275895&r1=275894&r2=275895&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains.h?rev=275895&r1=275894&r2=275895&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Driver/ToolChains.h (original)<br>
+++ cfe/trunk/lib/Driver/ToolChains.h Mon Jul 18 14:56:38 2016<br>
@@ -279,7 +279,8 @@ public:<br>
llvm::opt::ArgStringList &CmdArgs) const {}<br>
<br>
/// Add the linker arguments to link the compiler runtime library.<br>
- virtual void AddLinkRuntimeLibArgs(const llvm::opt::ArgList &Args,<br>
+ virtual void AddLinkRuntimeLibArgs(const llvm::Triple &EffectiveTriple,<br>
+ const llvm::opt::ArgList &Args,<br>
llvm::opt::ArgStringList &CmdArgs) const;<br>
<br>
virtual void addStartObjectFileArgs(const llvm::opt::ArgList &Args,<br>
@@ -303,7 +304,8 @@ public:<br>
<br>
/// Add any profiling runtime libraries that are needed. This is essentially a<br>
/// MachO specific version of addProfileRT in Tools.cpp.<br>
- void addProfileRTLibs(const llvm::opt::ArgList &Args,<br>
+ void addProfileRTLibs(const llvm::Triple &EffectiveTriple,<br>
+ const llvm::opt::ArgList &Args,<br>
llvm::opt::ArgStringList &CmdArgs) const override {<br>
// There aren't any profiling libs for embedded targets currently.<br>
}<br>
@@ -417,7 +419,8 @@ public:<br>
!isTargetWatchOS());<br>
}<br>
<br>
- void addProfileRTLibs(const llvm::opt::ArgList &Args,<br>
+ void addProfileRTLibs(const llvm::Triple &EffectiveTriple,<br>
+ const llvm::opt::ArgList &Args,<br>
llvm::opt::ArgStringList &CmdArgs) const override;<br>
<br>
protected:<br>
@@ -572,7 +575,8 @@ public:<br>
/// @name Apple ToolChain Implementation<br>
/// {<br>
<br>
- void AddLinkRuntimeLibArgs(const llvm::opt::ArgList &Args,<br>
+ void AddLinkRuntimeLibArgs(const llvm::Triple &EffectiveTriple,<br>
+ const llvm::opt::ArgList &Args,<br>
llvm::opt::ArgStringList &CmdArgs) const override;<br>
<br>
void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args,<br>
@@ -838,7 +842,8 @@ public:<br>
llvm::opt::ArgStringList &CC1Args) const override;<br>
bool isPIEDefault() const override;<br>
SanitizerMask getSupportedSanitizers() const override;<br>
- void addProfileRTLibs(const llvm::opt::ArgList &Args,<br>
+ void addProfileRTLibs(const llvm::Triple &EffectiveTriple,<br>
+ const llvm::opt::ArgList &Args,<br>
llvm::opt::ArgStringList &CmdArgs) const override;<br>
virtual std::string computeSysRoot() const;<br>
<br>
@@ -902,7 +907,8 @@ public:<br>
void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args,<br>
llvm::opt::ArgStringList &CmdArgs) const override;<br>
<br>
- std::string getCompilerRT(const llvm::opt::ArgList &Args, StringRef Component,<br>
+ std::string getCompilerRT(const llvm::Triple &EffectiveTriple,<br>
+ const llvm::opt::ArgList &Args, StringRef Component,<br>
bool Shared = false) const override;<br>
<br>
std::string computeSysRoot() const override;<br>
<br>
Modified: cfe/trunk/lib/Driver/Tools.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=275895&r1=275894&r2=275895&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=275895&r1=275894&r2=275895&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Driver/Tools.cpp (original)<br>
+++ cfe/trunk/lib/Driver/Tools.cpp Mon Jul 18 14:56:38 2016<br>
@@ -771,10 +771,11 @@ static bool useAAPCSForMachO(const llvm:<br>
<br>
// Select the float ABI as determined by -msoft-float, -mhard-float, and<br>
// -mfloat-abi=.<br>
-arm::FloatABI arm::getARMFloatABI(const ToolChain &TC, const ArgList &Args) {<br>
+arm::FloatABI arm::getARMFloatABI(const ToolChain &TC,<br>
+ const llvm::Triple &EffectiveTriple,<br>
+ const ArgList &Args) {<br>
const Driver &D = TC.getDriver();<br>
- const llvm::Triple Triple(TC.ComputeEffectiveClangTriple(Args));<br>
- auto SubArch = getARMSubArchVersionNumber(Triple);<br>
+ auto SubArch = getARMSubArchVersionNumber(EffectiveTriple);<br>
arm::FloatABI ABI = FloatABI::Invalid;<br>
if (Arg *A =<br>
Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,<br>
@@ -797,23 +798,23 @@ arm::FloatABI arm::getARMFloatABI(const<br>
<br>
// It is incorrect to select hard float ABI on MachO platforms if the ABI is<br>
// "apcs-gnu".<br>
- if (Triple.isOSBinFormatMachO() && !useAAPCSForMachO(Triple) &&<br>
- ABI == FloatABI::Hard) {<br>
- D.Diag(diag::err_drv_unsupported_opt_for_target) << A->getAsString(Args)<br>
- << Triple.getArchName();<br>
+ if (EffectiveTriple.isOSBinFormatMachO() &&<br>
+ !useAAPCSForMachO(EffectiveTriple) && ABI == FloatABI::Hard) {<br>
+ D.Diag(diag::err_drv_unsupported_opt_for_target)<br>
+ << A->getAsString(Args) << EffectiveTriple.getArchName();<br>
}<br>
}<br>
<br>
// If unspecified, choose the default based on the platform.<br>
if (ABI == FloatABI::Invalid) {<br>
- switch (Triple.getOS()) {<br>
+ switch (EffectiveTriple.getOS()) {<br>
case llvm::Triple::Darwin:<br>
case llvm::Triple::MacOSX:<br>
case llvm::Triple::IOS:<br>
case llvm::Triple::TvOS: {<br>
// Darwin defaults to "softfp" for v6 and v7.<br>
ABI = (SubArch == 6 || SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;<br>
- ABI = Triple.isWatchABI() ? FloatABI::Hard : ABI;<br>
+ ABI = EffectiveTriple.isWatchABI() ? FloatABI::Hard : ABI;<br>
break;<br>
}<br>
case llvm::Triple::WatchOS:<br>
@@ -826,7 +827,7 @@ arm::FloatABI arm::getARMFloatABI(const<br>
break;<br>
<br>
case llvm::Triple::FreeBSD:<br>
- switch (Triple.getEnvironment()) {<br>
+ switch (EffectiveTriple.getEnvironment()) {<br>
case llvm::Triple::GNUEABIHF:<br>
ABI = FloatABI::Hard;<br>
break;<br>
@@ -838,7 +839,7 @@ arm::FloatABI arm::getARMFloatABI(const<br>
break;<br>
<br>
default:<br>
- switch (Triple.getEnvironment()) {<br>
+ switch (EffectiveTriple.getEnvironment()) {<br>
case llvm::Triple::GNUEABIHF:<br>
case llvm::Triple::MuslEABIHF:<br>
case llvm::Triple::EABIHF:<br>
@@ -855,14 +856,14 @@ arm::FloatABI arm::getARMFloatABI(const<br>
break;<br>
default:<br>
// Assume "soft", but warn the user we are guessing.<br>
- if (Triple.isOSBinFormatMachO() &&<br>
- Triple.getSubArch() == llvm::Triple::ARMSubArch_v7em)<br>
+ if (EffectiveTriple.isOSBinFormatMachO() &&<br>
+ EffectiveTriple.getSubArch() == llvm::Triple::ARMSubArch_v7em)<br>
ABI = FloatABI::Hard;<br>
else<br>
ABI = FloatABI::Soft;<br>
<br>
- if (Triple.getOS() != llvm::Triple::UnknownOS ||<br>
- !Triple.isOSBinFormatMachO())<br>
+ if (EffectiveTriple.getOS() != llvm::Triple::UnknownOS ||<br>
+ !EffectiveTriple.isOSBinFormatMachO())<br>
D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";<br>
break;<br>
}<br>
@@ -882,7 +883,7 @@ static void getARMTargetFeatures(const T<br>
<br>
bool KernelOrKext =<br>
Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);<br>
- arm::FloatABI ABI = arm::getARMFloatABI(TC, Args);<br>
+ arm::FloatABI ABI = arm::getARMFloatABI(TC, Triple, Args);<br>
const Arg *WaCPU = nullptr, *WaFPU = nullptr;<br>
const Arg *WaHDiv = nullptr, *WaArch = nullptr;<br>
<br>
@@ -1011,7 +1012,7 @@ static void getARMTargetFeatures(const T<br>
Features.push_back("+long-calls");<br>
} else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)) &&<br>
!Triple.isWatchOS()) {<br>
- Features.push_back("+long-calls");<br>
+ Features.push_back("+long-calls");<br>
}<br>
<br>
// Kernel code has more strict alignment requirements.<br>
@@ -1025,7 +1026,8 @@ static void getARMTargetFeatures(const T<br>
D.Diag(diag::err_target_unsupported_unaligned) << "v6m";<br>
// v8M Baseline follows on from v6M, so doesn't support unaligned memory<br>
// access either.<br>
- else if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8m_baseline)<br>
+ else if (Triple.getSubArch() ==<br>
+ llvm::Triple::SubArchType::ARMSubArch_v8m_baseline)<br>
D.Diag(diag::err_target_unsupported_unaligned) << "v8m.base";<br>
} else<br>
Features.push_back("+strict-align");<br>
@@ -1111,7 +1113,7 @@ void Clang::AddARMTargetArgs(const llvm:<br>
CmdArgs.push_back(ABIName);<br>
<br>
// Determine floating point ABI from the options & target defaults.<br>
- arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);<br>
+ arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Triple, Args);<br>
if (ABI == arm::FloatABI::Soft) {<br>
// Floating point operations and argument passing are soft.<br>
// FIXME: This changes CPP defines, we need -target-soft-float.<br>
@@ -1172,11 +1174,9 @@ static std::string getAArch64TargetCPU(c<br>
return "generic";<br>
}<br>
<br>
-void Clang::AddAArch64TargetArgs(const ArgList &Args,<br>
+void Clang::AddAArch64TargetArgs(const llvm::Triple &EffectiveTriple,<br>
+ const ArgList &Args,<br>
ArgStringList &CmdArgs) const {<br>
- std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);<br>
- llvm::Triple Triple(TripleStr);<br>
-<br>
if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||<br>
Args.hasArg(options::OPT_mkernel) ||<br>
Args.hasArg(options::OPT_fapple_kext))<br>
@@ -1189,7 +1189,7 @@ void Clang::AddAArch64TargetArgs(const A<br>
const char *ABIName = nullptr;<br>
if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))<br>
ABIName = A->getValue();<br>
- else if (Triple.isOSDarwin())<br>
+ else if (EffectiveTriple.isOSDarwin())<br>
ABIName = "darwinpcs";<br>
else<br>
ABIName = "aapcs";<br>
@@ -1204,7 +1204,7 @@ void Clang::AddAArch64TargetArgs(const A<br>
CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");<br>
else<br>
CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");<br>
- } else if (Triple.isAndroid()) {<br>
+ } else if (EffectiveTriple.isAndroid()) {<br>
// Enabled A53 errata (835769) workaround by default on android<br>
CmdArgs.push_back("-backend-option");<br>
CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");<br>
@@ -2999,9 +2999,10 @@ static void CollectArgsForIntegratedAsse<br>
// This adds the static libclang_rt.builtins-arch.a directly to the command line<br>
// FIXME: Make sure we can also emit shared objects if they're requested<br>
// and available, check for possible errors, etc.<br>
-static void addClangRT(const ToolChain &TC, const ArgList &Args,<br>
- ArgStringList &CmdArgs) {<br>
- CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins"));<br>
+static void addClangRT(const ToolChain &TC, const llvm::Triple &EffectiveTriple,<br>
+ const ArgList &Args, ArgStringList &CmdArgs) {<br>
+ CmdArgs.push_back(<br>
+ TC.getCompilerRTArgString(EffectiveTriple, Args, "builtins"));<br>
}<br>
<br>
namespace {<br>
@@ -3075,22 +3076,27 @@ static void addOpenMPRuntime(ArgStringLi<br>
}<br>
}<br>
<br>
-static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,<br>
- ArgStringList &CmdArgs, StringRef Sanitizer,<br>
- bool IsShared, bool IsWhole) {<br>
+static void addSanitizerRuntime(const ToolChain &TC,<br>
+ const llvm::Triple &EffectiveTriple,<br>
+ const ArgList &Args, ArgStringList &CmdArgs,<br>
+ StringRef Sanitizer, bool IsShared,<br>
+ bool IsWhole) {<br>
// Wrap any static runtimes that must be forced into executable in<br>
// whole-archive.<br>
if (IsWhole) CmdArgs.push_back("-whole-archive");<br>
- CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared));<br>
- if (IsWhole) CmdArgs.push_back("-no-whole-archive");<br>
+ CmdArgs.push_back(<br>
+ TC.getCompilerRTArgString(EffectiveTriple, Args, Sanitizer, IsShared));<br>
+ if (IsWhole)<br>
+ CmdArgs.push_back("-no-whole-archive");<br>
}<br>
<br>
// Tries to use a file with the list of dynamic symbols that need to be exported<br>
// from the runtime library. Returns true if the file was found.<br>
-static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,<br>
- ArgStringList &CmdArgs,<br>
+static bool addSanitizerDynamicList(const ToolChain &TC,<br>
+ const llvm::Triple &EffectiveTriple,<br>
+ const ArgList &Args, ArgStringList &CmdArgs,<br>
StringRef Sanitizer) {<br>
- SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer));<br>
+ SmallString<128> SanRT(TC.getCompilerRT(EffectiveTriple, Args, Sanitizer));<br>
if (llvm::sys::fs::exists(SanRT + ".syms")) {<br>
CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));<br>
return true;<br>
@@ -3179,25 +3185,28 @@ collectSanitizerRuntimes(const ToolChain<br>
<br>
// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,<br>
// C runtime, etc). Returns true if sanitizer system deps need to be linked in.<br>
-static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,<br>
- ArgStringList &CmdArgs) {<br>
+static bool addSanitizerRuntimes(const ToolChain &TC,<br>
+ const llvm::Triple &EffectiveTriple,<br>
+ const ArgList &Args, ArgStringList &CmdArgs) {<br>
SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,<br>
NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;<br>
collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,<br>
NonWholeStaticRuntimes, HelperStaticRuntimes,<br>
RequiredSymbols);<br>
for (auto RT : SharedRuntimes)<br>
- addSanitizerRuntime(TC, Args, CmdArgs, RT, true, false);<br>
+ addSanitizerRuntime(TC, EffectiveTriple, Args, CmdArgs, RT, true, false);<br>
for (auto RT : HelperStaticRuntimes)<br>
- addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);<br>
+ addSanitizerRuntime(TC, EffectiveTriple, Args, CmdArgs, RT, false, true);<br>
bool AddExportDynamic = false;<br>
for (auto RT : StaticRuntimes) {<br>
- addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);<br>
- AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);<br>
+ addSanitizerRuntime(TC, EffectiveTriple, Args, CmdArgs, RT, false, true);<br>
+ AddExportDynamic |=<br>
+ !addSanitizerDynamicList(TC, EffectiveTriple, Args, CmdArgs, RT);<br>
}<br>
for (auto RT : NonWholeStaticRuntimes) {<br>
- addSanitizerRuntime(TC, Args, CmdArgs, RT, false, false);<br>
- AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);<br>
+ addSanitizerRuntime(TC, EffectiveTriple, Args, CmdArgs, RT, false, false);<br>
+ AddExportDynamic |=<br>
+ !addSanitizerDynamicList(TC, EffectiveTriple, Args, CmdArgs, RT);<br>
}<br>
for (auto S : RequiredSymbols) {<br>
CmdArgs.push_back("-u");<br>
@@ -3210,12 +3219,14 @@ static bool addSanitizerRuntimes(const T<br>
return !StaticRuntimes.empty();<br>
}<br>
<br>
-static bool addXRayRuntime(const ToolChain &TC, const ArgList &Args,<br>
- ArgStringList &CmdArgs) {<br>
+static bool addXRayRuntime(const ToolChain &TC,<br>
+ const llvm::Triple &EffectiveTriple,<br>
+ const ArgList &Args, ArgStringList &CmdArgs) {<br>
if (Args.hasFlag(options::OPT_fxray_instrument,<br>
options::OPT_fnoxray_instrument, false)) {<br>
CmdArgs.push_back("-whole-archive");<br>
- CmdArgs.push_back(TC.getCompilerRTArgString(Args, "xray", false));<br>
+ CmdArgs.push_back(<br>
+ TC.getCompilerRTArgString(EffectiveTriple, Args, "xray", false));<br>
CmdArgs.push_back("-no-whole-archive");<br>
return true;<br>
}<br>
@@ -3825,9 +3836,9 @@ static void AddAssemblerKPIC(const ToolC<br>
<br>
void Clang::ConstructJob(Compilation &C, const JobAction &JA,<br>
const InputInfo &Output, const InputInfoList &Inputs,<br>
+ const llvm::Triple &EffectiveTriple,<br>
const ArgList &Args, const char *LinkingOutput) const {<br>
- std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);<br>
- const llvm::Triple Triple(TripleStr);<br>
+ std::string TripleStr = EffectiveTriple.str();<br>
<br>
bool KernelOrKext =<br>
Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);<br>
@@ -3880,13 +3891,14 @@ void Clang::ConstructJob(Compilation &C,<br>
CmdArgs.push_back(Args.MakeArgString(NormalizedTriple));<br>
}<br>
<br>
- if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||<br>
- Triple.getArch() == llvm::Triple::thumb)) {<br>
- unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;<br>
+ if (EffectiveTriple.isOSWindows() &&<br>
+ (EffectiveTriple.getArch() == llvm::Triple::arm ||<br>
+ EffectiveTriple.getArch() == llvm::Triple::thumb)) {<br>
+ unsigned Offset = EffectiveTriple.getArch() == llvm::Triple::arm ? 4 : 6;<br>
unsigned Version;<br>
- Triple.getArchName().substr(Offset).getAsInteger(10, Version);<br>
+ EffectiveTriple.getArchName().substr(Offset).getAsInteger(10, Version);<br>
if (Version < 7)<br>
- D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()<br>
+ D.Diag(diag::err_target_unsupported_arch) << EffectiveTriple.getArchName()<br>
<< TripleStr;<br>
}<br>
<br>
@@ -4088,7 +4100,7 @@ void Clang::ConstructJob(Compilation &C,<br>
unsigned PICLevel;<br>
bool IsPIE;<br>
std::tie(RelocationModel, PICLevel, IsPIE) =<br>
- ParsePICArgs(getToolChain(), Triple, Args);<br>
+ ParsePICArgs(getToolChain(), EffectiveTriple, Args);<br>
<br>
const char *RMName = RelocationModelName(RelocationModel);<br>
if (RMName) {<br>
@@ -4187,8 +4199,7 @@ void Clang::ConstructJob(Compilation &C,<br>
false))<br>
CmdArgs.push_back("-fstrict-enums");<br>
if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,<br>
- options::OPT_fno_strict_vtable_pointers,<br>
- false))<br>
+ options::OPT_fno_strict_vtable_pointers, false))<br>
CmdArgs.push_back("-fstrict-vtable-pointers");<br>
if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,<br>
options::OPT_fno_optimize_sibling_calls))<br>
@@ -4403,7 +4414,7 @@ void Clang::ConstructJob(Compilation &C,<br>
}<br>
<br>
// Add the target cpu<br>
- std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);<br>
+ std::string CPU = getCPUName(Args, EffectiveTriple, /*FromAs*/ false);<br>
if (!CPU.empty()) {<br>
CmdArgs.push_back("-target-cpu");<br>
CmdArgs.push_back(Args.MakeArgString(CPU));<br>
@@ -4415,7 +4426,7 @@ void Clang::ConstructJob(Compilation &C,<br>
}<br>
<br>
// Add the target features<br>
- getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);<br>
+ getTargetFeatures(getToolChain(), EffectiveTriple, Args, CmdArgs, false);<br>
<br>
// Add target specific flags.<br>
switch (getToolChain().getArch()) {<br>
@@ -4427,12 +4438,12 @@ void Clang::ConstructJob(Compilation &C,<br>
case llvm::Triple::thumb:<br>
case llvm::Triple::thumbeb:<br>
// Use the effective triple, which takes into account the deployment target.<br>
- AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);<br>
+ AddARMTargetArgs(EffectiveTriple, Args, CmdArgs, KernelOrKext);<br>
break;<br>
<br>
case llvm::Triple::aarch64:<br>
case llvm::Triple::aarch64_be:<br>
- AddAArch64TargetArgs(Args, CmdArgs);<br>
+ AddAArch64TargetArgs(EffectiveTriple, Args, CmdArgs);<br>
break;<br>
<br>
case llvm::Triple::mips:<br>
@@ -4553,8 +4564,8 @@ void Clang::ConstructJob(Compilation &C,<br>
}<br>
<br>
// If a debugger tuning argument appeared, remember it.<br>
- if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,<br>
- options::OPT_ggdbN_Group)) {<br>
+ if (Arg *A =<br>
+ Args.getLastArg(options::OPT_gTune_Group, options::OPT_ggdbN_Group)) {<br>
if (A->getOption().matches(options::OPT_glldb))<br>
DebuggerTuning = llvm::DebuggerKind::LLDB;<br>
else if (A->getOption().matches(options::OPT_gsce))<br>
@@ -4583,7 +4594,7 @@ void Clang::ConstructJob(Compilation &C,<br>
<br>
// PS4 defaults to no column info<br>
if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,<br>
- /*Default=*/ !IsPS4CPU))<br>
+ /*Default=*/!IsPS4CPU))<br>
CmdArgs.push_back("-dwarf-column-info");<br>
<br>
// FIXME: Move backend command line options to the module.<br>
@@ -4637,9 +4648,10 @@ void Clang::ConstructJob(Compilation &C,<br>
<br>
// CloudABI and WebAssembly use -ffunction-sections and -fdata-sections by<br>
// default.<br>
- bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI ||<br>
- Triple.getArch() == llvm::Triple::wasm32 ||<br>
- Triple.getArch() == llvm::Triple::wasm64;<br>
+ bool UseSeparateSections =<br>
+ EffectiveTriple.getOS() == llvm::Triple::CloudABI ||<br>
+ EffectiveTriple.getArch() == llvm::Triple::wasm32 ||<br>
+ EffectiveTriple.getArch() == llvm::Triple::wasm64;<br>
<br>
if (Args.hasFlag(options::OPT_ffunction_sections,<br>
options::OPT_fno_function_sections, UseSeparateSections)) {<br>
@@ -5008,7 +5020,8 @@ void Clang::ConstructJob(Compilation &C,<br>
Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);<br>
// Emulated TLS is enabled by default on Android, and can be enabled manually<br>
// with -femulated-tls.<br>
- bool EmulatedTLSDefault = Triple.isAndroid() || Triple.isWindowsCygwinEnvironment();<br>
+ bool EmulatedTLSDefault = EffectiveTriple.isAndroid() ||<br>
+ EffectiveTriple.isWindowsCygwinEnvironment();<br>
if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,<br>
EmulatedTLSDefault))<br>
CmdArgs.push_back("-femulated-tls");<br>
@@ -5049,7 +5062,7 @@ void Clang::ConstructJob(Compilation &C,<br>
}<br>
<br>
const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();<br>
- Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);<br>
+ Sanitize.addArgs(getToolChain(), EffectiveTriple, Args, CmdArgs, InputType);<br>
<br>
// Report an error for -faltivec on anything other than PowerPC.<br>
if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {<br>
@@ -5191,9 +5204,9 @@ void Clang::ConstructJob(Compilation &C,<br>
CmdArgs.push_back("-backend-option");<br>
CmdArgs.push_back("-arm-no-restrict-it");<br>
}<br>
- } else if (Triple.isOSWindows() &&<br>
- (Triple.getArch() == llvm::Triple::arm ||<br>
- Triple.getArch() == llvm::Triple::thumb)) {<br>
+ } else if (EffectiveTriple.isOSWindows() &&<br>
+ (EffectiveTriple.getArch() == llvm::Triple::arm ||<br>
+ EffectiveTriple.getArch() == llvm::Triple::thumb)) {<br>
// Windows on ARM expects restricted IT blocks<br>
CmdArgs.push_back("-backend-option");<br>
CmdArgs.push_back("-arm-restrict-it");<br>
@@ -5546,7 +5559,7 @@ void Clang::ConstructJob(Compilation &C,<br>
if (Args.hasArg(options::OPT_fno_inline))<br>
CmdArgs.push_back("-fno-inline");<br>
<br>
- if (Arg* InlineArg = Args.getLastArg(options::OPT_finline_functions,<br>
+ if (Arg *InlineArg = Args.getLastArg(options::OPT_finline_functions,<br>
options::OPT_finline_hint_functions,<br>
options::OPT_fno_inline_functions))<br>
InlineArg->render(Args, CmdArgs);<br>
@@ -5608,7 +5621,6 @@ void Clang::ConstructJob(Compilation &C,<br>
options::OPT_fno_objc_arc_exceptions,<br>
/*default*/ types::isCXX(InputType)))<br>
CmdArgs.push_back("-fobjc-arc-exceptions");<br>
-<br>
}<br>
<br>
// -fobjc-infer-related-result-type is the default, except in the Objective-C<br>
@@ -5634,8 +5646,8 @@ void Clang::ConstructJob(Compilation &C,<br>
<br>
// Pass down -fobjc-weak or -fno-objc-weak if present.<br>
if (types::isObjC(InputType)) {<br>
- auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak,<br>
- options::OPT_fno_objc_weak);<br>
+ auto WeakArg =<br>
+ Args.getLastArg(options::OPT_fobjc_weak, options::OPT_fno_objc_weak);<br>
if (!WeakArg) {<br>
// nothing to do<br>
} else if (GCArg) {<br>
@@ -5805,7 +5817,7 @@ void Clang::ConstructJob(Compilation &C,<br>
StringRef Value(A->getValue());<br>
if (Value != "always" && Value != "never" && Value != "auto")<br>
getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)<br>
- << ("-fdiagnostics-color=" + Value).str();<br>
+ << ("-fdiagnostics-color=" + Value).str();<br>
}<br>
A->claim();<br>
}<br>
@@ -6476,6 +6488,7 @@ void ClangAs::AddX86TargetArgs(const Arg<br>
<br>
void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,<br>
const InputInfo &Output, const InputInfoList &Inputs,<br>
+ const llvm::Triple &EffectiveTriple,<br>
const ArgList &Args,<br>
const char *LinkingOutput) const {<br>
ArgStringList CmdArgs;<br>
@@ -6483,9 +6496,7 @@ void ClangAs::ConstructJob(Compilation &<br>
assert(Inputs.size() == 1 && "Unexpected number of inputs.");<br>
const InputInfo &Input = Inputs[0];<br>
<br>
- std::string TripleStr =<br>
- getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());<br>
- const llvm::Triple Triple(TripleStr);<br>
+ std::string TripleStr = EffectiveTriple.str();<br>
<br>
// Don't warn about "clang -w -c foo.s"<br>
Args.ClaimAllArgs(options::OPT_w);<br>
@@ -6514,14 +6525,14 @@ void ClangAs::ConstructJob(Compilation &<br>
CmdArgs.push_back(Clang::getBaseInputName(Args, Input));<br>
<br>
// Add the target cpu<br>
- std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);<br>
+ std::string CPU = getCPUName(Args, EffectiveTriple, /*FromAs*/ true);<br>
if (!CPU.empty()) {<br>
CmdArgs.push_back("-target-cpu");<br>
CmdArgs.push_back(Args.MakeArgString(CPU));<br>
}<br>
<br>
// Add the target features<br>
- getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);<br>
+ getTargetFeatures(getToolChain(), EffectiveTriple, Args, CmdArgs, true);<br>
<br>
// Ignore explicit -force_cpusubtype_ALL option.<br>
(void)Args.hasArg(options::OPT_force__cpusubtype__ALL);<br>
@@ -6580,7 +6591,7 @@ void ClangAs::ConstructJob(Compilation &<br>
unsigned PICLevel;<br>
bool IsPIE;<br>
std::tie(RelocationModel, PICLevel, IsPIE) =<br>
- ParsePICArgs(getToolChain(), Triple, Args);<br>
+ ParsePICArgs(getToolChain(), EffectiveTriple, Args);<br>
<br>
const char *RMName = RelocationModelName(RelocationModel);<br>
if (RMName) {<br>
@@ -6663,7 +6674,9 @@ void GnuTool::anchor() {}<br>
<br>
void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,<br>
const InputInfo &Output,<br>
- const InputInfoList &Inputs, const ArgList &Args,<br>
+ const InputInfoList &Inputs,<br>
+ const llvm::Triple &EffectiveTriple,<br>
+ const ArgList &Args,<br>
const char *LinkingOutput) const {<br>
const Driver &D = getToolChain().getDriver();<br>
ArgStringList CmdArgs;<br>
@@ -6830,6 +6843,7 @@ void hexagon::Assembler::RenderExtraTool<br>
void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,<br>
const InputInfo &Output,<br>
const InputInfoList &Inputs,<br>
+ const llvm::Triple &EffectiveTriple,<br>
const ArgList &Args,<br>
const char *LinkingOutput) const {<br>
claimNoWarnArgs(Args);<br>
@@ -7073,6 +7087,7 @@ constructHexagonLinkArgs(Compilation &C,<br>
void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,<br>
const InputInfo &Output,<br>
const InputInfoList &Inputs,<br>
+ const llvm::Triple &EffectiveTriple,<br>
const ArgList &Args,<br>
const char *LinkingOutput) const {<br>
auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());<br>
@@ -7090,6 +7105,7 @@ void hexagon::Linker::ConstructJob(Compi<br>
void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,<br>
const InputInfo &Output,<br>
const InputInfoList &Inputs,<br>
+ const llvm::Triple &EffectiveTriple,<br>
const ArgList &Args,<br>
const char *LinkingOutput) const {<br>
<br>
@@ -7118,6 +7134,7 @@ bool wasm::Linker::hasIntegratedCPP() co<br>
void wasm::Linker::ConstructJob(Compilation &C, const JobAction &JA,<br>
const InputInfo &Output,<br>
const InputInfoList &Inputs,<br>
+ const llvm::Triple &EffectiveTriple,<br>
const ArgList &Args,<br>
const char *LinkingOutput) const {<br>
<br>
@@ -7193,7 +7210,8 @@ const std::string arm::getARMArch(String<br>
std::string CPU = llvm::sys::getHostCPUName();<br>
if (CPU != "generic") {<br>
// Translate the native cpu into the architecture suffix for that CPU.<br>
- StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);<br>
+ StringRef Suffix =<br>
+ arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);<br>
// If there is no valid architecture suffix for this CPU we don't know how<br>
// to handle it, so return no architecture.<br>
if (Suffix.empty())<br>
@@ -7453,6 +7471,7 @@ const char *Clang::getDependencyFileName<br>
void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,<br>
const InputInfo &Output,<br>
const InputInfoList &Inputs,<br>
+ const llvm::Triple &EffectiveTriple,<br>
const ArgList &Args,<br>
const char *LinkingOutput) const {<br>
const ToolChain &ToolChain = getToolChain();<br>
@@ -7521,6 +7540,7 @@ void cloudabi::Linker::ConstructJob(Comp<br>
void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,<br>
const InputInfo &Output,<br>
const InputInfoList &Inputs,<br>
+ const llvm::Triple &EffectiveTriple,<br>
const ArgList &Args,<br>
const char *LinkingOutput) const {<br>
ArgStringList CmdArgs;<br>
@@ -7818,6 +7838,7 @@ void darwin::Linker::AddLinkArgs(Compila<br>
void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,<br>
const InputInfo &Output,<br>
const InputInfoList &Inputs,<br>
+ const llvm::Triple &EffectiveTriple,<br>
const ArgList &Args,<br>
const char *LinkingOutput) const {<br>
assert(Output.getType() == types::TY_Image && "Invalid linker output type.");<br>
@@ -7919,7 +7940,7 @@ void darwin::Linker::ConstructJob(Compil<br>
if (Args.hasArg(options::OPT_fnested_functions))<br>
CmdArgs.push_back("-allow_stack_execute");<br>
<br>
- getMachOToolChain().addProfileRTLibs(Args, CmdArgs);<br>
+ getMachOToolChain().addProfileRTLibs(EffectiveTriple, Args, CmdArgs);<br>
<br>
if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {<br>
if (getToolChain().getDriver().CCCIsCXX())<br>
@@ -7928,7 +7949,7 @@ void darwin::Linker::ConstructJob(Compil<br>
// link_ssp spec is empty.<br>
<br>
// Let the tool chain choose which runtime library to link.<br>
- getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);<br>
+ getMachOToolChain().AddLinkRuntimeLibArgs(EffectiveTriple, Args, CmdArgs);<br>
}<br>
<br>
if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {<br>
@@ -7961,6 +7982,7 @@ void darwin::Linker::ConstructJob(Compil<br>
void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,<br>
const InputInfo &Output,<br>
const InputInfoList &Inputs,<br>
+ const llvm::Triple &EffectiveTriple,<br>
const ArgList &Args,<br>
const char *LinkingOutput) const {<br>
ArgStringList CmdArgs;<br>
@@ -7983,6 +8005,7 @@ void darwin::Lipo::ConstructJob(Compilat<br>
void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,<br>
const InputInfo &Output,<br>
const InputInfoList &Inputs,<br>
+ const llvm::Triple &EffectiveTriple,<br>
const ArgList &Args,<br>
const char *LinkingOutput) const {<br>
ArgStringList CmdArgs;<br>
@@ -8003,6 +8026,7 @@ void darwin::Dsymutil::ConstructJob(Comp<br>
void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,<br>
const InputInfo &Output,<br>
const InputInfoList &Inputs,<br>
+ const llvm::Triple &EffectiveTriple,<br>
const ArgList &Args,<br>
const char *LinkingOutput) const {<br>
ArgStringList CmdArgs;<br>
@@ -8026,6 +8050,7 @@ void darwin::VerifyDebug::ConstructJob(C<br>
void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,<br>
const InputInfo &Output,<br>
const InputInfoList &Inputs,<br>
+ const llvm::Triple &EffectiveTriple,<br>
const ArgList &Args,<br>
const char *LinkingOutput) const {<br>
claimNoWarnArgs(Args);<br>
@@ -8046,6 +8071,7 @@ void solaris::Assembler::ConstructJob(Co<br>
void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,<br>
const InputInfo &Output,<br>
const InputInfoList &Inputs,<br>
+ const llvm::Triple &EffectiveTriple,<br>
const ArgList &Args,<br>
const char *LinkingOutput) const {<br>
ArgStringList CmdArgs;<br>
@@ -8115,7 +8141,7 @@ void solaris::Linker::ConstructJob(Compi<br>
}<br>
CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));<br>
<br>
- getToolChain().addProfileRTLibs(Args, CmdArgs);<br>
+ getToolChain().addProfileRTLibs(EffectiveTriple, Args, CmdArgs);<br>
<br>
const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());<br>
C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));<br>
@@ -8124,6 +8150,7 @@ void solaris::Linker::ConstructJob(Compi<br>
void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,<br>
const InputInfo &Output,<br>
const InputInfoList &Inputs,<br>
+ const llvm::Triple &EffectiveTriple,<br>
const ArgList &Args,<br>
const char *LinkingOutput) const {<br>
claimNoWarnArgs(Args);<br>
@@ -8195,6 +8222,7 @@ void openbsd::Assembler::ConstructJob(Co<br>
void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,<br>
const InputInfo &Output,<br>
const InputInfoList &Inputs,<br>
+ const llvm::Triple &EffectiveTriple,<br>
const ArgList &Args,<br>
const char *LinkingOutput) const {<br>
const Driver &D = getToolChain().getDriver();<br>
@@ -8317,6 +8345,7 @@ void openbsd::Linker::ConstructJob(Compi<br>
void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,<br>
const InputInfo &Output,<br>
const InputInfoList &Inputs,<br>
+ const llvm::Triple &EffectiveTriple,<br>
const ArgList &Args,<br>
const char *LinkingOutput) const {<br>
claimNoWarnArgs(Args);<br>
@@ -8337,6 +8366,7 @@ void bitrig::Assembler::ConstructJob(Com<br>
void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,<br>
const InputInfo &Output,<br>
const InputInfoList &Inputs,<br>
+ const llvm::Triple &EffectiveTriple,<br>
const ArgList &Args,<br>
const char *LinkingOutput) const {<br>
const Driver &D = getToolChain().getDriver();<br>
@@ -8446,6 +8476,7 @@ void bitrig::Linker::ConstructJob(Compil<br>
void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,<br>
const InputInfo &Output,<br>
const InputInfoList &Inputs,<br>
+ const llvm::Triple &EffectiveTriple,<br>
const ArgList &Args,<br>
const char *LinkingOutput) const {<br>
claimNoWarnArgs(Args);<br>
@@ -8495,7 +8526,8 @@ void freebsd::Assembler::ConstructJob(Co<br>
case llvm::Triple::armeb:<br>
case llvm::Triple::thumb:<br>
case llvm::Triple::thumbeb: {<br>
- arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);<br>
+ arm::FloatABI ABI =<br>
+ arm::getARMFloatABI(getToolChain(), EffectiveTriple, Args);<br>
<br>
if (ABI == arm::FloatABI::Hard)<br>
CmdArgs.push_back("-mfpu=vfp");<br>
@@ -8539,6 +8571,7 @@ void freebsd::Assembler::ConstructJob(Co<br>
void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,<br>
const InputInfo &Output,<br>
const InputInfoList &Inputs,<br>
+ const llvm::Triple &EffectiveTriple,<br>
const ArgList &Args,<br>
const char *LinkingOutput) const {<br>
const toolchains::FreeBSD &ToolChain =<br>
@@ -8653,7 +8686,8 @@ void freebsd::Linker::ConstructJob(Compi<br>
if (D.isUsingLTO())<br>
AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);<br>
<br>
- bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);<br>
+ bool NeedsSanitizerDeps =<br>
+ addSanitizerRuntimes(ToolChain, EffectiveTriple, Args, CmdArgs);<br>
AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);<br>
<br>
if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {<br>
@@ -8720,7 +8754,7 @@ void freebsd::Linker::ConstructJob(Compi<br>
CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));<br>
}<br>
<br>
- ToolChain.addProfileRTLibs(Args, CmdArgs);<br>
+ ToolChain.addProfileRTLibs(EffectiveTriple, Args, CmdArgs);<br>
<br>
const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());<br>
C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));<br>
@@ -8729,6 +8763,7 @@ void freebsd::Linker::ConstructJob(Compi<br>
void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,<br>
const InputInfo &Output,<br>
const InputInfoList &Inputs,<br>
+ const llvm::Triple &EffectiveTriple,<br>
const ArgList &Args,<br>
const char *LinkingOutput) const {<br>
claimNoWarnArgs(Args);<br>
@@ -8812,6 +8847,7 @@ void netbsd::Assembler::ConstructJob(Com<br>
void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,<br>
const InputInfo &Output,<br>
const InputInfoList &Inputs,<br>
+ const llvm::Triple &EffectiveTriple,<br>
const ArgList &Args,<br>
const char *LinkingOutput) const {<br>
const Driver &D = getToolChain().getDriver();<br>
@@ -8861,9 +8897,7 @@ void netbsd::Linker::ConstructJob(Compil<br>
break;<br>
case llvm::Triple::armeb:<br>
case llvm::Triple::thumbeb:<br>
- arm::appendEBLinkFlags(<br>
- Args, CmdArgs,<br>
- llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));<br>
+ arm::appendEBLinkFlags(Args, CmdArgs, EffectiveTriple);<br>
CmdArgs.push_back("-m");<br>
switch (getToolChain().getTriple().getEnvironment()) {<br>
case llvm::Triple::EABI:<br>
@@ -9014,7 +9048,7 @@ void netbsd::Linker::ConstructJob(Compil<br>
CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));<br>
}<br>
<br>
- getToolChain().addProfileRTLibs(Args, CmdArgs);<br>
+ getToolChain().addProfileRTLibs(EffectiveTriple, Args, CmdArgs);<br>
<br>
const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());<br>
C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));<br>
@@ -9023,20 +9057,18 @@ void netbsd::Linker::ConstructJob(Compil<br>
void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,<br>
const InputInfo &Output,<br>
const InputIn</blockquote></div>