JonChesterfield updated this revision to Diff 343557.
JonChesterfield added a comment.
- rework logic for finding libomptarget.so
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D101960/new/
https://reviews.llvm.org/D101960
Files:
clang/lib/Driver/ToolChains/CommonArgs.cpp
clang/lib/Driver/ToolChains/CommonArgs.h
openmp/libomptarget/src/rtl.cpp
openmp/libomptarget/test/lit.cfg
Index: openmp/libomptarget/test/lit.cfg
===================================================================
--- openmp/libomptarget/test/lit.cfg
+++ openmp/libomptarget/test/lit.cfg
@@ -70,14 +70,10 @@
config.test_flags += " -Wl,-rpath," + config.library_dir
config.test_flags += " -Wl,-rpath," + config.omp_host_rtl_directory
else: # Unices
- append_dynamic_library_path('LD_LIBRARY_PATH', config.library_dir, ":")
- append_dynamic_library_path('LD_LIBRARY_PATH', \
- config.omp_host_rtl_directory, ":")
+ config.test_flags += " -Wl,-rpath," + config.library_dir
+ config.test_flags += " -Wl,-rpath," + config.omp_host_rtl_directory
if config.cuda_libdir:
- append_dynamic_library_path('LD_LIBRARY_PATH', config.cuda_libdir, ":")
- append_dynamic_library_path('LIBRARY_PATH', config.library_dir, ":")
- append_dynamic_library_path('LIBRARY_PATH', \
- config.omp_host_rtl_directory, ":")
+ config.test_flags += " -Wl,-rpath," + config.cuda_libdir
# substitutions
# - for targets that exist in the system create the actual command.
@@ -182,7 +178,8 @@
config.substitutions.append(("%clangxx", config.test_cxx_compiler))
config.substitutions.append(("%clang", config.test_c_compiler))
config.substitutions.append(("%openmp_flags", config.test_openmp_flags))
-if config.cuda_path:
+
+if config.cuda_path and config.cuda_path != 'CUDA_TOOLKIT_ROOT_DIR-NOTFOUND':
config.substitutions.append(("%cuda_flags", "--cuda-path=" + config.cuda_path))
else:
config.substitutions.append(("%cuda_flags", ""))
Index: openmp/libomptarget/src/rtl.cpp
===================================================================
--- openmp/libomptarget/src/rtl.cpp
+++ openmp/libomptarget/src/rtl.cpp
@@ -65,6 +65,30 @@
#endif
}
+namespace {
+std::string findLibomptargetDirectory() {
+ Dl_info dl_info;
+ // look up a symbol which is known to be from libomptarget
+ if (dladdr((void *)&__tgt_register_lib, &dl_info) != 0) {
+ std::string libomptargetPath = std::string(dl_info.dli_fname);
+ size_t slash = libomptargetPath.find_last_of('/');
+ if (slash != std::string::npos) {
+ return libomptargetPath.substr(0, slash + 1); // keep the /
+ }
+ }
+ return "";
+}
+
+void *verbose_dlopen(const char *Name) {
+ DP("Loading library '%s'...\n", Name);
+ void *dynlib_handle = dlopen(Name, RTLD_NOW);
+ if (!dynlib_handle) {
+ DP("Unable to load library '%s': %s!\n", Name, dlerror());
+ }
+ return dynlib_handle;
+}
+} // namespace
+
void RTLsTy::LoadRTLs() {
// Parse environment variable OMP_TARGET_OFFLOAD (if set)
PM->TargetOffloadPolicy =
@@ -72,19 +96,22 @@
if (PM->TargetOffloadPolicy == tgt_disabled) {
return;
}
-
DP("Loading RTLs...\n");
+ std::string libomptargetPath = findLibomptargetDirectory();
// Attempt to open all the plugins and, if they exist, check if the interface
// is correct and if they are supporting any devices.
for (auto *Name : RTLNames) {
- DP("Loading library '%s'...\n", Name);
- void *dynlib_handle = dlopen(Name, RTLD_NOW);
+ std::string adjacentPluginName = libomptargetPath + std::string(Name);
+ void *dynlib_handle = verbose_dlopen(adjacentPluginName.c_str());
if (!dynlib_handle) {
- // Library does not exist or cannot be found.
- DP("Unable to load library '%s': %s!\n", Name, dlerror());
- continue;
+ // Try again without the libomptarget library path prefix
+ dynlib_handle = verbose_dlopen(Name);
+ if (!dynlib_handle) {
+ // Library does not exist or cannot be found.
+ continue;
+ }
}
DP("Successfully loaded library '%s'!\n", Name);
Index: clang/lib/Driver/ToolChains/CommonArgs.h
===================================================================
--- clang/lib/Driver/ToolChains/CommonArgs.h
+++ clang/lib/Driver/ToolChains/CommonArgs.h
@@ -73,6 +73,10 @@
const llvm::opt::ArgList &Args,
llvm::opt::ArgStringList &CmdArgs);
+void addOpenMPRuntimeSpecificRPath(const ToolChain &TC,
+ const llvm::opt::ArgList &Args,
+ llvm::opt::ArgStringList &CmdArgs);
+
void addArchSpecificRPath(const ToolChain &TC, const llvm::opt::ArgList &Args,
llvm::opt::ArgStringList &CmdArgs);
/// Returns true, if an OpenMP runtime has been added.
Index: clang/lib/Driver/ToolChains/CommonArgs.cpp
===================================================================
--- clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -645,6 +645,17 @@
/*IsLTO=*/true);
}
+void tools::addOpenMPRuntimeSpecificRPath(const ToolChain &TC,
+ const ArgList &Args,
+ ArgStringList &CmdArgs) {
+ const Driver &D = TC.getDriver();
+ std::string CandidateRPath = D.Dir + "/../lib" CLANG_LIBDIR_SUFFIX;
+ if (TC.getVFS().exists(CandidateRPath)) {
+ CmdArgs.push_back("-rpath");
+ CmdArgs.push_back(Args.MakeArgString(CandidateRPath.c_str()));
+ }
+}
+
void tools::addArchSpecificRPath(const ToolChain &TC, const ArgList &Args,
ArgStringList &CmdArgs) {
// Enable -frtlib-add-rpath by default for the case of VE.
@@ -697,6 +708,9 @@
if (RTKind == Driver::OMPRT_GOMP && GompNeedsRT)
CmdArgs.push_back("-lrt");
+ if (RTKind == Driver::OMPRT_OMP)
+ addOpenMPRuntimeSpecificRPath(TC, Args, CmdArgs);
+
if (IsOffloadingHost)
CmdArgs.push_back("-lomptarget");
@@ -1686,6 +1700,12 @@
llvm::sys::path::append(DefaultLibPath, Twine("lib") + CLANG_LIBDIR_SUFFIX);
LibraryPaths.emplace_back(DefaultLibPath.c_str());
+ // Add path to runtimes binary folder, used by ENABLE_RUNTIMES build
+ SmallString<256> RuntimesBinPath = llvm::sys::path::parent_path(D.Dir);
+ llvm::sys::path::append(RuntimesBinPath,
+ "runtimes/runtimes-bins/openmp/libomptarget");
+ LibraryPaths.emplace_back(RuntimesBinPath.c_str());
+
OptSpecifier LibomptargetBCPathOpt =
Triple.isAMDGCN() ? options::OPT_libomptarget_amdgcn_bc_path_EQ
: options::OPT_libomptarget_nvptx_bc_path_EQ;
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits