TableGen是LLVM的一個工具,其可執行文件的名字爲llvm-tblgen。通常在build目錄下的bin目錄裏。
TableGen主要是幫助開發者開發和維護特定領域的信息記錄,方便開發者更好的構建這些信息記錄,避免錯誤。尤其是在面對大量的信息記錄的時候,用起來比較方便。TableGen的主要使用者是The LLVM Target-Independent Code Generator和Clang 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的選項之下有一個列表。