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

LLVMについて調べた

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for oyuk oyuk
July 31, 2017
200

 LLVMについて調べた

Avatar for oyuk

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 !