LLVM 后端实践笔记 4:生成目标文件
之前的章节只介绍了汇编代码生成的内容,这一章,我们将介绍对 ELF 目标格式文件的支持以及如何使用 objdump 工具来验证生成的目标文件。在 LLVM 代码框架下,只需要增加少量的代码,Cpu0 后端就可以生成支持大端或小端编码的目标文件。目标注册机制以及它的结构也在本章介绍。 LLVM 后端实践笔记 0:序LLVM 后端实践笔记 1:新后端初始化和软件编译LLVM 后端实践笔记 2:后端结构LLVM 后端实践笔记 3:算术和逻辑指令LLVM 后端实践笔记 4:生成目标文件LLVM 后端实践笔记 5:全局变量LLVM 后端实践笔记 6:更多数据类型LLVM 后端实践笔记 7:控制流L...
LLVM 后端实践笔记 3:算术和逻辑指令
这一章首先增加了更多的 Cpu0 算术运算指令和逻辑运算指令,这些在各个优化步骤中存在的 DAG 转换过程可以使用 Graphviz 来图形化显示,展示出更多的有效信息。不同于上一章,在这一章中,你应该专注于 C 代码的操作和 llvm IR 之间的映射以及如何在 td 文件中描述更复杂的 IR 与指令。这一章定义了另外一些寄存器类,你需要了解为什么需要它们,如果有些设计没有看懂,可能是对 Cpu0 的硬件不够熟悉,可以结合硬件来理解。 LLVM 后端实践笔记 0:序LLVM 后端实践笔记 1:新后端初始化和软件编译LLVM 后端实践笔记 2:后端结构LLVM 后端实践笔记 3:算术和逻...
LLVM 后端实践笔记 2:后端结构
这一章介绍LLVM后端代码的组成结构,并分别实现这些结构下的类。这一章结束时,我们的后端就能够正常生成简单代码的汇编码了。这一章会增加不少代码,Cpu0 的后端代码主要参考 Mips 后端的代码,建议直接复制拿去用,然后根据实际情况修改。 这一章需要留意一下类关系。还需要知道指令选择、寄存器分配等概念。到调整栈帧的时候,可能会有点难,但只要对计算机体系结构比较清楚,相对会好理解。 (内容有点多,建议收藏后分多次阅读。本来打算分开的,但感觉分开之后章节关系变得太松散了,便作罢) LLVM 后端实践笔记 0:序LLVM 后端实践笔记 1:新后端初始化和软件编译LLVM 后端实践笔记 2:后端...
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 后端实践笔记 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 指令别名分析...
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 目标无关代码生成器 4:MC 层
本文是一篇译文,翻译自:https://llvm.org/docs/CodeGenerator.htmlllvm.org/docs/CodeGenerator.html如有问题,敬请指出。转载需注明出处,若需相关专业翻译服务,可联系我。 MC 层被用来表示机器编码级别的代码,相比于更高层的表示形式,它去除了像常量池、跳转表、全局变量等概念。在这一层上,LLVM 处理如 Label 名称、机器指令、目标文件段信息。这一层的代码在一些阶段非常重要,比如代码生成的最后阶段(也就是写入 .s 或 .o 文件时),或者被 llvm-mc 工具用来作为独立汇编器和反汇编器使用。 这一章节描述...
LLVM 目标无关代码生成器 3:机器代码描述类
本文是一篇译文,翻译自:https://llvm.org/docs/CodeGenerator.htmlllvm.org/docs/CodeGenerator.html如有问题,敬请指出。转载需注明出处,若需相关专业翻译服务,可联系我。 在高层设计中,LLVM 代码会翻译成由 MachineFunction、MachineBasicBlock 和 MachineInstr 实例组成的特定机器的表示。这种表示完全是目标无关的,以最抽象的方式描述指令:操作码和操作数。这种表示被设计用来同时支持机器码的 SSA 形式以及寄存器分配后的表示(即非 SSA 形式) 。 LLVM 目标无关代...
LLVM 目标无关代码生成器 2:目标描述类
本文是一篇译文,翻译自:https://llvm.org/docs/CodeGenerator.htmlllvm.org/docs/CodeGenerator.html如有问题,敬请指出。转载需注明出处,若需相关专业翻译服务,可联系我。 LLVM 目标描述的类 (存放在 include/llvm/Target/ 路径下)提供了一套抽象的针对任意后端机器通用的描述。这些类被设计来管理一些抽象的目标属性(比如指令和寄存器),并且不夹杂任何代码生成算法的片段。 除了 DataLayout 以外,其他所有的目标描述类都需要作为基类被特定目标的描述类所继承,同...














