[clang] 5f91c74 - [Driver] Fix rpath for compiler-rt
Yaxun Liu via cfe-commits
cfe-commits at lists.llvm.org
Wed Apr 5 17:15:19 PDT 2023
Author: Yaxun (Sam) Liu
Date: 2023-04-05T20:14:53-04:00
New Revision: 5f91c747763c20a63f3d6156fced03b474f842a1
URL: https://github.com/llvm/llvm-project/commit/5f91c747763c20a63f3d6156fced03b474f842a1
DIFF: https://github.com/llvm/llvm-project/commit/5f91c747763c20a63f3d6156fced03b474f842a1.diff
LOG: [Driver] Fix rpath for compiler-rt
The compiler-rt library path can be either {resource_dir}/lib/{triple}
or {resource_dir}/lib/{OS}/{arch} depending on whether
LLVM_ENABLE_PER_TARGET_RUNTIME_DIR_default is ON or OFF.
Currently, the rpath added by -rtlib-add-rpath only adds
the latter. This patch checks both and adds the one that exists.
Reviewed by: Fangrui Song
Differential Revision: https://reviews.llvm.org/D146686
Added:
Modified:
clang/include/clang/Driver/ToolChain.h
clang/lib/Driver/ToolChain.cpp
clang/lib/Driver/ToolChains/CommonArgs.cpp
clang/lib/Driver/ToolChains/OHOS.cpp
clang/lib/Driver/ToolChains/OHOS.h
clang/lib/Driver/ToolChains/VEToolchain.cpp
clang/test/Driver/arch-specific-libdir-rpath.c
Removed:
################################################################################
diff --git a/clang/include/clang/Driver/ToolChain.h b/clang/include/clang/Driver/ToolChain.h
index e969edfc4e866..a4346a1bab8d2 100644
--- a/clang/include/clang/Driver/ToolChain.h
+++ b/clang/include/clang/Driver/ToolChain.h
@@ -492,9 +492,9 @@ class ToolChain {
// Returns target specific standard library paths.
path_list getStdlibPaths() const;
- // Returns <ResourceDir>/lib/<OSName>/<arch>. This is used by runtimes (such
- // as OpenMP) to find arch-specific libraries.
- virtual std::string getArchSpecificLibPath() const;
+ // Returns <ResourceDir>/lib/<OSName>/<arch> or <ResourceDir>/lib/<triple>.
+ // This is used by runtimes (such as OpenMP) to find arch-specific libraries.
+ virtual path_list getArchSpecificLibPaths() const;
// Returns <OSname> part of above.
virtual StringRef getOSLibName() const;
diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp
index 2dba975a5a8fa..27b66aa81ce2d 100644
--- a/clang/lib/Driver/ToolChain.cpp
+++ b/clang/lib/Driver/ToolChain.cpp
@@ -86,7 +86,8 @@ ToolChain::ToolChain(const Driver &D, const llvm::Triple &T,
addIfExists(getLibraryPaths(), Path);
for (const auto &Path : getStdlibPaths())
addIfExists(getFilePaths(), Path);
- addIfExists(getFilePaths(), getArchSpecificLibPath());
+ for (const auto &Path : getArchSpecificLibPaths())
+ addIfExists(getFilePaths(), Path);
}
llvm::Expected<std::unique_ptr<llvm::MemoryBuffer>>
@@ -621,11 +622,20 @@ ToolChain::path_list ToolChain::getStdlibPaths() const {
return Paths;
}
-std::string ToolChain::getArchSpecificLibPath() const {
- SmallString<128> Path(getDriver().ResourceDir);
- llvm::sys::path::append(Path, "lib", getOSLibName(),
- llvm::Triple::getArchTypeName(getArch()));
- return std::string(Path.str());
+ToolChain::path_list ToolChain::getArchSpecificLibPaths() const {
+ path_list Paths;
+
+ auto AddPath = [&](const ArrayRef<StringRef> &SS) {
+ SmallString<128> Path(getDriver().ResourceDir);
+ llvm::sys::path::append(Path, "lib");
+ for (auto &S : SS)
+ llvm::sys::path::append(Path, S);
+ Paths.push_back(std::string(Path.str()));
+ };
+
+ AddPath({getTriple().str()});
+ AddPath({getOSLibName(), llvm::Triple::getArchTypeName(getArch())});
+ return Paths;
}
bool ToolChain::needsProfileRT(const ArgList &Args) {
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index 020ae8a98c7c7..6190c9d65ddbd 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -818,10 +818,11 @@ void tools::addArchSpecificRPath(const ToolChain &TC, const ArgList &Args,
options::OPT_fno_rtlib_add_rpath, DefaultValue))
return;
- std::string CandidateRPath = TC.getArchSpecificLibPath();
- if (TC.getVFS().exists(CandidateRPath)) {
- CmdArgs.push_back("-rpath");
- CmdArgs.push_back(Args.MakeArgString(CandidateRPath));
+ for (const auto &CandidateRPath : TC.getArchSpecificLibPaths()) {
+ if (TC.getVFS().exists(CandidateRPath)) {
+ CmdArgs.push_back("-rpath");
+ CmdArgs.push_back(Args.MakeArgString(CandidateRPath));
+ }
}
}
diff --git a/clang/lib/Driver/ToolChains/OHOS.cpp b/clang/lib/Driver/ToolChains/OHOS.cpp
index d25c293716430..ea0c1c12541ca 100644
--- a/clang/lib/Driver/ToolChains/OHOS.cpp
+++ b/clang/lib/Driver/ToolChains/OHOS.cpp
@@ -139,9 +139,9 @@ OHOS::OHOS(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
SelectedMultilib = Result.SelectedMultilib;
getFilePaths().clear();
- std::string CandidateLibPath = getArchSpecificLibPath();
- if (getVFS().exists(CandidateLibPath))
- getFilePaths().push_back(CandidateLibPath);
+ for (const auto &CandidateLibPath : getArchSpecificLibPaths())
+ if (getVFS().exists(CandidateLibPath))
+ getFilePaths().push_back(CandidateLibPath);
getLibraryPaths().clear();
for (auto &Path : getRuntimePaths())
@@ -401,9 +401,12 @@ void OHOS::addProfileRTLibs(const llvm::opt::ArgList &Args,
ToolChain::addProfileRTLibs(Args, CmdArgs);
}
-std::string OHOS::getArchSpecificLibPath() const {
+ToolChain::path_list OHOS::getArchSpecificLibPaths() const {
+ ToolChain::path_list Paths;
llvm::Triple Triple = getTriple();
- return makePath({getDriver().ResourceDir, "lib", getMultiarchTriple(Triple)});
+ Paths.push_back(
+ makePath({getDriver().ResourceDir, "lib", getMultiarchTriple(Triple)}));
+ return Paths;
}
ToolChain::UnwindLibType OHOS::GetUnwindLibType(const llvm::opt::ArgList &Args) const {
diff --git a/clang/lib/Driver/ToolChains/OHOS.h b/clang/lib/Driver/ToolChains/OHOS.h
index b648d0ffa67a1..a06df0eee6e2b 100644
--- a/clang/lib/Driver/ToolChains/OHOS.h
+++ b/clang/lib/Driver/ToolChains/OHOS.h
@@ -83,7 +83,8 @@ class LLVM_LIBRARY_VISIBILITY OHOS : public Generic_ELF {
SanitizerMask getSupportedSanitizers() const override;
void addProfileRTLibs(const llvm::opt::ArgList &Args,
llvm::opt::ArgStringList &CmdArgs) const override;
- std::string getArchSpecificLibPath() const override;
+ path_list getArchSpecificLibPaths() const override;
+
private:
Multilib SelectedMultilib;
};
diff --git a/clang/lib/Driver/ToolChains/VEToolchain.cpp b/clang/lib/Driver/ToolChains/VEToolchain.cpp
index 9be239262db8d..e72db208f587b 100644
--- a/clang/lib/Driver/ToolChains/VEToolchain.cpp
+++ b/clang/lib/Driver/ToolChains/VEToolchain.cpp
@@ -33,7 +33,7 @@ VEToolChain::VEToolChain(const Driver &D, const llvm::Triple &Triple,
// These are OK.
// Default file paths are following:
- // ${RESOURCEDIR}/lib/linux/ve, (== getArchSpecificLibPath)
+ // ${RESOURCEDIR}/lib/linux/ve, (== getArchSpecificLibPaths)
// /lib/../lib64,
// /usr/lib/../lib64,
// ${BINPATH}/../lib,
@@ -45,12 +45,13 @@ VEToolChain::VEToolChain(const Driver &D, const llvm::Triple &Triple,
getFilePaths().clear();
// Add library directories:
- // ${BINPATH}/../lib/ve-unknown-linux-gnu, (== getStdlibPath)
- // ${RESOURCEDIR}/lib/linux/ve, (== getArchSpecificLibPath)
+ // ${BINPATH}/../lib/ve-unknown-linux-gnu, (== getStdlibPaths)
+ // ${RESOURCEDIR}/lib/linux/ve, (== getArchSpecificLibPaths)
// ${SYSROOT}/opt/nec/ve/lib,
for (auto &Path : getStdlibPaths())
getFilePaths().push_back(std::move(Path));
- getFilePaths().push_back(getArchSpecificLibPath());
+ for (const auto &Path : getArchSpecificLibPaths())
+ getFilePaths().push_back(Path);
getFilePaths().push_back(computeSysRoot() + "/opt/nec/ve/lib");
}
diff --git a/clang/test/Driver/arch-specific-libdir-rpath.c b/clang/test/Driver/arch-specific-libdir-rpath.c
index 690da26273da5..1e6bbbc5929ac 100644
--- a/clang/test/Driver/arch-specific-libdir-rpath.c
+++ b/clang/test/Driver/arch-specific-libdir-rpath.c
@@ -75,6 +75,15 @@
// RUN: -frtlib-add-rpath 2>&1 \
// RUN: | FileCheck --check-prefixes=RESDIR,NO-LIBPATH,NO-RPATH %s
+// Test that the driver adds an per-target arch-specific subdirectory in
+// {RESOURCE_DIR}/lib/{triple} to the linker search path and to '-rpath'
+//
+// RUN: %clang %s -### 2>&1 --target=x86_64-linux-gnu \
+// RUN: -fsanitize=address -shared-libasan \
+// RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \
+// RUN: -frtlib-add-rpath \
+// RUN: | FileCheck --check-prefixes=PERTARGET %s
+
// RESDIR: "-resource-dir" "[[RESDIR:[^"]*]]"
//
// LIBPATH-X86_64: -L[[RESDIR]]{{(/|\\\\)lib(/|\\\\)linux(/|\\\\)x86_64}}
@@ -88,3 +97,7 @@
//
// NO-LIBPATH-NOT: "-L{{[^"]*Inputs(/|\\\\)resource_dir}}"
// NO-RPATH-NOT: "-rpath" {{.*(/|\\\\)Inputs(/|\\\\)resource_dir}}
+
+// PERTARGET: "-resource-dir" "[[PTRESDIR:[^"]*]]"
+// PERTARGET: -L[[PTRESDIR]]{{(/|\\\\)lib(/|\\\\)x86_64-unknown-linux-gnu}}
+// PERTARGET: "-rpath" "[[PTRESDIR]]{{(/|\\\\)lib(/|\\\\)x86_64-unknown-linux-gnu}}"
More information about the cfe-commits
mailing list