LLVM 學習笔记
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 theFunctionType
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 theFunctiontype::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,但是對於其中的 id
,number
,binary_expression
,function
,call
,prototype
需要定義與 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
存儲全局的數據結構,比如符號表什麽的。
以上寫的可能又有些問題,我過一段時間回查一下
參考資料