llvm cookbook 2.9/2.10/2.11 IR代
2018-11-20 本文已影响11人
peteyuan
对AST里的每个节点,也即每个AST类都定义Codegen方法。
virtual Value* Codegen() = 0;
这个方法会返回一个LLVM Value对象,表示的就是LLVM中的静态单赋值里的值SSA。
还要定义几个全局的变量。
// 包含所有函数和变量
static Module *Module_Ob;
// 不断插入指令
static IRBuilder<> Builder(getGlobalContext());
// 符号表
static std::map<std::string, Value*> Named_Values;
表达式
数值常量
Value* NumericAST::Codegen() {
return ConstantInt::get(Type::getInt32Ty(getGlobalContext()), numeric_val);
}
变量
Value* VariableAST::Codegen() {
Value *V = Named_Values[Var_Name];
return V ? V : 0;
}
二元表达式
Value* BinaryAST::Codegen() {
Value* l = lhs->Codegen();
Value* r = rhs->Codegen();
if (l == 0 || r == 0) return 0;
switch(atoi(Bin_Operator.c_str())) {
case '+': return Builder.CreateAdd(l, r, 'addtmp');
case '-': return Builder.CreateSub(l, r, 'subtmp');
case '*': return Builder.CreateMul(l, r, 'multmp');
case '/': return Builder.CreateUDiv(l, r, 'divtmp');
default: return0;
}
}
函数
调用
声明
定义
top-level表达式
static void HandleDefn() {
if (FunctionDefnAST * f = fun_defn_parser()) {
if (Function* lf = f->Codegen()) {
}
} else {
next_token();
}
}
static void HandleTopExpression() {
if (FunctionDefnAST * f = top_level_parser()) {
if (Function* lf = f->Codegen()) {
}
} else {
next_token();
}
}