LLVM 學習

終於來到激動人心的第三章 LLVM IR(今天是周日,有點擺了

Function *PrototypeAST::codegen() {
  // Make the function type:  double(double,double) etc.
  std::vector<Type*> Doubles(Args.size(),
                             Type::getDoubleTy(*TheContext));
  FunctionType *FT =
    FunctionType::get(Type::getDoubleTy(*TheContext), Doubles, false);

  Function *F =
    Function::Create(FT, Function::ExternalLinkage, Name, TheModule.get());

The call to FunctionType::get creates the FunctionType that should be used for a given Prototype. Since all function arguments in Kaleidoscope are of type double, the first line creates a vector of “N” LLVM double types. It then uses the Functiontype::get method to create a function type that takes “N” doubles as arguments, returns one double as a result, and that is not vararg (the false parameter indicates this). Note that Types in LLVM are uniqued just like Constants are, so you don’t “new” a type, you “get” it.

從中我并沒有看出哪裏返回了 double,我的理解是返回值是否是 double 應該是在函數的 expression 中給定的,所以對於這個(FunctionType::get)就沒有指定返回值是 double 類型。

只要給每個 AST 加一個 codegen 函數就可以比較方便的生成 LLVM IR 的 AST,但是對於其中的 idnumberbinary_expressionfunctioncallprototype 需要定義與 LLVM IR 的轉換。説實話我沒搞懂爲什麽要用這麽多和函數有關的 AST

其中有比較重要的幾個全局變量

static std::unique_ptr<LLVMContext> TheContext;
static std::unique_ptr<IRBuilder<>> Builder;
static std::unique_ptr<Module> TheModule;
static std::map<std::string, Value *> NamedValues;

不太好描述這幾個的實際含義,TheContext 類似於 LLVM IR 的 this 指針,Builder 用來構建 LLVM IR,TheModule 用來構建基本塊,NameValues 存儲全局的數據結構,比如符號表什麽的。

以上寫的可能又有些問題,我過一段時間回查一下

參考資料