21 std::shared_ptr<sammine_lang::LLVMRes> resPtr;
22 std::stack<std::map<std::string, llvm::AllocaInst *>> allocaValues;
24 llvm::Function *current_func;
25 llvm::Function *getCurrentFunction();
27 void setCurrentFunction(llvm::Function *);
29 std::string module_name;
30 bool in_reuse =
false;
31 bool current_func_exported =
false;
34 std::map<std::string, llvm::Function *> closure_wrappers;
35 size_t partial_counter = 0;
36 llvm::Function *getOrCreateClosureWrapper(llvm::Function *fn,
39 void emitBoundsCheck(llvm::Value *idx,
size_t arr_size);
40 llvm::Value *emitArrayComparison(llvm::Value *L, llvm::Value *R,
41 const Type &arrType, TokenType tok);
42 llvm::Value *buildClosure(llvm::Value *codePtr, llvm::Value *envPtr);
43 llvm::Value *emitArrayElementGEP(llvm::Value *base, llvm::Value *idx,
44 llvm::Type *arrLlvmType,
size_t arrSize);
46 void emitCall(
ExprAST *ast, llvm::FunctionCallee callee,
47 llvm::ArrayRef<llvm::Value *> args,
const llvm::Twine &name);
48 void emitPartialApplication(
CallExprAST *ast, llvm::Function *callee,
49 llvm::ArrayRef<llvm::Value *> boundArgs);
59 CgVisitor(std::shared_ptr<sammine_lang::LLVMRes> resPtr,
60 std::string module_name =
"",
62 : resPtr(resPtr), module_name(std::move(module_name)),
63 type_converter(*resPtr), props_(props) {}
65 void enter_new_scope()
override;
66 void exit_new_scope()
override;
73 virtual void preorder_walk(
ProgramAST *ast)
override;
74 virtual void preorder_walk(
VarDefAST *ast)
override;
75 virtual void preorder_walk(
FuncDefAST *ast)
override;
77 virtual void preorder_walk(
EnumDefAST *ast)
override;
79 virtual void preorder_walk(
ExternAST *ast)
override;
81 virtual void preorder_walk(
CallExprAST *ast)
override;
86 virtual void preorder_walk(
BoolExprAST *ast)
override;
87 virtual void preorder_walk(
CharExprAST *ast)
override;
89 virtual void preorder_walk(
BlockAST *ast)
override;
90 virtual void preorder_walk(
IfExprAST *ast)
override;
91 virtual void preorder_walk(
UnitExprAST *ast)
override;
92 virtual void preorder_walk(
TypedVarAST *ast)
override;
93 virtual void preorder_walk(
DerefExprAST *ast)
override {}
95 virtual void preorder_walk(
AllocExprAST *ast)
override {}
96 virtual void preorder_walk(
FreeExprAST *ast)
override {}
98 virtual void preorder_walk(
IndexExprAST *ast)
override {}
99 virtual void preorder_walk(
LenExprAST *ast)
override {}
103 virtual void preorder_walk(
CaseExprAST *ast)
override {}
104 virtual void preorder_walk(
WhileExprAST *ast)
override {}
110 virtual void postorder_walk(
ProgramAST *ast)
override {}
111 virtual void postorder_walk(
VarDefAST *ast)
override;
112 virtual void postorder_walk(
ExternAST *ast)
override;
113 virtual void postorder_walk(
FuncDefAST *ast)
override;
114 virtual void postorder_walk(
StructDefAST *ast)
override;
115 virtual void postorder_walk(
EnumDefAST *ast)
override;
117 virtual void postorder_walk(
PrototypeAST *ast)
override {}
118 virtual void postorder_walk(
CallExprAST *ast)
override;
123 virtual void postorder_walk(
BoolExprAST *ast)
override {}
124 virtual void postorder_walk(
CharExprAST *ast)
override {}
126 virtual void postorder_walk(
BlockAST *ast)
override;
127 virtual void postorder_walk(
IfExprAST *ast)
override {}
128 virtual void postorder_walk(
UnitExprAST *ast)
override {}
129 virtual void postorder_walk(
TypedVarAST *ast)
override {}
130 virtual void postorder_walk(
DerefExprAST *ast)
override;
132 virtual void postorder_walk(
AllocExprAST *ast)
override;
133 virtual void postorder_walk(
FreeExprAST *ast)
override;
135 virtual void postorder_walk(
IndexExprAST *ast)
override;
136 virtual void postorder_walk(
LenExprAST *ast)
override;
140 virtual void postorder_walk(
CaseExprAST *ast)
override {}
141 virtual void postorder_walk(
WhileExprAST *ast)
override {}
Defined LLVMRes, which encapsulates the state of LLVM (Context, Modules, IRBuilder,...