#include "IRBuilder.h" #define CONST_INT(num) ConstantInt::get(num, module.get()) #define CONST_FLOAT(num) ConstantFloat::get(num, module.get()) // You can define global variables and functions here // to store state // store temporary value Value *tmp_val = nullptr; // types Type *VOID_T; Type *INT1_T; Type *INT32_T; Type *FLOAT_T; Type *INT32PTR_T; Type *FLOATPTR_T; void IRBuilder::visit(SyntaxTree::Assembly &node) { VOID_T = Type::get_void_type(module.get()); INT1_T = Type::get_int1_type(module.get()); INT32_T = Type::get_int32_type(module.get()); FLOAT_T = Type::get_float_type(module.get()); INT32PTR_T = Type::get_int32_ptr_type(module.get()); FLOATPTR_T = Type::get_float_ptr_type(module.get()); for (const auto &def : node.global_defs) { def->accept(*this); } } // You need to fill them void IRBuilder::visit(SyntaxTree::InitVal &node) {} void IRBuilder::visit(SyntaxTree::FuncDef &node) {} void IRBuilder::visit(SyntaxTree::FuncFParamList &node) {} void IRBuilder::visit(SyntaxTree::FuncParam &node) {} void IRBuilder::visit(SyntaxTree::VarDef &node) {} void IRBuilder::visit(SyntaxTree::LVal &node) {} void IRBuilder::visit(SyntaxTree::AssignStmt &node) {} void IRBuilder::visit(SyntaxTree::Literal &node) {} void IRBuilder::visit(SyntaxTree::ReturnStmt &node) {} void IRBuilder::visit(SyntaxTree::BlockStmt &node) {} void IRBuilder::visit(SyntaxTree::EmptyStmt &node) {} void IRBuilder::visit(SyntaxTree::ExprStmt &node) {} void IRBuilder::visit(SyntaxTree::UnaryCondExpr &node) {} void IRBuilder::visit(SyntaxTree::BinaryCondExpr &node) {} void IRBuilder::visit(SyntaxTree::BinaryExpr &node) {} void IRBuilder::visit(SyntaxTree::UnaryExpr &node) {} void IRBuilder::visit(SyntaxTree::FuncCallStmt &node) {} void IRBuilder::visit(SyntaxTree::IfStmt &node) {} void IRBuilder::visit(SyntaxTree::WhileStmt &node) {} void IRBuilder::visit(SyntaxTree::BreakStmt &node) {} void IRBuilder::visit(SyntaxTree::ContinueStmt &node) {}