From: Mike Hommey Date: Thu, 23 Mar 2023 06:52:28 +0900 Subject: [PATCH] Apply the same fallbacks as runtimes search for stdlib search When building clang with e.g. LLVM_ENABLE_RUNTIMES=libcxx;libunwind, those runtimes end up in the stdlib search directory, and when LLVM_ENABLE_PER_TARGET_RUNTIME_DIR is set, that ends up in a target-specific subdirectory. The stdlib search does handle the situation, but when the target in question is Android, the same issues as those that required fallbacks for runtimes search apply. Traditionally, those libraries are shipped as part of the Android NDK, but when one builds their own clang for Android, they may want to use the runtimes from the same version rather than the ones from the NDK. diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp index 7a4319ea680f..afbc7de8befd 100644 --- a/clang/lib/Driver/ToolChain.cpp +++ b/clang/lib/Driver/ToolChain.cpp @@ -535,34 +535,39 @@ 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) { - SmallString<128> P(D.ResourceDir); - llvm::sys::path::append(P, "lib", Triple.str()); - Paths.push_back(std::string(P.str())); - }; - - addPathForTriple(getTriple()); +template +static void fillPaths(const ToolChain &TC, F addPathForTriple) { + addPathForTriple(TC.getTriple()); // Android targets may include an API level at the end. We still want to fall // back on a path without the API level. - if (getTriple().isAndroid() && - getTriple().getEnvironmentName() != "android") { - llvm::Triple TripleWithoutLevel = getTriple(); + if (TC.getTriple().isAndroid() && + TC.getTriple().getEnvironmentName() != "android") { + llvm::Triple TripleWithoutLevel = TC.getTriple(); TripleWithoutLevel.setEnvironmentName("android"); addPathForTriple(TripleWithoutLevel); } +} +ToolChain::path_list ToolChain::getRuntimePaths() const { + path_list Paths; + auto addPathForTriple = [this, &Paths](const llvm::Triple &Triple) { + SmallString<128> P(D.ResourceDir); + llvm::sys::path::append(P, "lib", Triple.str()); + Paths.push_back(std::string(P.str())); + }; + fillPaths(*this, addPathForTriple); return Paths; } ToolChain::path_list ToolChain::getStdlibPaths() const { path_list Paths; - SmallString<128> P(D.Dir); - llvm::sys::path::append(P, "..", "lib", getTripleString()); - Paths.push_back(std::string(P.str())); - + auto addPathForTriple = [this, &Paths](const llvm::Triple &Triple) { + SmallString<128> P(D.Dir); + llvm::sys::path::append(P, "..", "lib", Triple.str()); + Paths.push_back(std::string(P.str())); + }; + fillPaths(*this, addPathForTriple); return Paths; }