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 cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits