Skip to content

Conversation

jmmartinez
Copy link
Contributor

@jmmartinez jmmartinez commented Oct 6, 2025

Before this patch we had:

clang -cc1 source.c -o bitcode.bc
llvm-link -o a.out bitcode.bc
llvm-spirv -o a.out a.out

Now we have:

clang -cc1 source.c -o bitcode.bc
llvm-link -o a-linked.bc bitcode.bc
llvm-spirv -o a.out a-linked.bc

Co-authored-by: Manuel Carrasco [email protected]

jmmartinez and others added 2 commits October 6, 2025 16:40
Before this patch we had:
    clang -cc1 source.c -o bitcode.bc
    llvm-link -o a.out bitcode.bc
    llvm-spirv -o a.out a.out

Now we have:
    clang -cc1 source.c -o bitcode.bc
    llvm-link -o a-linked.bc bitcode.bc
    llvm-spirv -o a.out a-linked.bc

Co-authored-by: Manuel Carrasco <[email protected]>
@jmmartinez jmmartinez requested a review from AlexVlx October 6, 2025 14:46
@jmmartinez jmmartinez self-assigned this Oct 6, 2025
@jmmartinez jmmartinez added the clang:driver 'clang' and 'clang++' user-facing binaries. Not 'clang-cl' label Oct 6, 2025
@llvmbot llvmbot added the clang Clang issues not falling into any other category label Oct 6, 2025
@llvmbot
Copy link
Member

llvmbot commented Oct 6, 2025

@llvm/pr-subscribers-clang

@llvm/pr-subscribers-clang-driver

Author: Juan Manuel Martinez Caamaño (jmmartinez)

Changes

Before this patch we had:
> clang -cc1 source.c -o bitcode.bc
> llvm-link -o a.out bitcode.bc
> llvm-spirv -o a.out a.out

Now we have:
> clang -cc1 source.c -o bitcode.bc
> llvm-link -o a-linked.bc bitcode.bc
> llvm-spirv -o a.out a-linked.bc

Co-authored-by: Manuel Carrasco <[email protected]>


Full diff: https://github.com/llvm/llvm-project/pull/162096.diff

6 Files Affected:

  • (modified) clang/lib/Driver/ToolChains/HIPAMD.cpp (+6-3)
  • (modified) clang/lib/Driver/ToolChains/HIPSPV.cpp (+2-13)
  • (modified) clang/lib/Driver/ToolChains/HIPUtility.cpp (+11)
  • (modified) clang/lib/Driver/ToolChains/HIPUtility.h (+2)
  • (modified) clang/test/Driver/hip-toolchain-no-rdc.hip (+1-1)
  • (modified) clang/test/Driver/spirv-amd-toolchain.c (+2-2)
diff --git a/clang/lib/Driver/ToolChains/HIPAMD.cpp b/clang/lib/Driver/ToolChains/HIPAMD.cpp
index 5f3fbea40f162..c0c8afec07264 100644
--- a/clang/lib/Driver/ToolChains/HIPAMD.cpp
+++ b/clang/lib/Driver/ToolChains/HIPAMD.cpp
@@ -168,9 +168,12 @@ void AMDGCN::Linker::constructLinkAndEmitSpirvCommand(
     const InputInfo &Output, const llvm::opt::ArgList &Args) const {
   assert(!Inputs.empty() && "Must have at least one input.");
 
-  constructLlvmLinkCommand(C, JA, Inputs, Output, Args);
+  std::string LinkedBCFilePrefix(
+      Twine(llvm::sys::path::stem(Output.getFilename()), "-linked").str());
+  const char *LinkedBCFilePath = HIP::getTempFile(C, LinkedBCFilePrefix, "bc");
+  InputInfo LinkedBCFile(&JA, LinkedBCFilePath, Output.getBaseInput());
 
-  // Linked BC is now in Output
+  constructLlvmLinkCommand(C, JA, Inputs, LinkedBCFile, Args);
 
   // Emit SPIR-V binary.
   llvm::opt::ArgStringList TrArgs{
@@ -180,7 +183,7 @@ void AMDGCN::Linker::constructLinkAndEmitSpirvCommand(
       "--spirv-lower-const-expr",
       "--spirv-preserve-auxdata",
       "--spirv-debug-info-version=nonsemantic-shader-200"};
-  SPIRV::constructTranslateCommand(C, *this, JA, Output, Output, TrArgs);
+  SPIRV::constructTranslateCommand(C, *this, JA, Output, LinkedBCFile, TrArgs);
 }
 
 // For amdgcn the inputs of the linker job are device bitcode and output is
diff --git a/clang/lib/Driver/ToolChains/HIPSPV.cpp b/clang/lib/Driver/ToolChains/HIPSPV.cpp
index 62bca0493a09a..bce7f46dea468 100644
--- a/clang/lib/Driver/ToolChains/HIPSPV.cpp
+++ b/clang/lib/Driver/ToolChains/HIPSPV.cpp
@@ -22,17 +22,6 @@ using namespace clang::driver::tools;
 using namespace clang;
 using namespace llvm::opt;
 
-// Convenience function for creating temporary file for both modes of
-// isSaveTempsEnabled().
-static const char *getTempFile(Compilation &C, StringRef Prefix,
-                               StringRef Extension) {
-  if (C.getDriver().isSaveTempsEnabled()) {
-    return C.getArgs().MakeArgString(Prefix + "." + Extension);
-  }
-  auto TmpFile = C.getDriver().GetTemporaryPath(Prefix, Extension);
-  return C.addTempFile(C.getArgs().MakeArgString(TmpFile));
-}
-
 // Locates HIP pass plugin.
 static std::string findPassPlugin(const Driver &D,
                                   const llvm::opt::ArgList &Args) {
@@ -65,7 +54,7 @@ void HIPSPV::Linker::constructLinkAndEmitSpirvCommand(
 
   assert(!Inputs.empty() && "Must have at least one input.");
   std::string Name = std::string(llvm::sys::path::stem(Output.getFilename()));
-  const char *TempFile = getTempFile(C, Name + "-link", "bc");
+  const char *TempFile = HIP::getTempFile(C, Name + "-link", "bc");
 
   // Link LLVM bitcode.
   ArgStringList LinkArgs{};
@@ -93,7 +82,7 @@ void HIPSPV::Linker::constructLinkAndEmitSpirvCommand(
   auto PassPluginPath = findPassPlugin(C.getDriver(), Args);
   if (!PassPluginPath.empty()) {
     const char *PassPathCStr = C.getArgs().MakeArgString(PassPluginPath);
-    const char *OptOutput = getTempFile(C, Name + "-lower", "bc");
+    const char *OptOutput = HIP::getTempFile(C, Name + "-lower", "bc");
     ArgStringList OptArgs{TempFile,     "-load-pass-plugin",
                           PassPathCStr, "-passes=hip-post-link-passes",
                           "-o",         OptOutput};
diff --git a/clang/lib/Driver/ToolChains/HIPUtility.cpp b/clang/lib/Driver/ToolChains/HIPUtility.cpp
index cb061ffede234..732403e69a075 100644
--- a/clang/lib/Driver/ToolChains/HIPUtility.cpp
+++ b/clang/lib/Driver/ToolChains/HIPUtility.cpp
@@ -472,3 +472,14 @@ void HIP::constructGenerateObjFileFromHIPFatBinary(
                                          D.getClangProgramPath(), ClangArgs,
                                          Inputs, Output, D.getPrependArg()));
 }
+
+// Convenience function for creating temporary file for both modes of
+// isSaveTempsEnabled().
+const char *HIP::getTempFile(Compilation &C, StringRef Prefix,
+                             StringRef Extension) {
+  if (C.getDriver().isSaveTempsEnabled()) {
+    return C.getArgs().MakeArgString(Prefix + "." + Extension);
+  }
+  auto TmpFile = C.getDriver().GetTemporaryPath(Prefix, Extension);
+  return C.addTempFile(C.getArgs().MakeArgString(TmpFile));
+}
diff --git a/clang/lib/Driver/ToolChains/HIPUtility.h b/clang/lib/Driver/ToolChains/HIPUtility.h
index 29e5a922024ab..55c155e5c35cf 100644
--- a/clang/lib/Driver/ToolChains/HIPUtility.h
+++ b/clang/lib/Driver/ToolChains/HIPUtility.h
@@ -16,6 +16,8 @@ namespace driver {
 namespace tools {
 namespace HIP {
 
+const char *getTempFile(Compilation &C, StringRef Prefix, StringRef Extension);
+
 // Construct command for creating HIP fatbin.
 void constructHIPFatbinCommand(Compilation &C, const JobAction &JA,
                                StringRef OutputFileName,
diff --git a/clang/test/Driver/hip-toolchain-no-rdc.hip b/clang/test/Driver/hip-toolchain-no-rdc.hip
index dc8f0a97ad371..a9e7de9aa0040 100644
--- a/clang/test/Driver/hip-toolchain-no-rdc.hip
+++ b/clang/test/Driver/hip-toolchain-no-rdc.hip
@@ -207,7 +207,7 @@
 //
 
 // AMDGCNSPIRV: "-cc1" "-triple" "spirv64-amd-amdhsa" {{.*}}"-emit-llvm-bc" {{.*}}"-fembed-bitcode=marker" "-disable-llvm-passes" {{.*}} "-o" "[[AMDGCNSPV_BC:.*bc]]"
-// AMDGCNSPIRV: {{".*llvm-link.*"}} "-o" "[[AMDGCNSPV_TMP:.*out]]" "[[AMDGCNSPV_BC]]"
+// AMDGCNSPIRV: {{".*llvm-link.*"}} "-o" "[[AMDGCNSPV_TMP:.*bc]]" "[[AMDGCNSPV_BC]]"
 // AMDGCNSPIRV: {{".*llvm-spirv.*"}} "--spirv-max-version=1.6" "--spirv-ext=+all" {{.*}} "[[AMDGCNSPV_TMP]]" {{.*}}"-o" "[[AMDGCNSPV_CO:.*out]]"
 // AMDGCNSPIRV: "-cc1" "-triple" "amdgcn-amd-amdhsa" {{.*}}"-emit-obj" {{.*}}"-target-cpu" "gfx900"{{.*}} "-o" "[[GFX900_OBJ:.*o]]"
 // AMDGCNSPIRV: {{".*lld.*"}} {{.*}}"-plugin-opt=mcpu=gfx900" {{.*}} "-o" "[[GFX900_CO:.*out]]" {{.*}}"[[GFX900_OBJ]]"
diff --git a/clang/test/Driver/spirv-amd-toolchain.c b/clang/test/Driver/spirv-amd-toolchain.c
index 14ba8f4632477..8f1f0f33e53f9 100644
--- a/clang/test/Driver/spirv-amd-toolchain.c
+++ b/clang/test/Driver/spirv-amd-toolchain.c
@@ -15,5 +15,5 @@
 // RUN: %clang -### --target=spirv64-amd-amdhsa %s -nogpulib -nogpuinc 2>&1 \
 // RUN:   | FileCheck %s --check-prefix=INVOCATION
 // INVOCATION: "-cc1" "-triple" "spirv64-amd-amdhsa" {{.*}}"-disable-llvm-optzns" {{.*}} "-o" "[[OUTPUT:.+]]" "-x" "c"
-// INVOCATION: "{{.*}}llvm-link" "-o" "a.out" "[[OUTPUT]]"
-// INVOCATION: "{{.*}}llvm-spirv" "--spirv-max-version=1.6" "--spirv-ext=+all" "--spirv-allow-unknown-intrinsics" "--spirv-lower-const-expr" "--spirv-preserve-auxdata" "--spirv-debug-info-version=nonsemantic-shader-200" "a.out" "-o" "a.out"
+// INVOCATION: "{{.*}}llvm-link" "-o" "[[LINKED_OUTPUT:.+]]" "[[OUTPUT]]"
+// INVOCATION: "{{.*}}llvm-spirv" "--spirv-max-version=1.6" "--spirv-ext=+all" "--spirv-allow-unknown-intrinsics" "--spirv-lower-const-expr" "--spirv-preserve-auxdata" "--spirv-debug-info-version=nonsemantic-shader-200" "[[LINKED_OUTPUT]]" "-o" "a.out"

Copy link
Contributor

@lamb-j lamb-j left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, can you wait a day or two before merging to see if anyone else has feedback?

Thanks

@jmmartinez jmmartinez merged commit 70b19a8 into llvm:main Oct 9, 2025
12 checks passed
@llvm-ci
Copy link
Collaborator

llvm-ci commented Oct 9, 2025

LLVM Buildbot has detected a new failure on builder arc-builder running on arc-worker while building clang at step 6 "test-build-unified-tree-check-all".

Full details are available at: https://lab.llvm.org/buildbot/#/builders/3/builds/23175

Here is the relevant piece of the build log for the reference
Step 6 (test-build-unified-tree-check-all) failure: test (failure)
******************** TEST 'LLVM :: tools/dsymutil/X86/swift-ast-x86_64.test' FAILED ********************
Exit Code: -6

Command Output (stdout):
--
# RUN: at line 1
rm -rf /buildbot/worker/arc-folder/build/test/tools/dsymutil/X86/Output/swift-ast-x86_64.test.tmp && mkdir /buildbot/worker/arc-folder/build/test/tools/dsymutil/X86/Output/swift-ast-x86_64.test.tmp
# executed command: rm -rf /buildbot/worker/arc-folder/build/test/tools/dsymutil/X86/Output/swift-ast-x86_64.test.tmp
# executed command: mkdir /buildbot/worker/arc-folder/build/test/tools/dsymutil/X86/Output/swift-ast-x86_64.test.tmp
# RUN: at line 2
/buildbot/worker/arc-folder/build/bin/dsymutil -oso-prepend-path /buildbot/worker/arc-folder/llvm-project/llvm/test/tools/dsymutil/X86/.. /buildbot/worker/arc-folder/llvm-project/llvm/test/tools/dsymutil/X86/../Inputs/swift-ast.macho.x86_64 -o /buildbot/worker/arc-folder/build/test/tools/dsymutil/X86/Output/swift-ast-x86_64.test.tmp/swift-ast.dSYM -verbose -no-swiftmodule-timestamp | /buildbot/worker/arc-folder/build/bin/FileCheck /buildbot/worker/arc-folder/llvm-project/llvm/test/tools/dsymutil/X86/swift-ast-x86_64.test --check-prefix=DSYMUTIL
# executed command: /buildbot/worker/arc-folder/build/bin/dsymutil -oso-prepend-path /buildbot/worker/arc-folder/llvm-project/llvm/test/tools/dsymutil/X86/.. /buildbot/worker/arc-folder/llvm-project/llvm/test/tools/dsymutil/X86/../Inputs/swift-ast.macho.x86_64 -o /buildbot/worker/arc-folder/build/test/tools/dsymutil/X86/Output/swift-ast-x86_64.test.tmp/swift-ast.dSYM -verbose -no-swiftmodule-timestamp
# .---command stderr------------
# | note: trying to open '/buildbot/worker/arc-folder/llvm-project/llvm/test/tools/dsymutil/X86/../Inputs/swift-ast.macho.x86_64'
# | note: loaded object.
# | note: trying to open '/buildbot/worker/arc-folder/llvm-project/llvm/test/tools/dsymutil/X86/../Inputs/swift-ast.macho.x86_64'
# | warning: Could not parse binary Swift module: could not check signature
# | malformed bitstream
# | note: while processing /buildbot/worker/arc-folder/llvm-project/llvm/test/tools/dsymutil/X86/../Inputs/swift-ast.swiftmodule
# | Verifying DWARF for architecture: x86_64
# `-----------------------------
# executed command: /buildbot/worker/arc-folder/build/bin/FileCheck /buildbot/worker/arc-folder/llvm-project/llvm/test/tools/dsymutil/X86/swift-ast-x86_64.test --check-prefix=DSYMUTIL
# RUN: at line 3
/buildbot/worker/arc-folder/build/bin/dsymutil -oso-prepend-path /buildbot/worker/arc-folder/llvm-project/llvm/test/tools/dsymutil/X86/.. /buildbot/worker/arc-folder/llvm-project/llvm/test/tools/dsymutil/X86/../Inputs/swift-ast.macho.x86_64 -o /buildbot/worker/arc-folder/build/test/tools/dsymutil/X86/Output/swift-ast-x86_64.test.tmp/swift-ast.dSYM -verbose | /buildbot/worker/arc-folder/build/bin/FileCheck /buildbot/worker/arc-folder/llvm-project/llvm/test/tools/dsymutil/X86/swift-ast-x86_64.test --check-prefix=DSYMUTIL
# executed command: /buildbot/worker/arc-folder/build/bin/dsymutil -oso-prepend-path /buildbot/worker/arc-folder/llvm-project/llvm/test/tools/dsymutil/X86/.. /buildbot/worker/arc-folder/llvm-project/llvm/test/tools/dsymutil/X86/../Inputs/swift-ast.macho.x86_64 -o /buildbot/worker/arc-folder/build/test/tools/dsymutil/X86/Output/swift-ast-x86_64.test.tmp/swift-ast.dSYM -verbose
# .---command stderr------------
# | note: trying to open '/buildbot/worker/arc-folder/llvm-project/llvm/test/tools/dsymutil/X86/../Inputs/swift-ast.macho.x86_64'
# | note: loaded object.
# | note: trying to open '/buildbot/worker/arc-folder/llvm-project/llvm/test/tools/dsymutil/X86/../Inputs/swift-ast.macho.x86_64'
# | warning: Could not parse binary Swift module: could not check signature
# | malformed bitstream
# | note: while processing /buildbot/worker/arc-folder/llvm-project/llvm/test/tools/dsymutil/X86/../Inputs/swift-ast.swiftmodule
# | Verifying DWARF for architecture: x86_64
# `-----------------------------
# executed command: /buildbot/worker/arc-folder/build/bin/FileCheck /buildbot/worker/arc-folder/llvm-project/llvm/test/tools/dsymutil/X86/swift-ast-x86_64.test --check-prefix=DSYMUTIL
# RUN: at line 4
/buildbot/worker/arc-folder/build/bin/llvm-readobj --sections --section-data /buildbot/worker/arc-folder/build/test/tools/dsymutil/X86/Output/swift-ast-x86_64.test.tmp/swift-ast.dSYM/Contents/Resources/DWARF/swift-ast.macho.x86_64 | /buildbot/worker/arc-folder/build/bin/FileCheck /buildbot/worker/arc-folder/llvm-project/llvm/test/tools/dsymutil/X86/swift-ast-x86_64.test --check-prefix=READOBJ
# executed command: /buildbot/worker/arc-folder/build/bin/llvm-readobj --sections --section-data /buildbot/worker/arc-folder/build/test/tools/dsymutil/X86/Output/swift-ast-x86_64.test.tmp/swift-ast.dSYM/Contents/Resources/DWARF/swift-ast.macho.x86_64
# executed command: /buildbot/worker/arc-folder/build/bin/FileCheck /buildbot/worker/arc-folder/llvm-project/llvm/test/tools/dsymutil/X86/swift-ast-x86_64.test --check-prefix=READOBJ
# RUN: at line 5
/buildbot/worker/arc-folder/build/bin/llvm-dwarfdump --show-section-sizes /buildbot/worker/arc-folder/build/test/tools/dsymutil/X86/Output/swift-ast-x86_64.test.tmp/swift-ast.dSYM/Contents/Resources/DWARF/swift-ast.macho.x86_64 | /buildbot/worker/arc-folder/build/bin/FileCheck /buildbot/worker/arc-folder/llvm-project/llvm/test/tools/dsymutil/X86/swift-ast-x86_64.test --check-prefix=DWARFDUMP
# executed command: /buildbot/worker/arc-folder/build/bin/llvm-dwarfdump --show-section-sizes /buildbot/worker/arc-folder/build/test/tools/dsymutil/X86/Output/swift-ast-x86_64.test.tmp/swift-ast.dSYM/Contents/Resources/DWARF/swift-ast.macho.x86_64
# executed command: /buildbot/worker/arc-folder/build/bin/FileCheck /buildbot/worker/arc-folder/llvm-project/llvm/test/tools/dsymutil/X86/swift-ast-x86_64.test --check-prefix=DWARFDUMP
# RUN: at line 7
/buildbot/worker/arc-folder/build/bin/dsymutil --linker parallel -oso-prepend-path /buildbot/worker/arc-folder/llvm-project/llvm/test/tools/dsymutil/X86/.. /buildbot/worker/arc-folder/llvm-project/llvm/test/tools/dsymutil/X86/../Inputs/swift-ast.macho.x86_64 -o /buildbot/worker/arc-folder/build/test/tools/dsymutil/X86/Output/swift-ast-x86_64.test.tmp/swift-ast.dSYM -verbose -no-swiftmodule-timestamp | /buildbot/worker/arc-folder/build/bin/FileCheck /buildbot/worker/arc-folder/llvm-project/llvm/test/tools/dsymutil/X86/swift-ast-x86_64.test --check-prefix=DSYMUTIL
# executed command: /buildbot/worker/arc-folder/build/bin/dsymutil --linker parallel -oso-prepend-path /buildbot/worker/arc-folder/llvm-project/llvm/test/tools/dsymutil/X86/.. /buildbot/worker/arc-folder/llvm-project/llvm/test/tools/dsymutil/X86/../Inputs/swift-ast.macho.x86_64 -o /buildbot/worker/arc-folder/build/test/tools/dsymutil/X86/Output/swift-ast-x86_64.test.tmp/swift-ast.dSYM -verbose -no-swiftmodule-timestamp
# .---command stderr------------
# | note: trying to open '/buildbot/worker/arc-folder/llvm-project/llvm/test/tools/dsymutil/X86/../Inputs/swift-ast.macho.x86_64'
# | note: loaded object.
# | note: trying to open '/buildbot/worker/arc-folder/llvm-project/llvm/test/tools/dsymutil/X86/../Inputs/swift-ast.macho.x86_64'
...

svkeerthy pushed a commit that referenced this pull request Oct 9, 2025
…62096)

Before this patch we had:
>    clang -cc1 source.c -o bitcode.bc
>    llvm-link -o a.out bitcode.bc
>    llvm-spirv -o a.out a.out

Now we have:
>    clang -cc1 source.c -o bitcode.bc
>    llvm-link -o a-linked.bc bitcode.bc
>    llvm-spirv -o a.out a-linked.bc

Co-authored-by: Manuel Carrasco <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
clang:driver 'clang' and 'clang++' user-facing binaries. Not 'clang-cl' clang Clang issues not falling into any other category
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants