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);
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);
#define LIBSPIRV_OPT_MODULE_H_
#include <functional>
+#include <memory>
#include <utility>
#include <vector>
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.
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_;