美文网首页
llvm cookbook 2.9/2.10/2.11 IR代

llvm cookbook 2.9/2.10/2.11 IR代

作者: peteyuan | 来源:发表于2018-11-20 14:15 被阅读11次

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

    相关文章

      网友评论

          本文标题:llvm cookbook 2.9/2.10/2.11 IR代

          本文链接:https://www.haomeiwen.com/subject/ilotqqtx.html