https://github.com/sarnex created https://github.com/llvm/llvm-project/pull/186824
In the failing case we are in the link phase with `-emit-llvm` passed, which means all inputs are expected to be `.bc` files, and linker options aren't supported as we aren't calling a real linker. I can't imagine anyone wants to pass arguments to `llvm-link`. Just drop them and warn instead of asserting. Fixes: https://github.com/llvm/llvm-project/issues/186598 >From 8d50561cf493d20f9e47193feb7eda9e82f16042 Mon Sep 17 00:00:00 2001 From: Nick Sarnie <[email protected]> Date: Mon, 16 Mar 2026 08:45:07 -0700 Subject: [PATCH] [clang][Driver][SPIRV] Fix assertion when using -emit-llvm Signed-off-by: Nick Sarnie <[email protected]> --- clang/lib/Driver/ToolChains/SPIRV.cpp | 18 ++++++++++++++++-- clang/test/Driver/spirv-llvm-link.c | 3 +++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/clang/lib/Driver/ToolChains/SPIRV.cpp b/clang/lib/Driver/ToolChains/SPIRV.cpp index a59bd05cac0cf..f77a1d30507c7 100644 --- a/clang/lib/Driver/ToolChains/SPIRV.cpp +++ b/clang/lib/Driver/ToolChains/SPIRV.cpp @@ -83,8 +83,22 @@ void SPIRV::constructLLVMLinkCommand(Compilation &C, const Tool &T, ArgStringList LlvmLinkArgs; - for (auto Input : Inputs) - LlvmLinkArgs.push_back(Input.getFilename()); + for (auto Input : Inputs) { + if (Input.isFilename()) { + LlvmLinkArgs.push_back(Input.getFilename()); + } else { + // Warn that any linker arguments will be dropped. + assert(Input.isInputArg() && "Unexpected linker input"); + const llvm::opt::Arg &LinkerOpt = Input.getInputArg(); + std::string LinkerOptStr = LinkerOpt.getAsString(Args); + const llvm::opt::Arg *EmitLLVM = Args.getLastArg(options::OPT_emit_llvm); + assert(EmitLLVM && "Unexpected linker input"); + std::string EmitLLVMStr = EmitLLVM ? EmitLLVM->getAsString(Args) : ""; + llvm::Triple Triple(T.getToolChain().getTriple()); + C.getDriver().Diag(clang::diag::warn_drv_input_file_unused) + << Triple.getTriple() << LinkerOptStr << false << EmitLLVMStr; + } + } tools::constructLLVMLinkCommand(C, T, JA, Inputs, LlvmLinkArgs, Output, Args); } diff --git a/clang/test/Driver/spirv-llvm-link.c b/clang/test/Driver/spirv-llvm-link.c index b7598395b3fad..bc1c488f5d141 100644 --- a/clang/test/Driver/spirv-llvm-link.c +++ b/clang/test/Driver/spirv-llvm-link.c @@ -31,3 +31,6 @@ // CHECK-BINDINGS-SRC: "spirv64" - "clang", inputs: ["{{.*}}foo.c"], output: "[[TMP1_BINDINGS_SRC_BC:.+]]" // CHECK-BINDINGS-SRC: "spirv64" - "clang", inputs: ["{{.*}}bar.c"], output: "[[TMP2_BINDINGS_SRC_BC:.+]]" // CHECK-BINDINGS-SRC: "spirv64" - "SPIR-V::Linker", inputs: ["[[TMP1_BINDINGS_SRC_BC]]", "[[TMP2_BINDINGS_SRC_BC]]"], output: "{{.*}}.bc" + +// RUN: %clang -### --target=spirv64 -emit-llvm %t/a.bc %t/b.bc -Wl,-O1 2>&1 | FileCheck --check-prefix=CHECK-WARN %s +// CHECK-WARN: warning: spirv64: '-Wl,-O1' input unused when '-emit-llvm' is present _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
