在描述處理器結構時,需要描述很多重複的資訊,如暫存器和指令集。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專案季度狀態報告中,...