vsk created this revision.
vsk added a reviewer: dexonsmith.
vsk added a subscriber: cfe-commits.
Herald added subscribers: srhines, danalbert, tberghammer, aemerson.
Compute an effective target triple exactly once in ConstructJob(), and
then simply pass around const references to it. This eliminates wasteful
re-computation of effective triples (e.g in getARMFloatABI()).
http://reviews.llvm.org/D22290
Files:
include/clang/Driver/SanitizerArgs.h
include/clang/Driver/Tool.h
include/clang/Driver/ToolChain.h
lib/Driver/Driver.cpp
lib/Driver/SanitizerArgs.cpp
lib/Driver/ToolChain.cpp
lib/Driver/ToolChains.cpp
lib/Driver/ToolChains.h
lib/Driver/Tools.cpp
lib/Driver/Tools.h
Index: lib/Driver/Tools.h
===================================================================
--- lib/Driver/Tools.h
+++ lib/Driver/Tools.h
@@ -60,7 +60,8 @@
const InputInfoList &Inputs,
const ToolChain *AuxToolChain) const;
- void AddAArch64TargetArgs(const llvm::opt::ArgList &Args,
+ void AddAArch64TargetArgs(const llvm::Triple &EffectiveTriple,
+ const llvm::opt::ArgList &Args,
llvm::opt::ArgStringList &CmdArgs) const;
void AddARMTargetArgs(const llvm::Triple &Triple,
const llvm::opt::ArgList &Args,
@@ -115,6 +116,7 @@
void ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output, const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const llvm::opt::ArgList &TCArgs,
const char *LinkingOutput) const override;
};
@@ -132,6 +134,7 @@
void ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output, const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const llvm::opt::ArgList &TCArgs,
const char *LinkingOutput) const override;
};
@@ -159,6 +162,7 @@
bool hasIntegratedAssembler() const override { return true; }
void ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output, const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const llvm::opt::ArgList &TCArgs,
const char *LinkingOutput) const override;
@@ -218,6 +222,7 @@
llvm::opt::ArgStringList &CmdArgs) const;
void ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output, const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const llvm::opt::ArgList &TCArgs,
const char *LinkingOutput) const override;
};
@@ -233,6 +238,7 @@
llvm::opt::ArgStringList &CmdArgs) const;
void ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output, const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const llvm::opt::ArgList &TCArgs,
const char *LinkingOutput) const override;
};
@@ -247,6 +253,7 @@
bool hasIntegratedCPP() const override { return false; }
void ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output, const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const llvm::opt::ArgList &TCArgs,
const char *LinkingOutput) const override;
};
@@ -262,6 +269,7 @@
bool hasIntegratedCPP() const override;
void ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output, const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const llvm::opt::ArgList &TCArgs,
const char *LinkingOutput) const override;
};
@@ -323,6 +331,7 @@
void ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output, const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const llvm::opt::ArgList &TCArgs,
const char *LinkingOutput) const override;
};
@@ -362,6 +371,7 @@
void ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output, const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const llvm::opt::ArgList &TCArgs,
const char *LinkingOutput) const override;
};
@@ -382,6 +392,7 @@
void ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output, const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const llvm::opt::ArgList &TCArgs,
const char *LinkingOutput) const override;
};
@@ -394,6 +405,7 @@
void ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output, const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const llvm::opt::ArgList &TCArgs,
const char *LinkingOutput) const override;
};
@@ -408,6 +420,7 @@
void ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output, const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const llvm::opt::ArgList &TCArgs,
const char *LinkingOutput) const override;
};
@@ -421,6 +434,7 @@
void ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output, const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const llvm::opt::ArgList &TCArgs,
const char *LinkingOutput) const override;
};
@@ -437,6 +451,7 @@
void ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output, const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const llvm::opt::ArgList &TCArgs,
const char *LinkingOutput) const override;
};
@@ -450,6 +465,7 @@
void ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output, const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const llvm::opt::ArgList &TCArgs,
const char *LinkingOutput) const override;
};
@@ -466,6 +482,7 @@
void ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output, const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const llvm::opt::ArgList &TCArgs,
const char *LinkingOutput) const override;
};
@@ -479,6 +496,7 @@
void ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output, const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const llvm::opt::ArgList &TCArgs,
const char *LinkingOutput) const override;
};
@@ -495,6 +513,7 @@
void ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output, const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const llvm::opt::ArgList &TCArgs,
const char *LinkingOutput) const override;
};
@@ -508,6 +527,7 @@
void ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output, const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const llvm::opt::ArgList &TCArgs,
const char *LinkingOutput) const override;
};
@@ -524,6 +544,7 @@
void ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output, const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const llvm::opt::ArgList &TCArgs,
const char *LinkingOutput) const override;
};
@@ -537,6 +558,7 @@
void ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output, const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const llvm::opt::ArgList &TCArgs,
const char *LinkingOutput) const override;
};
@@ -552,6 +574,7 @@
void ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output, const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const llvm::opt::ArgList &TCArgs,
const char *LinkingOutput) const override;
};
@@ -565,6 +588,7 @@
void ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output, const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const llvm::opt::ArgList &TCArgs,
const char *LinkingOutput) const override;
};
@@ -577,6 +601,7 @@
void ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output, const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const llvm::opt::ArgList &TCArgs,
const char *LinkingOutput) const override;
};
@@ -590,6 +615,7 @@
void ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output, const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const llvm::opt::ArgList &TCArgs,
const char *LinkingOutput) const override;
};
@@ -606,6 +632,7 @@
void ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output, const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const llvm::opt::ArgList &TCArgs,
const char *LinkingOutput) const override;
};
@@ -619,6 +646,7 @@
void ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output, const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const llvm::opt::ArgList &TCArgs,
const char *LinkingOutput) const override;
};
@@ -635,6 +663,7 @@
void ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output, const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const llvm::opt::ArgList &TCArgs,
const char *LinkingOutput) const override;
};
@@ -648,6 +677,7 @@
void ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output, const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const llvm::opt::ArgList &TCArgs,
const char *LinkingOutput) const override;
};
@@ -664,6 +694,7 @@
void ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output, const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const llvm::opt::ArgList &TCArgs,
const char *LinkingOutput) const override;
};
@@ -677,6 +708,7 @@
void ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output, const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const llvm::opt::ArgList &TCArgs,
const char *LinkingOutput) const override;
};
@@ -699,6 +731,7 @@
void ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output, const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const llvm::opt::ArgList &TCArgs,
const char *LinkingOutput) const override;
};
@@ -715,6 +748,7 @@
void ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output, const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const llvm::opt::ArgList &TCArgs,
const char *LinkingOutput) const override;
@@ -736,6 +770,7 @@
void ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output, const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const llvm::opt::ArgList &TCArgs,
const char *LinkingOutput) const override;
};
@@ -749,11 +784,13 @@
void ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output, const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const llvm::opt::ArgList &TCArgs,
const char *LinkingOutput) const override;
private:
- void AddLibGCC(const llvm::opt::ArgList &Args, ArgStringList &CmdArgs) const;
+ void AddLibGCC(const llvm::Triple &EffectiveTriple,
+ const llvm::opt::ArgList &Args, ArgStringList &CmdArgs) const;
};
} // end namespace MinGW
@@ -765,7 +802,9 @@
Hard,
};
-FloatABI getARMFloatABI(const ToolChain &TC, const llvm::opt::ArgList &Args);
+FloatABI getARMFloatABI(const ToolChain &TC,
+ const llvm::Triple &EffectiveTriple,
+ const llvm::opt::ArgList &Args);
} // end namespace arm
namespace ppc {
@@ -799,6 +838,7 @@
bool hasIntegratedCPP() const override { return false; }
void ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output, const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const llvm::opt::ArgList &TCArgs,
const char *LinkingOutput) const override;
};
@@ -811,6 +851,7 @@
bool isLinkJob() const override { return true; }
void ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output, const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const llvm::opt::ArgList &TCArgs,
const char *LinkingOutput) const override;
};
@@ -825,6 +866,7 @@
void ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output, const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const llvm::opt::ArgList &TCArgs,
const char *LinkingOutput) const override;
};
@@ -839,6 +881,7 @@
void ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output, const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const llvm::opt::ArgList &TCArgs,
const char *LinkingOutput) const override;
};
@@ -854,6 +897,7 @@
void ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output, const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const llvm::opt::ArgList &TCArgs,
const char *LinkingOutput) const override;
};
@@ -866,6 +910,7 @@
void ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output, const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const llvm::opt::ArgList &TCArgs,
const char *LinkingOutput) const override;
};
@@ -883,6 +928,7 @@
bool isLinkJob() const override { return true; }
void ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output, const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const llvm::opt::ArgList &TCArgs,
const char *LinkingOutput) const override;
};
@@ -897,8 +943,8 @@
bool hasIntegratedCPP() const override { return false; }
void ConstructJob(Compilation &C, const JobAction &JA,
- const InputInfo &Output,
- const InputInfoList &Inputs,
+ const InputInfo &Output, const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const llvm::opt::ArgList &TCArgs,
const char *LinkingOutput) const override;
};
@@ -913,6 +959,7 @@
void ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const llvm::opt::ArgList &TCArgs,
const char *LinkingOutput) const override;
};
@@ -931,6 +978,7 @@
void ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output, const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const llvm::opt::ArgList &TCArgs,
const char *LinkingOutput) const override;
};
@@ -947,6 +995,7 @@
void ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output, const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const llvm::opt::ArgList &TCArgs,
const char *LinkingOutput) const override;
};
Index: lib/Driver/Tools.cpp
===================================================================
--- lib/Driver/Tools.cpp
+++ lib/Driver/Tools.cpp
@@ -742,10 +742,11 @@
// Select the float ABI as determined by -msoft-float, -mhard-float, and
// -mfloat-abi=.
-arm::FloatABI arm::getARMFloatABI(const ToolChain &TC, const ArgList &Args) {
+arm::FloatABI arm::getARMFloatABI(const ToolChain &TC,
+ const llvm::Triple &EffectiveTriple,
+ const ArgList &Args) {
const Driver &D = TC.getDriver();
- const llvm::Triple Triple(TC.ComputeEffectiveClangTriple(Args));
- auto SubArch = getARMSubArchVersionNumber(Triple);
+ auto SubArch = getARMSubArchVersionNumber(EffectiveTriple);
arm::FloatABI ABI = FloatABI::Invalid;
if (Arg *A =
Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
@@ -768,23 +769,23 @@
// It is incorrect to select hard float ABI on MachO platforms if the ABI is
// "apcs-gnu".
- if (Triple.isOSBinFormatMachO() && !useAAPCSForMachO(Triple) &&
- ABI == FloatABI::Hard) {
- D.Diag(diag::err_drv_unsupported_opt_for_target) << A->getAsString(Args)
- << Triple.getArchName();
+ if (EffectiveTriple.isOSBinFormatMachO() &&
+ !useAAPCSForMachO(EffectiveTriple) && ABI == FloatABI::Hard) {
+ D.Diag(diag::err_drv_unsupported_opt_for_target)
+ << A->getAsString(Args) << EffectiveTriple.getArchName();
}
}
// If unspecified, choose the default based on the platform.
if (ABI == FloatABI::Invalid) {
- switch (Triple.getOS()) {
+ switch (EffectiveTriple.getOS()) {
case llvm::Triple::Darwin:
case llvm::Triple::MacOSX:
case llvm::Triple::IOS:
case llvm::Triple::TvOS: {
// Darwin defaults to "softfp" for v6 and v7.
ABI = (SubArch == 6 || SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
- ABI = Triple.isWatchABI() ? FloatABI::Hard : ABI;
+ ABI = EffectiveTriple.isWatchABI() ? FloatABI::Hard : ABI;
break;
}
case llvm::Triple::WatchOS:
@@ -797,7 +798,7 @@
break;
case llvm::Triple::FreeBSD:
- switch (Triple.getEnvironment()) {
+ switch (EffectiveTriple.getEnvironment()) {
case llvm::Triple::GNUEABIHF:
ABI = FloatABI::Hard;
break;
@@ -809,7 +810,7 @@
break;
default:
- switch (Triple.getEnvironment()) {
+ switch (EffectiveTriple.getEnvironment()) {
case llvm::Triple::GNUEABIHF:
case llvm::Triple::MuslEABIHF:
case llvm::Triple::EABIHF:
@@ -826,14 +827,14 @@
break;
default:
// Assume "soft", but warn the user we are guessing.
- if (Triple.isOSBinFormatMachO() &&
- Triple.getSubArch() == llvm::Triple::ARMSubArch_v7em)
+ if (EffectiveTriple.isOSBinFormatMachO() &&
+ EffectiveTriple.getSubArch() == llvm::Triple::ARMSubArch_v7em)
ABI = FloatABI::Hard;
else
ABI = FloatABI::Soft;
- if (Triple.getOS() != llvm::Triple::UnknownOS ||
- !Triple.isOSBinFormatMachO())
+ if (EffectiveTriple.getOS() != llvm::Triple::UnknownOS ||
+ !EffectiveTriple.isOSBinFormatMachO())
D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
break;
}
@@ -853,7 +854,7 @@
bool KernelOrKext =
Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
- arm::FloatABI ABI = arm::getARMFloatABI(TC, Args);
+ arm::FloatABI ABI = arm::getARMFloatABI(TC, Triple, Args);
const Arg *WaCPU = nullptr, *WaFPU = nullptr;
const Arg *WaHDiv = nullptr, *WaArch = nullptr;
@@ -982,7 +983,7 @@
Features.push_back("+long-calls");
} else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
!Triple.isWatchOS()) {
- Features.push_back("+long-calls");
+ Features.push_back("+long-calls");
}
// Kernel code has more strict alignment requirements.
@@ -996,7 +997,8 @@
D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
// v8M Baseline follows on from v6M, so doesn't support unaligned memory
// access either.
- else if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8m_baseline)
+ else if (Triple.getSubArch() ==
+ llvm::Triple::SubArchType::ARMSubArch_v8m_baseline)
D.Diag(diag::err_target_unsupported_unaligned) << "v8m.base";
} else
Features.push_back("+strict-align");
@@ -1082,7 +1084,7 @@
CmdArgs.push_back(ABIName);
// Determine floating point ABI from the options & target defaults.
- arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
+ arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Triple, Args);
if (ABI == arm::FloatABI::Soft) {
// Floating point operations and argument passing are soft.
// FIXME: This changes CPP defines, we need -target-soft-float.
@@ -1143,11 +1145,9 @@
return "generic";
}
-void Clang::AddAArch64TargetArgs(const ArgList &Args,
+void Clang::AddAArch64TargetArgs(const llvm::Triple &EffectiveTriple,
+ const ArgList &Args,
ArgStringList &CmdArgs) const {
- std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
- llvm::Triple Triple(TripleStr);
-
if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Args.hasArg(options::OPT_mkernel) ||
Args.hasArg(options::OPT_fapple_kext))
@@ -1160,7 +1160,7 @@
const char *ABIName = nullptr;
if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
ABIName = A->getValue();
- else if (Triple.isOSDarwin())
+ else if (EffectiveTriple.isOSDarwin())
ABIName = "darwinpcs";
else
ABIName = "aapcs";
@@ -1175,7 +1175,7 @@
CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
else
CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
- } else if (Triple.isAndroid()) {
+ } else if (EffectiveTriple.isAndroid()) {
// Enabled A53 errata (835769) workaround by default on android
CmdArgs.push_back("-backend-option");
CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
@@ -2970,9 +2970,10 @@
// This adds the static libclang_rt.builtins-arch.a directly to the command line
// FIXME: Make sure we can also emit shared objects if they're requested
// and available, check for possible errors, etc.
-static void addClangRT(const ToolChain &TC, const ArgList &Args,
- ArgStringList &CmdArgs) {
- CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins"));
+static void addClangRT(const ToolChain &TC, const llvm::Triple &EffectiveTriple,
+ const ArgList &Args, ArgStringList &CmdArgs) {
+ CmdArgs.push_back(
+ TC.getCompilerRTArgString(EffectiveTriple, Args, "builtins"));
}
namespace {
@@ -3046,22 +3047,27 @@
}
}
-static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
- ArgStringList &CmdArgs, StringRef Sanitizer,
- bool IsShared, bool IsWhole) {
+static void addSanitizerRuntime(const ToolChain &TC,
+ const llvm::Triple &EffectiveTriple,
+ const ArgList &Args, ArgStringList &CmdArgs,
+ StringRef Sanitizer, bool IsShared,
+ bool IsWhole) {
// Wrap any static runtimes that must be forced into executable in
// whole-archive.
if (IsWhole) CmdArgs.push_back("-whole-archive");
- CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared));
- if (IsWhole) CmdArgs.push_back("-no-whole-archive");
+ CmdArgs.push_back(
+ TC.getCompilerRTArgString(EffectiveTriple, Args, Sanitizer, IsShared));
+ if (IsWhole)
+ CmdArgs.push_back("-no-whole-archive");
}
// Tries to use a file with the list of dynamic symbols that need to be exported
// from the runtime library. Returns true if the file was found.
-static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
- ArgStringList &CmdArgs,
+static bool addSanitizerDynamicList(const ToolChain &TC,
+ const llvm::Triple &EffectiveTriple,
+ const ArgList &Args, ArgStringList &CmdArgs,
StringRef Sanitizer) {
- SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer));
+ SmallString<128> SanRT(TC.getCompilerRT(EffectiveTriple, Args, Sanitizer));
if (llvm::sys::fs::exists(SanRT + ".syms")) {
CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
return true;
@@ -3150,25 +3156,28 @@
// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
-static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
- ArgStringList &CmdArgs) {
+static bool addSanitizerRuntimes(const ToolChain &TC,
+ const llvm::Triple &EffectiveTriple,
+ const ArgList &Args, ArgStringList &CmdArgs) {
SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
NonWholeStaticRuntimes, HelperStaticRuntimes,
RequiredSymbols);
for (auto RT : SharedRuntimes)
- addSanitizerRuntime(TC, Args, CmdArgs, RT, true, false);
+ addSanitizerRuntime(TC, EffectiveTriple, Args, CmdArgs, RT, true, false);
for (auto RT : HelperStaticRuntimes)
- addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
+ addSanitizerRuntime(TC, EffectiveTriple, Args, CmdArgs, RT, false, true);
bool AddExportDynamic = false;
for (auto RT : StaticRuntimes) {
- addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
- AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
+ addSanitizerRuntime(TC, EffectiveTriple, Args, CmdArgs, RT, false, true);
+ AddExportDynamic |=
+ !addSanitizerDynamicList(TC, EffectiveTriple, Args, CmdArgs, RT);
}
for (auto RT : NonWholeStaticRuntimes) {
- addSanitizerRuntime(TC, Args, CmdArgs, RT, false, false);
- AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
+ addSanitizerRuntime(TC, EffectiveTriple, Args, CmdArgs, RT, false, false);
+ AddExportDynamic |=
+ !addSanitizerDynamicList(TC, EffectiveTriple, Args, CmdArgs, RT);
}
for (auto S : RequiredSymbols) {
CmdArgs.push_back("-u");
@@ -3750,9 +3759,9 @@
void Clang::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output, const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const ArgList &Args, const char *LinkingOutput) const {
- std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
- const llvm::Triple Triple(TripleStr);
+ std::string TripleStr = EffectiveTriple.str();
bool KernelOrKext =
Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
@@ -3805,13 +3814,14 @@
CmdArgs.push_back(Args.MakeArgString(AuxToolChain->getTriple().str()));
}
- if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
- Triple.getArch() == llvm::Triple::thumb)) {
- unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
+ if (EffectiveTriple.isOSWindows() &&
+ (EffectiveTriple.getArch() == llvm::Triple::arm ||
+ EffectiveTriple.getArch() == llvm::Triple::thumb)) {
+ unsigned Offset = EffectiveTriple.getArch() == llvm::Triple::arm ? 4 : 6;
unsigned Version;
- Triple.getArchName().substr(Offset).getAsInteger(10, Version);
+ EffectiveTriple.getArchName().substr(Offset).getAsInteger(10, Version);
if (Version < 7)
- D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
+ D.Diag(diag::err_target_unsupported_arch) << EffectiveTriple.getArchName()
<< TripleStr;
}
@@ -4013,7 +4023,7 @@
unsigned PICLevel;
bool IsPIE;
std::tie(RelocationModel, PICLevel, IsPIE) =
- ParsePICArgs(getToolChain(), Triple, Args);
+ ParsePICArgs(getToolChain(), EffectiveTriple, Args);
const char *RMName = RelocationModelName(RelocationModel);
if (RMName) {
@@ -4112,8 +4122,7 @@
false))
CmdArgs.push_back("-fstrict-enums");
if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
- options::OPT_fno_strict_vtable_pointers,
- false))
+ options::OPT_fno_strict_vtable_pointers, false))
CmdArgs.push_back("-fstrict-vtable-pointers");
if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
options::OPT_fno_optimize_sibling_calls))
@@ -4328,7 +4337,7 @@
}
// Add the target cpu
- std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
+ std::string CPU = getCPUName(Args, EffectiveTriple, /*FromAs*/ false);
if (!CPU.empty()) {
CmdArgs.push_back("-target-cpu");
CmdArgs.push_back(Args.MakeArgString(CPU));
@@ -4340,7 +4349,7 @@
}
// Add the target features
- getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
+ getTargetFeatures(getToolChain(), EffectiveTriple, Args, CmdArgs, false);
// Add target specific flags.
switch (getToolChain().getArch()) {
@@ -4352,12 +4361,12 @@
case llvm::Triple::thumb:
case llvm::Triple::thumbeb:
// Use the effective triple, which takes into account the deployment target.
- AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
+ AddARMTargetArgs(EffectiveTriple, Args, CmdArgs, KernelOrKext);
break;
case llvm::Triple::aarch64:
case llvm::Triple::aarch64_be:
- AddAArch64TargetArgs(Args, CmdArgs);
+ AddAArch64TargetArgs(EffectiveTriple, Args, CmdArgs);
break;
case llvm::Triple::mips:
@@ -4478,8 +4487,8 @@
}
// If a debugger tuning argument appeared, remember it.
- if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
- options::OPT_ggdbN_Group)) {
+ if (Arg *A =
+ Args.getLastArg(options::OPT_gTune_Group, options::OPT_ggdbN_Group)) {
if (A->getOption().matches(options::OPT_glldb))
DebuggerTuning = llvm::DebuggerKind::LLDB;
else if (A->getOption().matches(options::OPT_gsce))
@@ -4508,7 +4517,7 @@
// PS4 defaults to no column info
if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
- /*Default=*/ !IsPS4CPU))
+ /*Default=*/!IsPS4CPU))
CmdArgs.push_back("-dwarf-column-info");
// FIXME: Move backend command line options to the module.
@@ -4562,9 +4571,10 @@
// CloudABI and WebAssembly use -ffunction-sections and -fdata-sections by
// default.
- bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI ||
- Triple.getArch() == llvm::Triple::wasm32 ||
- Triple.getArch() == llvm::Triple::wasm64;
+ bool UseSeparateSections =
+ EffectiveTriple.getOS() == llvm::Triple::CloudABI ||
+ EffectiveTriple.getArch() == llvm::Triple::wasm32 ||
+ EffectiveTriple.getArch() == llvm::Triple::wasm64;
if (Args.hasFlag(options::OPT_ffunction_sections,
options::OPT_fno_function_sections, UseSeparateSections)) {
@@ -4923,7 +4933,8 @@
Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
// Emulated TLS is enabled by default on Android, and can be enabled manually
// with -femulated-tls.
- bool EmulatedTLSDefault = Triple.isAndroid() || Triple.isWindowsCygwinEnvironment();
+ bool EmulatedTLSDefault = EffectiveTriple.isAndroid() ||
+ EffectiveTriple.isWindowsCygwinEnvironment();
if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
EmulatedTLSDefault))
CmdArgs.push_back("-femulated-tls");
@@ -4964,7 +4975,7 @@
}
const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
- Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
+ Sanitize.addArgs(getToolChain(), EffectiveTriple, Args, CmdArgs, InputType);
// Report an error for -faltivec on anything other than PowerPC.
if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
@@ -5106,9 +5117,9 @@
CmdArgs.push_back("-backend-option");
CmdArgs.push_back("-arm-no-restrict-it");
}
- } else if (Triple.isOSWindows() &&
- (Triple.getArch() == llvm::Triple::arm ||
- Triple.getArch() == llvm::Triple::thumb)) {
+ } else if (EffectiveTriple.isOSWindows() &&
+ (EffectiveTriple.getArch() == llvm::Triple::arm ||
+ EffectiveTriple.getArch() == llvm::Triple::thumb)) {
// Windows on ARM expects restricted IT blocks
CmdArgs.push_back("-backend-option");
CmdArgs.push_back("-arm-restrict-it");
@@ -5461,7 +5472,7 @@
if (Args.hasArg(options::OPT_fno_inline))
CmdArgs.push_back("-fno-inline");
- if (Arg* InlineArg = Args.getLastArg(options::OPT_finline_functions,
+ if (Arg *InlineArg = Args.getLastArg(options::OPT_finline_functions,
options::OPT_finline_hint_functions,
options::OPT_fno_inline_functions))
InlineArg->render(Args, CmdArgs);
@@ -5523,7 +5534,6 @@
options::OPT_fno_objc_arc_exceptions,
/*default*/ types::isCXX(InputType)))
CmdArgs.push_back("-fobjc-arc-exceptions");
-
}
// -fobjc-infer-related-result-type is the default, except in the Objective-C
@@ -5549,8 +5559,8 @@
// Pass down -fobjc-weak or -fno-objc-weak if present.
if (types::isObjC(InputType)) {
- auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak,
- options::OPT_fno_objc_weak);
+ auto WeakArg =
+ Args.getLastArg(options::OPT_fobjc_weak, options::OPT_fno_objc_weak);
if (!WeakArg) {
// nothing to do
} else if (GCArg) {
@@ -5720,7 +5730,7 @@
StringRef Value(A->getValue());
if (Value != "always" && Value != "never" && Value != "auto")
getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
- << ("-fdiagnostics-color=" + Value).str();
+ << ("-fdiagnostics-color=" + Value).str();
}
A->claim();
}
@@ -6377,6 +6387,7 @@
void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output, const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const ArgList &Args,
const char *LinkingOutput) const {
ArgStringList CmdArgs;
@@ -6384,9 +6395,7 @@
assert(Inputs.size() == 1 && "Unexpected number of inputs.");
const InputInfo &Input = Inputs[0];
- std::string TripleStr =
- getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
- const llvm::Triple Triple(TripleStr);
+ std::string TripleStr = EffectiveTriple.str();
// Don't warn about "clang -w -c foo.s"
Args.ClaimAllArgs(options::OPT_w);
@@ -6415,14 +6424,14 @@
CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
// Add the target cpu
- std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
+ std::string CPU = getCPUName(Args, EffectiveTriple, /*FromAs*/ true);
if (!CPU.empty()) {
CmdArgs.push_back("-target-cpu");
CmdArgs.push_back(Args.MakeArgString(CPU));
}
// Add the target features
- getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
+ getTargetFeatures(getToolChain(), EffectiveTriple, Args, CmdArgs, true);
// Ignore explicit -force_cpusubtype_ALL option.
(void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
@@ -6481,7 +6490,7 @@
unsigned PICLevel;
bool IsPIE;
std::tie(RelocationModel, PICLevel, IsPIE) =
- ParsePICArgs(getToolChain(), Triple, Args);
+ ParsePICArgs(getToolChain(), EffectiveTriple, Args);
const char *RMName = RelocationModelName(RelocationModel);
if (RMName) {
@@ -6559,7 +6568,9 @@
void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
- const InputInfoList &Inputs, const ArgList &Args,
+ const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
+ const ArgList &Args,
const char *LinkingOutput) const {
const Driver &D = getToolChain().getDriver();
ArgStringList CmdArgs;
@@ -6726,6 +6737,7 @@
void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const ArgList &Args,
const char *LinkingOutput) const {
claimNoWarnArgs(Args);
@@ -6969,6 +6981,7 @@
void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const ArgList &Args,
const char *LinkingOutput) const {
auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
@@ -6986,6 +6999,7 @@
void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const ArgList &Args,
const char *LinkingOutput) const {
@@ -7014,6 +7028,7 @@
void wasm::Linker::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const ArgList &Args,
const char *LinkingOutput) const {
@@ -7089,7 +7104,8 @@
std::string CPU = llvm::sys::getHostCPUName();
if (CPU != "generic") {
// Translate the native cpu into the architecture suffix for that CPU.
- StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
+ StringRef Suffix =
+ arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
// If there is no valid architecture suffix for this CPU we don't know how
// to handle it, so return no architecture.
if (Suffix.empty())
@@ -7349,6 +7365,7 @@
void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const ArgList &Args,
const char *LinkingOutput) const {
const ToolChain &ToolChain = getToolChain();
@@ -7417,6 +7434,7 @@
void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const ArgList &Args,
const char *LinkingOutput) const {
ArgStringList CmdArgs;
@@ -7714,6 +7732,7 @@
void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const ArgList &Args,
const char *LinkingOutput) const {
assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
@@ -7815,7 +7834,7 @@
if (Args.hasArg(options::OPT_fnested_functions))
CmdArgs.push_back("-allow_stack_execute");
- getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
+ getMachOToolChain().addProfileRTLibs(EffectiveTriple, Args, CmdArgs);
if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
if (getToolChain().getDriver().CCCIsCXX())
@@ -7824,7 +7843,7 @@
// link_ssp spec is empty.
// Let the tool chain choose which runtime library to link.
- getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
+ getMachOToolChain().AddLinkRuntimeLibArgs(EffectiveTriple, Args, CmdArgs);
}
if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
@@ -7857,6 +7876,7 @@
void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const ArgList &Args,
const char *LinkingOutput) const {
ArgStringList CmdArgs;
@@ -7879,6 +7899,7 @@
void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const ArgList &Args,
const char *LinkingOutput) const {
ArgStringList CmdArgs;
@@ -7899,6 +7920,7 @@
void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const ArgList &Args,
const char *LinkingOutput) const {
ArgStringList CmdArgs;
@@ -7922,6 +7944,7 @@
void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const ArgList &Args,
const char *LinkingOutput) const {
claimNoWarnArgs(Args);
@@ -7942,6 +7965,7 @@
void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const ArgList &Args,
const char *LinkingOutput) const {
ArgStringList CmdArgs;
@@ -8011,7 +8035,7 @@
}
CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
- getToolChain().addProfileRTLibs(Args, CmdArgs);
+ getToolChain().addProfileRTLibs(EffectiveTriple, Args, CmdArgs);
const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
@@ -8020,6 +8044,7 @@
void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const ArgList &Args,
const char *LinkingOutput) const {
claimNoWarnArgs(Args);
@@ -8091,6 +8116,7 @@
void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const ArgList &Args,
const char *LinkingOutput) const {
const Driver &D = getToolChain().getDriver();
@@ -8213,6 +8239,7 @@
void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const ArgList &Args,
const char *LinkingOutput) const {
claimNoWarnArgs(Args);
@@ -8233,6 +8260,7 @@
void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const ArgList &Args,
const char *LinkingOutput) const {
const Driver &D = getToolChain().getDriver();
@@ -8342,6 +8370,7 @@
void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const ArgList &Args,
const char *LinkingOutput) const {
claimNoWarnArgs(Args);
@@ -8391,7 +8420,8 @@
case llvm::Triple::armeb:
case llvm::Triple::thumb:
case llvm::Triple::thumbeb: {
- arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
+ arm::FloatABI ABI =
+ arm::getARMFloatABI(getToolChain(), EffectiveTriple, Args);
if (ABI == arm::FloatABI::Hard)
CmdArgs.push_back("-mfpu=vfp");
@@ -8435,6 +8465,7 @@
void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const ArgList &Args,
const char *LinkingOutput) const {
const toolchains::FreeBSD &ToolChain =
@@ -8549,7 +8580,8 @@
if (D.isUsingLTO())
AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
- bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
+ bool NeedsSanitizerDeps =
+ addSanitizerRuntimes(ToolChain, EffectiveTriple, Args, CmdArgs);
AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
@@ -8616,7 +8648,7 @@
CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
}
- ToolChain.addProfileRTLibs(Args, CmdArgs);
+ ToolChain.addProfileRTLibs(EffectiveTriple, Args, CmdArgs);
const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
@@ -8625,6 +8657,7 @@
void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const ArgList &Args,
const char *LinkingOutput) const {
claimNoWarnArgs(Args);
@@ -8708,6 +8741,7 @@
void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const ArgList &Args,
const char *LinkingOutput) const {
const Driver &D = getToolChain().getDriver();
@@ -8757,9 +8791,7 @@
break;
case llvm::Triple::armeb:
case llvm::Triple::thumbeb:
- arm::appendEBLinkFlags(
- Args, CmdArgs,
- llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
+ arm::appendEBLinkFlags(Args, CmdArgs, EffectiveTriple);
CmdArgs.push_back("-m");
switch (getToolChain().getTriple().getEnvironment()) {
case llvm::Triple::EABI:
@@ -8910,7 +8942,7 @@
CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
}
- getToolChain().addProfileRTLibs(Args, CmdArgs);
+ getToolChain().addProfileRTLibs(EffectiveTriple, Args, CmdArgs);
const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
@@ -8919,20 +8951,18 @@
void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const ArgList &Args,
const char *LinkingOutput) const {
claimNoWarnArgs(Args);
- std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
- llvm::Triple Triple = llvm::Triple(TripleStr);
-
ArgStringList CmdArgs;
llvm::Reloc::Model RelocationModel;
unsigned PICLevel;
bool IsPIE;
std::tie(RelocationModel, PICLevel, IsPIE) =
- ParsePICArgs(getToolChain(), Triple, Args);
+ ParsePICArgs(getToolChain(), EffectiveTriple, Args);
switch (getToolChain().getArch()) {
default:
@@ -8995,7 +9025,7 @@
break;
}
- switch (arm::getARMFloatABI(getToolChain(), Args)) {
+ switch (arm::getARMFloatABI(getToolChain(), EffectiveTriple, Args)) {
case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
case arm::FloatABI::Soft:
CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
@@ -9170,6 +9200,7 @@
}
static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
+ const llvm::Triple &EffectiveTriple,
ArgStringList &CmdArgs, const ArgList &Args) {
// Make use of compiler-rt if --rtlib option is used
ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
@@ -9181,7 +9212,7 @@
llvm_unreachable("unsupported OS");
case llvm::Triple::Win32:
case llvm::Triple::Linux:
- addClangRT(TC, Args, CmdArgs);
+ addClangRT(TC, EffectiveTriple, Args, CmdArgs);
break;
}
break;
@@ -9253,15 +9284,13 @@
void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const ArgList &Args,
const char *LinkingOutput) const {
const toolchains::Linux &ToolChain =
static_cast<const toolchains::Linux &>(getToolChain());
const Driver &D = ToolChain.getDriver();
- std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
- llvm::Triple Triple = llvm::Triple(TripleStr);
-
const llvm::Triple::ArchType Arch = ToolChain.getArch();
const bool isAndroid = ToolChain.getTriple().isAndroid();
const bool IsIAMCU = ToolChain.getTriple().isOSIAMCU();
@@ -9303,7 +9332,7 @@
CmdArgs.push_back("-s");
if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
- arm::appendEBLinkFlags(Args, CmdArgs, Triple);
+ arm::appendEBLinkFlags(Args, CmdArgs, EffectiveTriple);
for (const auto &Opt : ToolChain.ExtraOpts)
CmdArgs.push_back(Opt.c_str());
@@ -9389,10 +9418,11 @@
if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
CmdArgs.push_back("--no-demangle");
- bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
+ bool NeedsSanitizerDeps =
+ addSanitizerRuntimes(ToolChain, EffectiveTriple, Args, CmdArgs);
AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
// The profile runtime also needs access to system libraries.
- getToolChain().addProfileRTLibs(Args, CmdArgs);
+ getToolChain().addProfileRTLibs(EffectiveTriple, Args, CmdArgs);
if (D.CCCIsCXX() &&
!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
@@ -9446,7 +9476,7 @@
}
}
- AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
+ AddRunTimeLibs(ToolChain, D, EffectiveTriple, CmdArgs, Args);
if (WantPthread && !isAndroid)
CmdArgs.push_back("-lpthread");
@@ -9463,7 +9493,7 @@
if (Args.hasArg(options::OPT_static))
CmdArgs.push_back("--end-group");
else
- AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
+ AddRunTimeLibs(ToolChain, D, EffectiveTriple, CmdArgs, Args);
// Add IAMCU specific libs (outside the group), if needed.
if (IsIAMCU) {
@@ -9499,6 +9529,7 @@
void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const ArgList &Args,
const char *LinkingOutput) const {
const toolchains::NaClToolChain &ToolChain =
@@ -9508,8 +9539,8 @@
InputInfoList NewInputs;
NewInputs.push_back(NaClMacros);
NewInputs.append(Inputs.begin(), Inputs.end());
- gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
- LinkingOutput);
+ gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, EffectiveTriple,
+ Args, LinkingOutput);
}
// This is quite similar to gnutools::Linker::ConstructJob with changes that
@@ -9519,6 +9550,7 @@
void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const ArgList &Args,
const char *LinkingOutput) const {
@@ -9667,6 +9699,7 @@
void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const ArgList &Args,
const char *LinkingOutput) const {
claimNoWarnArgs(Args);
@@ -9687,6 +9720,7 @@
void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const ArgList &Args,
const char *LinkingOutput) const {
const Driver &D = getToolChain().getDriver();
@@ -9712,7 +9746,7 @@
AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
- getToolChain().addProfileRTLibs(Args, CmdArgs);
+ getToolChain().addProfileRTLibs(EffectiveTriple, Args, CmdArgs);
if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
if (D.CCCIsCXX()) {
@@ -9742,6 +9776,7 @@
void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const ArgList &Args,
const char *LinkingOutput) const {
claimNoWarnArgs(Args);
@@ -9767,6 +9802,7 @@
void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const ArgList &Args,
const char *LinkingOutput) const {
const Driver &D = getToolChain().getDriver();
@@ -9881,7 +9917,7 @@
CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
}
- getToolChain().addProfileRTLibs(Args, CmdArgs);
+ getToolChain().addProfileRTLibs(EffectiveTriple, Args, CmdArgs);
const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
@@ -9910,6 +9946,7 @@
void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const ArgList &Args,
const char *LinkingOutput) const {
ArgStringList CmdArgs;
@@ -9989,15 +10026,18 @@
CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
- CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
+ CmdArgs.push_back(
+ TC.getCompilerRTArgString(EffectiveTriple, Args, Lib));
// Make sure the dynamic runtime thunk is not optimized out at link time
// to ensure proper SEH handling.
CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
} else if (DLL) {
- CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
+ CmdArgs.push_back(
+ TC.getCompilerRTArgString(EffectiveTriple, Args, "asan_dll_thunk"));
} else {
for (const auto &Lib : {"asan", "asan_cxx"})
- CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
+ CmdArgs.push_back(
+ TC.getCompilerRTArgString(EffectiveTriple, Args, Lib));
}
}
@@ -10027,7 +10067,7 @@
// Add compiler-rt lib in case if it was explicitly
// specified as an argument for --rtlib option.
if (!Args.hasArg(options::OPT_nostdlib)) {
- AddRunTimeLibs(TC, TC.getDriver(), CmdArgs, Args);
+ AddRunTimeLibs(TC, TC.getDriver(), EffectiveTriple, CmdArgs, Args);
}
// Add filenames, libraries, and other linker inputs.
@@ -10056,7 +10096,7 @@
A.renderAsInput(Args, CmdArgs);
}
- TC.addProfileRTLibs(Args, CmdArgs);
+ TC.addProfileRTLibs(EffectiveTriple, Args, CmdArgs);
// We need to special case some linker paths. In the case of lld, we need to
// translate 'lld' into 'lld-link', and in the case of the regular msvc
@@ -10085,6 +10125,7 @@
void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const ArgList &Args,
const char *LinkingOutput) const {
C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
@@ -10207,6 +10248,7 @@
void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const ArgList &Args,
const char *LinkingOutput) const {
claimNoWarnArgs(Args);
@@ -10234,7 +10276,8 @@
SplitDebugName(Args, Inputs[0]));
}
-void MinGW::Linker::AddLibGCC(const ArgList &Args,
+void MinGW::Linker::AddLibGCC(const llvm::Triple &EffectiveTriple,
+ const ArgList &Args,
ArgStringList &CmdArgs) const {
if (Args.hasArg(options::OPT_mthreads))
CmdArgs.push_back("-lmingwthrd");
@@ -10256,7 +10299,8 @@
CmdArgs.push_back("-lgcc");
}
} else {
- AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
+ AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), EffectiveTriple,
+ CmdArgs, Args);
}
CmdArgs.push_back("-lmoldname");
@@ -10267,6 +10311,7 @@
void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const ArgList &Args,
const char *LinkingOutput) const {
const ToolChain &TC = getToolChain();
@@ -10389,7 +10434,7 @@
if (Args.hasArg(options::OPT_fopenmp))
CmdArgs.push_back("-lgomp");
- AddLibGCC(Args, CmdArgs);
+ AddLibGCC(EffectiveTriple, Args, CmdArgs);
if (Args.hasArg(options::OPT_pg))
CmdArgs.push_back("-lgmon");
@@ -10410,7 +10455,7 @@
if (Args.hasArg(options::OPT_static))
CmdArgs.push_back("--end-group");
else if (!LinkerName.equals_lower("lld"))
- AddLibGCC(Args, CmdArgs);
+ AddLibGCC(EffectiveTriple, Args, CmdArgs);
}
if (!Args.hasArg(options::OPT_nostartfiles)) {
@@ -10430,6 +10475,7 @@
void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const ArgList &Args,
const char *LinkingOutput) const {
claimNoWarnArgs(Args);
@@ -10463,6 +10509,7 @@
void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const ArgList &Args,
const char *LinkingOutput) const {
ArgStringList CmdArgs;
@@ -10491,6 +10538,7 @@
void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const ArgList &Args,
const char *LinkingOutput) const {
claimNoWarnArgs(Args);
@@ -10530,6 +10578,7 @@
void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const ArgList &Args,
const char *LinkingOutput) const {
const auto &TC =
@@ -10653,17 +10702,19 @@
if (!Args.hasArg(options::OPT_nodefaultlibs)) {
// TODO handle /MT[d] /MD[d]
CmdArgs.push_back("-lmsvcrt");
- AddRunTimeLibs(TC, D, CmdArgs, Args);
+ AddRunTimeLibs(TC, D, EffectiveTriple, CmdArgs, Args);
}
}
if (TC.getSanitizerArgs().needsAsanRt()) {
// TODO handle /MT[d] /MD[d]
if (Args.hasArg(options::OPT_shared)) {
- CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
+ CmdArgs.push_back(
+ TC.getCompilerRTArgString(EffectiveTriple, Args, "asan_dll_thunk"));
} else {
for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
- CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
+ CmdArgs.push_back(
+ TC.getCompilerRTArgString(EffectiveTriple, Args, Lib));
// Make sure the dynamic runtime thunk is not optimized out at link time
// to ensure proper SEH handling.
CmdArgs.push_back(Args.MakeArgString("--undefined"));
@@ -10681,6 +10732,7 @@
void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const ArgList &Args,
const char *LinkingOutput) const {
ArgStringList CmdArgs;
@@ -10737,6 +10789,7 @@
void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const ArgList &Args,
const char *LinkingOutput) const {
ArgStringList CmdArgs;
@@ -10773,6 +10826,7 @@
void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const ArgList &Args,
const char *LinkingOutput) const {
const auto &TC =
@@ -10848,6 +10902,7 @@
void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const ArgList &Args,
const char *LinkingOutput) const {
claimNoWarnArgs(Args);
@@ -11116,6 +11171,7 @@
void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const ArgList &Args,
const char *LinkingOutput) const {
const toolchains::FreeBSD &ToolChain =
@@ -11145,6 +11201,7 @@
void NVPTX::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const ArgList &Args,
const char *LinkingOutput) const {
const auto &TC =
@@ -11222,6 +11279,7 @@
void NVPTX::Linker::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const ArgList &Args,
const char *LinkingOutput) const {
const auto &TC =
Index: lib/Driver/ToolChains.h
===================================================================
--- lib/Driver/ToolChains.h
+++ lib/Driver/ToolChains.h
@@ -280,7 +280,8 @@
llvm::opt::ArgStringList &CmdArgs) const {}
/// Add the linker arguments to link the compiler runtime library.
- virtual void AddLinkRuntimeLibArgs(const llvm::opt::ArgList &Args,
+ virtual void AddLinkRuntimeLibArgs(const llvm::Triple &EffectiveTriple,
+ const llvm::opt::ArgList &Args,
llvm::opt::ArgStringList &CmdArgs) const;
virtual void addStartObjectFileArgs(const llvm::opt::ArgList &Args,
@@ -304,7 +305,8 @@
/// Add any profiling runtime libraries that are needed. This is essentially a
/// MachO specific version of addProfileRT in Tools.cpp.
- void addProfileRTLibs(const llvm::opt::ArgList &Args,
+ void addProfileRTLibs(const llvm::Triple &EffectiveTriple,
+ const llvm::opt::ArgList &Args,
llvm::opt::ArgStringList &CmdArgs) const override {
// There aren't any profiling libs for embedded targets currently.
}
@@ -418,7 +420,8 @@
!isTargetWatchOS());
}
- void addProfileRTLibs(const llvm::opt::ArgList &Args,
+ void addProfileRTLibs(const llvm::Triple &EffectiveTriple,
+ const llvm::opt::ArgList &Args,
llvm::opt::ArgStringList &CmdArgs) const override;
protected:
@@ -573,7 +576,8 @@
/// @name Apple ToolChain Implementation
/// {
- void AddLinkRuntimeLibArgs(const llvm::opt::ArgList &Args,
+ void AddLinkRuntimeLibArgs(const llvm::Triple &EffectiveTriple,
+ const llvm::opt::ArgList &Args,
llvm::opt::ArgStringList &CmdArgs) const override;
void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args,
@@ -839,7 +843,8 @@
llvm::opt::ArgStringList &CC1Args) const override;
bool isPIEDefault() const override;
SanitizerMask getSupportedSanitizers() const override;
- void addProfileRTLibs(const llvm::opt::ArgList &Args,
+ void addProfileRTLibs(const llvm::Triple &EffectiveTriple,
+ const llvm::opt::ArgList &Args,
llvm::opt::ArgStringList &CmdArgs) const override;
virtual std::string computeSysRoot() const;
@@ -903,7 +908,8 @@
void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args,
llvm::opt::ArgStringList &CmdArgs) const override;
- std::string getCompilerRT(const llvm::opt::ArgList &Args, StringRef Component,
+ std::string getCompilerRT(const llvm::Triple &EffectiveTriple,
+ const llvm::opt::ArgList &Args, StringRef Component,
bool Shared = false) const override;
std::string computeSysRoot() const override;
Index: lib/Driver/ToolChains.cpp
===================================================================
--- lib/Driver/ToolChains.cpp
+++ lib/Driver/ToolChains.cpp
@@ -380,13 +380,16 @@
llvm_unreachable("Unsupported platform");
}
-void Darwin::addProfileRTLibs(const ArgList &Args,
+void Darwin::addProfileRTLibs(const llvm::Triple &EffectiveTriple,
+ const ArgList &Args,
ArgStringList &CmdArgs) const {
- if (!needsProfileRT(Args)) return;
+ if (!needsProfileRT(Args))
+ return;
- AddLinkRuntimeLib(Args, CmdArgs, (Twine("libclang_rt.profile_") +
- getOSLibraryNameSuffix() + ".a").str(),
- /*AlwaysLink*/ true);
+ AddLinkRuntimeLib(
+ Args, CmdArgs,
+ (Twine("libclang_rt.profile_") + getOSLibraryNameSuffix() + ".a").str(),
+ /*AlwaysLink*/ true);
}
void DarwinClang::AddLinkSanitizerLibArgs(const ArgList &Args,
@@ -400,7 +403,8 @@
/*AddRPath*/ true);
}
-void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args,
+void DarwinClang::AddLinkRuntimeLibArgs(const llvm::Triple &EffectiveTriple,
+ const ArgList &Args,
ArgStringList &CmdArgs) const {
// Darwin only supports the compiler-rt based runtime libraries.
switch (GetRuntimeLibType(Args)) {
@@ -1012,16 +1016,17 @@
return DAL;
}
-void MachO::AddLinkRuntimeLibArgs(const ArgList &Args,
+void MachO::AddLinkRuntimeLibArgs(const llvm::Triple &EffectiveTriple,
+ const ArgList &Args,
ArgStringList &CmdArgs) const {
// Embedded targets are simple at the moment, not supporting sanitizers and
// with different libraries for each member of the product { static, PIC } x
// { hard-float, soft-float }
llvm::SmallString<32> CompilerRT = StringRef("libclang_rt.");
- CompilerRT +=
- (tools::arm::getARMFloatABI(*this, Args) == tools::arm::FloatABI::Hard)
- ? "hard"
- : "soft";
+ CompilerRT += (tools::arm::getARMFloatABI(*this, EffectiveTriple, Args) ==
+ tools::arm::FloatABI::Hard)
+ ? "hard"
+ : "soft";
CompilerRT += Args.hasArg(options::OPT_fPIC) ? "_pic.a" : "_static.a";
AddLinkRuntimeLib(Args, CmdArgs, CompilerRT, false, true);
@@ -2858,9 +2863,10 @@
CmdArgs.push_back("-lunwind");
}
-std::string MipsLLVMToolChain::getCompilerRT(const ArgList &Args,
- StringRef Component,
- bool Shared) const {
+std::string
+MipsLLVMToolChain::getCompilerRT(const llvm::Triple &EffectiveTriple,
+ const ArgList &Args, StringRef Component,
+ bool Shared) const {
SmallString<128> Path(getDriver().ResourceDir);
llvm::sys::path::append(Path, SelectedMultilib.osSuffix(), "lib" + LibSuffix,
getOS());
@@ -4237,9 +4243,9 @@
case llvm::Triple::thumb:
case llvm::Triple::armeb:
case llvm::Triple::thumbeb: {
- const bool HF =
- Triple.getEnvironment() == llvm::Triple::GNUEABIHF ||
- tools::arm::getARMFloatABI(*this, Args) == tools::arm::FloatABI::Hard;
+ const bool HF = Triple.getEnvironment() == llvm::Triple::GNUEABIHF ||
+ tools::arm::getARMFloatABI(*this, Triple, Args) ==
+ tools::arm::FloatABI::Hard;
LibDir = "lib";
Loader = HF ? "ld-linux-armhf.so.3" : "ld-linux.so.3";
@@ -4631,16 +4637,18 @@
return Res;
}
-void Linux::addProfileRTLibs(const llvm::opt::ArgList &Args,
+void Linux::addProfileRTLibs(const llvm::Triple &EffectiveTriple,
+ const llvm::opt::ArgList &Args,
llvm::opt::ArgStringList &CmdArgs) const {
- if (!needsProfileRT(Args)) return;
+ if (!needsProfileRT(Args))
+ return;
// Add linker option -u__llvm_runtime_variable to cause runtime
// initialization module to be linked in.
if (!Args.hasArg(options::OPT_coverage))
CmdArgs.push_back(Args.MakeArgString(
Twine("-u", llvm::getInstrProfRuntimeHookVarName())));
- ToolChain::addProfileRTLibs(Args, CmdArgs);
+ ToolChain::addProfileRTLibs(EffectiveTriple, Args, CmdArgs);
}
/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.
Index: lib/Driver/ToolChain.cpp
===================================================================
--- lib/Driver/ToolChain.cpp
+++ lib/Driver/ToolChain.cpp
@@ -268,46 +268,52 @@
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) {
@@ -518,11 +524,13 @@
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(
Index: lib/Driver/SanitizerArgs.cpp
===================================================================
--- lib/Driver/SanitizerArgs.cpp
+++ lib/Driver/SanitizerArgs.cpp
@@ -602,7 +602,9 @@
CmdArgs.push_back(Args.MakeArgString(LinkerOptionFlag));
}
-void SanitizerArgs::addArgs(const ToolChain &TC, const llvm::opt::ArgList &Args,
+void SanitizerArgs::addArgs(const ToolChain &TC,
+ const llvm::Triple &EffectiveTriple,
+ const llvm::opt::ArgList &Args,
llvm::opt::ArgStringList &CmdArgs,
types::ID InputType) const {
// Translate available CoverageFeatures to corresponding clang-cc1 flags.
@@ -626,21 +628,24 @@
// Instruct the code generator to embed linker directives in the object file
// that cause the required runtime libraries to be linked.
CmdArgs.push_back(Args.MakeArgString(
- "--dependent-lib=" + TC.getCompilerRT(Args, "ubsan_standalone")));
+ "--dependent-lib=" +
+ TC.getCompilerRT(EffectiveTriple, Args, "ubsan_standalone")));
if (types::isCXX(InputType))
CmdArgs.push_back(Args.MakeArgString(
- "--dependent-lib=" + TC.getCompilerRT(Args, "ubsan_standalone_cxx")));
+ "--dependent-lib=" +
+ TC.getCompilerRT(EffectiveTriple, Args, "ubsan_standalone_cxx")));
}
if (TC.getTriple().isOSWindows() && needsStatsRt()) {
- CmdArgs.push_back(Args.MakeArgString("--dependent-lib=" +
- TC.getCompilerRT(Args, "stats_client")));
+ CmdArgs.push_back(Args.MakeArgString(
+ "--dependent-lib=" +
+ TC.getCompilerRT(EffectiveTriple, Args, "stats_client")));
// The main executable must export the stats runtime.
// FIXME: Only exporting from the main executable (e.g. based on whether the
// translation unit defines main()) would save a little space, but having
// multiple copies of the runtime shouldn't hurt.
- CmdArgs.push_back(Args.MakeArgString("--dependent-lib=" +
- TC.getCompilerRT(Args, "stats")));
+ CmdArgs.push_back(Args.MakeArgString(
+ "--dependent-lib=" + TC.getCompilerRT(EffectiveTriple, Args, "stats")));
addIncludeLinkerOption(TC, Args, CmdArgs, "__sanitizer_stats_register");
}
Index: lib/Driver/Driver.cpp
===================================================================
--- lib/Driver/Driver.cpp
+++ lib/Driver/Driver.cpp
@@ -2112,7 +2112,21 @@
AtTopLevel, MultipleArchs),
BaseInput);
+ llvm::Triple EffectiveTriple;
+ const ArgList &Args = C.getArgsForToolChain(TC, BoundArch);
+ if (InputInfos.size() != 1) {
+ EffectiveTriple = llvm::Triple(
+ T->getToolChain().ComputeEffectiveClangTriple(Args));
+ } else {
+ // Pass along the input type if it can be unambiguously determined.
+ EffectiveTriple =
+ llvm::Triple(T->getToolChain().ComputeEffectiveClangTriple(
+ Args, InputInfos[0].getType()));
+ }
+
if (CCCPrintBindings && !CCGenDiagnostics) {
+ // FIXME: We should be able to use the effective triple here, but doing so
+ // breaks some multi-arch tests.
llvm::errs() << "# \"" << T->getToolChain().getTripleString() << '"'
<< " - \"" << T->getName() << "\", inputs: [";
for (unsigned i = 0, e = InputInfos.size(); i != e; ++i) {
@@ -2122,7 +2136,7 @@
}
llvm::errs() << "], output: " << Result.getAsString() << "\n";
} else {
- T->ConstructJob(C, *JA, Result, InputInfos,
+ T->ConstructJob(C, *JA, Result, InputInfos, EffectiveTriple,
C.getArgsForToolChain(TC, BoundArch), LinkingOutput);
}
return Result;
Index: include/clang/Driver/ToolChain.h
===================================================================
--- include/clang/Driver/ToolChain.h
+++ include/clang/Driver/ToolChain.h
@@ -261,11 +261,13 @@
return ToolChain::CST_Libstdcxx;
}
- virtual std::string getCompilerRT(const llvm::opt::ArgList &Args,
+ virtual std::string getCompilerRT(const llvm::Triple &EffectiveTriple,
+ const llvm::opt::ArgList &Args,
StringRef Component,
bool Shared = false) const;
- const char *getCompilerRTArgString(const llvm::opt::ArgList &Args,
+ const char *getCompilerRTArgString(const llvm::Triple &EffectiveTriple,
+ const llvm::opt::ArgList &Args,
StringRef Component,
bool Shared = false) const;
/// needsProfileRT - returns true if instrumentation profile is on.
@@ -411,7 +413,8 @@
const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const;
/// addProfileRTLibs - When -fprofile-instr-profile is specified, try to pass
/// a suitable profile runtime library to the linker.
- virtual void addProfileRTLibs(const llvm::opt::ArgList &Args,
+ virtual void addProfileRTLibs(const llvm::Triple &EffectiveTriple,
+ const llvm::opt::ArgList &Args,
llvm::opt::ArgStringList &CmdArgs) const;
/// \brief Add arguments to use system-specific CUDA includes.
Index: include/clang/Driver/Tool.h
===================================================================
--- include/clang/Driver/Tool.h
+++ include/clang/Driver/Tool.h
@@ -14,6 +14,7 @@
#include "llvm/Support/Program.h"
namespace llvm {
+class Triple;
namespace opt {
class ArgList;
}
@@ -127,6 +128,7 @@
virtual void ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
const InputInfoList &Inputs,
+ const llvm::Triple &EffectiveTriple,
const llvm::opt::ArgList &TCArgs,
const char *LinkingOutput) const = 0;
};
Index: include/clang/Driver/SanitizerArgs.h
===================================================================
--- include/clang/Driver/SanitizerArgs.h
+++ include/clang/Driver/SanitizerArgs.h
@@ -16,6 +16,10 @@
#include <string>
#include <vector>
+namespace llvm {
+class Triple;
+}
+
namespace clang {
namespace driver {
@@ -66,7 +70,8 @@
bool requiresPIE() const;
bool needsUnwindTables() const;
bool linkCXXRuntimes() const { return LinkCXXRuntimes; }
- void addArgs(const ToolChain &TC, const llvm::opt::ArgList &Args,
+ void addArgs(const ToolChain &TC, const llvm::Triple &EffectiveTriple,
+ const llvm::opt::ArgList &Args,
llvm::opt::ArgStringList &CmdArgs, types::ID InputType) const;
};
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits