LLVM 中間代碼歸納


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM