diff options
author | Petr Hosek <phosek@chromium.org> | 2019-05-26 03:39:07 +0000 |
---|---|---|
committer | Petr Hosek <phosek@chromium.org> | 2019-05-26 03:39:07 +0000 |
commit | 10299eac40b659e3829b33a24a451f0bde5f3793 (patch) | |
tree | 4368968a8f4ffa40ea692e972e54ca3d86b14404 /lib | |
parent | 5a18a355edce3e687460b0fde3b5dbf48136d69c (diff) | |
download | clang-10299eac40b659e3829b33a24a451f0bde5f3793.tar.gz |
[Driver] Update handling of c++ and runtime directories
This is a follow up to r361432 and r361504 which addresses issues
introduced by those changes. Specifically, it avoids duplicating
file and runtime paths in case when the effective triple is the
same as the cannonical one. Furthermore, it fixes the broken multilib
setup in the Fuchsia driver and deduplicates some of the code.
Differential Revision: https://reviews.llvm.org/D62442
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@361709 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Driver/ToolChain.cpp | 65 | ||||
-rw-r--r-- | lib/Driver/ToolChains/Fuchsia.cpp | 33 |
2 files changed, 55 insertions, 43 deletions
diff --git a/lib/Driver/ToolChain.cpp b/lib/Driver/ToolChain.cpp index 08d1ebb75d..01fb818c9c 100644 --- a/lib/Driver/ToolChain.cpp +++ b/lib/Driver/ToolChain.cpp @@ -73,29 +73,13 @@ ToolChain::ToolChain(const Driver &D, const llvm::Triple &T, const ArgList &Args) : D(D), Triple(T), Args(Args), CachedRTTIArg(GetRTTIArgument(Args)), CachedRTTIMode(CalculateRTTIMode(Args, Triple, CachedRTTIArg)) { - SmallString<128> P; - if (D.CCCIsCXX()) { - P.assign(D.Dir); - llvm::sys::path::append(P, "..", "lib", D.getTargetTriple(), "c++"); - if (getVFS().exists(P)) - getLibraryPaths().push_back(P.str()); - - P.assign(D.Dir); - llvm::sys::path::append(P, "..", "lib", Triple.str(), "c++"); - if (getVFS().exists(P)) - getLibraryPaths().push_back(P.str()); + if (auto CXXStdlibPath = getCXXStdlibPath()) + getFilePaths().push_back(*CXXStdlibPath); } - P.assign(D.ResourceDir); - llvm::sys::path::append(P, D.getTargetTriple(), "lib"); - if (getVFS().exists(P)) - getLibraryPaths().push_back(P.str()); - - P.assign(D.ResourceDir); - llvm::sys::path::append(P, Triple.str(), "lib"); - if (getVFS().exists(P)) - getLibraryPaths().push_back(P.str()); + if (auto RuntimePath = getRuntimePath()) + getLibraryPaths().push_back(*RuntimePath); std::string CandidateLibPath = getArchSpecificLibPath(); if (getVFS().exists(CandidateLibPath)) @@ -421,6 +405,43 @@ const char *ToolChain::getCompilerRTArgString(const llvm::opt::ArgList &Args, return Args.MakeArgString(getCompilerRT(Args, Component, Type)); } + +Optional<std::string> ToolChain::getRuntimePath() const { + SmallString<128> P; + + // First try the triple passed to driver as --target=<triple>. + P.assign(D.ResourceDir); + llvm::sys::path::append(P, D.getTargetTriple(), "lib"); + 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, Triple.str(), "lib"); + if (getVFS().exists(P)) + return llvm::Optional<std::string>(P.str()); + + return None; +} + +Optional<std::string> ToolChain::getCXXStdlibPath() const { + SmallString<128> P; + + // First try the triple passed to driver as --target=<triple>. + P.assign(D.Dir); + llvm::sys::path::append(P, "..", "lib", D.getTargetTriple(), "c++"); + 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(), "c++"); + if (getVFS().exists(P)) + return llvm::Optional<std::string>(P.str()); + + return None; +} + std::string ToolChain::getArchSpecificLibPath() const { SmallString<128> Path(getDriver().ResourceDir); llvm::sys::path::append(Path, "lib", getOSLibName(), @@ -833,10 +854,6 @@ void ToolChain::AddCXXStdlibLibArgs(const ArgList &Args, void ToolChain::AddFilePathLibArgs(const ArgList &Args, ArgStringList &CmdArgs) const { - for (const auto &LibPath : getLibraryPaths()) - if(LibPath.length() > 0) - CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath)); - for (const auto &LibPath : getFilePaths()) if(LibPath.length() > 0) CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath)); diff --git a/lib/Driver/ToolChains/Fuchsia.cpp b/lib/Driver/ToolChains/Fuchsia.cpp index 3249d4f1f7..2344a69adb 100644 --- a/lib/Driver/ToolChains/Fuchsia.cpp +++ b/lib/Driver/ToolChains/Fuchsia.cpp @@ -172,21 +172,16 @@ Fuchsia::Fuchsia(const Driver &D, const llvm::Triple &Triple, getFilePaths().push_back(P.str()); } - auto RuntimeDirs = [&](const Multilib &M) -> std::vector<std::string> { - SmallString<128> P; - std::vector<std::string> RD; - - P.assign(D.ResourceDir); - llvm::sys::path::append(P, D.getTargetTriple(), "lib", M.gccSuffix()); - if (getVFS().exists(P)) - RD.push_back(P.str()); - - P.assign(D.ResourceDir); - llvm::sys::path::append(P, Triple.str(), "lib", M.gccSuffix()); - if (getVFS().exists(P)) - RD.push_back(P.str()); - - return RD; + auto FilePaths = [&](const Multilib &M) -> std::vector<std::string> { + std::vector<std::string> FP; + if (D.CCCIsCXX()) { + if (auto CXXStdlibPath = getCXXStdlibPath()) { + SmallString<128> P(*CXXStdlibPath); + llvm::sys::path::append(P, M.gccSuffix()); + FP.push_back(P.str()); + } + } + return FP; }; Multilibs.push_back(Multilib()); @@ -198,7 +193,7 @@ Fuchsia::Fuchsia(const Driver &D, const llvm::Triple &Triple, Multilibs.push_back(Multilib("asan", {}, {}, 2) .flag("+fsanitize=address")); Multilibs.FilterOut([&](const Multilib &M) { - std::vector<std::string> RD = RuntimeDirs(M); + std::vector<std::string> RD = FilePaths(M); return std::all_of(RD.begin(), RD.end(), [&](std::string P) { return !getVFS().exists(P); }); @@ -209,14 +204,14 @@ Fuchsia::Fuchsia(const Driver &D, const llvm::Triple &Triple, Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions, true), "fexceptions", Flags); addMultilibFlag(getSanitizerArgs().needsAsanRt(), "fsanitize=address", Flags); - Multilibs.setFilePathsCallback(RuntimeDirs); + Multilibs.setFilePathsCallback(FilePaths); if (Multilibs.select(Flags, SelectedMultilib)) if (!SelectedMultilib.isDefault()) if (const auto &PathsCallback = Multilibs.filePathsCallback()) for (const auto &Path : PathsCallback(SelectedMultilib)) - // We need to prepend the multilib path to ensure it takes precedence. - getLibraryPaths().insert(getLibraryPaths().begin(), Path); + // Prepend the multilib path to ensure it takes the precedence. + getFilePaths().insert(getFilePaths().begin(), Path); } std::string Fuchsia::ComputeEffectiveClangTriple(const ArgList &Args, |