4 #include "ast/DeclContext.h"
6 #include "semantic/NameResolver.h"
7 #include "tir/Constant.h"
8 #include "tir/IRBuilder.h"
9 #include "tir/Instructions.h"
14 class CGExprEvaluator;
23 static bool isAstTypeReference(ast::
Type const* ty) {
24 return ty->isString() || ty->isNull() || ty->isReference();
28 friend class CGExprEvaluator;
32 semantic::NameResolver& nr);
37 void run(ast::LinkingUnit
const* lu);
38 tir::
Type* emitType(ast::
Type const* type);
41 void emitStmt(ast::
Stmt const* stmt);
42 tir::
Value* emitExpr(ast::
Expr const* expr);
44 void emitFunction(ast::MethodDecl
const* decl);
46 void emitFunctionDecl(ast::MethodDecl
const* decl);
48 void emitClassDecl(ast::ClassDecl
const* decl);
50 void emitClass(ast::ClassDecl
const* decl);
58 void emitSetArraySz(tir::
Value* ptr, tir::
Value* sz);
60 void emitSetArrayPtr(tir::
Value* ptr, tir::
Value* arr);
63 void emitReturnStmt(ast::ReturnStmt
const* stmt);
64 void emitForStmt(ast::ForStmt
const* stmt);
65 void emitBlockStmt(ast::BlockStatement
const* stmt);
66 void emitDeclStmt(ast::DeclStmt
const* stmt);
67 void emitExprStmt(ast::ExprStmt
const* stmt);
68 void emitIfStmt(ast::IfStmt
const* stmt);
69 void emitWhileStmt(ast::WhileStmt
const* stmt);
74 tir::Function* curFn{
nullptr};
76 std::unordered_map<ast::Decl
const*, tir::AllocaInst*> valueMap{};
78 std::unordered_map<ast::Decl
const*, tir::Value*> gvMap{};
80 std::unordered_map<ast::Decl
const*, tir::Type*> typeMap{};
82 tir::StructType* arrayType{
nullptr};
84 semantic::NameResolver& nr;