使用我自己的传递结果(不是预定义的传递)进入下一遍

时间:2013-04-14 06:19:09

标签: llvm

我创建了一个pathprofiles传递,然后将结果存储在不同的数据结构中,例如路径对应的块,路径边缘等。  我有不同的变量和数据结构。

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

2 个答案:

答案 0 :(得分:1)

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

假设您有两次通过,第一次是您的PathProfilePass,第二次是您的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方法。
  3. 代码方面,第二遍看起来像这样:

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

    免责声明:我还没有编译这段代码,但这是对你的例子的改编。希望这很有用: - )

答案 1 :(得分:0)

设置从第二遍到第一遍的依赖关系(通过覆盖getAnalysisUsage并调用getAnalysis - 有关如何执行此操作,请参阅the programmer's guide to writing a pass。一旦获得第一遍的实例,就可以像使用任何其他C ++对象一样使用它。