yaxunl updated this revision to Diff 508312. yaxunl edited the summary of this revision. yaxunl added a comment. Herald added a reviewer: jdoerfert. Herald added subscribers: jplehr, sstefan1.
adds check for both {resource_dir}/lib/{triple} and {resource_dir}/lib/{OS}/{arch} CHANGES SINCE LAST ACTION https://reviews.llvm.org/D146686/new/ https://reviews.llvm.org/D146686 Files: 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-per-target-libdir-rpath.c
Index: clang/test/Driver/arch-specific-per-target-libdir-rpath.c =================================================================== --- /dev/null +++ clang/test/Driver/arch-specific-per-target-libdir-rpath.c @@ -0,0 +1,86 @@ +// Test that the driver adds an per-target arch-specific subdirectory in +// {RESOURCE_DIR}/lib/{triple} to the linker search path and to '-rpath' +// +// Test the default behavior when neither -frtlib-add-rpath nor +// -fno-rtlib-add-rpath is specified, which is to skip -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: | FileCheck --check-prefixes=RESDIR,LIBPATH-X86_64,NO-RPATH-X86_64 %s +// +// Test that -rpath is not added under -fno-rtlib-add-rpath even if other +// conditions are met. +// 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: -fno-rtlib-add-rpath \ +// RUN: | FileCheck --check-prefixes=RESDIR,LIBPATH-X86_64,NO-RPATH-X86_64 %s +// +// Test that -rpath is added only under the right circumstance even if +// -frtlib-add-rpath is specified. +// +// Add LIBPATH but no RPATH for -fsanitizer=address w/o -shared-libasan +// RUN: %clang %s -### 2>&1 -target x86_64-linux-gnu -fsanitize=undefined \ +// RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \ +// RUN: -frtlib-add-rpath \ +// RUN: | FileCheck --check-prefixes=RESDIR,LIBPATH-X86_64,NO-RPATH-X86_64 %s +// +// Add LIBPATH but no RPATH for -fsanitizer=address w/o -shared-libasan +// RUN: %clang %s -### 2>&1 -target x86_64-linux-gnu -fsanitize=undefined \ +// RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \ +// RUN: -frtlib-add-rpath \ +// RUN: | FileCheck --check-prefixes=RESDIR,LIBPATH-X86_64,NO-RPATH-X86_64 %s +// +// Add LIBPATH, RPATH for -fsanitize=address -shared-libasan +// 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=RESDIR,LIBPATH-X86_64,RPATH-X86_64 %s +// +// Add LIBPATH, RPATH with -fsanitize=address for Android +// RUN: %clang %s -### 2>&1 -target aarch64-linux-android -fsanitize=address \ +// RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \ +// RUN: -frtlib-add-rpath \ +// RUN: | FileCheck --check-prefixes=RESDIR,LIBPATH-AARCH64-ANDROID,RPATH-AARCH64-ANDROID %s +// +// Add LIBPATH, RPATH for OpenMP +// RUN: %clang %s -### 2>&1 -target x86_64-linux-gnu -fopenmp \ +// RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \ +// RUN: -frtlib-add-rpath \ +// RUN: | FileCheck --check-prefixes=RESDIR,LIBPATH-X86_64,RPATH-X86_64 %s +// +// Add LIBPATH but no RPATH for ubsan (or any other sanitizer) +// RUN: %clang %s -### 2>&1 -fsanitize=undefined -target x86_64-linux-gnu \ +// RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \ +// RUN: -frtlib-add-rpath \ +// RUN: | FileCheck --check-prefixes=RESDIR,LIBPATH-X86_64,NO-RPATH-X86_64 %s +// +// Add LIBPATH but no RPATH if no sanitizer or runtime is specified +// RUN: %clang %s -### 2>&1 -target x86_64-linux-gnu \ +// RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \ +// RUN: -frtlib-add-rpath \ +// RUN: | FileCheck --check-prefixes=RESDIR,LIBPATH-X86_64,NO-RPATH-X86_64 %s +// +// Do not add LIBPATH or RPATH if arch-specific subdir doesn't exist +// RUN: %clang %s -### 2>&1 -target x86_64-linux-gnu \ +// RUN: -resource-dir=%S/Inputs/resource_dir \ +// RUN: -frtlib-add-rpath \ +// RUN: | FileCheck --check-prefixes=RESDIR,NO-LIBPATH,NO-RPATH %s + +// RESDIR: "-resource-dir" "[[RESDIR:[^"]*]]" +// +// LIBPATH-X86_64: -L[[RESDIR]]{{(/|\\\\)lib(/|\\\\)x86_64-unknown-linux-gnu}} +// RPATH-X86_64: "-rpath" "[[RESDIR]]{{(/|\\\\)lib(/|\\\\)x86_64-unknown-linux-gnu}}" +// +// LIBPATH-AARCH64-ANDROID: -L[[RESDIR]]{{(/|\\\\)lib(/|\\\\)aarch64-unknown-linux-android}} +// RPATH-AARCH64-ANDROID: "-rpath" "[[RESDIR]]{{(/|\\\\)lib(/|\\\\)aarch64-unknown-linux-android}}" +// +// NO-LIBPATH-X86_64-NOT: -L[[RESDIR]]{{(/|\\\\)lib(/|\\\\)x86_64-unknown-linux}} +// NO-RPATH-X86_64-NOT: "-rpath" "[[RESDIR]]{{(/|\\\\)lib(/|\\\\)x86_64-unknown-linux}}" +// +// LIBPATH-AARCH64: -L[[RESDIR]]{{(/|\\\\)lib(/|\\\\)aarch64-unknown-linux}} +// RPATH-AARCH64: "-rpath" "[[RESDIR]]{{(/|\\\\)lib(/|\\\\)aarch64-unknown-linux}}" +// +// NO-LIBPATH-NOT: "-L{{[^"]*Inputs(/|\\\\)resource_dir}}" +// NO-RPATH-NOT: "-rpath" {{.*(/|\\\\)Inputs(/|\\\\)resource_dir}} Index: clang/lib/Driver/ToolChains/VEToolchain.cpp =================================================================== --- clang/lib/Driver/ToolChains/VEToolchain.cpp +++ clang/lib/Driver/ToolChains/VEToolchain.cpp @@ -33,7 +33,7 @@ // 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 @@ 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"); } Index: clang/lib/Driver/ToolChains/OHOS.h =================================================================== --- clang/lib/Driver/ToolChains/OHOS.h +++ clang/lib/Driver/ToolChains/OHOS.h @@ -82,7 +82,8 @@ 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; }; Index: clang/lib/Driver/ToolChains/OHOS.cpp =================================================================== --- clang/lib/Driver/ToolChains/OHOS.cpp +++ clang/lib/Driver/ToolChains/OHOS.cpp @@ -137,9 +137,10 @@ 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()) @@ -399,9 +400,12 @@ 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 { Index: clang/lib/Driver/ToolChains/CommonArgs.cpp =================================================================== --- clang/lib/Driver/ToolChains/CommonArgs.cpp +++ clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -815,10 +815,11 @@ 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)); + } } } Index: clang/lib/Driver/ToolChain.cpp =================================================================== --- clang/lib/Driver/ToolChain.cpp +++ clang/lib/Driver/ToolChain.cpp @@ -86,7 +86,8 @@ 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,21 @@ 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) { Index: clang/include/clang/Driver/ToolChain.h =================================================================== --- clang/include/clang/Driver/ToolChain.h +++ clang/include/clang/Driver/ToolChain.h @@ -492,9 +492,9 @@ // 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;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits