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_);
 }