LLVM language 參考手冊(譯)(6)

模塊級內聯彙編(Module-Level Inline Assembly)

模塊包含「module-level inline assembly」塊,這與GCC中的「file scope inline asm」塊的相同的。這些塊將被LLVM內部連接並看成一個單獨的單元,但若是但願的話,它們在.ll 文件中能夠是分開的。它的語法十分簡單:html

module asm "inline asm code goes here"
module asm "more can go here"

這個字符串能夠經過非輸出字符轉義包含任意字符。這個轉義序列是「\xx」形式的,這個「xx」是兩個十六位的數字。前端

當彙編代碼生成時,這分內聯彙編代碼十分容易打印爲機器代碼 .s 文件函數

數據佈局(Data Layout

模塊能夠指定一個目標平臺指定的數據佈局的字符串,它指定數據在內存中是如何佈局的。數據佈局的語法很簡單:佈局

target datalayout = "layout specification"

佈局規格由減號字符(' - ')分隔的列表組成 。每種規格以一個字母開頭,而且能夠包含在這個字母定義了某些方面的數據佈局以後的其餘星系。被接受的規格以下:優化

E
代表,目標平臺在數據佈局中使用big-endian格式。高字節在低地址,低字節在高地址。
e
代表,目標平臺在數據佈局中使用little-endian格式。低字節在低地址,高字節在高地址。
S<size>
指定堆棧中的bit的天然對齊。棧變量的對齊提高被限制到這個天然的棧對齊而避免動態棧重對齊。這個棧的對齊長度必須是8位的倍數。若是省略,天然棧對齊默認爲「未指定」 ,這並不妨礙任何對齊提高。
p[n]:<size>:<abi>:<pref>
這指定一個指針的大小和它對於地址空間  n 的< abi>和< pref>對齊偏差。全部長度單位都爲bit。這個地址空間, n 是可選的,若是未指定,則表示缺省地址空間0。 n 的值必須在範圍[1,2^23). 。
i<size>:<abi>:<pref>
這代表一個整數類型以bit  <size>對齊, <size>的值必須爲[1,2^23)
v<size>:<abi>:<pref>
這代表一個向量類型以bit  <size>對齊。
f<size>:<abi>:<pref>
這代表一個浮點類型以bit  <size>對齊。僅當<size>的值被目標平臺支持纔會工做。32(float)和64(double)被全部目標平臺所支持。80 或 128(不一樣於long double)也被某些平臺支持。
a:<abi>:<pref>
這代表對象集合類型的對齊。
m:<mangling>
若是這個屬性存在,就代表了LLVM的名稱將會在輸出的時候被校訂,有如下選項:
e: ELF校訂:private 符號會帶上一個  .L 前綴
m: Mips校訂:private 符號會帶上一個  $ 前綴
o: Mach-O校訂:private 符號會帶上一個  L 前綴。其餘符號將帶上一個  _ 前綴
w: Window COFF前綴:與Mach-O類似,但stdcall 與 fastcall 函數將會帶有一個基於幀大小的後綴。
n<size1>:<size2>:<size3>...
這指明瞭目標平臺的一個以bit爲單位的本地整數寬度集。例如,對於32-bit PowerPC有  n32 ,對於PowerPC 64有  n32:64,或者對於X86-64有 n8:16:32:64。這個集合裏的元素被認爲是有效地支持最廣泛的算術運算。
在每個帶有  <abi>:<pref> 的標識中,指明 <pref> 對齊是可選的。若是 <pref> 被省略,那麼這個冒號 :也應該被省略,而且 <pref> 將與 <abi> 相等。
當爲一個給定的目標平臺構造數據佈局的時候,LLVM將會開始於一組默認標識的集合,但這組集合能夠被  datalayout 關鍵字指明的標識重寫。默認的標識將在如下這個列表中給定:
E - big endian
p:64:64:64 - 64bit的指針將有64bit的對齊。
p[n]:64:64:64 - 其餘地址空間被認爲與默認地址空間是相同。
S0 - 天然堆棧對齊是未指定的
i1:8:8 - i1 是8bit(byte)對齊的
i8:8:8 - i8 是8bit(byte)對齊的
i16:16:16 - i16 是16bit對齊的
i32:32:32 - i32 是32bit對齊的
i64:32:64 - i64 要求32bit的ABI對齊,但64bit對齊是更好的選擇
f16:16:16 - half 是16bit對齊的
f32:32:32 - float 是32bit對齊的
f64:64:64 - double 是64bit對齊的
f128:128:128 - quad 是128bit對齊的
v64:64:64 - 64bit的vector是64bit對齊的
v128:128:128 - 128bit的vector是128bit對齊的
a:0:64 - 集合是64bit對齊的
當LLVM決定一個給定類型的對齊屬性的時候,它將會使用如下規則:
一、若是類型查找明確匹配到了這些標識的其中一個,這個標識將會被使用。
二、若是沒有找到匹配,而且這個類型查找肯定是一個整數類型,那麼將大於這個被使用的查找類型的位寬的最小整數類型將會被使用。若是這些標識中沒有一個大於這個位寬,那麼最大的整數類型將被使用,例如,給定上述的默認標識,i7類型將會使用i8(下一個最大值)的對齊屬性,一樣的i65和i256都將使用i64的對齊屬性(可指定的最大值)。
三、若是沒有找到匹配,而且被查找的類型是一個vector類型,那麼小於這個被查找的vector最大vector類型將會被用做回落。這是根據<128 x double>能夠被64 <2 x double>的組合代替。

數據佈局字符串的函數可能不是你所指望的。值得注意的是,這並非說,指定代碼生成器應使用的對齊屬性的標識取決於前端代碼。spa

相反,若是被指定,目標平臺的數據佈局將被要求匹配到最終的代碼生成器所指望的形式。這個字符串是被用於mid-level優化器來提高代碼的,而且只有這個字符串與最終的代碼生成器所使用的形式相匹配時,這個字符串纔會被使用。若是你想要生成IR,而不但願這些平臺相關的細節嵌入到這個IR中,那麼你不須要指定這個字符串。這將會禁用某些須要精確佈局信息的優化,但這也防止這些優化插入這些平臺相關的細節到IR中。指針

相關文章
相關標籤/搜索