[CUDA] Fix output from `ptxas` being removes as a temporary file
authorJoseph Huber <jhuber6@vols.utk.edu>
Wed, 25 Jan 2023 22:20:16 +0000 (16:20 -0600)
committerJoseph Huber <jhuber6@vols.utk.edu>
Wed, 25 Jan 2023 22:24:30 +0000 (16:24 -0600)
Summary:
The logic here is to add the `.cubin` temporary file if we had to create
a new filename to handle it. Unfortuantely the logic was wrong because
we compare `const char *` values here. This logic seems to have been
wrong for some time, but was never noticed since we never used the
relocatable output.

Fixes https://github.com/llvm/llvm-project/issues/60301

clang/lib/Driver/ToolChains/Cuda.cpp

index 484c8c0..9a231c0 100644 (file)
@@ -443,7 +443,7 @@ void NVPTX::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
   CmdArgs.push_back("--gpu-name");
   CmdArgs.push_back(Args.MakeArgString(CudaArchToString(gpu_arch)));
   CmdArgs.push_back("--output-file");
-  const char *OutputFileName = Args.MakeArgString(TC.getInputFilename(Output));
+  std::string OutputFileName = TC.getInputFilename(Output);
 
   // If we are invoking `nvlink` internally we need to output a `.cubin` file.
   // Checking if the output is a temporary is the cleanest way to determine
@@ -455,12 +455,12 @@ void NVPTX::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
           C.getTempFiles().end()) {
     SmallString<256> Filename(Output.getFilename());
     llvm::sys::path::replace_extension(Filename, "cubin");
-    OutputFileName = Args.MakeArgString(Filename);
+    OutputFileName = Filename.str();
   }
   if (Output.isFilename() && OutputFileName != Output.getFilename())
-    C.addTempFile(OutputFileName);
+    C.addTempFile(Args.MakeArgString(OutputFileName));
 
-  CmdArgs.push_back(OutputFileName);
+  CmdArgs.push_back(Args.MakeArgString(OutputFileName));
   for (const auto &II : Inputs)
     CmdArgs.push_back(Args.MakeArgString(II.getFilename()));