[clang] [Driver][SPIR-V] Use consistent tools to convert between text and binary form (PR #120266)
Nick Sarnie via cfe-commits
cfe-commits at lists.llvm.org
Wed Jan 8 09:20:43 PST 2025
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.sarnie at 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.sarnie at 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.sarnie at 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.
More information about the cfe-commits
mailing list