smeenai created this revision. smeenai added reviewers: collinbaker, thakis, phosek, MaskRay. Herald added a project: All. smeenai requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
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. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D158475 Files: clang/include/clang/Driver/ToolChain.h clang/lib/Driver/Driver.cpp clang/lib/Driver/ToolChain.cpp
Index: clang/lib/Driver/ToolChain.cpp =================================================================== --- clang/lib/Driver/ToolChain.cpp +++ clang/lib/Driver/ToolChain.cpp @@ -86,8 +86,8 @@ List.push_back(Path); }; - for (const auto &Path : getRuntimePaths()) - addIfExists(getLibraryPaths(), Path); + if (std::optional<std::string> Path = getRuntimePath()) + getLibraryPaths().push_back(*Path); for (const auto &Path : getStdlibPaths()) addIfExists(getFilePaths(), Path); for (const auto &Path : getArchSpecificLibPaths()) @@ -677,15 +677,18 @@ 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<std::string> ToolChain::getRuntimePath() const { + auto getPathForTriple = + [this](const llvm::Triple &Triple) -> std::optional<std::string> { 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 @@ 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 @@ 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 { Index: clang/lib/Driver/Driver.cpp =================================================================== --- clang/lib/Driver/Driver.cpp +++ clang/lib/Driver/Driver.cpp @@ -2168,16 +2168,8 @@ } 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<std::string> RuntimePath = TC.getRuntimePath()) + llvm::outs() << *RuntimePath << '\n'; else llvm::outs() << TC.getCompilerRTPath() << '\n'; return false; Index: clang/include/clang/Driver/ToolChain.h =================================================================== --- clang/include/clang/Driver/ToolChain.h +++ clang/include/clang/Driver/ToolChain.h @@ -29,6 +29,7 @@ #include <cassert> #include <climits> #include <memory> +#include <optional> #include <string> #include <utility> @@ -500,8 +501,8 @@ 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<std::string> getRuntimePath() const; // Returns target specific standard library paths. path_list getStdlibPaths() const;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits