html代码生成器_LLVM 目标无关代码生成器(第四章)

本文主要介绍了LLVM的MC层,用于表示机器编码级别的代码,去除高层概念如常量池和全局变量。MCStreamer API是汇编器设计的核心,提供EmitLabel等方法处理汇编指令。MCContext管理唯一的数据结构,如symbols和sections。MCSymbol表示符号,MCSection代表目标文件的section,而MCInst则用于表示简单的、目标无关的机器指令。
摘要由CSDN通过智能技术生成
本文是一篇译文,翻译自:
https://llvm.org/docs/CodeGenerator.html​llvm.org
如有问题,敬请指出。
转载需注明出处,若需相关专业翻译服务,可联系我。

本文目录

  • 第一章 介绍
P2Tree:LLVM 目标无关代码生成器(第一章)​zhuanlan.zhihu.com
e321b9ae5ecb467de3fcba3d929ec44a.png
  • 第二章:目标描述类
P2Tree:LLVM 目标无关代码生成器(第二章)​zhuanlan.zhihu.com
7148b5351e0114d03db0f6b9e1c2bb75.png
  • 第三章:机器代码描述类
P2Tree:LLVM 目标无关代码生成器(第三章)​zhuanlan.zhihu.com
805f98683145e581a8694dc04b56ed1b.png
  • 第四章:MC 层
P2Tree:LLVM 目标无关代码生成器(第四章)​zhuanlan.zhihu.com
118f88d86af88b161e38b523550c8ff2.png
  • 第五章:目标无关的代码生成算法
P2Tree:LLVM 目标无关代码生成器(第五章)​zhuanlan.zhihu.com
bb0b40a73b5367b2ed9c0d30e4d19b96.png
  • 第六章:实现一个原生汇编器
P2Tree:LLVM 目标无关代码生成器(第六章)​zhuanlan.zhihu.com
f3a383da047b07389bbe074a0cda7475.png

4 MC 层

MC 层被用来表示机器编码级别的代码,相比于更高层的表示形式,它去除了像常量池、跳转表、全局变量等概念。在这一层上,LLVM 处理如 Label 名称、机器指令、目标文件段信息。这一层的代码在一些阶段非常重要,比如代码生成的最后阶段(也就是写入 .s 或 .o 文件时),或者被 llvm-mc 工具用来作为独立汇编器和反汇编器使用。

这一章节描述一些很重要的类,在之后的章节,还会描述和这一层交互的其他很重要的子系统。

4.1 MCStreamer API

MCStreamer API 被认为是汇编器中设计最好的 API。它作为一个抽象的接口,被实现为不同的功能(比如输出 .s 文件、输出 ELF 格式的 .o 文件等),但是它的 API 直接对应于你在 .s 文件中对应的内容。MCStreamer 类中,对于每一类指示符(译注:directive,和 instruction 有区分)都有一个对应的方法来处理,比如 EmitLabel,EmitSymbolAttribute,SwitchSection,EmitValue 等,这些都是汇编级别的指示符。它还提供一个 EmitInstruction 方法,用来将 MCInst 结构的代码输出到流。

对于 llvm-mc 独立汇编器和代码生成器来说,这个类都非常重要。llvm-mc 工具实际上就是一个汇编解析器加 MCStreamer 的输出;而在代码生成器中,Code Emission 阶段利用 MCStreamer 将高级别的 LLVM IR 和 Machine* 结构构造成低层次的 MC 层结构,同时也是通过 MCStreamer 类发出指令。

从 MCStreamer 的实现角度看,有两大块非常重要的部分:一个是写出 .s 文件(子类 MCAsmStreamer),另一个是写出 .o 文件(子类 MCObjectStreamer)。MCAsmStreamer 通过每一个 Emit* 方法直接输出指令,但对于 MCObjectStreamer,还需要实现一个完整的汇编器的功能。

对于目标相关的指令,MCStreamer 会依赖于一个 MCTargetStreamer 实例。每一个目标都会继承这个类来实现一个子类,每一个方法都会有两种多态的继承实现,也就是一个输出 object 的 streamer 和一个输出 asm 的 streamer。通过后者发射指示符(比如 EmitFnStart 发射 .fnstart),通过前者发射汇编的逻辑代码。

为了让 LLVM 顺利使用这个类,在目标初始化时,必须通过 TargetRegistry::RegisterAsmStreamer 和 TargetRegistry::RegisterMCObjectStreamer 两个回调函数来分配 MCStreamer 的 streamer 基类对象,并将其传递给 createAsmStreamer 等位置来构造目标 streamer 子对象。

4.2 MCContext 类

MCContext 类拥有 MC 层很多唯一性的数据结构,包括 symbols、sections 等。所以,你可以与这个类来交互,实现创建 symbols 和 sections 的目的。这个类没有子类继承。

4.3 MCSymbol 类

MCSymbol 类用来表示一个汇编文件中 symbol 的结构(也就是 label)。有两种类型,一种是汇编器临时的符号,另一种是普通符号。汇编器临时符号被汇编器用来做一些处理,但会在输出目标文件时被删去。通常这种符号会在 label 开头名字加一个前缀符号,比如在 MachO 平台下,会有一个 L 前缀符号的 label 用来表示临时符号。

MCSymbols 只被 MCContext 使用来创建符号。这意味着可以通过指针运算来检查两个符号是否是同一个。但需要注意,两个指针不相等并不表示两个符号被放在不同的地址(译注:两个符号可能在同一个目标文件地址),比如在汇编文件中有如下结构:

foo:
bar:
  .byte 4

我们看到,foo 和 bar 这两个 label 是在同一个目标文件地址的(但他们是不同符号)。

4.4 MCSection 类

MCSection 类用来表示目标文件中的 section(译注:翻译为段),对于不同的目标文件,这个类会被继承为不同的子类(比如 MCSectionMachO,MCSectionCOFF,MCSectionELF)。同样的,它也只被 MCContext 使用来创建段。MCStreamer 有一个对于当前段的标记,可以通过 SwitchToSection 来改变段标记。

4.5 MCInst 类

MCInst 类是目标无关的指令表示,相比于 MachineInstr,它更为简单,它维护着每一条机器指令的指令码和指令操作数的 vector。MCOperand(指令操作数)有三种不同的类型:一个简单立即数、一个目标寄存器的 ID 或一个符号表示(MCExpr 类型,比如 "Lfoo-Lbar+42")。

MCInst 现在通常被用来表示 MC 层的机器指令。它被指令编码、指令输出、汇编 parser 的类型生成和反汇编器使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值