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。
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: LLVM IRBuilder是一种代码生成工具,它被用于将代码转换成LLVM IR格式。这种工具可以帮助开发人员更容易地生成LLVM IR代码,从而提高代码生成的效率。LLVM IRBuilder提供了一种简单易用的API,可以让开发人员通过简单的几个步骤来构建LLVM IR代码。 使用LLVM IRBuilder可以轻松地构建LLVM IR函数、基本块、指令等。该工具可以自动地管理使用到的中间变量,并生成最终的LLVM IR代码。在使用LLVM IRBuilder时,开发人员只需要按照所需的指令顺序调用相应的API函数,即可自动生成对应的LLVM IR代码。这种方式使得代码生成更加容易,同时也能够减少开发人员编写代码的工作量,提高代码的可维护性。 总之,LLVM IRBuilder是一个强大的代码生成工具,它能够帮助开发人员更加高效地生成LLVM IR代码。使用这种工具能够使代码生成变得更加容易,从而为开发人员提供更多的时间和精力来处理其他方面的问题。 ### 回答2: LLVM IRBuilder是LLVM工具链中的一个重要模块,它主要用于生成LLVM IR代码。LLVM IRBuilder提供了一组简单易用的API,使得开发人员能够以高级的方式来生成IR代码。通过使用LLVM IRBuilder,开发人员可以更加灵活地控制生成的IR代码,从而更容易地实现编译器优化和代码生成任务。 LLVM IRBuilder的核心API包括创建基本块、创建指令、创建值、将指令添加到基本块、以及跳转到其他基本块等。在使用LLVM IRBuilder时,开发人员只需要简单地调用这些API即可生成相应的IR代码。此外,LLVM IRBuilder还提供了一些高级API,例如根据类型创建值、创建内存操作指令、以及创建运行时库调用等。 总体而言,LLVM IRBuilder是LLVM工具链中非常重要的一部分,它将LLVM IR代码的生成变得更加简单和易用。它对于开发高性能、高效的编译器和代码生成器非常有用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值