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的選項之下有一個列表。

 

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