2011-01-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…

globalで一部のファイルのみを索引付けの対象にする方法

C

http://www.gnu.org/software/global/globaldoc.html#SEC8 索引付けの対象とするファイルのリストをglobalに渡すとうまくいくらしい。 find . -path "./Release" -prune -o -path "./Debug" -prune \ -o -iname ".svn" -prune -type f > ./file_list gtags -f…

LLVM APIでdlopenを扱う

llvm::sys::DynamicLibrary::LoadLibraryPermanentlyを利用するとdlopenと同じ操作が行えるようです。 dlsymはDynamicLibrary::SearchForAddressOfSymbolが対応しています。以下がサンプルコードですが、libmに定義されているfabs関数を呼び出している例です…

Gentoo prefix on OSXLion

portage-2.2.01.18213/prefix-portage-2.2.01.18213のインストールがうまくいかない。 /usr/bin//install -c -m 644 -m 755 -o masa -g staff -t /Users/masa/Gentoo/usr/lib/portage/bin/. ././archive-conf ././banned-helper ././binhost-snapshot ././ch…

LLVM APIで構造体を扱う

LLVMLLVM-2.9 構造体の扱いはLLVMが勝手につくってくれるかと思っていたけど、 そんなことはなかったので書いてみた。 StructType::get(Context, fields, /*isPacked=*/false);を使って 構造体を作るのが手っ取り早い気がする。フィールドへのアクセスはGetE…