[coco] Change Instr/Block destruction order (#1711)
author박종현/동작제어Lab(SR)/Staff Engineer/삼성전자 <jh1302.park@samsung.com>
Tue, 2 Oct 2018 00:29:50 +0000 (09:29 +0900)
committerGitHub Enterprise <noreply-CODE@samsung.com>
Tue, 2 Oct 2018 00:29:50 +0000 (09:29 +0900)
This commit revises EntityManagerImpl to first destruct InstrManager and
then destruct BlockManager.

Signed-off-by: Jonghyun Park <jh1302.park@samsung.com>
contrib/coco/core/src/IR/Module.cpp

index 5502487..331e842 100644 (file)
@@ -47,16 +47,10 @@ public:
   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(); }
 
@@ -73,6 +67,16 @@ public:
 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