forked from OSchip/llvm-project
[Driver] Update handling of c++ and runtime directories
This is a follow up to r361432 and r361504 which addresses issues introduced by those changes. Specifically, it avoids duplicating file and runtime paths in case when the effective triple is the same as the cannonical one. Furthermore, it fixes the broken multilib setup in the Fuchsia driver and deduplicates some of the code. Differential Revision: https://reviews.llvm.org/D62442 llvm-svn: 361709
This commit is contained in:
parent
d4a9cae965
commit
2db79ef32c
|
@ -389,6 +389,12 @@ public:
|
|||
getCompilerRTArgString(const llvm::opt::ArgList &Args, StringRef Component,
|
||||
FileType Type = ToolChain::FT_Static) const;
|
||||
|
||||
// Returns target specific runtime path if it exists.
|
||||
virtual Optional<std::string> getRuntimePath() const;
|
||||
|
||||
// Returns target specific C++ library path if it exists.
|
||||
virtual Optional<std::string> getCXXStdlibPath() const;
|
||||
|
||||
// Returns <ResourceDir>/lib/<OSName>/<arch>. This is used by runtimes (such
|
||||
// as OpenMP) to find arch-specific libraries.
|
||||
std::string getArchSpecificLibPath() const;
|
||||
|
|
|
@ -73,29 +73,13 @@ ToolChain::ToolChain(const Driver &D, const llvm::Triple &T,
|
|||
const ArgList &Args)
|
||||
: D(D), Triple(T), Args(Args), CachedRTTIArg(GetRTTIArgument(Args)),
|
||||
CachedRTTIMode(CalculateRTTIMode(Args, Triple, CachedRTTIArg)) {
|
||||
SmallString<128> P;
|
||||
|
||||
if (D.CCCIsCXX()) {
|
||||
P.assign(D.Dir);
|
||||
llvm::sys::path::append(P, "..", "lib", D.getTargetTriple(), "c++");
|
||||
if (getVFS().exists(P))
|
||||
getLibraryPaths().push_back(P.str());
|
||||
|
||||
P.assign(D.Dir);
|
||||
llvm::sys::path::append(P, "..", "lib", Triple.str(), "c++");
|
||||
if (getVFS().exists(P))
|
||||
getLibraryPaths().push_back(P.str());
|
||||
if (auto CXXStdlibPath = getCXXStdlibPath())
|
||||
getFilePaths().push_back(*CXXStdlibPath);
|
||||
}
|
||||
|
||||
P.assign(D.ResourceDir);
|
||||
llvm::sys::path::append(P, D.getTargetTriple(), "lib");
|
||||
if (getVFS().exists(P))
|
||||
getLibraryPaths().push_back(P.str());
|
||||
|
||||
P.assign(D.ResourceDir);
|
||||
llvm::sys::path::append(P, Triple.str(), "lib");
|
||||
if (getVFS().exists(P))
|
||||
getLibraryPaths().push_back(P.str());
|
||||
if (auto RuntimePath = getRuntimePath())
|
||||
getLibraryPaths().push_back(*RuntimePath);
|
||||
|
||||
std::string CandidateLibPath = getArchSpecificLibPath();
|
||||
if (getVFS().exists(CandidateLibPath))
|
||||
|
@ -421,6 +405,43 @@ const char *ToolChain::getCompilerRTArgString(const llvm::opt::ArgList &Args,
|
|||
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, D.getTargetTriple(), "lib");
|
||||
if (getVFS().exists(P))
|
||||
return llvm::Optional<std::string>(P.str());
|
||||
|
||||
// Second try the normalized triple.
|
||||
P.assign(D.ResourceDir);
|
||||
llvm::sys::path::append(P, Triple.str(), "lib");
|
||||
if (getVFS().exists(P))
|
||||
return llvm::Optional<std::string>(P.str());
|
||||
|
||||
return None;
|
||||
}
|
||||
|
||||
Optional<std::string> ToolChain::getCXXStdlibPath() 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(), "c++");
|
||||
if (getVFS().exists(P))
|
||||
return llvm::Optional<std::string>(P.str());
|
||||
|
||||
// Second try the normalized triple.
|
||||
P.assign(D.Dir);
|
||||
llvm::sys::path::append(P, "..", "lib", Triple.str(), "c++");
|
||||
if (getVFS().exists(P))
|
||||
return llvm::Optional<std::string>(P.str());
|
||||
|
||||
return None;
|
||||
}
|
||||
|
||||
std::string ToolChain::getArchSpecificLibPath() const {
|
||||
SmallString<128> Path(getDriver().ResourceDir);
|
||||
llvm::sys::path::append(Path, "lib", getOSLibName(),
|
||||
|
@ -833,10 +854,6 @@ void ToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
|
|||
|
||||
void ToolChain::AddFilePathLibArgs(const ArgList &Args,
|
||||
ArgStringList &CmdArgs) const {
|
||||
for (const auto &LibPath : getLibraryPaths())
|
||||
if(LibPath.length() > 0)
|
||||
CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
|
||||
|
||||
for (const auto &LibPath : getFilePaths())
|
||||
if(LibPath.length() > 0)
|
||||
CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
|
||||
|
|
|
@ -172,21 +172,16 @@ Fuchsia::Fuchsia(const Driver &D, const llvm::Triple &Triple,
|
|||
getFilePaths().push_back(P.str());
|
||||
}
|
||||
|
||||
auto RuntimeDirs = [&](const Multilib &M) -> std::vector<std::string> {
|
||||
SmallString<128> P;
|
||||
std::vector<std::string> RD;
|
||||
|
||||
P.assign(D.ResourceDir);
|
||||
llvm::sys::path::append(P, D.getTargetTriple(), "lib", M.gccSuffix());
|
||||
if (getVFS().exists(P))
|
||||
RD.push_back(P.str());
|
||||
|
||||
P.assign(D.ResourceDir);
|
||||
llvm::sys::path::append(P, Triple.str(), "lib", M.gccSuffix());
|
||||
if (getVFS().exists(P))
|
||||
RD.push_back(P.str());
|
||||
|
||||
return RD;
|
||||
auto FilePaths = [&](const Multilib &M) -> std::vector<std::string> {
|
||||
std::vector<std::string> FP;
|
||||
if (D.CCCIsCXX()) {
|
||||
if (auto CXXStdlibPath = getCXXStdlibPath()) {
|
||||
SmallString<128> P(*CXXStdlibPath);
|
||||
llvm::sys::path::append(P, M.gccSuffix());
|
||||
FP.push_back(P.str());
|
||||
}
|
||||
}
|
||||
return FP;
|
||||
};
|
||||
|
||||
Multilibs.push_back(Multilib());
|
||||
|
@ -198,7 +193,7 @@ Fuchsia::Fuchsia(const Driver &D, const llvm::Triple &Triple,
|
|||
Multilibs.push_back(Multilib("asan", {}, {}, 2)
|
||||
.flag("+fsanitize=address"));
|
||||
Multilibs.FilterOut([&](const Multilib &M) {
|
||||
std::vector<std::string> RD = RuntimeDirs(M);
|
||||
std::vector<std::string> RD = FilePaths(M);
|
||||
return std::all_of(RD.begin(), RD.end(), [&](std::string P) {
|
||||
return !getVFS().exists(P);
|
||||
});
|
||||
|
@ -209,14 +204,14 @@ Fuchsia::Fuchsia(const Driver &D, const llvm::Triple &Triple,
|
|||
Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions, true),
|
||||
"fexceptions", Flags);
|
||||
addMultilibFlag(getSanitizerArgs().needsAsanRt(), "fsanitize=address", Flags);
|
||||
Multilibs.setFilePathsCallback(RuntimeDirs);
|
||||
Multilibs.setFilePathsCallback(FilePaths);
|
||||
|
||||
if (Multilibs.select(Flags, SelectedMultilib))
|
||||
if (!SelectedMultilib.isDefault())
|
||||
if (const auto &PathsCallback = Multilibs.filePathsCallback())
|
||||
for (const auto &Path : PathsCallback(SelectedMultilib))
|
||||
// We need to prepend the multilib path to ensure it takes precedence.
|
||||
getLibraryPaths().insert(getLibraryPaths().begin(), Path);
|
||||
// Prepend the multilib path to ensure it takes the precedence.
|
||||
getFilePaths().insert(getFilePaths().begin(), Path);
|
||||
}
|
||||
|
||||
std::string Fuchsia::ComputeEffectiveClangTriple(const ArgList &Args,
|
||||
|
|
|
@ -93,8 +93,6 @@
|
|||
// CHECK-ASAN-X86: "-fsanitize=address"
|
||||
// CHECK-ASAN-X86: "-fsanitize-address-globals-dead-stripping"
|
||||
// CHECK-ASAN-X86: "-dynamic-linker" "asan/ld.so.1"
|
||||
// CHECK-ASAN-X86: "-L[[RESOURCE_DIR]]{{/|\\\\}}x86_64-fuchsia{{/|\\\\}}lib{{/|\\\\}}asan"
|
||||
// CHECK-ASAN-X86: "-L[[RESOURCE_DIR]]{{/|\\\\}}x86_64-fuchsia{{/|\\\\}}lib"
|
||||
// CHECK-ASAN-X86: "[[RESOURCE_DIR]]{{/|\\\\}}x86_64-fuchsia{{/|\\\\}}lib{{/|\\\\}}libclang_rt.asan.so"
|
||||
// CHECK-ASAN-X86: "[[RESOURCE_DIR]]{{/|\\\\}}x86_64-fuchsia{{/|\\\\}}lib{{/|\\\\}}libclang_rt.asan-preinit.a"
|
||||
|
||||
|
@ -107,8 +105,6 @@
|
|||
// CHECK-ASAN-AARCH64: "-fsanitize=address"
|
||||
// CHECK-ASAN-AARCH64: "-fsanitize-address-globals-dead-stripping"
|
||||
// CHECK-ASAN-AARCH64: "-dynamic-linker" "asan/ld.so.1"
|
||||
// CHECK-ASAN-AARCH64: "-L[[RESOURCE_DIR]]{{/|\\\\}}aarch64-fuchsia{{/|\\\\}}lib{{/|\\\\}}asan"
|
||||
// CHECK-ASAN-AARCH64: "-L[[RESOURCE_DIR]]{{/|\\\\}}aarch64-fuchsia{{/|\\\\}}lib"
|
||||
// CHECK-ASAN-AARCH64: "[[RESOURCE_DIR]]{{/|\\\\}}aarch64-fuchsia{{/|\\\\}}lib{{/|\\\\}}libclang_rt.asan.so"
|
||||
// CHECK-ASAN-AARCH64: "[[RESOURCE_DIR]]{{/|\\\\}}aarch64-fuchsia{{/|\\\\}}lib{{/|\\\\}}libclang_rt.asan-preinit.a"
|
||||
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
// RUN: %clangxx %s -### -no-canonical-prefixes --target=x86_64-fuchsia \
|
||||
// RUN: -ccc-install-dir %S/Inputs/basic_fuchsia_tree/bin \
|
||||
// RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \
|
||||
// RUN: --sysroot=%S/platform -fuse-ld=lld 2>&1 | FileCheck %s
|
||||
// CHECK: {{.*}}clang{{.*}}" "-cc1"
|
||||
|
@ -44,29 +45,33 @@
|
|||
// CHECK-STATIC: "--pop-state"
|
||||
// CHECK-STATIC: "-lc"
|
||||
|
||||
// RUN: %clang %s -### --target=x86_64-fuchsia -nostdlib++ -fuse-ld=lld 2>&1 \
|
||||
// RUN: %clangxx %s -### --target=x86_64-fuchsia -nostdlib++ -fuse-ld=lld 2>&1 \
|
||||
// RUN: | FileCheck %s -check-prefix=CHECK-NOSTDLIBXX
|
||||
// CHECK-NOSTDLIBXX-NOT: "-lc++"
|
||||
// CHECK-NOSTDLIBXX-NOT: "-lm"
|
||||
// CHECK-NOSTDLIBXX: "-lc"
|
||||
|
||||
// RUN: %clang %s -### --target=x86_64-fuchsia \
|
||||
// RUN: %clangxx %s -### --target=x86_64-fuchsia \
|
||||
// RUN: -ccc-install-dir %S/Inputs/basic_fuchsia_tree/bin \
|
||||
// RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \
|
||||
// RUN: -fuse-ld=lld 2>&1\
|
||||
// RUN: | FileCheck %s -check-prefixes=CHECK-MULTILIB-X86
|
||||
// RUN: %clang %s -### --target=x86_64-fuchsia -fsanitize=address \
|
||||
// RUN: %clangxx %s -### --target=x86_64-fuchsia -fsanitize=address \
|
||||
// RUN: -ccc-install-dir %S/Inputs/basic_fuchsia_tree/bin \
|
||||
// RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \
|
||||
// RUN: -fuse-ld=lld 2>&1\
|
||||
// RUN: | FileCheck %s -check-prefixes=CHECK-MULTILIB-X86,CHECK-MULTILIB-ASAN-X86
|
||||
// RUN: %clang %s -### --target=x86_64-fuchsia -fno-exceptions \
|
||||
// RUN: %clangxx %s -### --target=x86_64-fuchsia -fno-exceptions \
|
||||
// RUN: -ccc-install-dir %S/Inputs/basic_fuchsia_tree/bin \
|
||||
// RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \
|
||||
// RUN: -fuse-ld=lld 2>&1\
|
||||
// RUN: | FileCheck %s -check-prefixes=CHECK-MULTILIB-X86,CHECK-MULTILIB-NOEXCEPT-X86
|
||||
// RUN: %clang %s -### --target=x86_64-fuchsia -fsanitize=address -fno-exceptions \
|
||||
// RUN: %clangxx %s -### --target=x86_64-fuchsia -fsanitize=address -fno-exceptions \
|
||||
// RUN: -ccc-install-dir %S/Inputs/basic_fuchsia_tree/bin \
|
||||
// RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \
|
||||
// RUN: -fuse-ld=lld 2>&1\
|
||||
// RUN: | FileCheck %s -check-prefixes=CHECK-MULTILIB-X86,CHECK-MULTILIB-ASAN-X86
|
||||
// CHECK-MULTILIB-X86: "-resource-dir" "[[RESOURCE_DIR:[^"]+]]"
|
||||
// CHECK-MULTILIB-ASAN-X86: "-L[[RESOURCE_DIR]]{{/|\\\\}}x86_64-fuchsia{{/|\\\\}}lib{{/|\\\\}}asan"
|
||||
// CHECK-MULTILIB-NOEXCEPT-X86: "-L[[RESOURCE_DIR]]{{/|\\\\}}x86_64-fuchsia{{/|\\\\}}lib{{/|\\\\}}noexcept"
|
||||
// CHECK-MULTILIB-X86: "-L[[RESOURCE_DIR]]{{/|\\\\}}x86_64-fuchsia{{/|\\\\}}lib"
|
||||
// CHECK-MULTILIB-ASAN-X86: "-L{{.*}}{{/|\\\\}}..{{/|\\\\}}lib{{/|\\\\}}x86_64-fuchsia{{/|\\\\}}c++{{/|\\\\}}asan"
|
||||
// CHECK-MULTILIB-NOEXCEPT-X86: "-L{{.*}}{{/|\\\\}}..{{/|\\\\}}lib{{/|\\\\}}x86_64-fuchsia{{/|\\\\}}c++{{/|\\\\}}noexcept"
|
||||
// CHECK-MULTILIB-X86: "-L{{.*}}{{/|\\\\}}..{{/|\\\\}}lib{{/|\\\\}}x86_64-fuchsia{{/|\\\\}}c++"
|
||||
|
|
|
@ -13,7 +13,6 @@
|
|||
// CHECK-PER-TARGET-RUNTIME: "-internal-isystem" "[[SYSROOT]]/usr/local/include"
|
||||
// CHECK-PER-TARGET-RUNTIME: "--sysroot=[[SYSROOT]]"
|
||||
// CHECK-PER-TARGET-RUNTIME: "-L{{.*}}{{/|\\\\}}..{{/|\\\\}}lib{{/|\\\\}}x86_64-linux-gnu{{/|\\\\}}c++"
|
||||
// CHECK-PER-TARGET-RUNTIME: "-L[[RESDIR]]{{/|\\\\}}x86_64-linux-gnu{{/|\\\\}}lib"
|
||||
|
||||
// RUN: %clang -rtlib=compiler-rt -print-libgcc-file-name 2>&1 \
|
||||
// RUN: --target=x86_64-linux-gnu \
|
||||
|
|
Loading…
Reference in New Issue