Identifiers 標識符 @ 全局 % 局部 后接字符串 命名量 @name %name 無符號數字 未命名量 @42 %42 類型系統 void 空類型 <type> * 指針類型 <returntype> (<parameter list>) 函數類型 < <# elements> x <elementtype> > 向量類型 [<# elements> x <elementtype>] 數組類型 { <type list> } 普通結構體類型 <{ <type list> }> 打包結構體類型 metadata 元數據類型 label 標簽類型 token 詞元類型 類型系統(例子) void 空 i32 * 指針 i32 (i32) 函數 <5 x i32> 向量 [5 x i32] 數組 { i32, i32, i32 } 普通結構體 <{ i32, i32, i32 }> 打包結構體 元數據 ; 未命名元數據節點 ; 用於被命名元數據引用 !0 = !{!"zero"} !1 = !{!"one"} !2 = !{!"two"} ; 命名元數據 !name = !{!0, !1, !2} !name --- !0 |-- !1 |-- !2 模塊層次內聯匯編 module asm "內聯匯編代碼" Target Triple target triple = "x86_64-amd64-freebsd" First Class Types 第一類型 Single Value Types 單值類型 只在寄存器里頭有效 Integer Type 整數類型 iN ;N為比特數 (通用描述) i1 一個比特整數 i32 32為整數 Floating-Point Types 浮點類型 half - 16位浮點值 float - 32位浮點值 double - 64位浮點值 fp128 - 128位浮點值 x86_fp80 - 80位浮點值 ppc_fp128 - 128位浮點值 模塊結構 程序由模塊組成,每個模塊都是輸入程序的翻譯單元。 Hello, world 模塊 ; 定義字符串常量作為全局常量 @.str = private unnamed_addr constant [13 x i8] c"hello world\0A\00" ; 外部聲明的 puts 函數 declare i32 @puts(i8* nocapture) nounwind ; main 函數的定義 define i32 @main() { ; i32()* ; [13 x i8] 轉換到 i8... %cast210 = getelementptr [13 x i8], [13 x i8]* @.str, i64 0, i64 0 ; 調用 puts 函數,將字符串寫入 stdout call i32 @puts(i8* %cast210) ret i32 0 } ; 命名元信息 !0 = !{i32 42, null, !"string"} !foo = !{!0} 指令參考 ========= Terminator Instructions 指示當前塊完成后,執行哪個塊。 終結指令典型的產生一個 void 值:他們影響控制流,而不是值。(invoke指令是一個例外) ret 返回 br 二元條件分支/無條件轉移 switch 多條件分支 indirectbr invoke 普通/帶異常調用 resume 拋出異常? catchswitch 捕獲異常 catchret cleanupret unreachable 不可到達(無語義) Binary Operations add 加 fadd 浮點加 sub 減 fsub 浮點減 mul 乘 fmul 浮點乘 udiv 無符號整數除 sdib 帶符號整數除 fdiv 浮點除 urem 無符號整數求余 srem 帶符號整數求余 frem 浮點數求余 運算\類型 無符號整數 帶符號整數 浮點數 + add fadd - sub fsub * mul fmul / udiv sdiv fdiv % urem srem frem Bitwise Binary Operations shl 左移 lshr 邏輯右移 ashr 算數右移 and 與 or 或 xor 異或 Vector Operations extractelement 取出元素 insertelement 插入元素 shufflevector Aggregate Operations extractvalue 取出值 insertvalue 插入值 Memory Access and Addressing Operations alloca 分配內存 load 從內存加載 store 儲存到內存 fence cmpxchg atomicrmw 自動修改內存 getelementptr 獲取 aggregate(集合) 數據結構的子成員地址 Coversion Operations 這個類型為轉換指令(強制類型轉換|鑄造casting) 都取一個單一運算對象和一個類型。 對運算對象提供一系列位轉換。 trunc .. to 截斷轉換 zext .. to 零擴展轉換 sext .. to 符號位擴展轉換 fptrunc .. to 浮點截斷轉換 fpext .. to 浮點擴展 fptoui .. to 浮點轉無符號整數 fptosi .. to 浮點轉帶符號整數 uitofp .. to 無符號整數轉浮點 sitofp .. to 帶符號整數轉浮點 ptrtoint .. to 指針轉整數 inttoptr .. to 整數轉指針 bitcast .. to 位模式轉換(重新解釋,不改變任何二進制位) addrepacecast .. to 地址空間轉換 Other Operations icmp 整數比較 fcmp 浮點數比較 phi φ 節點 select 條件值選擇 call 簡單函數調用 va_arg 可變參數 landingpad catchpad cleanuppad