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