(3)llvm ir转换过程

(1)DAG Lowering

输入的IR转换成SelectionDAG的过程被称作lowering

就是把llvm ir转成这种

(2)DAG legalization

"DAG legalization"(有向无环图合法化)是编译器后端,特别是在LLVM中处理SelectionDAG的一个阶段。它主要发生在将中间表示(IR)转换为具体机器指令之前的指令选择过程中。DAG合法化的目标是确保SelectionDAG中的所有节点都能直接映射到目标硬件平台支持的操作上,即保证DAG中的每个操作都是"合法"的,能够被硬件直接执行。

(3) 指令选择

(4)Scheduling and Formation

重排指令

(5)SSA-based Machine Code Optimization

基于SSA的优化

(6)寄存器分配

寄存器分配的输入是一个SSA(Static Single Assignment)形式的中间表示(IR),这种表示确保每个变量只被赋值一次。此外,输入的IR已经经过了指令选择阶段,这意味着高级IR指令已经转换为更接近目标机器指令的形式,但这些指令目前还关联到虚拟寄存器,而不是实际的物理寄存器。

(7)post-allocation passes

(8)Prologue/Epilogue Code Insertion

在LLVM后端中,Prologue/Epilogue Code Insertion(序言/尾声代码插入)是指在函数的入口和出口处插入一些额外的代码,用于进行函数调用的准备和清理工作。这些代码用于保存和恢复寄存器、设置栈帧、处理参数传递等。

(9)peephole optimization

在LLVM后端中,Peephole Optimization(孔眼优化)是一种局部优化技术,它通过识别和替换一系列连续的指令序列,来改进代码的效率和质量。

(10)assembly printing

在LLVM后端中,Assembly Printing(汇编代码打印)是指将LLVM中间表示(IR)转换为目标机器的汇编代码的过程。

LLVM中的汇编代码是目标机器特定的低级指令序列,用于直接在目标机器上执行。通过汇编代码打印,LLVM后端可以将LLVM IR转换为目标机器的汇编代码,并将其输出为文本形式,以便查看和调试。

SSA形式的llvm ir可以用控制流图表示

然后控制流图里面的每一个部分可以用DAG表示

相关推荐
沢田纲吉20 小时前
《LLVM IR 学习手记(五):关系运算与循环语句的实现与解析》
前端·c++·llvm
沢田纲吉20 小时前
《LLVM IR 学习手记(六):break 语句与 continue 语句的实现与解析》
前端·c++·llvm
沢田纲吉10 天前
《LLVM IR 学习手记(三):赋值表达式与错误处理的实现与解析》
前端·编程语言·llvm
沢田纲吉17 天前
《LLVM IR 学习手记(二):变量表达式编译器的实现与深入解析》
前端·编程语言·llvm
沢田纲吉24 天前
《LLVM IR 学习手记(一):无量表达式编译器的实现与实践总结》
编程语言·llvm
CYRUS_STUDIO1 个月前
一文搞懂 Frida Stalker:对抗 OLLVM 的算法还原利器
android·逆向·llvm
CYRUS_STUDIO1 个月前
C&C++ 代码安全再升级:用 OLLVM 给 so 加上字符串加密保护
c++·安全·llvm
CYRUS_STUDIO1 个月前
别让 so 裸奔!移植 OLLVM 到 NDK 并集成到 Android Studio
android·android studio·llvm
CYRUS_STUDIO1 个月前
OLLVM 移植 LLVM18 踩坑:一步步调试修复控制流平坦化
c语言·c++·llvm
CYRUS_STUDIO1 个月前
LLVM 不止能编译!自定义 Pass + 定制 clang 实现函数名加密
c语言·c++·llvm