const coco::OpManager *op(void) const override { return _op.get(); }
public:
- std::unique_ptr<coco::InstrManager> _instr;
-
-public:
coco::InstrManager *instr(void) override { return _instr.get(); }
const coco::InstrManager *instr(void) const override { return _instr.get(); }
public:
- std::unique_ptr<coco::BlockManager> _block;
-
-public:
coco::BlockManager *block(void) override { return _block.get(); }
const coco::BlockManager *block(void) const override { return _block.get(); }
public:
coco::OutputManager *output(void) override { return _output.get(); }
const coco::OutputManager *output(void) const override { return _output.get(); }
+
+public:
+ // WARN Do NOT change the order of these fields: _block -> _instr
+ //
+ // Note that each instruction may have a reference to a block, and
+ // the destructor of Instr accesses this 'block' reference.
+ //
+ // Thus, Instr entities SHOULD BE destructed before Block entities are destructed.
+ std::unique_ptr<coco::BlockManager> _block;
+ std::unique_ptr<coco::InstrManager> _instr;
};
} // namespace