#pragma once #include #include #include #include #include "3rdparty/easylogging++.h" #include "common.h" #include "llir_type.h" namespace antlrSysY { class Value { public: std::string name; TypePtr_t type; Value(const std::string &name, TypePtr_t type) : name(name), type(type) {} virtual ~Value() = default; template static bool isType(std::shared_ptr ptr) { if (ptr.get()) { auto &r = *ptr.get(); return typeid(r) == typeid(TT); } LOG(WARNING) << "Comparing with nullptr"; return false; } virtual std::string to_string() { return name + ": " + type->to_string(); } }; class User : public Value { public: }; class BasicBlock; class Instruction; class FParam : public Value { public: FParam(const std::string &name, TypePtr_t type) : Value(name, type) {} }; class Function : public Value { public: std::vector> fparam_list; std::vector> bb_list; // we use empty basic_block to represent lib function Function(const std::string &name, TypePtr_t ret_type) : Value(name, std::make_shared(ret_type)) {} std::shared_ptr get_type() { return std::dynamic_pointer_cast(type); } bool is_libfunc() { return bb_list.size() == 0; } virtual std::string to_string() override { std::string params_str; for (auto fparam : fparam_list) { params_str += fparam->to_string() + ","; } return name + "(" + params_str + ") -> " + type->to_string(); } }; class BasicBlock : public Value { public: std::vector> inst_list; std::shared_ptr parent; std::vector> successors; std::vector> predecessors; BasicBlock(const std::string &name, std::shared_ptr parent) : Value(name, TypeHelper::TYPE_LABEL) { this->parent = parent; } }; typedef std::shared_ptr ValuePtr_t; typedef std::shared_ptr BasicBlockPtr_t; typedef std::shared_ptr FunctionPtr_t; class Constant : public Value { public: Constant(const std::string &name, TypePtr_t type) : Value(name, type) {} }; class ConstantInt : public Constant { public: int value; ConstantInt(const std::string &name, int value) : Constant(name, TypeHelper::TYPE_I32), value(value) {} static std::shared_ptr make_shared(int value) { return std::make_shared("", value); } }; class ConstantArr : public Constant { public: std::vector value_list; ConstantArr(const std::string &name, const std::vector &value_list, std::shared_ptr type) : Constant(name, type), value_list(value_list) {} static std::shared_ptr make_shared(const std::string &name, const std::vector &value_list, std::shared_ptr type) { return std::make_shared(name, value_list, type); } }; typedef std::shared_ptr ConstantPtr_t; // emmm, actually it is more of a Instruction type class GlobalVar : public Value { public: ConstantPtr_t init_value; bool is_const; GlobalVar(const std::string &name, ConstantPtr_t init_value, bool is_const) : Value(name, PointerType::make_shared(init_value->type)), init_value(init_value), is_const(is_const) {} static std::shared_ptr make_shared(const std::string &name, ConstantPtr_t init_value, bool is_const) { return std::make_shared(name, init_value, is_const); } }; } // namespace antlrSysY