diff --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td b/clang/include/clang/Basic/DiagnosticDriverKinds.td --- a/clang/include/clang/Basic/DiagnosticDriverKinds.td +++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td @@ -262,6 +262,7 @@ "The option -fopenmp-targets must be used in conjunction with a -fopenmp option compatible with offloading, please use -fopenmp=libomp or -fopenmp=libiomp5.">; def err_drv_omp_offload_target_missingbcruntime : Error< "No library '%0' found in the default clang lib directory or in LIBRARY_PATH. Please use --libomptarget-%1-bc-path to specify %1 bitcode library.">; +def warn_drv_omp_offload_target_missingbcruntime : Warning<"No library '%0' found in the default clang lib directory or in LIBRARY_PATH. Fall back to '%1' instead.">; def err_drv_omp_offload_target_bcruntime_not_found : Error<"Bitcode library '%0' does not exist.">; def warn_drv_omp_offload_target_duplicate : Warning< "The OpenMP offloading target '%0' is similar to target '%1' already specified - will be ignored.">, diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp --- a/clang/lib/Driver/ToolChains/CommonArgs.cpp +++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -1628,6 +1628,33 @@ } } +namespace { +bool tryAppendBuiltinBitcode(const llvm::opt::ArgList &DriverArgs, + llvm::opt::ArgStringList &CC1Args, StringRef lib) { + if (llvm::sys::fs::exists(lib)) { + CC1Args.push_back("-mlink-builtin-bitcode"); + CC1Args.push_back(DriverArgs.MakeArgString(lib)); + return true; + } else { + return false; + } +} + +bool tryAppendBuiltinBitcodeGivenPaths( + const SmallVector &LibraryPaths, + const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args, + StringRef lib) { + for (StringRef LibraryPath : LibraryPaths) { + SmallString<128> TargetFile(LibraryPath); + llvm::sys::path::append(TargetFile, lib); + if (tryAppendBuiltinBitcode(DriverArgs, CC1Args, TargetFile)) { + return true; + } + } + return false; +} +} // namespace + void tools::addOpenMPDeviceRTL(const Driver &D, const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args, @@ -1658,27 +1685,24 @@ // First check whether user specifies bc library if (const Arg *A = DriverArgs.getLastArg(LibomptargetBCPathOpt)) { std::string LibOmpTargetName(A->getValue()); - if (llvm::sys::fs::exists(LibOmpTargetName)) { - CC1Args.push_back("-mlink-builtin-bitcode"); - CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetName)); - } else { + if (!tryAppendBuiltinBitcode(DriverArgs, CC1Args, LibOmpTargetName)) { D.Diag(diag::err_drv_omp_offload_target_bcruntime_not_found) << LibOmpTargetName; } } else { - bool FoundBCLibrary = false; - - std::string LibOmpTargetName = - "libomptarget-" + BitcodeSuffix.str() + ".bc"; - - for (StringRef LibraryPath : LibraryPaths) { - SmallString<128> LibOmpTargetFile(LibraryPath); - llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName); - if (llvm::sys::fs::exists(LibOmpTargetFile)) { - CC1Args.push_back("-mlink-builtin-bitcode"); - CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile)); - FoundBCLibrary = true; - break; + std::string Root = "libomptarget-"; + std::string LibOmpTargetName = Root + BitcodeSuffix.str() + ".bc"; + std::string FallbackTargetName = Root + ArchPrefix.str() + "-unknown.bc"; + + bool FoundBCLibrary = tryAppendBuiltinBitcodeGivenPaths( + LibraryPaths, DriverArgs, CC1Args, LibOmpTargetName); + + if (!FoundBCLibrary) { + FoundBCLibrary = tryAppendBuiltinBitcodeGivenPaths( + LibraryPaths, DriverArgs, CC1Args, FallbackTargetName); + if (FoundBCLibrary) { + D.Diag(diag::warn_drv_omp_offload_target_missingbcruntime) + << LibOmpTargetName << FallbackTargetName; } }