0

パスを作成し、パスに対応するブロック、パスのエッジなどのさまざまなデータ構造に結果を格納するパスを作成しました。これらのそれぞれに異なる変数とデータ構造があります。

私が書いた別のパスでこれらの変数を直接使用する方法はありますか? はいの場合、どのように?(getAnalysisUsage がこれに対して機能するかどうかわかりませんか?) 緊急の助けが必要です

4

2 に答える 2

1

この回答は遅いかもしれませんが、同じ質問があり、あなたの投稿に出くわし、Oakのおかげで正しい方向に向けられました。そこで、ここでいくつかのコードを共有したいと思いました。

2 つのパスがあるとします。1 つ目はあなたPathProfilePassのもので、2 つ目はあなたのものDoSomethingPassです。最初のパスには、収集して 2 番目のパスと共有するデータが含まれます。ここで特別なことをする必要はありません:

/// Path profiling to gather heaps of data.
class PathProfilePass: public llvm::ModulePass {

  public:

    virtual bool runOnModule(llvm::Module &M) {

        // Create goodness for edges and paths.
        ...
    }

    std::set<Edges> edges;   ///< All the edges this pass collects.
    std::set<Paths> paths;   ///< All the paths this pass collects.
};

興味深いことは、2 番目のパスで発生します。ここで行う必要がある 2 つのこと:

  1. 最初のパスに対する 2 番目のパスの依存関係を指定します。getAnalysisUsageメソッドを参照してください。
  2. 最初のパスからデータにアクセスします。getAnalysisメソッドを参照してください。

コード的には、2 番目のパスは次のようになります。

/// Doing something with edge and path informations.
class DoSomethingPass: public llvm::ModulePass {

  public:

    /// Specify the dependency of this pass on PathProfilePass.
    virtual void getAnalysisUsage(llvm::AnalysisUsage &AU) const {
        AU.addRequired<PathProfilePass>();
    }

    /// Use the data of the PathProfilePass.
    virtual bool runOnModule(llvm::Module &M) {

        PathProfilePass &PPP = getAnalysis<PathProfilePass>();

        // Get the edges and paths from the first pass.
        std::set<Edges> &edges = PPP.edges;
        std::set<Paths> &paths = PPP.paths;

        // Now you can noodle over that data.
        ...
    }
};

免責事項:私はこのコードをコンパイルしていませんが、これは私にとって何がうまくいくかのあなたの例への適応です. これが役に立つことを願っています:-)

于 2013-11-27T00:28:52.297 に答える
0

2 番目のパスから 1 番目のパスへの依存関係を設定します (オーバーライドgetAnalysisUsageと呼び出しを介してgetAnalysis-その方法については、パスを作成するためのプログラマー ガイドを参照してください)。最初のパスのインスタンスを取得したら、他の C++ オブジェクトと同じように使用できます。

于 2013-04-14T06:37:07.387 に答える