From aa2bbfaee2d5b352f7ab1a990c1e40535c6fb51b Mon Sep 17 00:00:00 2001 From: Joseph Huber Date: Mon, 6 Feb 2023 12:26:45 -0600 Subject: [PATCH] [CUDA] Fix output from ptxas being removes as a temporary file 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. --- clang/lib/Driver/ToolChains/Cuda.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Cuda.cpp b/clang/lib/Driver/ToolChains/Cuda.cpp index 484c8c0702643..9a231c06a0749 100644 --- a/clang/lib/Driver/ToolChains/Cuda.cpp +++ b/clang/lib/Driver/ToolChains/Cuda.cpp @@ -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()));