[coco] Link to Def instead of Producer (#1487)
author박종현/동작제어Lab(SR)/Staff Engineer/삼성전자 <jh1302.park@samsung.com>
Fri, 14 Sep 2018 04:15:34 +0000 (13:15 +0900)
committerGitHub Enterprise <noreply-CODE@samsung.com>
Fri, 14 Sep 2018 04:15:34 +0000 (13:15 +0900)
This commit revises ObjectInfo class to maintain a link(= pointer) to
Def instead of Producer.

Signed-off-by: Jonghyun Park <jh1302.park@samsung.com>
contrib/coco/core/include/coco/IR/Def.forward.h [new file with mode: 0644]
contrib/coco/core/include/coco/IR/Def.h
contrib/coco/core/include/coco/IR/ObjectInfo.h
contrib/coco/core/src/IR/Def.cpp
contrib/coco/core/src/IR/Object.cpp
contrib/coco/core/src/IR/ObjectInfo.cpp

diff --git a/contrib/coco/core/include/coco/IR/Def.forward.h b/contrib/coco/core/include/coco/IR/Def.forward.h
new file mode 100644 (file)
index 0000000..1adbda4
--- /dev/null
@@ -0,0 +1,11 @@
+#ifndef __COCO_IR_DEF_FORWARD_H__
+#define __COCO_IR_DEF_FORWARD_H__
+
+namespace coco
+{
+
+class Def;
+
+} // namespace coco
+
+#endif // __COCO_IR_DEF_FORWARD_H__
index 9421730..cdb3982 100644 (file)
@@ -27,6 +27,9 @@ public:
 public:
   void value(Object *value);
 
+public:
+  Object::Producer *producer(void) const { return _producer; }
+
 private:
   const PtrLink<Object, ObjectInfo> *_link = nullptr;
 
index 508913e..69193ac 100644 (file)
@@ -2,6 +2,7 @@
 #define __COCO_IR_OBJECT_INFO_H__
 
 #include "coco/IR/Object.h"
+#include "coco/IR/Def.forward.h"
 
 namespace coco
 {
@@ -15,15 +16,15 @@ public:
   virtual ~ObjectInfo() = default;
 
 public:
-  Object::Producer *def(void) const { return _def; }
-  void def(Object::Producer *d);
+  Def *def(void) const { return _def; }
+  void def(Def *d);
 
 public:
   Object::ConsumerSet *user(void) { return &_user; }
   const Object::ConsumerSet *user(void) const { return &_user; }
 
 private:
-  Object::Producer *_def = nullptr;
+  Def *_def = nullptr;
   Object::ConsumerSet _user;
 };
 
index 78cc2c4..9b3d16a 100644 (file)
@@ -27,7 +27,7 @@ void Def::value(Object *value)
 
     auto info = _link->find(_value);
     assert(info != nullptr);
-    info->def(_producer);
+    info->def(this);
   }
 
   assert(_value == value);
index a93d0f1..ba3deee 100644 (file)
@@ -1,6 +1,7 @@
 #include "coco/IR/Object.h"
 #include "coco/IR/BagInfo.h"
 #include "coco/IR/ObjectInfo.h"
+#include "coco/IR/Def.h"
 
 #include <cassert>
 #include <stdexcept>
@@ -23,7 +24,16 @@ ObjectInfo *Object::info(void) const
   return res;
 }
 
-Object::Producer *Object::def(void) const { return info()->def(); }
+Object::Producer *Object::def(void) const
+{
+  if (auto d = info()->def())
+  {
+    return d->producer();
+  }
+
+  return nullptr;
+}
+
 const Object::ConsumerSet *Object::user(void) const { return info()->user(); }
 
 } // namespace coco
index f49b67d..faace4b 100644 (file)
@@ -5,7 +5,7 @@
 namespace coco
 {
 
-void ObjectInfo::def(Object::Producer *d)
+void ObjectInfo::def(Def *d)
 {
   // This assert ensures that object cannot have multiple def.
   assert((_def == nullptr) || (d == nullptr));