[spirv-writer] Remove diag::List from Printer
The diagnostic list is no longer used, so have Printer::Generate()
return a tint::Result that either contains the SPIR-V binary or an
error string.
Change-Id: I60855c7f687855d513f54e76e35f9bbc3a5bb355
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/143424
Commit-Queue: James Price <jrprice@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
Auto-Submit: James Price <jrprice@google.com>
diff --git a/src/tint/lang/spirv/writer/common/helper_test.h b/src/tint/lang/spirv/writer/common/helper_test.h
index 0055a5c..38e5228 100644
--- a/src/tint/lang/spirv/writer/common/helper_test.h
+++ b/src/tint/lang/spirv/writer/common/helper_test.h
@@ -99,16 +99,17 @@
/// @param writer the writer to use for SPIR-V generation
/// @returns true if generation and validation succeeded
bool Generate(Printer& writer) {
- if (!writer.Generate()) {
- err_ = writer.Diagnostics().str();
+ auto spirv = writer.Generate();
+ if (!spirv) {
+ err_ = spirv.Failure();
return false;
}
- output_ = Disassemble(writer.Result(), SPV_BINARY_TO_TEXT_OPTION_FRIENDLY_NAMES |
- SPV_BINARY_TO_TEXT_OPTION_INDENT |
- SPV_BINARY_TO_TEXT_OPTION_COMMENT);
+ output_ = Disassemble(spirv.Get(), SPV_BINARY_TO_TEXT_OPTION_FRIENDLY_NAMES |
+ SPV_BINARY_TO_TEXT_OPTION_INDENT |
+ SPV_BINARY_TO_TEXT_OPTION_COMMENT);
- if (!Validate(writer.Result())) {
+ if (!Validate(spirv.Get())) {
return false;
}
diff --git a/src/tint/lang/spirv/writer/printer/printer.cc b/src/tint/lang/spirv/writer/printer/printer.cc
index 9b7fc26..6e77738 100644
--- a/src/tint/lang/spirv/writer/printer/printer.cc
+++ b/src/tint/lang/spirv/writer/printer/printer.cc
@@ -167,11 +167,10 @@
Printer::Printer(ir::Module* module, bool zero_init_workgroup_mem)
: ir_(module), zero_init_workgroup_memory_(zero_init_workgroup_mem) {}
-bool Printer::Generate() {
+Result<std::vector<uint32_t>, std::string> Printer::Generate() {
auto valid = ir::Validate(*ir_);
if (!valid) {
- diagnostics_ = valid.Failure();
- return false;
+ return valid.Failure().str();
}
// Run the IR transformations to prepare for SPIR-V emission.
@@ -195,15 +194,11 @@
EmitFunction(func);
}
- if (diagnostics_.contains_errors()) {
- return false;
- }
-
// Serialize the module into binary SPIR-V.
- writer_.WriteHeader(module_.IdBound(), kWriterVersion);
- writer_.WriteModule(&module_);
-
- return true;
+ BinaryWriter writer;
+ writer.WriteHeader(module_.IdBound(), kWriterVersion);
+ writer.WriteModule(&module_);
+ return std::move(writer.Result());
}
uint32_t Printer::Builtin(builtin::BuiltinValue builtin, builtin::AddressSpace addrspace) {
diff --git a/src/tint/lang/spirv/writer/printer/printer.h b/src/tint/lang/spirv/writer/printer/printer.h
index d036a75..7c292a7 100644
--- a/src/tint/lang/spirv/writer/printer/printer.h
+++ b/src/tint/lang/spirv/writer/printer/printer.h
@@ -15,6 +15,7 @@
#ifndef SRC_TINT_LANG_SPIRV_WRITER_PRINTER_PRINTER_H_
#define SRC_TINT_LANG_SPIRV_WRITER_PRINTER_PRINTER_H_
+#include <string>
#include <vector>
#include "src/tint/lang/core/builtin/address_space.h"
@@ -28,6 +29,7 @@
#include "src/tint/utils/containers/hashmap.h"
#include "src/tint/utils/containers/vector.h"
#include "src/tint/utils/diagnostic/diagnostic.h"
+#include "src/tint/utils/result/result.h"
#include "src/tint/utils/symbol/symbol.h"
// Forward declarations
@@ -80,18 +82,12 @@
/// storage class with OpConstantNull
Printer(ir::Module* module, bool zero_init_workgroup_memory);
- /// @returns true on successful generation; false otherwise
- bool Generate();
+ /// @returns the generated SPIR-V binary on success, or an error string on failure
+ tint::Result<std::vector<uint32_t>, std::string> Generate();
/// @returns the module that this writer has produced
writer::Module& Module() { return module_; }
- /// @returns the generated SPIR-V binary data
- const std::vector<uint32_t>& Result() const { return writer_.Result(); }
-
- /// @returns the list of diagnostics raised by the writer
- diag::List Diagnostics() const { return diagnostics_; }
-
/// Get the result ID of the constant `constant`, emitting its instruction if necessary.
/// @param constant the constant to get the ID for
/// @returns the result ID of the constant
@@ -272,7 +268,6 @@
ir::Module* ir_;
writer::Module module_;
BinaryWriter writer_;
- diag::List diagnostics_;
/// A function type used for an OpTypeFunction declaration.
struct FunctionType {
diff --git a/src/tint/lang/spirv/writer/writer.cc b/src/tint/lang/spirv/writer/writer.cc
index 18889d9..4972769 100644
--- a/src/tint/lang/spirv/writer/writer.cc
+++ b/src/tint/lang/spirv/writer/writer.cc
@@ -49,10 +49,11 @@
// Generate the SPIR-V code.
auto ir = converted.Move();
auto impl = std::make_unique<Printer>(&ir, zero_initialize_workgroup_memory);
- if (!impl->Generate()) {
- return impl->Diagnostics().str();
+ auto spirv = impl->Generate();
+ if (!spirv) {
+ return std::move(spirv.Failure());
}
- output.spirv = std::move(impl->Result());
+ output.spirv = std::move(spirv.Get());
} else // NOLINT(readability/braces)
#endif
{
diff --git a/src/tint/lang/spirv/writer/writer_test.cc b/src/tint/lang/spirv/writer/writer_test.cc
index 9f1c54e..a612f7c 100644
--- a/src/tint/lang/spirv/writer/writer_test.cc
+++ b/src/tint/lang/spirv/writer/writer_test.cc
@@ -22,8 +22,9 @@
using namespace tint::number_suffixes; // NOLINT
TEST_F(SpirvWriterTest, ModuleHeader) {
- ASSERT_TRUE(writer_.Generate()) << writer_.Diagnostics().str();
- auto got = Disassemble(writer_.Result());
+ auto spirv = writer_.Generate();
+ ASSERT_TRUE(spirv) << spirv.Failure();
+ auto got = Disassemble(spirv.Get());
EXPECT_THAT(got, testing::StartsWith(R"(OpCapability Shader
OpMemoryModel Logical GLSL450
)"));