sammine-lang
Loading...
Searching...
No Matches
CodegenVisitor.h
Go to the documentation of this file.
1//
2// Created by Jasmine Tang on 3/27/24.
3//
4
5#pragma once
6#include "TypeConverter.h"
7#include "ast/ASTProperties.h"
8#include "ast/AstBase.h"
9#include "ast/AstDecl.h"
10#include "codegen/LLVMRes.h"
11#include <llvm/IR/Function.h>
12#include <llvm/IR/Type.h>
13#include <llvm/IR/Value.h>
14
17namespace sammine_lang::AST {
18class CgVisitor : public ScopedASTVisitor {
19
20private:
21 std::shared_ptr<sammine_lang::LLVMRes> resPtr;
22 std::stack<std::map<std::string, llvm::AllocaInst *>> allocaValues;
23
24 llvm::Function *current_func;
25 llvm::Function *getCurrentFunction();
26
27 void setCurrentFunction(llvm::Function *);
28
29 std::string module_name;
30 bool in_reuse = false;
31 bool current_func_exported = false;
32 TypeConverter type_converter;
33
34 std::map<std::string, llvm::Function *> closure_wrappers;
35 size_t partial_counter = 0;
36 llvm::Function *getOrCreateClosureWrapper(llvm::Function *fn,
37 const FunctionType &ft);
38
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);
45
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);
50 void emitEnumConstructor(CallExprAST *ast);
51 void forward_declare(PrototypeAST *ast);
52
53 // INFO: The collector is named Jasmine because she said on her discord status
54 // once that she's a garbage woman lol
55
56 const AST::ASTProperties *props_ = nullptr;
57
58public:
59 CgVisitor(std::shared_ptr<sammine_lang::LLVMRes> resPtr,
60 std::string module_name = "",
61 const AST::ASTProperties *props = nullptr)
62 : resPtr(resPtr), module_name(std::move(module_name)),
63 type_converter(*resPtr), props_(props) {}
64
65 void enter_new_scope() override;
66 void exit_new_scope() override;
67
68 virtual void visit(FuncDefAST *) override;
69 virtual void visit(IfExprAST *) override;
70 // visit
71 // pre order
72 // TODO: Implement these
73 virtual void preorder_walk(ProgramAST *ast) override;
74 virtual void preorder_walk(VarDefAST *ast) override;
75 virtual void preorder_walk(FuncDefAST *ast) override;
76 virtual void preorder_walk(StructDefAST *ast) override;
77 virtual void preorder_walk(EnumDefAST *ast) override;
78 virtual void preorder_walk(TypeAliasDefAST *ast) override;
79 virtual void preorder_walk(ExternAST *ast) override;
80 virtual void preorder_walk(PrototypeAST *ast) override;
81 virtual void preorder_walk(CallExprAST *ast) override;
82 virtual void preorder_walk(ReturnExprAST *ast) override {}
83 virtual void preorder_walk(BinaryExprAST *ast) override;
84 virtual void preorder_walk(NumberExprAST *ast) override;
85 virtual void preorder_walk(StringExprAST *ast) override;
86 virtual void preorder_walk(BoolExprAST *ast) override;
87 virtual void preorder_walk(CharExprAST *ast) override;
88 virtual void preorder_walk(VariableExprAST *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 {}
94 virtual void preorder_walk(AddrOfExprAST *ast) override {}
95 virtual void preorder_walk(AllocExprAST *ast) override {}
96 virtual void preorder_walk(FreeExprAST *ast) override {}
97 virtual void preorder_walk(ArrayLiteralExprAST *ast) override {}
98 virtual void preorder_walk(IndexExprAST *ast) override {}
99 virtual void preorder_walk(LenExprAST *ast) override {}
100 virtual void preorder_walk(UnaryNegExprAST *ast) override {}
101 virtual void preorder_walk(StructLiteralExprAST *ast) override {}
102 virtual void preorder_walk(FieldAccessExprAST *ast) override {}
103 virtual void preorder_walk(CaseExprAST *ast) override {}
104 virtual void preorder_walk(WhileExprAST *ast) override {}
105 virtual void preorder_walk(TypeClassDeclAST *ast) override {}
106 virtual void preorder_walk(TypeClassInstanceAST *ast) override {}
107
108 // post order
109 // TODO: Implement these?
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;
116 virtual void postorder_walk(TypeAliasDefAST *ast) override {}
117 virtual void postorder_walk(PrototypeAST *ast) override {}
118 virtual void postorder_walk(CallExprAST *ast) override;
119 virtual void postorder_walk(ReturnExprAST *ast) override;
120 virtual void postorder_walk(BinaryExprAST *ast) override;
121 virtual void postorder_walk(NumberExprAST *ast) override {}
122 virtual void postorder_walk(StringExprAST *ast) override;
123 virtual void postorder_walk(BoolExprAST *ast) override {}
124 virtual void postorder_walk(CharExprAST *ast) override {}
125 virtual void postorder_walk(VariableExprAST *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;
131 virtual void postorder_walk(AddrOfExprAST *ast) override {}
132 virtual void postorder_walk(AllocExprAST *ast) override;
133 virtual void postorder_walk(FreeExprAST *ast) override;
134 virtual void postorder_walk(ArrayLiteralExprAST *ast) override;
135 virtual void postorder_walk(IndexExprAST *ast) override;
136 virtual void postorder_walk(LenExprAST *ast) override;
137 virtual void postorder_walk(UnaryNegExprAST *ast) override;
138 virtual void postorder_walk(StructLiteralExprAST *ast) override;
139 virtual void postorder_walk(FieldAccessExprAST *ast) override;
140 virtual void postorder_walk(CaseExprAST *ast) override {}
141 virtual void postorder_walk(WhileExprAST *ast) override {}
142 virtual void postorder_walk(TypeClassDeclAST *ast) override {}
143 virtual void postorder_walk(TypeClassInstanceAST *ast) override {}
144
145 virtual void visit(TypeClassDeclAST *ast) override {}
146 virtual void visit(TypeClassInstanceAST *ast) override;
147 virtual void visit(WhileExprAST *ast) override;
148 virtual void visit(DerefExprAST *ast) override;
149 virtual void visit(IndexExprAST *ast) override;
150 virtual void visit(AddrOfExprAST *ast) override;
151 virtual void visit(CaseExprAST *ast) override;
152};
153} // namespace sammine_lang::AST
Defines the AST Abstract class for printing out AST Nodes.
Holds declaration for all the AST Nodes.
Defined LLVMRes, which encapsulates the state of LLVM (Context, Modules, IRBuilder,...
Defines the TypeConverter, which holds the characistics of converting our AST types into LLVM IR type...
Definition Types.h:43
Definition ASTProperties.h:40
An AST to simulate a { } code block.
Definition Ast.h:317
Definition Ast.h:485
Definition Ast.h:548
Definition Ast.h:798
virtual void visit(FuncDefAST *) override
Definition CodegenVisitor.cpp:88
Definition Ast.h:495
Definition Ast.h:378
Definition Ast.h:302
A Function Definition that has the prototype and definition in terms of a block.
Definition Ast.h:291
Definition Ast.h:667
Definition Ast.h:326
Definition Ast.h:598
Definition Ast.h:707
Definition Ast.h:197
A prototype to present "func func_name(...) -> type;".
Definition Ast.h:236
Definition AstBase.h:277
Definition TypeConverter.h:16
Definition Ast.h:205
Definition Ast.h:581
A variable definition: "var x = expression;" or "let (a, b) = expr;".
Definition Ast.h:420
Definition Types.h:139