LLVM简要介绍

news/2024/7/24 11:42:41 标签: 开发语言, LLVM

LLVM总体架构图:总体分为三部分,分别是前端、中间优化层、编译器后端。前端经过词法、语法、语义分析生成IR,中间优化层会经过若干个pass,不同的pass会对IR进行不同的优化处理,将优化处理后的IR传递给后端,后端根据不同的硬件生成与硬件相关的机器码。后端流程:指令选择->寄存器分配->指令调度->代码布局->代码组装,生成硬件所对应的汇编指令。
在这里插入图片描述

运行过程:c代码进行一系列的预处理变成.i文件,使用前端编译变成IR文件——.ll(人类可读的代码语言)和.bc(在硬盘上存储的二进制中间语言)文件,通过llc把IR变成汇编的机器码,然后把机器码编译成二进制文件。
在这里插入图片描述

clang -E -c hello.c -o hello.i 对c++源代码进行预处理生成.i文件
clang -emit-llvm hello.i -c -o hello.bc 把.i文件导出成.bc形式的llvm IR
clang -emit-llvm hello.i -S -o hello.ll 把.i文件导出成.ll形式的llvm IR
llc hello.ll -o hello.s 通过llc导出成.s文件
code hello.s 可以看到里面是一些汇编指令
clang hello.s -o hello 变成可执行的二进制文件

后端的详细工作流程:

后端的主要任务是代码生成,即将LLVM IR变换为目标代码(或者汇编)。
1、指令选择
• 内存中 LLVM IR 变换为目标特定 SelectionDAG 节点(有向无环图);
• 每个DAG能够表示单一基本块的计算;
• 节点表示指令,而边编码了指令间的数据流依赖;
• 让LLVM代码生成程序库能够运用基于树的模式匹配指令选择算法。
主要过程:第一步是根据LLVM IR指令构建DAG,从而创建一个其节点执行IR操作的SelectionDAG对象。接着,这些节点经过降级、DAG合并和合法化等过程,使它更容易与目标指令相匹配。然后,指令选择使用节点模式匹配方法进行DAG到DAG的变换(目的是通过使用模式匹配将目标无关节点转换成目标相关节点),将SelectionDAG节点转换为代表目标指令的节点。
2、指令调度
• 第1次指令调度(Instruction Scheduling),也称为前寄存器分配(RA)调度;
• 对DAG指令排序,同时尝试发现尽可能多的指令层次的并行;
• 然后指令被变换为MachineInstr三地址表示。
3、寄存器分配
LLVMIR 两个中哟特性之一:LLVM IR 寄存器集是无限;这个性质一直保持着,直到寄存器分配(Register Allocation);
• 寄存器分配将无限的虚拟寄存器引用转换为有限的目标特定的物理寄存器;
• 寄存器不够时挤出(spill)到内存。
四个寄存器分配算法:pbqp、greedy、basic、fast
4、指令调度
• 第2次指令调度,也称为后寄存器分配(RA)调度;
• 此时可获得真实的寄存器信息,某些类型寄存器存在延迟,它们可被用以改进指令顺序。
5、代码输出
• 代码输出阶段将指令从 MachineInstr 表示变换为 MCInst 实例;
• 新的表示更适合汇编器和链接器,可以输出汇编代码或者输出二进制块特定目标代码格式。
如此,整个后端流水线用到了四种不同层次的指令表示:内存中的LLVM IR,SelectionDAG节点,MachineInstr,和MCInst。
在这里插入图片描述


http://www.niftyadmin.cn/n/197059.html

相关文章

Codeforces Round 863 (Div. 3) (E-G)

Problem - E - Codeforces (1)题目大意 问你第k个不出现4的数字是多少。 (2)解题思路 1.九进制,把每一位大于等于4的位置1 2.二分数位dp,二分第k个数,然后数位dp计算有多少个不含4的数即可。 &a…

【LeetCode72】编辑距离

题目描述 给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作: 插入一个字符 删除一个字符 替换一个字符 示例 1: 输入:word1 “horse”, word2 “ros” …

通讯录的实现(初级版本)

思维导图: 目录 思维导图: ​编辑 一,实现通讯录的第一步——实现逻辑 二,头文件内实现的内容 三,contect.c文件内的函数定义 3.1初始化通讯录:void InitContect(cotect*pc) 3.2:实现通讯录内容的增加&#xff…

Windows 元件

Windows 元件 核心组件 ▪ Aero▪ ClearType▪ 桌面视窗管理员▪ DirectX▪ 档案总管▪ 任务栏▪ 开始选单▪ Shell▪ 特殊资料夹▪ 文件关联▪ 搜索▪ iFilters▪ 图形设备接口▪ WIM▪ 新一代TCP/IP通讯堆栈▪ .NET Framework▪ 音效▪ 打印▪ WSH▪ JScript▪ 组件对象模型▪…

RecycleView小结

RecycleView四级缓存 一级缓存:用于存放当前屏幕可显示区域的ViewHolder,目的是为了方便更新数据,以及对View操作时更加快捷二级缓存:用于缓存最近滑动出屏幕的ViewHolder,目的是为了当用户将该View滑出屏幕外时又突然…

代码不熟没关系,让AI替你写

程序员早已不是一个陌生的群体,但程序、代码相对普通人而言,看着还是比较深奥难懂,但自从有了ChatGPT,不少对此有兴趣的外行人士,也能轻松写出代码了,比如让ChatGPT写一个贪吃蛇游戏,按它给出的…

一个评测模型+10个问题,摸清盘古、通义千问、文心一言、ChatGPT的“家底”!...

‍数据智能产业创新服务媒体——聚焦数智 改变商业毫无疑问,全球已经在进行大模型的军备竞赛了,“有头有脸”的科技巨头都不会缺席。昨天阿里巴巴内测了通义千问,今天华为公布了盘古大模型的最新进展。不久前百度公布了文心一言、360也公布了…

i.MX6ULL 裸机点亮 LED

概述 去 datasheet 收集点亮 LED 需要的所有条件。 datasheet 所需条件总结如下: CCM (时钟)GPIO.DR(data register)GPIO.GDIR (direction)SW_MUX_CTL_PAD_ (复用模式)SW_PAD_CTL_PAD_ (引脚属性) 编码 # 寄存器宏定义 .equ CCM_CCR_BAS…