LLVM每日谈之五十七 TableGen

TableGen官方文档

TableGen 后端官方文档

TableGen是LLVM的一个工具,其可执行文件的名字为llvm-tblgen。通常在build目录下的bin目录里。

TableGen主要是帮助开发者开发和维护特定领域的信息记录,方便开发者更好的构建这些信息记录,避免错误。尤其是在面对大量的信息记录的时候,用起来比较方便。TableGen的主要使用者是The LLVM Target-Independent Code GeneratorClang diagnostics and attributes. 前者就是我们通常所讲的LLVM后端。

TableGen所作的工作通常就是分析一个文件,将其中的声明实例化,然后将结果交给一个特定领域的后端去处理。

我们接下来看几个实例:

1、在LLVM源码目录之下运行该命令,输出RISCV.td的中的寄存器信息。

./build/bin/llvm-tblgen lib/Target/RISCV/RISCV.td -print-enums -class=Register -I include/ -I lib/Target/RISCV/

其实我们可以看到F0-F31是分为32位和64位的,X0-X31则没有区分。仔细查看RISCV.td,其中并没有关于寄存器的信息。其实这些信息存储在RISCVRegisterInfo.td之中,而RISCV.td包含了RISCVRegisterInfo.td。

//===----------------------------------------------------------------------===//
// Registers, calling conventions, instruction descriptions.
//===----------------------------------------------------------------------===//

include "RISCVRegisterInfo.td"
include "RISCVCallingConv.td"
include "RISCVInstrInfo.td"

2、在LLVM源码之下运行该命令,输出RISCV.td中的指令信息。

./build/bin/llvm-tblgen lib/Target/RISCV/RISCV.td -print-enums -class=Instruction -I include/ -I lib/Target/RISCV/

得到如下输出:

如同1到提到的情况一样,其实指令的信息是在RISCVInstrInfo.td之中,以及其扩展:RISCVInstrInfoM.td、RISCVInstrInfoA.td、RISCVInstrInfoF.td、RISCVInstrInfoD.td、RISCVInstrInfoC.td之中。RISCVInstrInfo.td之中也包含了RISCVInstrInfoX.td这几个td文件。

include "RISCVInstrInfoM.td"
include "RISCVInstrInfoA.td"
include "RISCVInstrInfoF.td"
include "RISCVInstrInfoD.td"
include "RISCVInstrInfoC.td"

如果没有一个后端,TableGen的文件将没有任何意义。之前我们的llvm-tblgen只是输出一些文本格式的信息,这个功能是用来调试TableGen的文件的。TableGen的真正作用是把源文件(.td文件)解释为满足你需要的一个中间表示形式,然后该中间表达形式将被其他部分使用。

TableGen的后端,可以通过llvm-tblgen -help查看,其在Action to perform的选项之下有一个列表。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章