2017-12-11 11 views
1

クラスの使用方法の例を教えてもらえますか。LLVMです。私が見つけることができるすべての例は、時代遅れの方法を使用するようです。llvm内でRandomNumberGeneratorを使用するには?

パス内で '-rng-seed'パラメータで上書きできるRNGを作成したいと考えています。

パラメータとして提供された場合、およびパラメータとして提供されなかった場合の値の作成方法は、どのようにこの値にアクセスできますか?

また、1つのモジュールのスレッド間で1つのRNGを共有することはできません。あるモジュールで複数のパスを実行している場合、同じ生成されたRNGを共有できますか?

+0

古くなった例のいずれかへのリンクを提供できますか?私は答えを更新しなければならないかもしれません。なぜなら、私がほとんど使用しないAPIコールだからです。 – compor

答えて

1

RandomNumberGeneratorクラスは(そのドキュメントとllvm/lib/Support/RandomNumberGenerator.cpp下のソースファイルを確認してください)プライベートコンストラクタを持っているので、インスタンスのホールドを取得する唯一の方法は、(私が知っていることを、少なくとも)ModulecreateRNGメソッドを介してです。

だから、あなたは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()がありますが、常にそのように設定されているわけではありません)。

+1

私が参照していたRNG実装の例は、llvm-dev-meeting-tutorial githubのDuplicateBBです。しかし、私の実装はRandomNumberGeneratorについての私の理解とはかなり異なっていました。あなたはそれをクリアした説明です、ありがとう! –

+0

ああ、私はQuarkslabチュートリアルを見ました。このAPIクラスを使用したときはいつでも思い出すことができませんでした。 – compor

関連する問題