LLVM中TableGen工具的使用

2021-06-26 10:02:57 字數 1399 閱讀 5557

在描述處理器結構時,需要描述很多重複的資訊,如暫存器和指令集。llvm工具鏈中有個tablegen工具,可以靈活地描述處理器中這些重複資訊。使用tablegen工具,可以減少我們重複編寫描述指令集和暫存器的**量,在減少我們工作的同時也減少了出錯的機率。所以,在llvm中增加一種新的處理器後端時,我們通常使用tablegen工具描述新處理器後端的暫存器和指令集。

要使用tablegen工具幫助我們描述新處理器後端的指令集和暫存器,我們首先要用tablegen自定義的.td檔案格式來描述,然後使用tablegen生成對應的c++**,嵌入到llvm中。

.td格式

tablegen檔案是由一系列記錄(record)組成的,記錄可以分為兩種:類(class)和定義(defination)。類和高階語言中的類相似用來簡化對定義的書寫。定義是最基本的記錄形式,它使用def關鍵字來標記。例如def r1是乙個定義,r1是這個定義的名字,可以是乙個暫存器或者一條指令,它又乙個string型別的變數name,name的值是「r1」,注意,記錄中的變數都必須有值。類相對定義來講稍微抽象一點,它的關鍵字是class。它是用來簡化對定義中公共部分的書寫。

class intreg

這就是乙個名為intreg的類,bits<5>是5個位元位型別,變數名叫num。

def  r1 : intreg

暫存器r1繼承了類intreg,r1中便有了bits<5>型別的num,同時還有string型別的name。使用let關鍵字可以修改r1中繼承過來的5型別的變數num的值。例如def r2 : intreg ,表示r2中繼承過來的num的值修改為0b11111.

tablegen支援的型別包括:

bit:1位,布林型別

int:整形,32位的整形值

string:字串型別,長度任意

bits:位串,表示n位二進位制數

list:列表,表示乙個元素是tr型別的列表,tr是任意型別,包括列表本身

class type:類,和列表型別一起使用時,用來之處列表中元素的型別為該類的子類

code:**段型別,表示一段**

dag:dag型別,表示巢狀有向圖中乙個組成元素。

.td檔案中可以使用c++中的//和/**/注釋符,也可以用include關鍵字包含另乙個.td檔案。使用tablegen工具的指令是:

tblgen    ***.td    -gen-register-desc    -o     ***genregisterinfo.inc     //暫存器描述

tblgen    ***.td    -gen-instr-desc         -o     ***geninstrinfo.inc      //指令集

tblgen    ***.td    -gencallingconv        -o     ***gencallingconv.inc    //呼叫約束描述

LLVM 4中將加入新的LLVM鏈結器LLD

lld將被新增到llvm 4 rc1中,並預設啟用。lld自稱在效能上大大優於gcc ld。雖然該新鏈結器早可用於構建在用的freebsd amd64基系統 base system 但是這次將其新增到llvm中依然是實驗性的,在出現問題時會回退到rc2。在最新發布的freebsd專案季度狀態報告中,...

LLVM 4中將加入新的LLVM鏈結器LLD

lld將被新增到llvm 4 rc1中,並預設啟用。lld自稱在效能上大大優於gcc ld。雖然該新鏈結器早可用於構建在用的freebsd amd64基系統 base system 但是這次將其新增到llvm中依然是實驗性的,在出現問題時會回退到rc2。在最新發布的freebsd專案季度狀態報告中,...

LLVM 4中將加入新的LLVM鏈結器LLD

lld將被新增到llvm 4 rc1中,並預設啟用。lld自稱在效能上大大優於gcc ld。雖然該新鏈結器早可用於構建在用的freebsd amd64基系統 base system 但是這次將其新增到llvm中依然是實驗性的,在出現問題時會回退到rc2。在最新發布的freebsd專案季度狀態報告中,...