llvm之IR手冊翻譯(1)

2021-07-05 19:34:07 字數 1323 閱讀 7326

原**是:

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

摘要:

這份檔案是針對llvm組合語言的參考手冊。 llvm是乙個靜態單賦值(ssa:這是一種中間表示形式。之所以稱之為單賦值,是因為每個名字在ssa中僅被賦值一次.這是一種高效的資料流分析技術)的,它提供型別安全,低階別的操作,靈活性,並能把「所有的」高階語言乾淨利落表示出來。它是整個llvm編譯策略的所有階段中常用的**表示。

簡介:

llvm的**表示被設計成三個不同的形式來使用:作為乙個記憶體編譯器ir;作為磁碟上的位元組碼(適合於jit編譯器快速裝載);並作為人類可讀的組合語言表示。這允許llvm為編譯器轉換和分析提供強大的中間表示,同時提供乙個自然的方法來除錯和視覺化的轉換。這三種不同形式的llvm的都是等價的。本文件介紹了人類可讀的中間表示。

llvm的表示的目標是在被表現,型別化,和可擴充套件的同時重量輕和級別低。它的目標是各種各樣的「通用中間表示」,通過在乙個足夠低的水平使高階的想法,可以清晰地對映到它(類似微處理器是如何工作的,讓很多的源語言對映到他們)。通過提供型別資訊,llvm可以用作優化的目標:例如,通過指標分析,可以證明,乙個c自動變數從未被當前函式的外部訪問,允許它被提公升到乙個簡單的ssa值代替的儲存單元。

很好的形成:

要注意,本文件描述』很好的形成』llvm組合語言。這與分析器接受的「很好的形成」是有不同的。例如,下面的指令在語法上是好的,但沒有很好地形成:

%x = add i32 1, %x;

因為%x的定義在它的用途中並不佔主導地位。 llvm的基礎設施提供了一次驗證可用於驗證的llvm模組完全角成了。該過程會自動被執行在解析器解析輸入組裝後和在它輸出bitcode優化前。由驗證過程表明錯誤在轉換或傳遞輸入到解析器過程中指出侵權。

識別符號:

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

1,命名值被表示為乙個字串和字首。例如:%for, @divisionbyzero, %a.really.long.identifier。實際使用的正規表示式「[%@] [ - a-za-z$._] [ - a-za-z_0-9]*」。需要在其名稱中的其他字元的識別符號可以用引號包圍。特殊字元可以使用「\ xx」,其中xx是字元以十六進製制的ascii碼進行轉義。以這種方式,任何字元可以在命名值被使用,即使引用自己。「\01」字首可用於全域性變數來抑制重整;

2,無名值表示為字首無符號數值,例如,%12,@2,%44;

3,常數,這在下面的常量部分中描述。

未完待續

llvm之IR手冊翻譯(2)

原 是 下面這些是我自己的翻譯,肯定有很多不恰當的地方,做這些只是希望自己以後翻閱更加方便,如果能對大家有所幫助那是極好的!llvm要求值開始帶字首有兩個原因 1,編譯器不需要擔心名稱衝突與保留字 2一組保留字可能會在將來方便進行擴充套件。此外,未命名識別符號允許編譯器能夠迅速提出乙個臨時變數,而不...

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

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

LLVM組合語言指導手冊之識別符號簡介

llvm的識別符號以兩種基本的型別存在 全域性的和區域性的。全域性識別符號 函式,全域性變數 以 字元開始。區域性識別符號 暫存器名字,型別 以 字元開始。另外,還有三種不同的識別符號格式,各有自己的用途 1.指定的 即自己定義的 變數被表示為乙個字串加上他們的字首。例如,foo,divisionb...