編寫LLVM的後端 一)

2021-05-23 23:19:17 字數 2181 閱讀 1300

本文件是指如何編寫乙個可以把llvm的中間表示轉換成乙個特定的機器或者其他語言的後端。對於乙個特定機器的**或者是組合語言或者是二進位制**。

llvm後端的是乙個和目標相關的**產生器,可以建立不同型別的目標處理器的輸出,如x86, powerpc, alpha, sparc。後端也可以用於產生針對cell處理器的spu或者gpu來支援計算核心的執行。

文件重點描述了在llvm/lib/target子目錄下存在的一些例子。特別的,文件描述了如何建立乙個靜態編譯器(乙個產生文字彙編)。sparc有相對標準的特性,如risc指令集和乙個比較直接的呼叫約定。

預備只是:

下面的一些基本文件是在閱讀本文件之前應該閱讀的:

llvm language reference manual

the llvm target-independent code generator

tablegen fundamentals

writing an llvm pass

基本步驟:

寫乙個的編譯器後端,把llvm  ir**轉換成乙個特定的目標,需要遵循以下步驟:

建立乙個 targetmachine類的子類來描述你的目標機器的特性。拷貝已經存在的某些機器的類和標頭檔案,從sparctargetmachine.cpp和sparctargetmachine.h開始,然後把這兩個檔案改為你自己的目標的檔名。

描述你的目標機器的暫存器集合,使用 tablegen為暫存器定義,暫存器別名和來自目標特定的registerinfo.td的暫存器類產生**。你應該為targetinfo類新增一些額外的**來表示這個目標機器支援的指令集。

描述llvm ir的選擇和轉換,從乙個指令的dag表示到本地目標指令。使用tablegen產生符合模式的**,基於目標特定的targetinstrinfo.td的額外資訊來用tablegen產生符合模式的**和選擇指令。編寫**檔案***xiseldagtodag.cpp,***x是你的目標名稱。用來進行模式匹配和dag到dag的指令選擇。也可以寫***isellowering.cpp來代替或者去除selectiondag中不支援的資料型別和操作。

編譯彙編列印,來進行llvm到彙編的轉換,乙個targetasminfo的子類。

可選的,新增對子目標的支援。你可以寫對targetsubtarget類的子類。這樣執行用-mcpu和-mattr的命令列選項。

可選的,新增jit支援,來建立乙個機器碼的發射器 (targetjitinfo的子類),可以用於直接把二進位制**儲存在記憶體中。

在你寫的.cpp和.h檔案中,先把這些方法寫出來,後面再去實現他們。否則,開始的時候你並不知道哪些私有成員會被這個類需要,那個元件需要被子類化。

preliminaries

實際建立乙個編譯器的後端,你需要建立和修改一些檔案。這裡討論乙個最簡化的工作。但實際上使用llvm中目標依賴的**產生器,你必須進行在llvm target-indepedent code generator中的那些步驟。

首先,應該建立乙個子目錄來存放和你的目標相關的檔案。假設你的目標是dummy,那建立lib/target/dummy目錄。

在這個新的目錄,建立乙個makefile,最簡單的方法是拷貝乙個已存在的目標的makefile,然後進行修改,這個makefile至少要有level, libraryname和target這些變數。然後include $(level)/makefile.common。這個庫可以命名為llvmdummy(參考mips目標)。或者你可以把這個庫分割為llvmdummy和llvmdummyasmprinter,後者應該實現在乙個lib/target/dummy的子目錄(參考powerpc目標)。為了能夠讓你的目標實現做一些實際的事情,你需要實現targetmachine的子類。這個實現一般位於lib/targe/dummytargetmachine.cpp檔案。但是在lib/target目錄中的任何檔案都會被編譯。使用llvm目標無關的**生成器,你可以做當前機器後端的工作:建立乙個llvmtargetmachine的子類。

使llvm編譯並鏈結你的目標機器的**,你需要把檔案新增到targets_to_build變數。為了完成這一步,你需要修改configure指令碼,在傳遞 --enable-targets選項。搜尋configure指令碼中的targets_to_build,新增你的目標到列表中。然後重新培訓。另外一種方法你也可以修改修改autotools/configure.ac,並且需要執行./autoconf/autogen.sh指令碼。

thanks

mk

我的LLVM學習筆記 編寫LLVM demo

一 安裝llvm 二 使用clion建立demo工程 main.cpp 如下 include llvm ir verifier.h include llvm executionengine genericvalue.h include llvm executionengine interpreter...

在LLVM中編寫pass的詳細教程(1)

可能你已經大概知道了llvm中pass是什麼,那麼你或許正躍躍欲試想在llvm中實際編寫乙個pass試試 即使你對pass的概念還很朦朧,實際practice一下或許也恰恰可以幫助你更加形象和具體的理解llvm中的pass。所以本文就是要向你介紹如何在llvm中實際編寫並使用乙個pass的入門教程。...

LLVM的參考資料

想用llvm寫後端編譯器時,收集了一些資料。關於llvm的中文資料並不多,當然llvm自己的官方文件倒是非常的全,不過是全英文。1 關於llvm和clang的基本介紹就不說了,這個資料還是很比較多且容易理解的。2 有乙個關於後端開發的譯本 這是翻譯自官方文件的。不過像是機器翻譯的,有些語句讀起來不太...