--- /dev/null
+#ifndef __COCO_IR_DEF_FORWARD_H__
+#define __COCO_IR_DEF_FORWARD_H__
+
+namespace coco
+{
+
+class Def;
+
+} // namespace coco
+
+#endif // __COCO_IR_DEF_FORWARD_H__
public:
void value(Object *value);
+public:
+ Object::Producer *producer(void) const { return _producer; }
+
private:
const PtrLink<Object, ObjectInfo> *_link = nullptr;
#define __COCO_IR_OBJECT_INFO_H__
#include "coco/IR/Object.h"
+#include "coco/IR/Def.forward.h"
namespace coco
{
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;
};
auto info = _link->find(_value);
assert(info != nullptr);
- info->def(_producer);
+ info->def(this);
}
assert(_value == value);
#include "coco/IR/Object.h"
#include "coco/IR/BagInfo.h"
#include "coco/IR/ObjectInfo.h"
+#include "coco/IR/Def.h"
#include <cassert>
#include <stdexcept>
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
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));