RandomNumberGenerator
クラスは(そのドキュメントとllvm/lib/Support/RandomNumberGenerator.cpp
下のソースファイルを確認してください)プライベートコンストラクタを持っているので、インスタンスのホールドを取得する唯一の方法は、(私が知っていることを、少なくとも)Module
のcreateRNG
メソッドを介してです。
だから、あなたはllvm:Function
パスを持っている(とC++ 11を使用して)と仮定:
bool runOnFunction(llvm::Function &CurFunc) override {
auto rng = CurFunc.getParent()->createRNG(this);
llvm::errs() << (*rng)() << '\n';
return false;
}
今、あなたはこのようなモジュールでこれを実行することができます(あなたがdocumentationからhello world
パスを変更仮定):
opt -load ./libLLVMHelloPass.so -hello foo.bc -o bar.bc
これを再実行すると、同じ擬似乱数が返されます。
-rng-seed
オプションは、ヘッダーを含めると(LLVM
サポートライブラリへのリンク、つまりllvm-config --libfiles support
)、パスに使用できるようになります。異なる配列を与える必要があり
opt -load ./libLLVMHelloPass.so -hello -rng-seed 42 foo.bc -o bar.bc
:だから、何かに上記の実行行を変更します。
最後に、AFAIK、LLVM
は、opt
を経由して、PassManager
(確かにレガシーのもの)のコンテキストで実行されます。カスタムスタンドアロンのLLVM
ツールをマルチスレッド(つまり、opt
で実行するつもりはない)を使用して構築するときは、そのアドバイスに従うべきだと思います。 LLVM
APIを使用するスタンドアロンアプリの関連例については、ユニットテストのソースサブディレクトリを参照してください(.cpp
のファイルはmain()
がありますが、常にそのように設定されているわけではありません)。
古くなった例のいずれかへのリンクを提供できますか?私は答えを更新しなければならないかもしれません。なぜなら、私がほとんど使用しないAPIコールだからです。 – compor