From 809f5c72b6dbfdae5bda51cc68218c716f2eedf9 Mon Sep 17 00:00:00 2001 From: Saleem Abdulrasool Date: Sun, 22 May 2016 01:37:36 +0000 Subject: [PATCH] Driver: simplify getDynameLinker Convert the cascading if/else to a switch. This makes it easier to follow the logic. Minor difference is that we no longer default to x86_64 but rather to the architecture specified by the architecture. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@270351 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Driver/Tools.cpp | 96 ++++++++++++++++++++++---------------------- 1 file changed, 49 insertions(+), 47 deletions(-) diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index 8a1cb541c1..2eee8b8fbc 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -8989,66 +8989,68 @@ static std::string getLinuxDynamicLinker(const ArgList &Args, const llvm::Triple::ArchType Arch = ToolChain.getArch(); const llvm::Triple &Triple = ToolChain.getTriple(); - if (Triple.isAndroid()) { - if (Triple.isArch64Bit()) - return "/system/bin/linker64"; - else - return "/system/bin/linker"; - } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc || - Arch == llvm::Triple::sparcel) - return "/lib/ld-linux.so.2"; - else if (Arch == llvm::Triple::aarch64) + 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"; - else if (Arch == llvm::Triple::aarch64_be) + case llvm::Triple::aarch64_be: return "/lib/ld-linux-aarch64_be.so.1"; - else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) { - if (Triple.getEnvironment() == llvm::Triple::GNUEABIHF || - arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard) - return "/lib/ld-linux-armhf.so.3"; - else - return "/lib/ld-linux.so.3"; - } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) { - // TODO: check which dynamic linker name. - if (Triple.getEnvironment() == llvm::Triple::GNUEABIHF || - arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard) - return "/lib/ld-linux-armhf.so.3"; - else - return "/lib/ld-linux.so.3"; - } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel || - Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) { + case llvm::Triple::arm: + case llvm::Triple::thumb: + case llvm::Triple::armeb: + case llvm::Triple::thumbeb: { + const bool IsHardFloat = + Triple.getEnvironment() == llvm::Triple::GNUEABIHF || + arm::getARMFloatABI(ToolChain, Args) == 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 = mips::isNaN2008(Args, Triple); + bool LE = (Triple.getArch() == llvm::Triple::mipsel) || + (Triple.getArch() == llvm::Triple::mips64el); + std::string LibDir = "/lib" + mips::getMipsABILibSuffix(Args, Triple); StringRef LibName; - bool IsNaN2008 = mips::isNaN2008(Args, Triple); if (mips::isUCLibc(Args)) LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0"; else if (!Triple.hasEnvironment() && - Triple.getVendor() == llvm::Triple::VendorType::MipsTechnologies) { - bool LE = (Triple.getArch() == llvm::Triple::mipsel) || - (Triple.getArch() == llvm::Triple::mips64el); + Triple.getVendor() == llvm::Triple::VendorType::MipsTechnologies) LibName = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1"; - } else + else LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1"; return (LibDir + "/" + LibName).str(); - } else if (Arch == llvm::Triple::ppc) + } + case llvm::Triple::ppc: return "/lib/ld.so.1"; - else if (Arch == llvm::Triple::ppc64) { - if (ppc::hasPPCAbiArg(Args, "elfv2")) - return "/lib64/ld64.so.2"; - return "/lib64/ld64.so.1"; - } else if (Arch == llvm::Triple::ppc64le) { - if (ppc::hasPPCAbiArg(Args, "elfv1")) - return "/lib64/ld64.so.1"; - return "/lib64/ld64.so.2"; - } else if (Arch == llvm::Triple::systemz) - return "/lib/ld64.so.1"; - else if (Arch == llvm::Triple::sparcv9) + case llvm::Triple::ppc64: + return (ppc::hasPPCAbiArg(Args, "elfv2")) ? "/lib64/ld64.so.2" + : "/lib64/ld64.so.1"; + case llvm::Triple::ppc64le: + return (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"; - else if (Arch == llvm::Triple::x86_64 && - Triple.getEnvironment() == llvm::Triple::GNUX32) - return "/libx32/ld-linux-x32.so.2"; - else - return "/lib64/ld-linux-x86-64.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"; + } } static void AddRunTimeLibs(const ToolChain &TC, const Driver &D, -- 2.40.0