From 14ee2b092c9c03f2aed695c05d48184f003b0935 Mon Sep 17 00:00:00 2001 From: Manuel Carrasco Date: Wed, 29 Oct 2025 12:42:26 -0500 Subject: [PATCH] [clang][Driver] Fix crash in --offload-new-driver and -save-temps. --- clang/lib/Driver/Driver.cpp | 13 ++++++++++--- clang/test/Driver/hip-spirv-translator-new-driver.c | 9 +++++++++ 2 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 clang/test/Driver/hip-spirv-translator-new-driver.c diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 71c52807091ba..114da05886161 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -6459,9 +6459,16 @@ const char *Driver::GetNamedOutputPath(Compilation &C, const JobAction &JA, (JA.getOffloadingDeviceKind() == Action::OFK_OpenMP && TC && TC->getTriple().isAMDGPU())); }; - if (!AtTopLevel && JA.getType() == types::TY_LLVM_BC && - (C.getArgs().hasArg(options::OPT_emit_llvm) || - IsAMDRDCInCompilePhase(JA, C.getArgs()))) + + // The linker wrapper may not support the input and output files to be the + // same one, and without it -save-temps can fail. + bool IsLinkerWrapper = + JA.getType() == types::TY_Object && isa(JA); + bool IsEmitBitcode = JA.getType() == types::TY_LLVM_BC && + (C.getArgs().hasArg(options::OPT_emit_llvm) || + IsAMDRDCInCompilePhase(JA, C.getArgs())); + + if (!AtTopLevel && (IsLinkerWrapper || IsEmitBitcode)) Suffixed += ".tmp"; Suffixed += '.'; Suffixed += Suffix; diff --git a/clang/test/Driver/hip-spirv-translator-new-driver.c b/clang/test/Driver/hip-spirv-translator-new-driver.c new file mode 100644 index 0000000000000..315a74635b9b3 --- /dev/null +++ b/clang/test/Driver/hip-spirv-translator-new-driver.c @@ -0,0 +1,9 @@ +// The --offload-new-driver was crashing when using -save-temps due to a failure in clang-linker-wrapper. +// The input and output files cannot be the same. + +// RUN: %clang --offload-new-driver -### -save-temps -nogpuinc -nogpulib \ +// RUN: --offload-arch=amdgcnspirv -x hip %s 2>&1 \ +// RUN: | FileCheck %s + +// CHECK-NOT: {{".*clang-linker-wrapper.*"}} {{.*}} "-o" "[[OUTPUT_FILE:.*.o]]" {{.*}}"[[OUTPUT_FILE]]" +// CHECK: {{".*clang-linker-wrapper.*"}} {{.*}} "-o" {{".*.tmp.o"}}