From 462f3cb52bf00ccedd049af5b4bbe7e423129b37 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=EB=B0=95=EC=A2=85=ED=98=84/=EB=8F=99=EC=9E=91=EC=A0=9C?= =?utf8?q?=EC=96=B4Lab=28SR=29/Staff=20Engineer/=EC=82=BC=EC=84=B1?= =?utf8?q?=EC=A0=84=EC=9E=90?= Date: Tue, 18 Sep 2018 19:28:45 +0900 Subject: [PATCH] [coco] Manage Def in Object (#1532) * [coco] Manage Def in Object This commit moves Def field and related methods from ObjectInfo into Object. Signed-off-by: Jonghyun Park * Update comment --- contrib/coco/core/include/coco/IR/Object.h | 7 +++++++ contrib/coco/core/include/coco/IR/ObjectInfo.h | 4 ---- contrib/coco/core/src/IR/Def.cpp | 11 ++--------- contrib/coco/core/src/IR/Object.cpp | 20 +++++++++++++++++++- contrib/coco/core/src/IR/ObjectInfo.cpp | 7 ------- contrib/coco/core/src/IR/ObjectInfo.test.cpp | 1 - 6 files changed, 28 insertions(+), 22 deletions(-) diff --git a/contrib/coco/core/include/coco/IR/Object.h b/contrib/coco/core/include/coco/IR/Object.h index 14375d0..9f7a7f9 100644 --- a/contrib/coco/core/include/coco/IR/Object.h +++ b/contrib/coco/core/include/coco/IR/Object.h @@ -71,7 +71,14 @@ public: const ConsumerSet *user(void) const; private: + // @brief Update the link to a producer + // + // WARN Only Def class is allowed to access this method + void def(Def *d); + +private: Dep _dep; + Def *_def = nullptr; }; // @brief Return the producer of a given object if it exists diff --git a/contrib/coco/core/include/coco/IR/ObjectInfo.h b/contrib/coco/core/include/coco/IR/ObjectInfo.h index fc56f7a..92f475c 100644 --- a/contrib/coco/core/include/coco/IR/ObjectInfo.h +++ b/contrib/coco/core/include/coco/IR/ObjectInfo.h @@ -17,10 +17,6 @@ public: virtual ~ObjectInfo() = default; public: - 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; } diff --git a/contrib/coco/core/src/IR/Def.cpp b/contrib/coco/core/src/IR/Def.cpp index b93ffca..769f4cd 100644 --- a/contrib/coco/core/src/IR/Def.cpp +++ b/contrib/coco/core/src/IR/Def.cpp @@ -1,5 +1,4 @@ #include "coco/IR/Def.h" -#include "coco/IR/ObjectInfo.h" #include @@ -10,10 +9,7 @@ void Def::value(Object *value) { if (_value) { - auto info = _value->info(); - assert(info != nullptr); - info->def(nullptr); - + _value->def(nullptr); _value = nullptr; } @@ -22,10 +18,7 @@ void Def::value(Object *value) if (value) { _value = value; - - auto info = _value->info(); - assert(info != nullptr); - info->def(this); + _value->def(this); } assert(_value == value); diff --git a/contrib/coco/core/src/IR/Object.cpp b/contrib/coco/core/src/IR/Object.cpp index 90ca4a5..7caae41 100644 --- a/contrib/coco/core/src/IR/Object.cpp +++ b/contrib/coco/core/src/IR/Object.cpp @@ -21,7 +21,25 @@ ObjectInfo *Object::info(void) const return res; } -Def *Object::def(void) const { return info()->def(); } +Def *Object::def(void) const { return _def; } + +void Object::def(Def *d) +{ + // This assert enforces users to explicitly reset def before update. + // + // Let's consider an object o with def d0. + // + // The following code is allowed: + // o->def(nullptr); + // o->def(d1); + // + // However, the following code is not allowed: + // o->def(d1); + // + assert((_def == nullptr) || (d == nullptr)); + _def = d; +} + const UseSet *Object::uses(void) const { return info()->uses(); } const Object::ConsumerSet *Object::user(void) const { return info()->user(); } diff --git a/contrib/coco/core/src/IR/ObjectInfo.cpp b/contrib/coco/core/src/IR/ObjectInfo.cpp index faace4b..adee9ab 100644 --- a/contrib/coco/core/src/IR/ObjectInfo.cpp +++ b/contrib/coco/core/src/IR/ObjectInfo.cpp @@ -5,11 +5,4 @@ namespace coco { -void ObjectInfo::def(Def *d) -{ - // This assert ensures that object cannot have multiple def. - assert((_def == nullptr) || (d == nullptr)); - _def = d; -} - } // namespace coco diff --git a/contrib/coco/core/src/IR/ObjectInfo.test.cpp b/contrib/coco/core/src/IR/ObjectInfo.test.cpp index e6ff373..97b46b2 100644 --- a/contrib/coco/core/src/IR/ObjectInfo.test.cpp +++ b/contrib/coco/core/src/IR/ObjectInfo.test.cpp @@ -13,6 +13,5 @@ TEST_F(ObjectInfoTest, constructor) { coco::ObjectInfo info; - ASSERT_EQ(info.def(), nullptr); ASSERT_EQ(info.user()->size(), 0); } -- 2.7.4