はじめに

分からないリスト

  • llvm-spirとllvmの関係は?
  • llvm-spirとはllvmに何をしたのか?
  • llvmって何?

llvmって何?

LLVM: Low Level Virtual Machine

c から llvm バイトコードの生成

参考: http://d.hatena.ne.jp/sxhxtxa/20120114/1326531561

これで llvm asm が出力されます。

llvm-as でバイトコード(バイナリ形式)に変換します。

バイトコードは lli( llvm interpreter ) 上で実行する事ができます。

llvm ir とは?

上述の llvm asm と等価です。人が読める形。

llvm bitcode とは?

上述のバイトコードと等価です。

上述で説明すると llvm-as でアセンブルして出力した main.bc が bitcode です。

llvmアセンブラ

  • SSA: Single Static Assign ベース
    変数への再代入はできない
  • 型安全
    型情報を持つ
  • レジスタは任意個
  • モジュールを合成できる

足し算をする例

  • define
    関数定義
  • @~
    関数名
  • %~
    レジスタ名
  • i32
    32bitレジスタ
    符号は特にない
    i1なら1bitレジスタ(フラグ)
    i128なら128bitレジスタ
  • entry
    とりあえず1つラベルがいる
  • add
    加算命令
  • ret
    関数から返る命令
  • 各命令にも型情報が必要

load/storeの例

 

llvm-spir って結局 llvm に何をしたのか?

  • SPIR 1.2 binary は LLVM 1.2 bitcode
  • SPIR IR は LLVM IR のサブセット

なんだけど SPIR binary を llvm-dis してもエラーになります。

↑いけるはずです。

 

llvm bitcode のバージョンによる差異は?

例えば、llvm-spir( llvm 3.2 )を新しいバージョンの llvm-dis を使ってディスアセは可能です。

参考:http://stackoverflow.com/questions/31322968/disassemble-spir-binary-to-llvm-ir

 

spir-v から llvm-ir への変換

今日までのまとめ

spir1.2 は llvm3.2 の完全なサブセット

bitcode は llvm3.2 のツールチェインで使用可能

spir2.0 は llvm3.4 のサブセット?

specialization of LLVM 3.4 IR と記述があるがサブセットなのかどうかが分からないです。

DXIL の bitcode を llvm-spirv で spir-v へ変換可能か?

一応、llvm-ir のサブセットを使用しているという記述はある。

下記コマンドで変換可能か?

ドキュメント

SPIR-LLVM