$30 off During Our Annual Pro Sale. View Details »

LLVMについて調べた

oyuk
July 31, 2017
150

 LLVMについて調べた

oyuk

July 31, 2017
Tweet

Transcript

  1. LLVM
    について調べた
    2017/03/23
    oyuk(@oydku)

    View Slide

  2. 自己紹介
    oyuk(@oydku)
    プログラマ

    View Slide

  3. LLVM
    とは?
    C++
    で書かれたコンパイラ基盤
    コンパイラを作るためのフレー
    ムワー

    View Slide

  4. コンパイラの基本的な構造
    Frontend
    字句解析、
    構文解析、
    意味解析
    Optimizer
    冗長性除去、
    定数畳み込み等
    Backend

    命令生成

    View Slide

  5. LLVM
    のアレ
    LLVM
    はOptimizer
    とBackend
    を担当
    Frontend
    は独自に実装できる(Clang
    が有名?)
    LLVM‑IR(LLVM
    中間言語)
    がFrontend
    とLLVM
    のインター
    フェー

    View Slide

  6. LLVM‑IR
    作り方(C
    言語)
    holloworld.c
    を書く
    #
    i
    n
    c
    l
    u
    d
    e <
    s
    t
    d
    i
    o
    .
    h
    >
    i
    n
    t m
    a
    i
    n
    (
    )
    {
    p
    r
    i
    n
    t
    f
    (
    "
    H
    e
    l
    l
    o
    , w
    o
    r
    l
    d
    !
    \
    n
    "
    )
    ;
    r
    e
    t
    u
    r
    n 0
    ;
    }

    View Slide

  7. LLVM‑IM
    コマンドを実行する
    c
    l
    a
    n
    g ‐
    S ‐
    e
    m
    i
    t

    l
    l
    v
    m ‐
    o h
    e
    l
    l
    o
    w
    o
    r
    l
    d
    .
    l
    l h
    e
    l
    l
    o
    w
    o
    r
    l
    d
    .
    c

    View Slide

  8. LLVM‑IM
    helloworld.ll
    出来る(
    一部抜粋)
    これがLLVM‑IR
    @
    .
    s
    t
    r = p
    r
    i
    v
    a
    t
    e u
    n
    n
    a
    m
    e
    d
    _
    a
    d
    d
    r c
    o
    n
    s
    t
    a
    n
    t [
    1
    5 x i
    8
    ] c
    "
    H
    e
    l
    l
    o
    , w
    o
    r
    l
    d
    !
    \
    0
    A
    \
    0
    0
    ; F
    u
    n
    c
    t
    i
    o
    n A
    t
    t
    r
    s
    : n
    o
    u
    n
    w
    i
    n
    d s
    s
    p u
    w
    t
    a
    b
    l
    e
    d
    e
    f
    i
    n
    e i
    3
    2 @
    m
    a
    i
    n
    (
    ) #
    0 {
    %
    1 = a
    l
    l
    o
    c
    a i
    3
    2
    , a
    l
    i
    g
    n 4
    s
    t
    o
    r
    e i
    3
    2 0
    , i
    3
    2
    * %
    1
    , a
    l
    i
    g
    n 4
    %
    2 = c
    a
    l
    l i
    3
    2 (
    i
    8
    *
    , .
    .
    .
    ) @
    p
    r
    i
    n
    t
    f
    (
    i
    8
    * g
    e
    t
    e
    l
    e
    m
    e
    n
    t
    p
    t
    r i
    n
    b
    o
    u
    n
    d
    s (
    [
    r
    e
    t i
    3
    2 0
    }

    View Slide

  9. LLVM‑IR
    helloworld.ll
    からbitcode
    を作る
    helloworld.bc
    ができる
    LLVM‑IR
    をバイナリに置き換えたようなアレ
    l
    l
    v
    m

    a
    s h
    e
    l
    l
    o
    w
    o
    r
    l
    d
    .
    l
    l

    View Slide

  10. LLVM‑IR
    helloworld
    すっぞ
    $ l
    l
    i H
    e
    l
    l
    o
    w
    o
    r
    l
    d
    .
    b
    c
    H
    e
    l
    l
    o
    , w
    o
    r
    l
    d
    !

    View Slide

  11. LLVM‑IR
    をどうやって作る?
    LLVM‑IR
    を作るAPI
    が提供されている
    c++
    でhelloworld
    してみる

    View Slide

  12. LLVM‑IR
    の構造
    Module
    Function
    BasicBlock
    Instruction

    View Slide

  13. LLVM‑IR
    の構造
    Module
    翻訳する1
    つの単位
    Function
    いわゆる関数
    BasicBlock
    Instruction
    をまとめたもの
    Instruction
    命令

    View Slide

  14. 作るもの詳細
    LLVM
    のputs
    という関数(c
    言語の関数?)
    を呼んでhelloworld
    を標
    準出力に出力する
    puts
    関数
    引数に8bit
    のinteger
    を指すポインタ
    返り値が32bit
    のinteger

    View Slide

  15. Module
    top
    って名前のModule
    作る
    s
    t
    d
    :
    :
    u
    n
    i
    q
    u
    e
    _
    p
    t
    r
    <
    l
    l
    v
    m
    :
    :
    M
    o
    d
    u
    l
    e
    > T
    h
    e
    M
    o
    d
    u
    l
    e =
    l
    l
    v
    m
    :
    :
    m
    a
    k
    e
    _
    u
    n
    i
    q
    u
    e
    <
    l
    l
    v
    m
    :
    :
    M
    o
    d
    u
    l
    e
    >
    (
    "
    t
    o
    p
    "
    ,
    T
    h
    e
    C
    o
    n
    t
    e
    x
    t
    )
    ;

    View Slide

  16. Functin
    main
    という関数を作る
    l
    l
    v
    m
    :
    :
    F
    u
    n
    c
    t
    i
    o
    n
    T
    y
    p
    e *
    f
    u
    n
    c
    T
    y
    p
    e =
    F
    u
    n
    c
    t
    i
    o
    n
    T
    y
    p
    e
    :
    :
    g
    e
    t
    (
    b
    u
    i
    l
    d
    e
    r
    .
    g
    e
    t
    V
    o
    i
    d
    T
    y
    (
    )
    ,
    f
    a
    l
    s
    e
    )
    ;
    l
    l
    v
    m
    :
    :
    F
    u
    n
    c
    t
    i
    o
    n
    * m
    a
    i
    n
    F
    u
    n
    c = l
    l
    v
    m
    :
    :
    F
    u
    n
    c
    t
    i
    o
    n
    :
    :
    C
    r
    e
    a
    t
    e
    (
    f
    u
    n
    c
    T
    y
    p
    e
    ,
    l
    l
    v
    m
    :
    :
    F
    u
    n
    c
    t
    i
    o
    n
    :
    :
    E
    x
    t
    e
    r
    n
    a
    l
    L
    i
    n
    k
    a
    g
    e
    ,
    "
    m
    a
    i
    n
    "
    ,
    T
    h
    e
    M
    o
    d
    u
    l
    e
    .
    g
    e
    t
    (
    )
    )
    ;

    View Slide

  17. BasicBlock
    entry
    というBasicBlock
    をmain
    関数内に作る
    命令の挿入位置をentry
    に設定する
    B
    a
    s
    i
    c
    B
    l
    o
    c
    k
    * e
    n
    t
    r
    y =
    l
    l
    v
    m
    :
    :
    B
    a
    s
    i
    c
    B
    l
    o
    c
    k
    :
    :
    C
    r
    e
    a
    t
    e
    (
    T
    h
    e
    C
    o
    n
    t
    e
    x
    t
    ,
    "
    e
    n
    t
    r
    y
    "
    ,
    m
    a
    i
    n
    F
    u
    n
    c
    )
    ;
    b
    u
    i
    l
    d
    e
    r
    .
    S
    e
    t
    I
    n
    s
    e
    r
    t
    P
    o
    i
    n
    t
    (
    e
    n
    t
    r
    y
    )
    ;

    View Slide

  18. Instruction
    helloworld
    の文字列をグロー
    バルに宣言する。
    何でグロー
    バルかは
    わかってないお
    l
    l
    v
    m
    :
    :
    V
    a
    l
    u
    e *
    h
    e
    l
    l
    o
    W
    o
    r
    l
    d =
    b
    u
    i
    l
    d
    e
    r
    .
    C
    r
    e
    a
    t
    e
    G
    l
    o
    b
    a
    l
    S
    t
    r
    i
    n
    g
    P
    t
    r
    (
    "
    h
    e
    l
    l
    o w
    o
    r
    l
    d
    !
    \
    n
    "
    )
    ;

    View Slide

  19. Instruction2
    p
    u
    t
    s
    の引数を設定する
    8bit
    のInteger
    のポインタを設定
    s
    t
    d
    :
    :
    v
    e
    c
    t
    o
    r
    <
    l
    l
    v
    m
    :
    :
    T
    y
    p
    e *
    > p
    u
    t
    s
    A
    r
    g
    s
    ;
    p
    u
    t
    s
    A
    r
    g
    s
    .
    p
    u
    s
    h
    _
    b
    a
    c
    k
    (
    b
    u
    i
    l
    d
    e
    r
    .
    g
    e
    t
    I
    n
    t
    8
    T
    y
    (
    )

    >
    g
    e
    t
    P
    o
    i
    n
    t
    e
    r
    T
    o
    (
    )
    )
    ;
    l
    l
    v
    m
    :
    :
    A
    r
    r
    a
    y
    R
    e
    f
    <
    l
    l
    v
    m
    :
    :
    T
    y
    p
    e
    *
    > a
    r
    g
    s
    R
    e
    f
    (
    p
    u
    t
    s
    A
    r
    g
    s
    )
    ;

    View Slide

  20. Instruction3
    p
    u
    t
    s
    の引数と返り値を設定する
    F
    u
    n
    c
    t
    i
    o
    n
    T
    y
    p
    e
    :
    :
    g
    e
    t
    第一引数が戻り値の型
    第二引数が引数の型のベクタ
    第三引数が可変長引数であるかのbool
    l
    l
    v
    m
    :
    :
    F
    u
    n
    c
    t
    i
    o
    n
    T
    y
    p
    e *
    p
    u
    t
    s
    T
    y
    p
    e =
    l
    l
    v
    m
    :
    :
    F
    u
    n
    c
    t
    i
    o
    n
    T
    y
    p
    e
    :
    :
    g
    e
    t
    (
    b
    u
    i
    l
    d
    e
    r
    .
    g
    e
    t
    I
    n
    t
    3
    2
    T
    y
    (
    )
    , a
    r
    g
    s
    R
    e
    f
    , f
    a
    l
    s
    e
    )
    ;
    l
    l
    v
    m
    :
    :
    C
    o
    n
    s
    t
    a
    n
    t *
    p
    u
    t
    s
    F
    u
    n
    c =
    T
    h
    e
    M
    o
    d
    u
    l
    e

    >
    g
    e
    t
    O
    r
    I
    n
    s
    e
    r
    t
    F
    u
    n
    c
    t
    i
    o
    n
    (
    "
    p
    u
    t
    s
    "
    , p
    u
    t
    s
    T
    y
    p
    e
    )
    ;

    View Slide

  21. Instruction4
    p
    u
    t
    s
    する命令にhelloworld
    文字列定数を渡してあげてcall
    する
    b
    u
    i
    l
    d
    e
    r
    .
    C
    r
    e
    a
    t
    e
    C
    a
    l
    l
    (
    p
    u
    t
    s
    F
    u
    n
    c
    , h
    e
    l
    l
    o
    W
    o
    r
    l
    d
    )
    ;

    View Slide

  22. LLVM‑IR
    を出力
    l
    l
    v
    m

    g
    +
    + `
    l
    l
    v
    m

    c
    o
    n
    f
    i
    g ‐

    c
    x
    x
    f
    l
    a
    g
    s ‐

    l
    d
    f
    l
    a
    g
    s ‐

    l
    i
    b
    s ‐

    s
    y
    s
    t
    e
    m

    l
    i
    b
    s
    `
    $ .
    /
    a
    .
    o
    u
    t
    ; M
    o
    d
    u
    l
    e
    I
    D = '
    t
    o
    p
    '
    s
    o
    u
    r
    c
    e
    _
    f
    i
    l
    e
    n
    a
    m
    e = "
    t
    o
    p
    "
    @
    0 = p
    r
    i
    v
    a
    t
    e u
    n
    n
    a
    m
    e
    d
    _
    a
    d
    d
    r c
    o
    n
    s
    t
    a
    n
    t [
    1
    4 x i
    8
    ] c
    "
    h
    e
    l
    l
    o w
    o
    r
    l
    d
    !
    \
    0
    A
    \
    0
    0
    "
    d
    e
    f
    i
    n
    e v
    o
    i
    d @
    m
    a
    i
    n
    (
    ) {
    e
    n
    t
    r
    y
    :
    %
    0 = c
    a
    l
    l i
    3
    2 @
    p
    u
    t
    s
    (
    i
    8
    * g
    e
    t
    e
    l
    e
    m
    e
    n
    t
    p
    t
    r i
    n
    b
    o
    u
    n
    d
    s (
    [
    1
    4 x i
    8
    ]
    , [
    1
    4
    r
    e
    t v
    o
    i
    d
    }
    d
    e
    c
    l
    a
    r
    e i
    3
    2 @
    p
    u
    t
    s
    (
    i
    8
    *
    )

    View Slide

  23. helloworld!
    .
    /
    a
    .
    o
    u
    t
    をの出力を h
    e
    l
    l
    o
    w
    o
    r
    l
    d
    .
    l
    l
    にして
    $ l
    l
    v
    m

    a
    s h
    e
    l
    l
    o
    w
    o
    r
    l
    d
    .
    l
    l
    $ l
    l
    i h
    e
    l
    l
    o
    w
    o
    r
    l
    d
    .
    b
    c
    h
    e
    l
    l
    o w
    o
    r
    l
    d
    !

    View Slide

  24. 参考資料、
    参照画像
    きつねさんでもわかるLLVM
    http://www.aosabook.org/en/llvm.html
    https://pauladamsmith.com/blog/2015/01/how‑to‑get‑started‑
    with‑llvm‑c‑api.html
    http://d.hatena.ne.jp/snaka72/20111206/1323189516
    http://qiita.com/gamako/items/f37dbb05de9d3832ce6b
    https://www.ibm.com/developerworks/jp/opensource/library/os‑
    createcompilerllvm1/
    https://www.cs.cornell.edu/~asampson/blog/llvm.html

    View Slide