当前位置:网站首页>LLVM系列第四章:逻辑代码块Block
LLVM系列第四章:逻辑代码块Block
2022-08-02 14:07:00 【飞翼剑仆】
系列文章目录
LLVM系列第一章:编译LLVM源码
LLVM系列第二章:模块Module
LLVM系列第三章:函数Function
LLVM系列第四章:逻辑代码块Block
LLVM系列第五章:全局变量Global Variable
LLVM系列第六章:函数返回值Return
LLVM系列第七章:函数参数Function Arguments
LLVM系列第八章:算术运算语句Arithmetic Statement
LLVM系列第九章:控制流语句if-else
LLVM系列第十章:控制流语句if-else-phi
LLVM系列第十一章:写一个Hello World
LLVM系列第十二章:写一个简单的词法分析器Lexer
LLVM系列第十三章:写一个简单的语法分析器Parser
LLVM系列第十四章:写一个简单的语义分析器Semantic Analyzer
LLVM系列第十五章:写一个简单的中间代码生成器IR Generator
LLVM系列第十六章:写一个简单的编译器
LLVM系列第十七章:for循环
LLVM系列第十八章:写一个简单的IR处理流程Pass
LLVM系列第十九章:写一个简单的Module Pass
LLVM系列第二十章:写一个简单的Function Pass
LLVM系列第二十一章:写一个简单的Loop Pass
LLVM系列第二十二章:写一个简单的编译时函数调用统计器(Pass)
LLVM系列第二十三章:写一个简单的运行时函数调用统计器(Pass)
LLVM系列第二十四章:用Xcode编译调试LLVM源码
LLVM系列第二十五章:简单统计一下LLVM源码行数
前言
在此记录下用LLVM生成逻辑代码块(Block)的过程,以备查阅。
开发环境的配置请参考第一章 《LLVM系列第一章:编译LLVM源码》。
函数(Function)是由基本的逻辑代码块(Basic Block)组成的。为了简单起见,我们就把“逻辑代码块”简称为“代码块”吧。一个代码块只有一个起点和终点。代码块的主要部分当然是代码,即一系列的IR指令(代码)。最后一条IR指令就是结束指令。代码块的起点可以是一个标签,它指示了下一行代码的位置。
LLVM提供了一个名为BasicBlock的工具来创建代码块。当然,在构建代码块的过程中,我们还需要用到通用的构建工具IRBuilder。
在这一章中,我们就用LLVM提供的这些工具来创建一个最简单的代码块。
一、Hello Block
我们来创建一个最简单的代码块,代码如下(示例):
// HelloBlock.cpp
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/Verifier.h"
using namespace llvm;
int main(int argc, char* argv[])
{
LLVMContext context;
IRBuilder<> builder(context);
// Create a module
Module* module = new Module("HelloModule", context);
// Add a function
Type* voidType = Type::getVoidTy(context);
FunctionType* functionType = FunctionType::get(voidType, false);
Function* function = Function::Create(functionType, GlobalValue::ExternalLinkage, "HelloFunction", module);
// Create a block
BasicBlock* block = BasicBlock::Create(context, "entry", function);
builder.SetInsertPoint(block);
// Print the IR
verifyFunction(*function);
module->print(outs(), nullptr);
return 0;
}
二、编译
用clang++进行编译(示例):
# Set up C++ standard library and header path
export SDKROOT=$(xcrun --sdk macosx --show-sdk-path)
# Compile
clang++ -w -o HelloBlock `llvm-config --cxxflags --ldflags --system-libs --libs core` HelloBlock.cpp
以上命令会生成一个名为HelloBlock的可执行程序。
三、运行
运行HelloBlock(示例):
./HelloBlock
输出结果如下(示例):
; ModuleID = 'HelloModule'
source_filename = "HelloModule"
define void @HelloFunction() {
entry:
}
四、总结
我们用LLVM提供的C++ API,创建了一个最简单的逻辑代码块(Block),并打印出了它的IR代码。完整源码示例请参看:
https://github.com/wuzhanglin/llvm-IR-examples
边栏推荐
猜你喜欢
随机推荐
VS Code无法安装插件之Unable to install because, the extension '' compatible with current version
Redis database related commands
宝塔搭建PHP自适应懒人网址导航源码实测
C语言初级—判断一个数是不是素数(函数封装)
C语言日记 5、7setprecision()问题
加强版Apktool堪称逆向神器
MySQL知识总结 (一) 数据类型
The Handler you really understand?
C语言日记 2 标识符
It is not allowed to subscribe with a(n) xxx multiple times.Please create a fresh instance of xxx
Redis-01-Nosql概述
Ffmpeg交叉编译
主存储器(二)
spark中RDD与DF的关系
LLVM系列第二十三章:写一个简单的运行时函数调用统计器(Pass)
Redis数据库相关指令
C语言日记 4 变量
MySQL知识总结 (六) MySQL调优
redis基础
原码、补码、反码