Allow missing memory model instructions in modules.
authorLei Zhang <antiagainst@google.com>
Wed, 27 Jul 2016 21:31:23 +0000 (17:31 -0400)
committerLei Zhang <antiagainst@gmail.com>
Fri, 29 Jul 2016 04:58:09 +0000 (00:58 -0400)
source/opt/module.cpp
source/opt/module.h

index c6bab3a..85d1f0e 100644 (file)
@@ -43,7 +43,7 @@ void Module::ForEachInst(const std::function<void(Instruction*)>& f) {
   for (auto& i : capabilities_) f(&i);
   for (auto& i : extensions_) f(&i);
   for (auto& i : ext_inst_imports_) f(&i);
-  f(&memory_model_);
+  if (memory_model_) f(memory_model_.get());
   for (auto& i : entry_points_) f(&i);
   for (auto& i : execution_modes_) f(&i);
   for (auto& i : debugs_) f(&i);
@@ -64,7 +64,7 @@ void Module::ToBinary(std::vector<uint32_t>* binary, bool skip_nop) const {
   for (const auto& c : capabilities_) c.ToBinary(binary, skip_nop);
   for (const auto& e : extensions_) e.ToBinary(binary, skip_nop);
   for (const auto& e : ext_inst_imports_) e.ToBinary(binary, skip_nop);
-  memory_model_.ToBinary(binary, skip_nop);
+  if (memory_model_) memory_model_->ToBinary(binary, skip_nop);
   for (const auto& e : entry_points_) e.ToBinary(binary, skip_nop);
   for (const auto& e : execution_modes_) e.ToBinary(binary, skip_nop);
   for (const auto& d : debugs_) d.ToBinary(binary, skip_nop);
index f4bfbbc..df02dbd 100644 (file)
@@ -28,6 +28,7 @@
 #define LIBSPIRV_OPT_MODULE_H_
 
 #include <functional>
+#include <memory>
 #include <utility>
 #include <vector>
 
@@ -63,8 +64,10 @@ class Module {
   void AddExtInstImport(Instruction&& e) {
     ext_inst_imports_.push_back(std::move(e));
   }
-  // Appends a memory model instruction to this module.
-  void SetMemoryModel(Instruction&& m) { memory_model_ = std::move(m); }
+  // Adds a memory model instruction to this module.
+  void SetMemoryModel(Instruction&& m) {
+    memory_model_.reset(new Instruction(std::move(m)));
+  }
   // Appends an entry point instruction to this module.
   void AddEntryPoint(Instruction&& e) { entry_points_.push_back(std::move(e)); }
   // Appends an execution mode instruction to this module.
@@ -113,7 +116,8 @@ class Module {
   std::vector<Instruction> capabilities_;
   std::vector<Instruction> extensions_;
   std::vector<Instruction> ext_inst_imports_;
-  Instruction memory_model_;  // A module only has one memory model instruction.
+  std::unique_ptr<Instruction>
+      memory_model_;  // A module only has one memory model instruction.
   std::vector<Instruction> entry_points_;
   std::vector<Instruction> execution_modes_;
   std::vector<Instruction> debugs_;