https://github.com/sarnex updated 
https://github.com/llvm/llvm-project/pull/120266

>From 998827f68bb2f9c1ca43f1132e109406db842880 Mon Sep 17 00:00:00 2001
From: "Sarnie, Nick" <nick.sar...@intel.com>
Date: Tue, 17 Dec 2024 08:52:49 -0800
Subject: [PATCH 1/2] [Driver][SPIR-V] Use consistent tools to convert between
 text and binary form

Signed-off-by: Sarnie, Nick <nick.sar...@intel.com>
---
 clang/lib/Driver/ToolChains/SPIRV.cpp | 5 ++++-
 clang/test/Driver/spirv-toolchain.cl  | 6 +++---
 2 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/clang/lib/Driver/ToolChains/SPIRV.cpp 
b/clang/lib/Driver/ToolChains/SPIRV.cpp
index 659da5c7f25aa9..c84b23611bcfa6 100644
--- a/clang/lib/Driver/ToolChains/SPIRV.cpp
+++ b/clang/lib/Driver/ToolChains/SPIRV.cpp
@@ -28,8 +28,11 @@ void SPIRV::constructTranslateCommand(Compilation &C, const 
Tool &T,
 
   if (Input.getType() == types::TY_PP_Asm)
     CmdArgs.push_back("-to-binary");
+
+  // The text output from spirv-dis is not in the format expected
+  // by llvm-spirv, so use the text output from llvm-spirv.
   if (Output.getType() == types::TY_PP_Asm)
-    CmdArgs.push_back("--spirv-tools-dis");
+    CmdArgs.push_back("-to-text");
 
   CmdArgs.append({"-o", Output.getFilename()});
 
diff --git a/clang/test/Driver/spirv-toolchain.cl 
b/clang/test/Driver/spirv-toolchain.cl
index eff02f809ce83c..bbb21d91484ffb 100644
--- a/clang/test/Driver/spirv-toolchain.cl
+++ b/clang/test/Driver/spirv-toolchain.cl
@@ -28,7 +28,7 @@
 
 // SPT64: "-cc1" "-triple" "spirv64"
 // SPT64-SAME: "-o" [[BC:".*bc"]]
-// SPT64: {{llvm-spirv.*"}} [[BC]] "--spirv-tools-dis" "-o" {{".*s"}}
+// SPT64: {{llvm-spirv.*"}} [[BC]] "-to-text" "-o" {{".*s"}}
 
 // RUN: %clang -### --target=spirv32 -x cl -S %s 2>&1 | FileCheck 
--check-prefix=SPT32 %s
 // RUN: %clang -### --target=spirv32 -x ir -S %s 2>&1 | FileCheck 
--check-prefix=SPT32 %s
@@ -37,7 +37,7 @@
 
 // SPT32: "-cc1" "-triple" "spirv32"
 // SPT32-SAME: "-o" [[BC:".*bc"]]
-// SPT32: {{llvm-spirv.*"}} [[BC]] "--spirv-tools-dis" "-o" {{".*s"}}
+// SPT32: {{llvm-spirv.*"}} [[BC]] "-to-text" "-o" {{".*s"}}
 
 //-----------------------------------------------------------------------------
 // Check assembly input -> object output
@@ -55,7 +55,7 @@
 // TMP: "-cc1" "-triple" "spirv64"
 // TMP-SAME: "-o" [[BC:".*bc"]]
 // TMP-SAME: [[I]]
-// TMP: {{llvm-spirv.*"}} [[BC]] "--spirv-tools-dis" "-o" [[S:".*s"]]
+// TMP: {{llvm-spirv.*"}} [[BC]] "-to-text" "-o" [[S:".*s"]]
 // TMP: {{llvm-spirv.*"}} [[S]] "-to-binary" "-o" {{".*o"}}
 
 //-----------------------------------------------------------------------------

>From d6354da3b36b973f3f507a40e77d38d40031dbfa Mon Sep 17 00:00:00 2001
From: "Sarnie, Nick" <nick.sar...@intel.com>
Date: Wed, 8 Jan 2025 08:48:51 -0800
Subject: [PATCH 2/2] Add a real assembler job that calls spirv-as

---
 clang/lib/Driver/ToolChains/SPIRV.cpp | 52 +++++++++++++++++++++++----
 clang/lib/Driver/ToolChains/SPIRV.h   | 19 ++++++++++
 clang/test/Driver/spirv-toolchain.cl  | 10 +++---
 3 files changed, 70 insertions(+), 11 deletions(-)

diff --git a/clang/lib/Driver/ToolChains/SPIRV.cpp 
b/clang/lib/Driver/ToolChains/SPIRV.cpp
index c84b23611bcfa6..5a7894f5435fcb 100644
--- a/clang/lib/Driver/ToolChains/SPIRV.cpp
+++ b/clang/lib/Driver/ToolChains/SPIRV.cpp
@@ -26,13 +26,10 @@ void SPIRV::constructTranslateCommand(Compilation &C, const 
Tool &T,
   llvm::opt::ArgStringList CmdArgs(Args);
   CmdArgs.push_back(Input.getFilename());
 
-  if (Input.getType() == types::TY_PP_Asm)
-    CmdArgs.push_back("-to-binary");
+  assert(Input.getType() != types::TY_PP_Asm && "Unexpected input type");
 
-  // The text output from spirv-dis is not in the format expected
-  // by llvm-spirv, so use the text output from llvm-spirv.
   if (Output.getType() == types::TY_PP_Asm)
-    CmdArgs.push_back("-to-text");
+    CmdArgs.push_back("--spirv-tools-dis");
 
   CmdArgs.append({"-o", Output.getFilename()});
 
@@ -49,6 +46,31 @@ void SPIRV::constructTranslateCommand(Compilation &C, const 
Tool &T,
                                          Exec, CmdArgs, Input, Output));
 }
 
+void SPIRV::constructAssembleCommand(Compilation &C, const Tool &T,
+                                     const JobAction &JA,
+                                     const InputInfo &Output,
+                                     const InputInfo &Input,
+                                     const llvm::opt::ArgStringList &Args) {
+  llvm::opt::ArgStringList CmdArgs(Args);
+  CmdArgs.push_back(Input.getFilename());
+
+  assert(Input.getType() == types::TY_PP_Asm && "Unexpected input type");
+
+  CmdArgs.append({"-o", Output.getFilename()});
+
+  // Try to find "spirv-as-<LLVM_VERSION_MAJOR>". Otherwise, fall back to
+  // plain "spirv-as".
+  using namespace std::string_literals;
+  auto VersionedTool = "spirv-as-"s + std::to_string(LLVM_VERSION_MAJOR);
+  std::string ExeCand = T.getToolChain().GetProgramPath(VersionedTool.c_str());
+  if (!llvm::sys::fs::can_execute(ExeCand))
+    ExeCand = T.getToolChain().GetProgramPath("spirv-as");
+
+  const char *Exec = C.getArgs().MakeArgString(ExeCand);
+  C.addCommand(std::make_unique<Command>(JA, T, ResponseFileSupport::None(),
+                                         Exec, CmdArgs, Input, Output));
+}
+
 void SPIRV::Translator::ConstructJob(Compilation &C, const JobAction &JA,
                                      const InputInfo &Output,
                                      const InputInfoList &Inputs,
@@ -60,12 +82,29 @@ void SPIRV::Translator::ConstructJob(Compilation &C, const 
JobAction &JA,
   constructTranslateCommand(C, *this, JA, Output, Inputs[0], {});
 }
 
+void SPIRV::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
+                                    const InputInfo &Output,
+                                    const InputInfoList &Inputs,
+                                    const ArgList &Args,
+                                    const char *AssembleOutput) const {
+  claimNoWarnArgs(Args);
+  if (Inputs.size() != 1)
+    llvm_unreachable("Invalid number of input files.");
+  constructAssembleCommand(C, *this, JA, Output, Inputs[0], {});
+}
+
 clang::driver::Tool *SPIRVToolChain::getTranslator() const {
   if (!Translator)
     Translator = std::make_unique<SPIRV::Translator>(*this);
   return Translator.get();
 }
 
+clang::driver::Tool *SPIRVToolChain::getAssembler() const {
+  if (!Assembler)
+    Assembler = std::make_unique<SPIRV::Assembler>(*this);
+  return Assembler.get();
+}
+
 clang::driver::Tool *SPIRVToolChain::SelectTool(const JobAction &JA) const {
   Action::ActionClass AC = JA.getKind();
   return SPIRVToolChain::getTool(AC);
@@ -76,8 +115,9 @@ clang::driver::Tool 
*SPIRVToolChain::getTool(Action::ActionClass AC) const {
   default:
     break;
   case Action::BackendJobClass:
-  case Action::AssembleJobClass:
     return SPIRVToolChain::getTranslator();
+  case Action::AssembleJobClass:
+    return SPIRVToolChain::getAssembler();
   }
   return ToolChain::getTool(AC);
 }
diff --git a/clang/lib/Driver/ToolChains/SPIRV.h 
b/clang/lib/Driver/ToolChains/SPIRV.h
index d59a8c76ed4737..93bc845e2c37d0 100644
--- a/clang/lib/Driver/ToolChains/SPIRV.h
+++ b/clang/lib/Driver/ToolChains/SPIRV.h
@@ -22,6 +22,11 @@ void constructTranslateCommand(Compilation &C, const Tool &T,
                                const InputInfo &Input,
                                const llvm::opt::ArgStringList &Args);
 
+void constructAssembleCommand(Compilation &C, const Tool &T,
+                              const JobAction &JA, const InputInfo &Output,
+                              const InputInfo &Input,
+                              const llvm::opt::ArgStringList &Args);
+
 class LLVM_LIBRARY_VISIBILITY Translator : public Tool {
 public:
   Translator(const ToolChain &TC)
@@ -47,6 +52,17 @@ class LLVM_LIBRARY_VISIBILITY Linker final : public Tool {
                     const char *LinkingOutput) const override;
 };
 
+class LLVM_LIBRARY_VISIBILITY Assembler final : public Tool {
+public:
+  Assembler(const ToolChain &TC) : Tool("SPIRV::Assembler", "spirv-as", TC) {}
+  bool hasIntegratedAssembler() const override { return false; }
+  bool hasIntegratedCPP() const override { return false; }
+  void ConstructJob(Compilation &C, const JobAction &JA,
+                    const InputInfo &Output, const InputInfoList &Inputs,
+                    const llvm::opt::ArgList &TCArgs,
+                    const char *AssembleOutput) const override;
+};
+
 } // namespace SPIRV
 } // namespace tools
 
@@ -54,6 +70,7 @@ namespace toolchains {
 
 class LLVM_LIBRARY_VISIBILITY SPIRVToolChain final : public ToolChain {
   mutable std::unique_ptr<Tool> Translator;
+  mutable std::unique_ptr<Tool> Assembler;
 
 public:
   SPIRVToolChain(const Driver &D, const llvm::Triple &Triple,
@@ -81,6 +98,8 @@ class LLVM_LIBRARY_VISIBILITY SPIRVToolChain final : public 
ToolChain {
 
 private:
   clang::driver::Tool *getTranslator() const;
+  clang::driver::Tool *getAssembler() const;
+
   bool NativeLLVMSupport;
 };
 
diff --git a/clang/test/Driver/spirv-toolchain.cl 
b/clang/test/Driver/spirv-toolchain.cl
index bbb21d91484ffb..33c7bc0a63adfc 100644
--- a/clang/test/Driver/spirv-toolchain.cl
+++ b/clang/test/Driver/spirv-toolchain.cl
@@ -28,7 +28,7 @@
 
 // SPT64: "-cc1" "-triple" "spirv64"
 // SPT64-SAME: "-o" [[BC:".*bc"]]
-// SPT64: {{llvm-spirv.*"}} [[BC]] "-to-text" "-o" {{".*s"}}
+// SPT64: {{llvm-spirv.*"}} [[BC]] "--spirv-tools-dis" "-o" {{".*s"}}
 
 // RUN: %clang -### --target=spirv32 -x cl -S %s 2>&1 | FileCheck 
--check-prefix=SPT32 %s
 // RUN: %clang -### --target=spirv32 -x ir -S %s 2>&1 | FileCheck 
--check-prefix=SPT32 %s
@@ -37,13 +37,13 @@
 
 // SPT32: "-cc1" "-triple" "spirv32"
 // SPT32-SAME: "-o" [[BC:".*bc"]]
-// SPT32: {{llvm-spirv.*"}} [[BC]] "-to-text" "-o" {{".*s"}}
+// SPT32: {{llvm-spirv.*"}} [[BC]] "--spirv-tools-dis" "-o" {{".*s"}}
 
 //-----------------------------------------------------------------------------
 // Check assembly input -> object output
 // RUN: %clang -### --target=spirv64 -x assembler -c %s 2>&1 | FileCheck 
--check-prefix=ASM %s
 // RUN: %clang -### --target=spirv32 -x assembler -c %s 2>&1 | FileCheck 
--check-prefix=ASM %s
-// ASM: {{llvm-spirv.*"}} {{".*"}} "-to-binary" "-o" {{".*o"}}
+// ASM: {{spirv-as.*"}} {{".*"}} "-o" {{".*o"}}
 
 //-----------------------------------------------------------------------------
 // Check --save-temps.
@@ -55,8 +55,8 @@
 // TMP: "-cc1" "-triple" "spirv64"
 // TMP-SAME: "-o" [[BC:".*bc"]]
 // TMP-SAME: [[I]]
-// TMP: {{llvm-spirv.*"}} [[BC]] "-to-text" "-o" [[S:".*s"]]
-// TMP: {{llvm-spirv.*"}} [[S]] "-to-binary" "-o" {{".*o"}}
+// TMP: {{llvm-spirv.*"}} [[BC]] "--spirv-tools-dis" "-o" [[S:".*s"]]
+// TMP: {{spirv-as.*"}} [[S]] "-o" {{".*o"}}
 
 //-----------------------------------------------------------------------------
 // Check linking when multiple input files are passed.

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to