phosek created this revision.
phosek added a reviewer: MaskRay.
Herald added subscribers: jgravelle-google, sbc100, dschuff.
phosek requested review of this revision.
Herald added subscribers: cfe-commits, aheejin.
Herald added a project: clang.
Different platforms use different rules for multiarch triples so
it's difficult to provide a single method for all platforms. We
instead move the getMultiarchTriple to the ToolChain class and let
individual platforms override it and provide their custom logic.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D101194
Files:
clang/include/clang/Driver/ToolChain.h
clang/lib/Driver/Driver.cpp
clang/lib/Driver/ToolChain.cpp
clang/lib/Driver/ToolChains/Fuchsia.cpp
clang/lib/Driver/ToolChains/Fuchsia.h
clang/lib/Driver/ToolChains/Gnu.h
clang/lib/Driver/ToolChains/Linux.cpp
clang/lib/Driver/ToolChains/WebAssembly.cpp
clang/lib/Driver/ToolChains/WebAssembly.h
Index: clang/lib/Driver/ToolChains/WebAssembly.h
===================================================================
--- clang/lib/Driver/ToolChains/WebAssembly.h
+++ clang/lib/Driver/ToolChains/WebAssembly.h
@@ -70,6 +70,10 @@
const char *getDefaultLinker() const override { return "wasm-ld"; }
Tool *buildLinker() const override;
+
+ std::string getMultiarchTriple(const Driver &D,
+ const llvm::Triple &TargetTriple,
+ StringRef SysRoot) const override;
};
} // end namespace toolchains
Index: clang/lib/Driver/ToolChains/WebAssembly.cpp
===================================================================
--- clang/lib/Driver/ToolChains/WebAssembly.cpp
+++ clang/lib/Driver/ToolChains/WebAssembly.cpp
@@ -26,9 +26,9 @@
/// Following the conventions in https://wiki.debian.org/Multiarch/Tuples,
/// we remove the vendor field to form the multiarch triple.
-static std::string getMultiarchTriple(const Driver &D,
- const llvm::Triple &TargetTriple,
- StringRef SysRoot) {
+std::string WebAssembly::getMultiarchTriple(const Driver &D,
+ const llvm::Triple &TargetTriple,
+ StringRef SysRoot) const {
return (TargetTriple.getArchName() + "-" +
TargetTriple.getOSAndEnvironmentName()).str();
}
Index: clang/lib/Driver/ToolChains/Linux.cpp
===================================================================
--- clang/lib/Driver/ToolChains/Linux.cpp
+++ clang/lib/Driver/ToolChains/Linux.cpp
@@ -253,6 +253,8 @@
if (IsAndroid || Distro.IsOpenSUSE())
ExtraOpts.push_back("--enable-new-dtags");
+ addPathIfExists(D, getRuntimePath(), getLibraryPaths());
+
// The selection of paths to try here is designed to match the patterns which
// the GCC driver itself uses, as this is part of the GCC-compatible driver.
// This was determined by running GCC in a fake filesystem, creating all
@@ -260,6 +262,8 @@
// to the link paths.
path_list &Paths = getFilePaths();
+ addPathIfExists(D, getStdlibPath(), Paths);
+
const std::string OSLibDir = std::string(getOSLibDir(Triple, Args));
const std::string MultiarchTriple = getMultiarchTriple(D, Triple, SysRoot);
Index: clang/lib/Driver/ToolChains/Gnu.h
===================================================================
--- clang/lib/Driver/ToolChains/Gnu.h
+++ clang/lib/Driver/ToolChains/Gnu.h
@@ -310,11 +310,6 @@
Tool *buildAssembler() const override;
Tool *buildLinker() const override;
- virtual std::string getMultiarchTriple(const Driver &D,
- const llvm::Triple &TargetTriple,
- StringRef SysRoot) const
- { return TargetTriple.str(); }
-
/// \name ToolChain Implementation Helper Functions
/// @{
Index: clang/lib/Driver/ToolChains/Fuchsia.h
===================================================================
--- clang/lib/Driver/ToolChains/Fuchsia.h
+++ clang/lib/Driver/ToolChains/Fuchsia.h
@@ -97,6 +97,10 @@
protected:
Tool *buildLinker() const override;
+
+ std::string getMultiarchTriple(const Driver &D,
+ const llvm::Triple &TargetTriple,
+ StringRef SysRoot) const override;
};
} // end namespace toolchains
Index: clang/lib/Driver/ToolChains/Fuchsia.cpp
===================================================================
--- clang/lib/Driver/ToolChains/Fuchsia.cpp
+++ clang/lib/Driver/ToolChains/Fuchsia.cpp
@@ -27,6 +27,7 @@
using namespace llvm::opt;
using tools::addMultilibFlag;
+using tools::addPathIfExists;
void fuchsia::Linker::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
@@ -181,6 +182,10 @@
if (getDriver().getInstalledDir() != D.Dir)
getProgramPaths().push_back(D.Dir);
+ addPathIfExists(D, getRuntimePath(), getLibraryPaths());
+
+ addPathIfExists(D, getStdlibPath(), getFilePaths());
+
if (!D.SysRoot.empty()) {
SmallString<128> P(D.SysRoot);
llvm::sys::path::append(P, "lib");
@@ -189,11 +194,9 @@
auto FilePaths = [&](const Multilib &M) -> std::vector<std::string> {
std::vector<std::string> FP;
- if (auto StdlibPath = getStdlibPath()) {
- SmallString<128> P(*StdlibPath);
- llvm::sys::path::append(P, M.gccSuffix());
- FP.push_back(std::string(P.str()));
- }
+ SmallString<128> P(getStdlibPath());
+ llvm::sys::path::append(P, M.gccSuffix());
+ FP.push_back(std::string(P.str()));
return FP;
};
@@ -276,6 +279,15 @@
getFilePaths().insert(getFilePaths().begin(), Path);
}
+/// Following the conventions in https://wiki.debian.org/Multiarch/Tuples,
+/// we remove the vendor field to form the multiarch triple.
+std::string Fuchsia::getMultiarchTriple(const Driver &D,
+ const llvm::Triple &TargetTriple,
+ StringRef SysRoot) const {
+ return (TargetTriple.getArchName() + "-" +
+ TargetTriple.getOSAndEnvironmentName()).str();
+}
+
std::string Fuchsia::ComputeEffectiveClangTriple(const ArgList &Args,
types::ID InputType) const {
llvm::Triple Triple(ComputeLLVMTriple(Args, InputType));
Index: clang/lib/Driver/ToolChain.cpp
===================================================================
--- clang/lib/Driver/ToolChain.cpp
+++ clang/lib/Driver/ToolChain.cpp
@@ -75,12 +75,6 @@
const ArgList &Args)
: D(D), Triple(T), Args(Args), CachedRTTIArg(GetRTTIArgument(Args)),
CachedRTTIMode(CalculateRTTIMode(Args, Triple, CachedRTTIArg)) {
- if (auto StdlibPath = getStdlibPath())
- getFilePaths().push_back(*StdlibPath);
-
- if (auto RuntimePath = getRuntimePath())
- getLibraryPaths().push_back(*RuntimePath);
-
std::string CandidateLibPath = getArchSpecificLibPath();
if (getVFS().exists(CandidateLibPath))
getFilePaths().push_back(CandidateLibPath);
@@ -479,41 +473,17 @@
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, "lib", D.getTargetTriple());
- if (getVFS().exists(P))
- return llvm::Optional<std::string>(std::string(P.str()));
-
- // Second try the normalized triple.
- P.assign(D.ResourceDir);
- llvm::sys::path::append(P, "lib", Triple.str());
- if (getVFS().exists(P))
- return llvm::Optional<std::string>(std::string(P.str()));
-
- return None;
+std::string ToolChain::getRuntimePath() const {
+ SmallString<128> P(D.ResourceDir);
+ llvm::sys::path::append(P, "lib", getMultiarchTriple(D, Triple, D.SysRoot));
+ return std::string(P.str());
}
-Optional<std::string> ToolChain::getStdlibPath() 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());
- if (getVFS().exists(P))
- return llvm::Optional<std::string>(std::string(P.str()));
-
- // Second try the normalized triple.
- P.assign(D.Dir);
- llvm::sys::path::append(P, "..", "lib", Triple.str());
- if (getVFS().exists(P))
- return llvm::Optional<std::string>(std::string(P.str()));
-
- return None;
+std::string ToolChain::getStdlibPath() const {
+ SmallString<128> P(D.Dir);
+ llvm::sys::path::append(P, "..", "lib",
+ getMultiarchTriple(D, Triple, D.SysRoot));
+ return std::string(P.str());
}
std::string ToolChain::getArchSpecificLibPath() const {
Index: clang/lib/Driver/Driver.cpp
===================================================================
--- clang/lib/Driver/Driver.cpp
+++ clang/lib/Driver/Driver.cpp
@@ -1824,11 +1824,11 @@
}
if (C.getArgs().hasArg(options::OPT_print_runtime_dir)) {
- if (auto RuntimePath = TC.getRuntimePath()) {
- llvm::outs() << *RuntimePath << '\n';
- return false;
- }
- llvm::outs() << TC.getCompilerRTPath() << '\n';
+ std::string CandidateRuntimePath = TC.getRuntimePath();
+ if (getVFS().exists(CandidateRuntimePath))
+ llvm::outs() << CandidateRuntimePath << '\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
@@ -184,6 +184,12 @@
virtual Tool *buildStaticLibTool() const;
virtual Tool *getTool(Action::ActionClass AC) const;
+ virtual std::string getMultiarchTriple(const Driver &D,
+ const llvm::Triple &TargetTriple,
+ StringRef SysRoot) const {
+ return TargetTriple.str();
+ }
+
virtual std::string buildCompilerRTBasename(const llvm::opt::ArgList &Args,
StringRef Component,
FileType Type,
@@ -442,10 +448,10 @@
FileType Type = ToolChain::FT_Static) const;
// Returns target specific runtime path if it exists.
- virtual Optional<std::string> getRuntimePath() const;
+ virtual std::string getRuntimePath() const;
// Returns target specific standard library path if it exists.
- virtual Optional<std::string> getStdlibPath() const;
+ virtual std::string getStdlibPath() const;
// Returns <ResourceDir>/lib/<OSName>/<arch>. This is used by runtimes (such
// as OpenMP) to find arch-specific libraries.
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits