当前位置:网站首页>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
边栏推荐
猜你喜欢
随机推荐
Kubernetes介绍
Manifest merger failed with multiple errors, see logs
C语言初级—从键盘接收一个整形并逆序输出
1. What is RecyclerView
什么是 Web 3.0:面向未来的去中心化互联网
主存储器(一)
Spark_DSL
[ROS] (02) Create & compile ROS package Package
无人驾驶综述:摘要
LLVM系列第十九章:写一个简单的Module Pass
7.如何给RecyclerView添加Click和LongClick事件
MySQL 8.0 新特性
C语言初级—常见问题(100~200素数,计算1+11+111+...,从键盘获取一个数并输出有几个位)
Spark_Core
spark中RDD与DF的关系
C语言待解决
App signature in flutter
原码、补码、反码
spark(standalone,yarn)
MySQL知识总结 (十一) MySql 日志,数据备份,数据恢复