[PATCH] D111488: [Clang][clang-nvlink-wrapper] Pass nvlink path to the wrapper

Saiyedul Islam via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Sat Oct 9 05:14:06 PDT 2021


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>(


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D111488.378437.patch
Type: text/x-patch
Size: 3302 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20211009/7a3bf2de/attachment-0001.bin>


More information about the cfe-commits mailing list