LLVMことはじめ
はじめに
分からないリスト
- llvm-spirとllvmの関係は?
- llvm-spirとはllvmに何をしたのか?
- llvmって何?
llvmって何?
LLVM: Low Level Virtual Machine
c から llvm バイトコードの生成
参考: http://d.hatena.ne.jp/sxhxtxa/20120114/1326531561
1 |
clang -emit-llvm -S -o main.S main.c |
これで llvm asm が出力されます。
llvm-as でバイトコード(バイナリ形式)に変換します。
1 |
llvm-as -o main.bc main.S |
バイトコードは lli( llvm interpreter ) 上で実行する事ができます。
llvm ir とは?
上述の llvm asm と等価です。人が読める形。
llvm bitcode とは?
上述のバイトコードと等価です。
上述で説明すると llvm-as でアセンブルして出力した main.bc が bitcode です。
llvmアセンブラ
- SSA: Single Static Assign ベース
変数への再代入はできない - 型安全
型情報を持つ - レジスタは任意個
- モジュールを合成できる
足し算をする例
1 2 3 4 5 6 |
define i32 @add1( i32 %x, i32 %y ) { entry: %ret = add i32 %x, %y ret i32 %ret } |
- define
関数定義 - @~
関数名 - %~
レジスタ名 - i32
32bitレジスタ
符号は特にない
i1なら1bitレジスタ(フラグ)
i128なら128bitレジスタ - entry
とりあえず1つラベルがいる - add
加算命令 - ret
関数から返る命令 - 各命令にも型情報が必要
load/storeの例
1 2 3 4 5 6 7 8 9 |
define void @add( i32* %z, i32* %x, i32* %y ) { entry: %9 = load i32* %x, align 32 %1 = load i32* %y, align 32 %ret = add nsw i32 %0, %1 store i32 %ret, i32* %z, align 32 ret void } |
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
1 2 3 4 |
Since SPIR 1.2 is derived from LLVM 3.2, this is only really guaranteed to work for an LLVM 3.2 version of llvm-dis. In practice, I've found that this still works fine with newer versions of LLVM, but there's no guarantee that this will always be the case. |
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 のサブセットを使用しているという記述はある。
下記コマンドで変換可能か?
1 |
llvm-spirv input.bc |
ドキュメント
- HLSLChanges.rst
llvm/clang からどう拡張したかの説明 - DXIL.rst
DXIL フォーマットの詳細
SPIR-LLVM
コメントを残す