0

我创建了一个路径配置文件的传递,然后将结果存储在不同的数据结构中,例如与路径相对应的块、路径中的边等。我对每个都有不同的变量和数据结构。

有没有办法在我写的另一遍中直接使用这些变量?如果是,如何?(我不确定 getAnalysisUsage 是否适用于此?)需要紧急帮助

4

2 回答 2

1

这个答案可能会迟到,但我有同样的问题,遇到了你的帖子,感谢Oak指出了正确的方向。所以我想在这里分享一些代码。

假设您有两个通行证,第一个是 your PathProfilePass,第二个是 your DoSomethingPass。第一个通道包含您收集并与第二个路径共享的数据;这里不需要做任何特别的事情:

/// 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.
};

有趣的事情发生在第二遍。你需要在这里做两件事:

  1. 指定第二遍对第一遍的依赖关系:参见getAnalysisUsage方法。
  2. 从第一遍访问数据:请参阅getAnalysis方法。

在代码方面,第二遍看起来像这样:

/// 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 回答