You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
1.3 KiB
64 lines
1.3 KiB
1 year ago
|
#ifndef _SYSYF_VALUE_H_
|
||
|
#define _SYSYF_VALUE_H_
|
||
|
|
||
|
#include <string>
|
||
|
#include <list>
|
||
|
#include <iostream>
|
||
|
#include <memory>
|
||
|
|
||
|
#include "internal_types.h"
|
||
|
|
||
|
namespace SysYF
|
||
|
{
|
||
|
namespace IR
|
||
|
{
|
||
|
|
||
|
class Type;
|
||
|
class Value;
|
||
|
|
||
|
struct Use
|
||
|
{
|
||
|
Ptr<Value> val_;
|
||
|
unsigned arg_no_; // the no. of operand, e.g., func(a, b), a is 0, b is 1
|
||
|
Use(Ptr<Value> val, unsigned no) : val_(val), arg_no_(no) {}
|
||
|
};
|
||
|
|
||
|
class Value : public std::enable_shared_from_this<Value>
|
||
|
{
|
||
|
public:
|
||
|
~Value() = default;
|
||
|
|
||
|
Ptr<Type> get_type() const { return type_; }
|
||
|
|
||
|
std::list<Use> &get_use_list() { return use_list_; }
|
||
|
|
||
|
void add_use(Ptr<Value> val, unsigned arg_no = 0);
|
||
|
|
||
|
bool set_name(std::string name) {
|
||
|
if (name_ == "")
|
||
|
{
|
||
|
name_=name;
|
||
|
return true;
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
std::string get_name() const;
|
||
|
|
||
|
void replace_all_use_with(Ptr<Value> new_val);
|
||
|
void remove_use(Ptr<Value> val);
|
||
|
|
||
|
virtual std::string print() = 0;
|
||
|
|
||
|
protected:
|
||
|
explicit Value(Ptr<Type> ty, const std::string &name = "");
|
||
|
|
||
|
private:
|
||
|
Ptr<Type> type_;
|
||
|
std::list<Use> use_list_; // who use this value
|
||
|
std::string name_; // should we put name field here ?
|
||
|
};
|
||
|
|
||
|
}
|
||
|
}
|
||
|
#endif // _SYSYF_VALUE_H_
|