diff options
author | Saleem Abdulrasool <compnerd@compnerd.org> | 2016-05-22 01:37:36 +0000 |
---|---|---|
committer | Saleem Abdulrasool <compnerd@compnerd.org> | 2016-05-22 01:37:36 +0000 |
commit | c9befbf552bd1e0dd12e28ef7835b36703cd0eac (patch) | |
tree | 824f1248f6afc02063a5f01cdecc878b2fa76614 /clang/lib/Driver/Tools.cpp | |
parent | 9235d9f6d74edfdefddca12ab2dbb24f68f6574d (diff) | |
download | llvm-c9befbf552bd1e0dd12e28ef7835b36703cd0eac.zip llvm-c9befbf552bd1e0dd12e28ef7835b36703cd0eac.tar.gz llvm-c9befbf552bd1e0dd12e28ef7835b36703cd0eac.tar.bz2 |
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.
llvm-svn: 270351
Diffstat (limited to 'clang/lib/Driver/Tools.cpp')
-rw-r--r-- | clang/lib/Driver/Tools.cpp | 96 |
1 files changed, 49 insertions, 47 deletions
diff --git a/clang/lib/Driver/Tools.cpp b/clang/lib/Driver/Tools.cpp index 8a1cb54..2eee8b8 100644 --- a/clang/lib/Driver/Tools.cpp +++ b/clang/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, |