LLVM 后端实践笔记 3:算术和逻辑指令
这一章首先增加了更多的 Cpu0 算术运算指令和逻辑运算指令,这些在各个优化步骤中存在的 DAG 转换过程可以使用 Graphviz 来图形化显示,展示出更多的有效信息。不同于上一章,在这一章中,你应该专注于 C 代码的操作和 llvm IR 之间的映射以及如何在 td 文件中描述更复杂的 IR 与指令。这一章定义了另外一些寄存器类,你需要了解为什么需要它们,如果有些设计没有看懂,可能是对 Cpu0 的硬件不够熟悉,可以结合硬件来理解。 LLVM 后端实践笔记 0:序LLVM 后端实践笔记 1:新后端初始化和软件编译LLVM 后端实践笔记 2:后端结构LLVM 后端实践笔记 3:算术和逻辑指令LLVM 后端实践笔记 4:生成目标文件LLVM 后端实践笔记 5:全局变量LLVM 后端实践笔记 6:更多数据类型LLVM 后端实践笔记 7:控制流LLVM 后端实践笔记 8:函数调用LLVM 后端实践笔记 9:ELF文件支持LLVM 后端实践笔记 10:汇编LLVM 后端实践笔记 附录A:使用 Simulator 验证编译器 3.1 算术运算3.1.1 简要说明(1) 乘法和移位运算...
LLVM 后端实践笔记 2:后端结构
这一章介绍LLVM后端代码的组成结构,并分别实现这些结构下的类。这一章结束时,我们的后端就能够正常生成简单代码的汇编码了。这一章会增加不少代码,Cpu0 的后端代码主要参考 Mips 后端的代码,建议直接复制拿去用,然后根据实际情况修改。 这一章需要留意一下类关系。还需要知道指令选择、寄存器分配等概念。到调整栈帧的时候,可能会有点难,但只要对计算机体系结构比较清楚,相对会好理解。 (内容有点多,建议收藏后分多次阅读。本来打算分开的,但感觉分开之后章节关系变得太松散了,便作罢) LLVM 后端实践笔记 0:序LLVM 后端实践笔记 1:新后端初始化和软件编译LLVM 后端实践笔记 2:后端结构LLVM 后端实践笔记 3:算术和逻辑指令LLVM 后端实践笔记 4:生成目标文件LLVM 后端实践笔记 5:全局变量LLVM 后端实践笔记 6:更多数据类型LLVM 后端实践笔记 7:控制流LLVM 后端实践笔记 8:函数调用LLVM 后端实践笔记 9:ELF文件支持LLVM 后端实践笔记 10:汇编LLVM 后端实践笔记 附录A:使用 Simulator 验证编译器 2.1 目标机器架...
LLVM 后端实践笔记 1:新后端初始化和软件编译
这一章介绍 Cpu0 的硬件配置,以及简单介绍 LLVM 代码的结构和编译方法。然后,我们会搭建起后端的框架,并能让 LLVM build 通过,通过完成一些后端注册的操作,可以让 llc 识别到我们新后端的存在。 LLVM 后端实践笔记 0:序LLVM 后端实践笔记 1:新后端初始化和软件编译LLVM 后端实践笔记 2:后端结构LLVM 后端实践笔记 3:算术和逻辑指令LLVM 后端实践笔记 4:生成目标文件LLVM 后端实践笔记 5:全局变量LLVM 后端实践笔记 6:更多数据类型LLVM 后端实践笔记 7:控制流LLVM 后端实践笔记 8:函数调用LLVM 后端实践笔记 9:ELF文件支持LLVM 后端实践笔记 10:汇编LLVM 后端实践笔记 附录A:使用 Simulator 验证编译器 1.1 Cpu0 处理器架构介绍注意:公开的 Cpu0 的设计会发生变化,本节描述仅服务于本教程使用。Cpu0 架构是基于 Mips 的一种简化设计,可以参考 Mips 的架构细节来完善 Cpu0。 1.1.1 基本介绍 32 位 RISC 架构; 16 个通用寄存器,R0 到 R...
LLVM 后端实践笔记 0:序
LLVM 后端学习的系列教程,这是第一集,必读起跑线
LLVM 目标无关代码生成器 6:实现原生汇编器
本文是一篇译文,翻译自:https://llvm.org/docs/CodeGenerator.htmlllvm.org/docs/CodeGenerator.html如有问题,敬请指出。转载需注明出处,若需相关专业翻译服务,可联系我。 LLVM 目标无关代码生成器 1:介绍LLVM 目标无关代码生成器 2:目标描述类LLVM 目标无关代码生成器 3:机器代码描述类LLVM 目标无关代码生成器 4:MC 层LLVM 目标无关代码生成器 5:目标无关代码生成算法LLVM 目标无关代码生成器 6:实现原生汇编器 6.1 指令解析(原文未完成) 原文待完成状态 6.2 指令别名分析指令解析之后,会进入到 MatchInstructionImpl 函数。该函数实现了别名处理,之后会做真正的匹配工作。 别名分析是为了识别同样一条指令的不同文本形式,并下降到同一种指令表示。在 TableGen 中有几种不同类型的别名描述,将会在后续小节阐述,它们的顺序是从简单到复杂排好序的,一般情况下,只需要使用第一种描述方法即可,这通常是最简洁的描述方法。 6.2.1 助记符别名助记符别名的描...
LLVM 目标无关代码生成器 5:目标无关代码生成算法
本文是一篇译文,翻译自:https://llvm.org/docs/CodeGenerator.htmlllvm.org/docs/CodeGenerator.html如有问题,敬请指出。转载需注明出处,若需相关专业翻译服务,可联系我。 这一部分文档详细描述了前边 1.2 节 “代码生成器的高层设计” 中的概述内容。详细解释了代码生成的工作原理和设计思路。 LLVM 目标无关代码生成器 1:介绍LLVM 目标无关代码生成器 2:目标描述类LLVM 目标无关代码生成器 3:机器代码描述类LLVM 目标无关代码生成器 4:MC 层LLVM 目标无关代码生成器 5:目标无关代码生成算法LLVM 目标无关代码生成器 6:实现原生汇编器 5.1 指令选择指令选择是 LLVM 代码生成中的一个重要步骤,它将高层的 LLVM 代码表示翻译为目标相关的机器指令。在学术界有多种不同的实现方法,LLVM 使用了基于 SelectionDAG 的指令选择器。 DAG 指令选择器的大部分内容是通过 tablegen 依赖 .td 文件生成的。我们的目标便是将这些 .td 文件生成一个完整的指令...
LLVM 目标无关代码生成器 4:MC 层
本文是一篇译文,翻译自:https://llvm.org/docs/CodeGenerator.htmlllvm.org/docs/CodeGenerator.html如有问题,敬请指出。转载需注明出处,若需相关专业翻译服务,可联系我。 MC 层被用来表示机器编码级别的代码,相比于更高层的表示形式,它去除了像常量池、跳转表、全局变量等概念。在这一层上,LLVM 处理如 Label 名称、机器指令、目标文件段信息。这一层的代码在一些阶段非常重要,比如代码生成的最后阶段(也就是写入 .s 或 .o 文件时),或者被 llvm-mc 工具用来作为独立汇编器和反汇编器使用。 这一章节描述一些很重要的类,在之后的章节,还会描述和这一层交互的其他很重要的子系统。 LLVM 目标无关代码生成器 1:介绍LLVM 目标无关代码生成器 2:目标描述类LLVM 目标无关代码生成器 3:机器代码描述类LLVM 目标无关代码生成器 4:MC 层LLVM 目标无关代码生成器 5:目标无关代码生成算法LLVM 目标无关代码生成器 6:实现原生汇编器 4.1 MCStreamer APIMCStre...
LLVM 目标无关代码生成器 3:机器代码描述类
本文是一篇译文,翻译自:https://llvm.org/docs/CodeGenerator.htmlllvm.org/docs/CodeGenerator.html如有问题,敬请指出。转载需注明出处,若需相关专业翻译服务,可联系我。 在高层设计中,LLVM 代码会翻译成由 MachineFunction、MachineBasicBlock 和 MachineInstr 实例组成的特定机器的表示。这种表示完全是目标无关的,以最抽象的方式描述指令:操作码和操作数。这种表示被设计用来同时支持机器码的 SSA 形式以及寄存器分配后的表示(即非 SSA 形式) 。 LLVM 目标无关代码生成器 1:介绍LLVM 目标无关代码生成器 2:目标描述类LLVM 目标无关代码生成器 3:机器代码描述类LLVM 目标无关代码生成器 4:MC 层LLVM 目标无关代码生成器 5:目标无关代码生成算法LLVM 目标无关代码生成器 6:实现原生汇编器 3.1 MachineInstr 类目标机器指令(Machine Instruction,LLVM 后端的一种中间表示,缩写为MI )通过 M...
LLVM 目标无关代码生成器 2:目标描述类
本文是一篇译文,翻译自:https://llvm.org/docs/CodeGenerator.htmlllvm.org/docs/CodeGenerator.html如有问题,敬请指出。转载需注明出处,若需相关专业翻译服务,可联系我。 LLVM 目标描述的类 (存放在 include/llvm/Target/ 路径下)提供了一套抽象的针对任意后端机器通用的描述。这些类被设计来管理一些抽象的目标属性(比如指令和寄存器),并且不夹杂任何代码生成算法的片段。 除了 DataLayout 以外,其他所有的目标描述类都需要作为基类被特定目标的描述类所继承,同时提供虚函数的实现。为了便于实现, TargetMachine 类提供了一些访问器(accessor),这些也同样需要在特定目标的描述类中实现。 LLVM 目标无关代码生成器 1:介绍LLVM 目标无关代码生成器 2:目标描述类LLVM 目标无关代码生成器 3:机器代码描述类LLVM 目标无关代码生成器 4:MC 层LLVM 目标无关代码生成器 5:目标无关代码生成算法LLVM 目标无关代码生成器...
LLVM 目标无关代码生成器 1:介绍
本文是一篇译文,翻译自:https://llvm.org/docs/CodeGenerator.htmlllvm.org/docs/CodeGenerator.html如有问题,敬请指出。转载需注明出处,若需相关专业翻译服务,可联系我。 LLVM 目标无关代码生成器是一个软件框架,它提供了一些可重用的组件,能将 LLVM 中间表示语言翻译成特殊目标下的机器代码。这里所指的机器代码,既可以是汇编码(静态编译器组成部分),也可作为二进制机器码(通过 JIT 编译器运行)。 译注:本文中会把原文 Machine Code 翻译为机器码,但需注意,此处机器码并不表示二进制可执行文件,如 ELF 文件,Machine Code 是 LLVM 后端中 MC 层的中间表示,虽然其与二进制可执行文件有较大相似之处,但依然是两个不同的东西。若文中需要翻译为二进制可执行文件,会特殊指出。 LLVM 目标无关代码生成器由 6 个主要的组件组成: 抽象的目标描述接口:用来维护那些重要的机器特性,而不需要考虑他们的使用。这些接口存放在 include/llvm/Target/ 下。 用来做代...














