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
- Gerrit 2.10 正式釋出,程式碼評審工具
- gcc和llvm對程式碼的不同優化效果GCLVM優化
- 2.9
- 《程式碼大全》程式碼生成
- 生成驗證碼程式程式碼
- Build CookbookUI
- 2.10
- Flowable 6.6.0 BPMN使用者指南-(2)配置 - 2.9 作業執行器/2.10 作業執行器啟用
- SQL Cookbook—字串SQL字串
- React Webpack cookbookReactWeb
- python cookbookPython
- UI2Code智慧生成Flutter程式碼——機器生成程式碼UIFlutter
- golang程式碼生成工具Golang
- Go - 程式碼生成工具Go
- 程式碼生成工具(一)
- freemarker程式碼生成
- mybatisplus程式碼生成MyBatis
- 程式碼生成器
- AOS 自動生成程式碼(三) Service生成
- (程式碼生成)JS寫的程式碼生成器-編碼也可以這麼爽..JS
- GO程式碼生成程式碼小思小試Go
- 例題2.11
- SQLMAP 例項COOKBOOKSQL
- llvm passLVM
- Protobuf 生成 Go 程式碼指南Go
- freemarker 生成 Java 程式碼Java
- Laravel 程式碼生成器Laravel
- svg生成矩形效果程式碼SVG
- js 程式碼生成器JS
- Emit動態生成程式碼MIT
- ZT 程式碼生成器
- 程式碼生成框架Velocity框架
- VAE生成人臉程式碼
- mybatis-plus程式碼生成MyBatis
- DDPM生成人臉程式碼
- ir-iso 流程說明
- 2.4-2.10