Upgrade to Pro — share decks privately, control downloads, hide ads and more …

LLVMについて調べた

oyuk
July 31, 2017
170

 LLVMについて調べた

oyuk

July 31, 2017
Tweet

Transcript

  1. 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 ; }
  2. 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
  3. 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 }
  4. 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 !
  5. 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 ) ;
  6. 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 ( ) ) ;
  7. 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 ) ;
  8. 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 " ) ;
  9. 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 ) ;
  10. 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 ) ;
  11. 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 ) ;
  12. 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 * )
  13. 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 !