譯 LLVM IR中間碼指令集

2021-10-02 04:38:00 字數 3171 閱讀 3439

先說點廢話: 

國內的it水平離世界頂級水平差距實在有點大, 個人感覺 有些因素導致這個結果:

2.牆. 有用的文件在牆外,不翻牆看不到. 

3.收費**查詢. 實在看不起, 沒錢啊. 在這個事情上收費簡直是個生孩子沒p眼的生意. 

4.中文**太水. 例如:導師的崇高感和師娘的優美感

5.**權重問題,引致優秀**從來都是發表在國外.

以下是 谷哥翻譯的結果, 我的英文水平太爛, 大家可以對照 英文版一起看. 我就是對照著看的. 

llvm語言參考手冊

本文件是llvm組合語言的參考手冊。llvm是基於靜態單一分配(ssa)的表示形式,可提供型別安全性,低階操作,靈活性以及清晰地表示「所有」高階語言的功能。它是在llvm編譯策略的所有階段中使用的通用**表示形式。

簡介llvm**表示被設計為以三種不同的形式使用:作為記憶體中的編譯器ir,作為磁碟上的位**表示(適用於即時編譯器的快速載入)以及作為人類可讀的程式集語言表示。這使llvm可以為有效的編譯器轉換和分析提供強大的中間表示,同時提供除錯和視覺化轉換的自然方法。llvm的三種不同形式都是等效的。本文件描述了人類可讀的表示形式和符號。

llvm表示的目標是輕量級和低階,同時要表現,鍵入和擴充套件。它的目標是成為一種「通用ir」,因為其級別足夠低,可以將高階思想清晰地對映到它(類似於微處理器如何成為「通用ir」,從而允許將許多源語言對映到它們)。 )。通過提供型別資訊,llvm可以用作優化的目標:例如,通過指標分析,可以證明從未在當前函式之外訪問c自動變數,從而將其提公升為簡單的ssa值而不是記憶體位置。

格式正確

重要的是要注意,該文件描述了「格式良好」的l​​lvm組合語言。解析器接受的內容與「格式正確」的內容之間存在差異。例如,以下指令在語法上尚可,但格式不正確:

%x = add i32 1, %x

因為的定義%x並不支配其所有用途。llvm基礎結構提供了乙個驗證通行證,可用於驗證llvm模組格式正確。此過程在解析輸入程式集後由解析器自動執行,而在輸出位**之前由優化器自動執行。驗證程式遍歷指出的違規表示轉換遍歷中存在錯誤或輸入到解析器。

識別符號llvm識別符號有兩種基本型別:全域性和本地。全域性識別符號(函式,全域性變數)以'@' 字元開頭。本地識別符號(暫存器名稱,型別)以'%'字元開頭 。此外,出於不同的目的,存在三種不同的識別符號格式:

命名值以帶有字首的字串表示。例如%foo,@divisionbyzero, %a.really.long.identifier。實際使用的正規表示式為「 [%@][-a-za-z$._][-a-za-z$._0-9]*」。在名稱中需要其他字元的識別符號可以用引號引起來。可以使用"\xx"where xx是十六進製制字元的ascii碼對特殊字元進行轉義。這樣,任何字元都可以用在名稱值中,甚至可以用引號引起來。該"\01"字首可用於全域性值以抑制篡改。

未命名的值以帶有字首的無符號數字值表示。例如%12,@2,%44。

常量,在下面的常量部分中介紹。

llvm要求值以字首開頭有兩個原因:編譯器不必擔心帶有保留字的名稱衝突,並且將來可以擴充套件保留字的集合而不會帶來任何損失。此外,未命名的識別符號使編譯器可以快速提出乙個臨時變數,而不必避免符號表衝突。

llvm中的保留字與其他語言中的保留字非常相似。有一些關鍵字用於不同的操作碼(「,add」,「 bitcast,」 ret等),原始型別名稱(「,void」,「 i32等等」)等。這些保留字不能與變數名衝突,因為它們都不以字首字元('%'或'@')開頭。

這是將整數變數' %x'乘以8 的llvm**示例:

簡單的方法:

%result = mul i32 %x, 8

強度降低後:

%result = shl i32 %x, 3

困難的方法:

%0 = add i32 %x, %x           ; yields i32:%0

%1 = add i32 %0, %0           ; yields i32:%1

%result = add i32 %1, %1

最後一種乘以%x8的方法說明了llvm的幾個重要詞彙特徵:

注釋以'分隔,;直到行尾。

未將計算結果分配給命名值時,將建立未命名的臨時物件。

未命名的臨時檔案按順序編號(使用按功能遞增的計數器,從0開始)。請注意,該編號中包括基本塊和未命名的功能引數。例如,如果沒有為條目基本塊指定標籤名稱,並且所有功能引數都被命名,則它將獲得數字0。

它還顯示了我們在本文件中遵循的約定。在演示指令時,我們將在指令後附上注釋,該注釋定義產生的值的型別和名稱。

高層結構

模組結構

llvm程式由組成module,每個都是輸入程式的翻譯單元。每個模組由函式,全域性變數和符號表條目組成。可以將模組與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」。

通常,模組由全域性值列表組成(其中函式和全域性變數均為全域性值)。全域性值由指向記憶體位置的指標(在這種情況下,指向char陣列的指標和指向函式的指標)表示,並具有以下鏈結型別之一。

private

具有「 private」鏈結的全域性值只能由當前模組中的物件直接訪問。特別是,將**鏈結到具有私有全域性值的模組中可能會導致在需要時將私有重新命名以避免衝突。因為該符號是模組專用的,所以可以更新所有引用。這不會顯示在目標檔案的任何符號表中。

internal

與private相似,但是該值stb_local在目標檔案中顯示為本地符號(對於elf)。這對應static於c中關鍵字' ' 的概念。

csdn 不讓發長文, 沒辦法了, 讀者請自行翻譯吧, 用chrome瀏覽器就行.  外國的月亮真他媽的圓~~~~

mysql bin指令集 mysql指令集

一 連線mysql。1 連線到本機上的mysql。首先開啟dos視窗,然後進入目錄mysql bin,再鍵入命令mysql u root p,回車後提示你輸密碼.注意使用者名稱前可以有空格也可以沒有空格,但是密碼前必須沒有空格,否則讓你重新輸入密碼.如果剛安裝好mysql,超級使用者root是沒有密...

gbip指令集 GB CPU 指令與指令集

gb cpu 指令與指令集 到目前為止,雖然 cpu 已經擁有了算術邏輯單元 alu 進行算術邏輯運算和使用暫存器儲存資料,但它仍然缺少一些正常工作時需要的資訊.就像建築工人無法僅僅依靠材料和工具憑空造出一棟高樓大廈,除非建築師能為其提供詳細的建築圖紙.cpu 也是一樣的,開發者需要通過某種方式告訴...

RISC V指令集介紹 整數基本指令集

前段時間在修改 picorv32 核心 乙個riscv 32的cpu核心 閱讀了一下riscv指令集的手冊。在此,做一下簡單記錄。rv32i 32位risc v整數指令集 1.暫存器 32個x暫存器,rv32下x reg是32位寬 x0 硬連線 常數0 x1 x31 31個通用reg pc 額外的使...