Generate errors from the SPIR-V builder.
This Cl adds error messages into the SPIR-V generator.
Bug: tint:5
Change-Id: I45c0d286dd8ec251773ff5e036322090647d780c
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/17521
Reviewed-by: David Neto <dneto@google.com>
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index ccd4754..aefe620 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -399,7 +399,7 @@
list(APPEND TINT_TEST_SRCS
writer/spirv/binary_writer_test.cc
writer/spirv/builder_test.cc
- writer/spirv/builder_test_entry_point_test.cc
+ writer/spirv/builder_entry_point_test.cc
writer/spirv/instruction_test.cc
writer/spirv/operand_test.cc
)
diff --git a/src/writer/spirv/builder.cc b/src/writer/spirv/builder.cc
index f542280..b1a5c8b 100644
--- a/src/writer/spirv/builder.cc
+++ b/src/writer/spirv/builder.cc
@@ -120,11 +120,13 @@
auto id = id_for_func_name(ep->function_name());
if (id == 0) {
+ error_ = "unable to find ID for function: " + ep->function_name();
return false;
}
auto stage = pipeline_stage_to_execution_model(ep->stage());
if (stage == SpvExecutionModelMax) {
+ error_ = "Unknown pipeline stage provided";
return false;
}
diff --git a/src/writer/spirv/builder.h b/src/writer/spirv/builder.h
index a0ab571..91d67dc 100644
--- a/src/writer/spirv/builder.h
+++ b/src/writer/spirv/builder.h
@@ -39,6 +39,9 @@
/// @returns true if the SPIR-V was successfully built
bool Build(const ast::Module& module);
+ /// @returns the error string or blank if no error was reported.
+ const std::string& error() const { return error_; }
+
/// @returns the number of uint32_t's needed to make up the results
uint32_t total_size() const;
@@ -125,6 +128,7 @@
private:
Operand result_op();
+ std::string error_;
uint32_t next_id_ = 1;
std::vector<Instruction> preamble_;
std::vector<Instruction> debug_;
diff --git a/src/writer/spirv/builder_test_entry_point_test.cc b/src/writer/spirv/builder_entry_point_test.cc
similarity index 97%
rename from src/writer/spirv/builder_test_entry_point_test.cc
rename to src/writer/spirv/builder_entry_point_test.cc
index 4a83258..454aaae 100644
--- a/src/writer/spirv/builder_test_entry_point_test.cc
+++ b/src/writer/spirv/builder_entry_point_test.cc
@@ -66,6 +66,7 @@
Builder b;
EXPECT_FALSE(b.GenerateEntryPoint(&ep));
+ EXPECT_EQ(b.error(), "unable to find ID for function: frag_main");
}
struct EntryPointStageData {
diff --git a/src/writer/spirv/generator.cc b/src/writer/spirv/generator.cc
index b47838c..2f0747c 100644
--- a/src/writer/spirv/generator.cc
+++ b/src/writer/spirv/generator.cc
@@ -25,8 +25,10 @@
Generator::~Generator() = default;
bool Generator::Generate() {
- if (!builder_.Build(module_))
+ if (!builder_.Build(module_)) {
+ set_error(builder_.error());
return false;
+ }
return writer_.Write(builder_);
}