diff --git a/clang/include/clang/Driver/ToolChain.h b/clang/include/clang/Driver/ToolChain.h --- a/clang/include/clang/Driver/ToolChain.h +++ b/clang/include/clang/Driver/ToolChain.h @@ -184,6 +184,12 @@ virtual Tool *buildStaticLibTool() const; virtual Tool *getTool(Action::ActionClass AC) const; + virtual std::string getMultiarchTriple(const Driver &D, + const llvm::Triple &TargetTriple, + StringRef SysRoot) const { + return TargetTriple.str(); + } + virtual std::string buildCompilerRTBasename(const llvm::opt::ArgList &Args, StringRef Component, FileType Type, @@ -442,10 +448,10 @@ FileType Type = ToolChain::FT_Static) const; // Returns target specific runtime path if it exists. - virtual Optional getRuntimePath() const; + virtual std::string getRuntimePath() const; // Returns target specific standard library path if it exists. - virtual Optional getStdlibPath() const; + virtual std::string getStdlibPath() const; // Returns /lib//. This is used by runtimes (such // as OpenMP) to find arch-specific libraries. diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -1824,11 +1824,11 @@ } if (C.getArgs().hasArg(options::OPT_print_runtime_dir)) { - if (auto RuntimePath = TC.getRuntimePath()) { - llvm::outs() << *RuntimePath << '\n'; - return false; - } - llvm::outs() << TC.getCompilerRTPath() << '\n'; + std::string CandidateRuntimePath = TC.getRuntimePath(); + if (getVFS().exists(CandidateRuntimePath)) + llvm::outs() << CandidateRuntimePath << '\n'; + else + llvm::outs() << TC.getCompilerRTPath() << '\n'; return false; } diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp --- a/clang/lib/Driver/ToolChain.cpp +++ b/clang/lib/Driver/ToolChain.cpp @@ -75,12 +75,6 @@ const ArgList &Args) : D(D), Triple(T), Args(Args), CachedRTTIArg(GetRTTIArgument(Args)), CachedRTTIMode(CalculateRTTIMode(Args, Triple, CachedRTTIArg)) { - if (auto StdlibPath = getStdlibPath()) - getFilePaths().push_back(*StdlibPath); - - if (auto RuntimePath = getRuntimePath()) - getLibraryPaths().push_back(*RuntimePath); - std::string CandidateLibPath = getArchSpecificLibPath(); if (getVFS().exists(CandidateLibPath)) getFilePaths().push_back(CandidateLibPath); @@ -479,41 +473,17 @@ return Args.MakeArgString(getCompilerRT(Args, Component, Type)); } - -Optional ToolChain::getRuntimePath() const { - SmallString<128> P; - - // First try the triple passed to driver as --target=. - P.assign(D.ResourceDir); - llvm::sys::path::append(P, "lib", D.getTargetTriple()); - if (getVFS().exists(P)) - return llvm::Optional(std::string(P.str())); - - // Second try the normalized triple. - P.assign(D.ResourceDir); - llvm::sys::path::append(P, "lib", Triple.str()); - if (getVFS().exists(P)) - return llvm::Optional(std::string(P.str())); - - return None; +std::string ToolChain::getRuntimePath() const { + SmallString<128> P(D.ResourceDir); + llvm::sys::path::append(P, "lib", getMultiarchTriple(D, Triple, D.SysRoot)); + return std::string(P.str()); } -Optional ToolChain::getStdlibPath() const { - SmallString<128> P; - - // First try the triple passed to driver as --target=. - P.assign(D.Dir); - llvm::sys::path::append(P, "..", "lib", D.getTargetTriple()); - if (getVFS().exists(P)) - return llvm::Optional(std::string(P.str())); - - // Second try the normalized triple. - P.assign(D.Dir); - llvm::sys::path::append(P, "..", "lib", Triple.str()); - if (getVFS().exists(P)) - return llvm::Optional(std::string(P.str())); - - return None; +std::string ToolChain::getStdlibPath() const { + SmallString<128> P(D.Dir); + llvm::sys::path::append(P, "..", "lib", + getMultiarchTriple(D, Triple, D.SysRoot)); + return std::string(P.str()); } std::string ToolChain::getArchSpecificLibPath() const { diff --git a/clang/lib/Driver/ToolChains/Fuchsia.h b/clang/lib/Driver/ToolChains/Fuchsia.h --- a/clang/lib/Driver/ToolChains/Fuchsia.h +++ b/clang/lib/Driver/ToolChains/Fuchsia.h @@ -97,6 +97,10 @@ protected: Tool *buildLinker() const override; + + std::string getMultiarchTriple(const Driver &D, + const llvm::Triple &TargetTriple, + StringRef SysRoot) const override; }; } // end namespace toolchains diff --git a/clang/lib/Driver/ToolChains/Fuchsia.cpp b/clang/lib/Driver/ToolChains/Fuchsia.cpp --- a/clang/lib/Driver/ToolChains/Fuchsia.cpp +++ b/clang/lib/Driver/ToolChains/Fuchsia.cpp @@ -27,6 +27,7 @@ using namespace llvm::opt; using tools::addMultilibFlag; +using tools::addPathIfExists; void fuchsia::Linker::ConstructJob(Compilation &C, const JobAction &JA, const InputInfo &Output, @@ -181,6 +182,10 @@ if (getDriver().getInstalledDir() != D.Dir) getProgramPaths().push_back(D.Dir); + addPathIfExists(D, getRuntimePath(), getLibraryPaths()); + + addPathIfExists(D, getStdlibPath(), getFilePaths()); + if (!D.SysRoot.empty()) { SmallString<128> P(D.SysRoot); llvm::sys::path::append(P, "lib"); @@ -189,11 +194,9 @@ auto FilePaths = [&](const Multilib &M) -> std::vector { std::vector FP; - if (auto StdlibPath = getStdlibPath()) { - SmallString<128> P(*StdlibPath); - llvm::sys::path::append(P, M.gccSuffix()); - FP.push_back(std::string(P.str())); - } + SmallString<128> P(getStdlibPath()); + llvm::sys::path::append(P, M.gccSuffix()); + FP.push_back(std::string(P.str())); return FP; }; @@ -276,6 +279,15 @@ getFilePaths().insert(getFilePaths().begin(), Path); } +/// Following the conventions in https://wiki.debian.org/Multiarch/Tuples, +/// we remove the vendor field to form the multiarch triple. +std::string Fuchsia::getMultiarchTriple(const Driver &D, + const llvm::Triple &TargetTriple, + StringRef SysRoot) const { + return (TargetTriple.getArchName() + "-" + + TargetTriple.getOSAndEnvironmentName()).str(); +} + std::string Fuchsia::ComputeEffectiveClangTriple(const ArgList &Args, types::ID InputType) const { llvm::Triple Triple(ComputeLLVMTriple(Args, InputType)); diff --git a/clang/lib/Driver/ToolChains/Gnu.h b/clang/lib/Driver/ToolChains/Gnu.h --- a/clang/lib/Driver/ToolChains/Gnu.h +++ b/clang/lib/Driver/ToolChains/Gnu.h @@ -310,11 +310,6 @@ Tool *buildAssembler() const override; Tool *buildLinker() const override; - virtual std::string getMultiarchTriple(const Driver &D, - const llvm::Triple &TargetTriple, - StringRef SysRoot) const - { return TargetTriple.str(); } - /// \name ToolChain Implementation Helper Functions /// @{ diff --git a/clang/lib/Driver/ToolChains/Linux.cpp b/clang/lib/Driver/ToolChains/Linux.cpp --- a/clang/lib/Driver/ToolChains/Linux.cpp +++ b/clang/lib/Driver/ToolChains/Linux.cpp @@ -253,6 +253,8 @@ if (IsAndroid || Distro.IsOpenSUSE()) ExtraOpts.push_back("--enable-new-dtags"); + addPathIfExists(D, getRuntimePath(), getLibraryPaths()); + // The selection of paths to try here is designed to match the patterns which // the GCC driver itself uses, as this is part of the GCC-compatible driver. // This was determined by running GCC in a fake filesystem, creating all @@ -260,6 +262,8 @@ // to the link paths. path_list &Paths = getFilePaths(); + addPathIfExists(D, getStdlibPath(), Paths); + const std::string OSLibDir = std::string(getOSLibDir(Triple, Args)); const std::string MultiarchTriple = getMultiarchTriple(D, Triple, SysRoot); diff --git a/clang/lib/Driver/ToolChains/WebAssembly.h b/clang/lib/Driver/ToolChains/WebAssembly.h --- a/clang/lib/Driver/ToolChains/WebAssembly.h +++ b/clang/lib/Driver/ToolChains/WebAssembly.h @@ -70,6 +70,10 @@ const char *getDefaultLinker() const override { return "wasm-ld"; } Tool *buildLinker() const override; + + std::string getMultiarchTriple(const Driver &D, + const llvm::Triple &TargetTriple, + StringRef SysRoot) const override; }; } // end namespace toolchains diff --git a/clang/lib/Driver/ToolChains/WebAssembly.cpp b/clang/lib/Driver/ToolChains/WebAssembly.cpp --- a/clang/lib/Driver/ToolChains/WebAssembly.cpp +++ b/clang/lib/Driver/ToolChains/WebAssembly.cpp @@ -26,9 +26,9 @@ /// Following the conventions in https://wiki.debian.org/Multiarch/Tuples, /// we remove the vendor field to form the multiarch triple. -static std::string getMultiarchTriple(const Driver &D, - const llvm::Triple &TargetTriple, - StringRef SysRoot) { +std::string WebAssembly::getMultiarchTriple(const Driver &D, + const llvm::Triple &TargetTriple, + StringRef SysRoot) const { return (TargetTriple.getArchName() + "-" + TargetTriple.getOSAndEnvironmentName()).str(); }