2011-12-01から1ヶ月間の記事一覧

自身のBitCodeを出力する

clangでコンパイルしたバイナリのBitcodeを出力する. BitCodeをParseBitcodeFile関数を使ってロードし、 Moduleを作る。Module::dumpでdumpする。clang -emit-llvmでbitcodeを生成する際にはlink時にシステムのリンカ(ld) ではなくてllvm-ldを指定しないとう…

LLVM APIで構造体を扱う(LinkList)

linklistを扱う方法がわかったのでメモしておく。 1. StructType::create(Context, "struct.list")で空の構造体を構築 2. structTy->setBody(fields, false)で構造体の本体を設定 struct x { int v; struct x *next; };みたいなリストを構築できる。 #includ…

関数のInline化

定数伝搬の最適化(IPSCCP)とかinline化パスを適応するとinline化できる。 最後にGlobalDeadCodeElimを行うと不要な関数も削除できる。 #include <llvm/LLVMContext.h> #include <llvm/Module.h> #include <llvm/Support/IRBuilder.h> #include <llvm/Support/TargetSelect.h> #include <llvm/Pass.h> #include <llvm/PassManager.h> #include </llvm/passmanager.h></llvm/pass.h></llvm/support/targetselect.h></llvm/support/irbuilder.h></llvm/module.h></llvm/llvmcontext.h>

LLVMでIntrinsic命令を扱う

llvm/Intrinsics.hをincludeして、 Function *fsin = Intrinsic::getDeclaration(m, Intrinsic::sin, args_type); でFunctionの実体を取得すれば良いらしい。 以下のコードはllvm-3.0では動作する。 // g++ intrinsic.cpp `llvm-config --cflags --libs --ld…