Skip to content

Commit

Permalink
[driver] Refactor getRuntimePaths. NFC
Browse files Browse the repository at this point in the history
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
  • Loading branch information
smeenai committed Aug 29, 2023
1 parent dcafbd0 commit b6a1473
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 22 deletions.
5 changes: 3 additions & 2 deletions clang/include/clang/Driver/ToolChain.h
Expand Up @@ -29,6 +29,7 @@
#include <cassert>
#include <climits>
#include <memory>
#include <optional>
#include <string>
#include <utility>

Expand Down Expand Up @@ -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<std::string> getRuntimePath() const;

// Returns target specific standard library paths.
path_list getStdlibPaths() const;
Expand Down
12 changes: 2 additions & 10 deletions clang/lib/Driver/Driver.cpp
Expand Up @@ -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<std::string> RuntimePath = TC.getRuntimePath())
llvm::outs() << *RuntimePath << '\n';
else
llvm::outs() << TC.getCompilerRTPath() << '\n';
return false;
Expand Down
25 changes: 15 additions & 10 deletions clang/lib/Driver/ToolChain.cpp
Expand Up @@ -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<std::string> Path = getRuntimePath())
getLibraryPaths().push_back(*Path);
for (const auto &Path : getStdlibPaths())
addIfExists(getFilePaths(), Path);
for (const auto &Path : getArchSpecificLibPaths())
Expand Down Expand Up @@ -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<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".
Expand All @@ -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
Expand All @@ -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 {
Expand Down

0 comments on commit b6a1473

Please sign in to comment.