llvm之IR手冊翻譯(2)

2021-07-05 21:02:36 字數 2507 閱讀 7043

原**是:

下面這些是我自己的翻譯,肯定有很多不恰當的地方,做這些只是希望自己以後翻閱更加方便,如果能對大家有所幫助那是極好的!

llvm要求值開始帶字首有兩個原因:1,編譯器不需要擔心名稱衝突與保留字;2一組保留字可能會在將來方便進行擴充套件。此外,未命名識別符號允許編譯器能夠迅速提出乙個臨時變數,而不必避免符號表衝突。

llvm中保留字與其他預言非常相似。對不同的操作碼有不同關鍵字(『add『, 『bitcast『, 『ret『,等…),對基本型別名((『void『, 『i32『,等等),及其他。這些保留字不會與變數名稱衝突,因為他們沒有乙個字首字元(「%」或「@」)。

下面是llvm**:整數變數』%x』乘以8的乙個例子:

簡單的辦法:

%result = mul i32 %x, 8

降低複雜後:

%result = shl i32 %x, 3

最複雜的辦法:

%0 = add i32 %x, %x ; 生成 i32:%0

%1 = add i32 %0, %0 ; 生成 i32:%1

%result = add i32 %1, %1

最後一中方式的8乘以%x說明了llvm的幾個重要詞法特徵:

注釋被「;」分隔,直到行尾。

當計算結果未分配到指定值的時建立臨時的未命名值。

未命名的臨時順序編號(用每個函式遞增計數器,從0開始)。需要注意的是基本塊和匿名函式引數包括在此編號。例如,如果入口基本塊沒有給出乙個標籤名稱並且所有函式的引數是指定的話,就會得到數0。

這也表明,我們按照本文件中的約定。當演示指令,我們將按照指令與注釋定義產生值的型別和名稱。

高層結構:

模組結構:

llvm程式由模組組成,其每乙個模組是輸入程式的轉換單元。每個模組由函式,全域性變數,和符號表組成。模組由llvm的鏈結程式合併函式(全域性變數)的定義,解決了前向宣告,並合併符號表項。這裡是「hello world」程式的例子:

; declare the string constant as a global constant.//宣告字串常量為全域性常量。

@.str = private unnamed_addr constant [13 x i8] c」hello world\0a\00」

; external declaration of the puts function//外部宣告輸出函式

declare i32 @puts(i8* nocapture) nounwind

; definition of main function//定義主函式

define i32 @main()

; named metadata//命名元資料(描述資料的資料,對資料及資訊資源的描述性資訊。)

!0 = !

!foo = !

本例是由乙個名為「.str」的全域性變數,乙個外部宣告的「puts」函式,乙個定義為「main」的函式和命名為元資料「foo」組成的。

在一般情況下,乙個模組由全域性值(其中函式和全域性變數是全域性值)列表組成的。全域性值由乙個指標指向乙個儲存位置表示的(在這種情況下,乙個指向字元陣列,乙個指向函式),並具有下列鏈結型別之一。

鏈結型別:

所有的全域性變數和函式具有以下鏈結型別之一:

私有 全域性值「私有」鏈結只能直接被當前模組中的物件訪問。特別是,連線碼插入帶私有全域性值的模組可能導致私有全域性值必須重新命名,以避免衝突。因為該符號是該模組私有的,所有的引用可以被更新。這不會顯示在物件檔案的任何符號表中。

內部 類似於私有的,但該值表示作為本地符號(stb_local 在elf情況下)在物件檔案中。這對應於c的「靜態」的關鍵字的概念。

外部可用

全域性值鏈結型別為「外部可用」從未存在對應於llvm模組的物件檔案。它們的存在,讓內聯和其他優化利用全域性的定義,它是被某個模組以外的地方知道的。全域性值鏈結型別為外部可用允許隨意被丟棄,而在其他方面與linkonce_odr相同。這種鏈結型別只允許定義,沒有宣告。

linkonce

全域性值用「linkonce」鏈結型別時合併出現同名的其它全域性變數。這可以被用來實現某些形式的內聯函式,模板,或必須在每個使用轉換單元中生成的其他**,但可以被稍後更明確的定義覆蓋。未引用的linkonce全域性值允許被丟棄。需要注意的是鏈結型別為linkonce全域性值實際上並不允許優化這個函式內聯其到呼叫者,因為它不知道,如果函式的這個定義是內程式或是否會通過更強定義所覆蓋的最終定義。為了讓內聯和其他優化,使用「linkonce odr」的鏈結型別。

weak

「weak」鏈結型別和「linkonece」相同合併,所不同的是未引用全域性弱連線可能不被丟棄。這是用於c語言源**宣告為「弱」的全域性值。

common

「common」鏈結型別是最相似的「weak」,但它被用於在c中試探性的定義,如「int x;」在全域性範圍內。「common」鏈結型別和「weak」符號以同樣的方式被合併,並且它們如果未引用可能不被刪除。」common」符號可能沒有乙個明確的值,必須有乙個零初始化,可能不被標記為「常量」。函式和別名可能沒有「common」鏈結。

未完待續

llvm之IR手冊翻譯(1)

原 是 下面這些是我自己的翻譯,肯定有很多不恰當的地方,做這些只是希望自己以後翻閱更加方便,如果能對大家有所幫助那是極好的!摘要 這份檔案是針對llvm組合語言的參考手冊。llvm是乙個靜態單賦值 ssa 這是一種中間表示形式。之所以稱之為單賦值,是因為每個名字在ssa中僅被賦值一次.這是一種高效的...

Ruby日文手冊翻譯2

程式 1 式子 就是 行,呵呵 2 程式的終止 程式是由式子併排組成的。式子和式子之間使用分號或者換行來區分 譯者注 如果你想把兩行式子 寫在同一行中間就用分號隔開,如果分開在兩行就無需分號 但是如果使用反斜槓 的話,表示下 一行繼續接著上一行。例 print hello world n 一如既往的...

BSD庫函式手冊翻譯之pthread join函式

pthread join 等待執行緒結束 include intpthread join pthread t thread,void value ptr 除非目標執行緒已經終止,否則函式pthread join 會 暫停呼叫執行緒 的執行 直到目標執行緒終止 為止。當傳入乙個非null的引數valu...