llvm cookbook 2.9/2.10/2.11 IR程式碼生成

weixin_33978044發表於2018-11-20

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

相關文章