Driver: sink getLinuxDynamicLoader into the Toolchain
The parameter already requires the toolchain, sink the method into the class.
This also enables the use of the distro detection logic which will be needed to
support Exherbo's multiarch approach.
llvm-svn: 270352
diff --git a/clang/lib/Driver/ToolChains.cpp b/clang/lib/Driver/ToolChains.cpp
index 556d240..3988c72 100644
--- a/clang/lib/Driver/ToolChains.cpp
+++ b/clang/lib/Driver/ToolChains.cpp
@@ -3918,6 +3918,75 @@
return std::string();
}
+std::string Linux::getDynamicLinker(const ArgList &Args) const {
+ const llvm::Triple::ArchType Arch = getArch();
+ const llvm::Triple &Triple = getTriple();
+
+ if (Triple.isAndroid())
+ return Triple.isArch64Bit() ? "/system/bin/linker64" : "/system/bin/linker";
+
+ switch (Arch) {
+ default: llvm_unreachable("unsupported architecture");
+
+ case llvm::Triple::aarch64:
+ return "/lib/ld-linux-aarch64.so.1";
+ case llvm::Triple::aarch64_be:
+ return "/lib/ld-linux-aarch64_be.so.1";
+ case llvm::Triple::arm:
+ case llvm::Triple::thumb:
+ case llvm::Triple::armeb:
+ case llvm::Triple::thumbeb: {
+ const bool IsHardFloat =
+ Triple.getEnvironment() == llvm::Triple::GNUEABIHF ||
+ tools::arm::getARMFloatABI(*this, Args) == tools::arm::FloatABI::Hard;
+
+ return IsHardFloat ? "/lib/ld-linux-armhf.so.3" : "/lib/ld-linux.so.3";
+ }
+ case llvm::Triple::mips:
+ case llvm::Triple::mipsel:
+ case llvm::Triple::mips64:
+ case llvm::Triple::mips64el: {
+ bool IsNaN2008 = tools::mips::isNaN2008(Args, Triple);
+ bool LE = (Triple.getArch() == llvm::Triple::mipsel) ||
+ (Triple.getArch() == llvm::Triple::mips64el);
+
+ std::string LibDir =
+ "/lib" + tools::mips::getMipsABILibSuffix(Args, Triple);
+ StringRef LibName;
+ if (tools::mips::isUCLibc(Args))
+ LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
+ else if (!Triple.hasEnvironment() &&
+ Triple.getVendor() == llvm::Triple::VendorType::MipsTechnologies)
+ LibName = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1";
+ else
+ LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
+
+ return (LibDir + "/" + LibName).str();
+ }
+ case llvm::Triple::ppc:
+ return "/lib/ld.so.1";
+ case llvm::Triple::ppc64:
+ return (tools::ppc::hasPPCAbiArg(Args, "elfv2")) ? "/lib64/ld64.so.2"
+ : "/lib64/ld64.so.1";
+ case llvm::Triple::ppc64le:
+ return (tools::ppc::hasPPCAbiArg(Args, "elfv1")) ? "/lib64/ld64.so.1"
+ : "/lib64/ld64.so.2";
+ case llvm::Triple::sparc:
+ case llvm::Triple::sparcel:
+ return "/lib/ld-linux.so.2";
+ case llvm::Triple::sparcv9:
+ return "/lib64/ld-linux.so.2";
+ case llvm::Triple::systemz:
+ return "/lib/ld64.so.1";
+ case llvm::Triple::x86:
+ return "/lib/ld-linux.so.2";
+ case llvm::Triple::x86_64:
+ return (Triple.getEnvironment() == llvm::Triple::GNUX32)
+ ? "/libx32/ld-linux-x32.so.2"
+ : "/lib64/ld-linux-x86-64.so.2";
+ }
+}
+
void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
ArgStringList &CC1Args) const {
const Driver &D = getDriver();