-
Notifications
You must be signed in to change notification settings - Fork 0
LLVM C API
hatsusato edited this page Jun 16, 2016
·
18 revisions
- LLVM-C Document に行く。
- そのAPIのソースコード上での定義を見に行く。
- 実装で使われているLLVMの(C++の)APIの名前で再度検索する。
- LLVM C++ APIの方は比較的ドキュメントが充実してるので、説明を読む。
- 適宜 LLVM Language Reference Manual の当該項目を参考にする。
- LLVMモジュール全体の情報を管理する。
- LLVMが管理するグローバル変数・関数やシンボルテーブルの情報を含む。
- LLVMを使うときはまず最初にこのオブジェクトが必要。
-
LLVMModuleCreateWithNameで作ってLLVMDisposeModuleで破棄する。
-
LLVMAddFunction- モジュールに関数を登録する。
-
ExternalLinkageで登録されるので注意。適宜LLVMSetLinkageする必要があるかもしれない。
-
LLVMGetNamedFunction- モジュールに登録された関数を名前で検索する。
- 型情報を持つ。
-
Integer Types
- 整数型
- 型ではサイズだけを規定し、
signed/unsignedは演算時に指定する。
- 型ではサイズだけを規定し、
- 整数型
-
Floating Point Types
- 浮動小数点数型
-
Function Types
- 関数型
-
IsVarArgは可変長かどうかを表す。
-
- 関数型
-
Structure Types
- 構造体型
-
Packedはパディングのないアラインメントが1の構造体。 - 前方宣言で用いられるような、まだ定義されていない宣言のみの構造体を opaque であると言う。
- opaque 構造体は
LLVMStructCreateNamedで作る。 実体が欲しくなったらLLVMStructSetBodyで設定する。
- opaque 構造体は
-
- 構造体型
-
Sequential Types
- 配列型
- ポインタ型
-
AddressSpaceは基本0。 -
void *はないのでi8 *で代用する。
-
- ベクトル型
- SIMDとかするやつ。
-
Other Types
- ボイド型、ラベル型など
- 条件分岐とかループとかジャンプのない一直線の命令列を表す。
- 関数呼び出しはジャンプには入らない。
-
LLVMBuildCallで命令追加できる。
-
- 任意の Basic Block は関数に属する。
- 関数呼び出しはジャンプには入らない。
- Basic Block には Instruction Builder を用いて命令を追加する。
-
LLVMValueRefと型の互換性がある。-
LLVMBasicBlockAsValueとLLVMValueAsBasicBlockで相互変換できる。
-
- Basic Block に命令を追加する Builder を表す。
- Basic Block 中のどこに命令を挿入するかを表すポインタでしかないようなので、全体で1つあれば十分そう。
-
LLVMCreateBuilderで作ってLLVMDisposeBuilderで破棄する。
-
LLVMPositionBuilderAtEnd- Basic Block の末尾に Instruction Builder をセットする。 以降の Instruction Builder への操作はここで指定した Basic Block の末尾に追加されていく。
-
LLVMPositionBuilderBefore- 指定した命令の直前に Instruction Builder をセットする。 以降の Instruction Builder への操作はここで指定した命令の直前に追加されていく。