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<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 IR 深入研究分析LVM
- 《程式碼大全》程式碼生成
- 2.10
- mybatisplus程式碼生成MyBatis
- 2.9
- Bypass WAF Cookbook
- UI2Code智慧生成Flutter程式碼——機器生成程式碼UIFlutter
- Flowable 6.6.0 BPMN使用者指南-(2)配置 - 2.9 作業執行器/2.10 作業執行器啟用
- 例題2.11
- 程式碼生成器
- golang程式碼生成工具Golang
- 程式碼生成工具(一)
- freemarker 生成 Java 程式碼Java
- Go - 程式碼生成工具Go
- openGauss 支援LLVMLVM
- LLVM二三事LVM
- 認識 LLVMLVM
- GO程式碼生成程式碼小思小試Go
- SQLMAP 例項COOKBOOKSQL
- svg生成矩形效果程式碼SVG
- Laravel 程式碼生成器Laravel
- mybatis-plus程式碼生成MyBatis
- Protobuf 生成 Go 程式碼指南Go
- SpringBoot程式碼生成器Spring Boot
- VAE生成人臉程式碼
- DDPM生成人臉程式碼
- 2.4-2.10
- 例題2.10
- llvm入門篇LVM
- 最詳細版本|UI2Code智慧生成Flutter程式碼——機器生成程式碼UIFlutter
- Flutter中文教程-CookbookFlutter
- 例題2.11_2
- chagpt自動生成PPT程式碼GPT
- go模板-程式碼生成器Go
- Tp生成小程式二維碼
- Laravel-generator 程式碼生成包Laravel
- 軟著整理程式碼快速生成
- Gckit-CLI-程式碼生成工具GC