From b6a1473f97d38471b08331dee7ae7f6112c495c0 Mon Sep 17 00:00:00 2001 From: Shoaib Meenai Date: Mon, 21 Aug 2023 15:16:28 -0700 Subject: [PATCH] [driver] Refactor getRuntimePaths. NFC This used to be getRuntimePath till https://reviews.llvm.org/D115049 added a fallback search path for Android. As far as I can tell, the intent has always been to use the first existing path though instead of actually supporting multiple runtime paths. We can move the existence checks into getRuntimePath and have it return std::optional, which also makes the `--print-runtime-dir` behavior much cleaner. The motivation is a follow-up change to Android runtime path searches, which is much nicer with this in place. Reviewed By: phosek, MaskRay Differential Revision: https://reviews.llvm.org/D158475 --- clang/include/clang/Driver/ToolChain.h | 5 +++-- clang/lib/Driver/Driver.cpp | 12 ++---------- clang/lib/Driver/ToolChain.cpp | 25 +++++++++++++++---------- 3 files changed, 20 insertions(+), 22 deletions(-) diff --git a/clang/include/clang/Driver/ToolChain.h b/clang/include/clang/Driver/ToolChain.h index 2e74507f71267..0b38b939a188a 100644 --- a/clang/include/clang/Driver/ToolChain.h +++ b/clang/include/clang/Driver/ToolChain.h @@ -29,6 +29,7 @@ #include #include #include +#include #include #include @@ -500,8 +501,8 @@ class ToolChain { StringRef Component, FileType Type = ToolChain::FT_Static) const; - // Returns target specific runtime paths. - path_list getRuntimePaths() const; + // Returns the target specific runtime path if it exists. + std::optional getRuntimePath() const; // Returns target specific standard library paths. path_list getStdlibPaths() const; diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 7b64ef4cc5db6..07c4561c990ab 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -2163,16 +2163,8 @@ bool Driver::HandleImmediateArgs(const Compilation &C) { } if (C.getArgs().hasArg(options::OPT_print_runtime_dir)) { - std::string RuntimePath; - // Get the first existing path, if any. - for (auto Path : TC.getRuntimePaths()) { - if (getVFS().exists(Path)) { - RuntimePath = Path; - break; - } - } - if (!RuntimePath.empty()) - llvm::outs() << RuntimePath << '\n'; + if (std::optional RuntimePath = TC.getRuntimePath()) + llvm::outs() << *RuntimePath << '\n'; else llvm::outs() << TC.getCompilerRTPath() << '\n'; return false; diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp index 8dafc3d481c2e..f40cee195fa55 100644 --- a/clang/lib/Driver/ToolChain.cpp +++ b/clang/lib/Driver/ToolChain.cpp @@ -86,8 +86,8 @@ ToolChain::ToolChain(const Driver &D, const llvm::Triple &T, List.push_back(Path); }; - for (const auto &Path : getRuntimePaths()) - addIfExists(getLibraryPaths(), Path); + if (std::optional Path = getRuntimePath()) + getLibraryPaths().push_back(*Path); for (const auto &Path : getStdlibPaths()) addIfExists(getFilePaths(), Path); for (const auto &Path : getArchSpecificLibPaths()) @@ -677,15 +677,18 @@ const char *ToolChain::getCompilerRTArgString(const llvm::opt::ArgList &Args, return Args.MakeArgString(getCompilerRT(Args, Component, Type)); } -ToolChain::path_list ToolChain::getRuntimePaths() const { - path_list Paths; - auto addPathForTriple = [this, &Paths](const llvm::Triple &Triple) { +std::optional ToolChain::getRuntimePath() const { + auto getPathForTriple = + [this](const llvm::Triple &Triple) -> std::optional { SmallString<128> P(D.ResourceDir); llvm::sys::path::append(P, "lib", Triple.str()); - Paths.push_back(std::string(P.str())); + if (getVFS().exists(P)) + return std::string(P); + return {}; }; - addPathForTriple(getTriple()); + if (auto Path = getPathForTriple(getTriple())) + return *Path; // When building with per target runtime directories, various ways of naming // the Arm architecture may have been normalised to simply "arm". @@ -705,7 +708,8 @@ ToolChain::path_list ToolChain::getRuntimePaths() const { if (getTriple().getArch() == Triple::arm && !getTriple().isArmMClass()) { llvm::Triple ArmTriple = getTriple(); ArmTriple.setArch(Triple::arm); - addPathForTriple(ArmTriple); + if (auto Path = getPathForTriple(ArmTriple)) + return *Path; } // Android targets may include an API level at the end. We still want to fall @@ -714,10 +718,11 @@ ToolChain::path_list ToolChain::getRuntimePaths() const { getTriple().getEnvironmentName() != "android") { llvm::Triple TripleWithoutLevel = getTriple(); TripleWithoutLevel.setEnvironmentName("android"); - addPathForTriple(TripleWithoutLevel); + if (auto Path = getPathForTriple(TripleWithoutLevel)) + return *Path; } - return Paths; + return {}; } ToolChain::path_list ToolChain::getStdlibPaths() const {