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);
};
}
|