aboutsummaryrefslogtreecommitdiff
path: root/include/cps/FunctionGen.h
blob: 84a2858fea6709ef6688a3102f5d14b610b4e3c1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

#pragma once
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/Module.h"
#include "cps/FunctionAST.h"
#include <map>
#include <vector>
#include <functional>
#include <string>
#include <tuple>

namespace cps {

class FunctionGen {
    llvm::LLVMContext &Context;
    llvm::Module &Module;
    llvm::IRBuilder<> &Builder;
    
    std::map<std::string, llvm::Value*> &NamedValues;

    void createArgumentAllocas(llvm::Function *F, const std::vector<std::tuple<std::string, std::string, bool>> &Args);

public:
    FunctionGen(llvm::LLVMContext &C, llvm::Module &M, llvm::IRBuilder<> &B, 
                std::map<std::string, llvm::Value*> &NV)
        : Context(C), Module(M), Builder(B), NamedValues(NV) {}

    llvm::Type *getLLVMType(const std::string &TypeName);

    llvm::Function *emitPrototype(PrototypeAST *Proto);

    llvm::Function *emitFunctionDef(FunctionDefAST *FuncAST, const std::function<void(StmtAST*)> &StmtEmitter);

    llvm::Value *emitCallExpr(CallExprAST *Call, const std::vector<llvm::Value*> &Args);
    
    void emitCallStmt(CallStmtAST *Call, const std::vector<llvm::Value*> &Args);

    void emitReturn(ReturnStmtAST *Ret, llvm::Value *RetVal);
};

}