llvm cookbook 2.9/2.10/2.11 IR代码生成

对AST里的每个节点,也即每个AST类都定义Codegen方法。

virtual Value* Codegen() = 0;

这个方法会返回一个LLVM Value对象,表示的就是LLVM中的静态单赋值里的值SSA。

还要定义几个全局的变量。

// 包含所有函数和变量
static Module *Module_Ob;

// 不断插入指令
static IRBuilder<> Builder(getGlobalContext());

// 符号表
static std::map 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();
  }
}

你可能感兴趣的:(llvm cookbook 2.9/2.10/2.11 IR代码生成)