saiislam created this revision. saiislam added reviewers: Meinersbur, ye-luo, JonChesterfield. saiislam requested review of this revision. Herald added a reviewer: jdoerfert. Herald added subscribers: cfe-commits, sstefan1. Herald added a project: clang.
Added support of a "--path=" option in clang-nvlink-wrapper which takes the path of directory containing nvlink binary. Static Device Library support for OpenMP (D105191 <https://reviews.llvm.org/D105191>) now searches for nvlink binary and passes its location via this option. In absence of this option, nvlink binary is searched in locations in PATH. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D111488 Files: clang/lib/Driver/ToolChains/Cuda.cpp clang/tools/clang-nvlink-wrapper/ClangNvlinkWrapper.cpp Index: clang/tools/clang-nvlink-wrapper/ClangNvlinkWrapper.cpp =================================================================== --- clang/tools/clang-nvlink-wrapper/ClangNvlinkWrapper.cpp +++ clang/tools/clang-nvlink-wrapper/ClangNvlinkWrapper.cpp @@ -41,6 +41,15 @@ static cl::opt<bool> Help("h", cl::desc("Alias for -help"), cl::Hidden); +// Mark all our options with this category, everything else (except for -help) +// will be hidden. +static cl::OptionCategory + ClangNvlinkWrapperCategory("clang-nvlink-wrapper options"); + +static cl::opt<std::string> + NvlinkUserPath("path", cl::desc("path of directory containing nvlink"), + cl::cat(ClangNvlinkWrapperCategory)); + static Error runNVLink(std::string NVLinkPath, SmallVectorImpl<std::string> &Args) { std::vector<StringRef> NVLArgs; @@ -121,7 +130,6 @@ int main(int argc, const char **argv) { sys::PrintStackTraceOnErrorSignal(argv[0]); - if (Help) { cl::PrintHelpMessage(); return 0; @@ -132,12 +140,7 @@ exit(1); }; - ErrorOr<std::string> NvlinkPath = sys::findProgramByName("nvlink"); - if (!NvlinkPath) { - reportError(createStringError(NvlinkPath.getError(), - "unable to find 'nvlink' in path")); - } - + std::string NvlinkPath; SmallVector<const char *, 0> Argv(argv, argv + argc); SmallVector<std::string, 0> ArgvSubst; SmallVector<std::string, 0> TmpFiles; @@ -147,15 +150,28 @@ for (size_t i = 1; i < Argv.size(); ++i) { std::string Arg = Argv[i]; + StringRef ArgRef(Arg); + auto NvlPath = ArgRef.startswith_insensitive("--path="); if (sys::path::extension(Arg) == ".a") { if (Error Err = extractArchiveFiles(Arg, ArgvSubst, TmpFiles)) reportError(std::move(Err)); + } else if (NvlPath) { + NvlinkPath = ArgRef.substr(7).str().append("/nvlink"); } else { ArgvSubst.push_back(Arg); } } - if (Error Err = runNVLink(NvlinkPath.get(), ArgvSubst)) + if (NvlinkPath.empty()) { + ErrorOr<std::string> NvlinkPathErr = sys::findProgramByName("nvlink"); + if (!NvlinkPathErr) { + reportError(createStringError(NvlinkPathErr.getError(), + "unable to find 'nvlink' in path")); + } + NvlinkPath = NvlinkPathErr.get(); + } + + if (Error Err = runNVLink(NvlinkPath, ArgvSubst)) reportError(std::move(Err)); if (Error Err = cleanupTmpFiles(TmpFiles)) reportError(std::move(Err)); Index: clang/lib/Driver/ToolChains/Cuda.cpp =================================================================== --- clang/lib/Driver/ToolChains/Cuda.cpp +++ clang/lib/Driver/ToolChains/Cuda.cpp @@ -613,6 +613,13 @@ AddStaticDeviceLibsLinking(C, *this, JA, Inputs, Args, CmdArgs, "nvptx", GPUArch, false, false); + // Find nvlink and pass it as "--path=" argument of clang-nvlink-wrapper. + auto NvlinkDir = + llvm::sys::path::parent_path(getToolChain().GetProgramPath("nvlink")) + .str(); + const char *NvlinkPath = Args.MakeArgString(Twine("--path=" + NvlinkDir)); + CmdArgs.push_back(NvlinkPath); + const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("clang-nvlink-wrapper")); C.addCommand(std::make_unique<Command>(
Index: clang/tools/clang-nvlink-wrapper/ClangNvlinkWrapper.cpp =================================================================== --- clang/tools/clang-nvlink-wrapper/ClangNvlinkWrapper.cpp +++ clang/tools/clang-nvlink-wrapper/ClangNvlinkWrapper.cpp @@ -41,6 +41,15 @@ static cl::opt<bool> Help("h", cl::desc("Alias for -help"), cl::Hidden); +// Mark all our options with this category, everything else (except for -help) +// will be hidden. +static cl::OptionCategory + ClangNvlinkWrapperCategory("clang-nvlink-wrapper options"); + +static cl::opt<std::string> + NvlinkUserPath("path", cl::desc("path of directory containing nvlink"), + cl::cat(ClangNvlinkWrapperCategory)); + static Error runNVLink(std::string NVLinkPath, SmallVectorImpl<std::string> &Args) { std::vector<StringRef> NVLArgs; @@ -121,7 +130,6 @@ int main(int argc, const char **argv) { sys::PrintStackTraceOnErrorSignal(argv[0]); - if (Help) { cl::PrintHelpMessage(); return 0; @@ -132,12 +140,7 @@ exit(1); }; - ErrorOr<std::string> NvlinkPath = sys::findProgramByName("nvlink"); - if (!NvlinkPath) { - reportError(createStringError(NvlinkPath.getError(), - "unable to find 'nvlink' in path")); - } - + std::string NvlinkPath; SmallVector<const char *, 0> Argv(argv, argv + argc); SmallVector<std::string, 0> ArgvSubst; SmallVector<std::string, 0> TmpFiles; @@ -147,15 +150,28 @@ for (size_t i = 1; i < Argv.size(); ++i) { std::string Arg = Argv[i]; + StringRef ArgRef(Arg); + auto NvlPath = ArgRef.startswith_insensitive("--path="); if (sys::path::extension(Arg) == ".a") { if (Error Err = extractArchiveFiles(Arg, ArgvSubst, TmpFiles)) reportError(std::move(Err)); + } else if (NvlPath) { + NvlinkPath = ArgRef.substr(7).str().append("/nvlink"); } else { ArgvSubst.push_back(Arg); } } - if (Error Err = runNVLink(NvlinkPath.get(), ArgvSubst)) + if (NvlinkPath.empty()) { + ErrorOr<std::string> NvlinkPathErr = sys::findProgramByName("nvlink"); + if (!NvlinkPathErr) { + reportError(createStringError(NvlinkPathErr.getError(), + "unable to find 'nvlink' in path")); + } + NvlinkPath = NvlinkPathErr.get(); + } + + if (Error Err = runNVLink(NvlinkPath, ArgvSubst)) reportError(std::move(Err)); if (Error Err = cleanupTmpFiles(TmpFiles)) reportError(std::move(Err)); Index: clang/lib/Driver/ToolChains/Cuda.cpp =================================================================== --- clang/lib/Driver/ToolChains/Cuda.cpp +++ clang/lib/Driver/ToolChains/Cuda.cpp @@ -613,6 +613,13 @@ AddStaticDeviceLibsLinking(C, *this, JA, Inputs, Args, CmdArgs, "nvptx", GPUArch, false, false); + // Find nvlink and pass it as "--path=" argument of clang-nvlink-wrapper. + auto NvlinkDir = + llvm::sys::path::parent_path(getToolChain().GetProgramPath("nvlink")) + .str(); + const char *NvlinkPath = Args.MakeArgString(Twine("--path=" + NvlinkDir)); + CmdArgs.push_back(NvlinkPath); + const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("clang-nvlink-wrapper")); C.addCommand(std::make_unique<Command>(
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits