我创建了一个pathprofiles传递,然后将结果存储在不同的数据结构中,例如路径对应的块,路径边缘等。 我有不同的变量和数据结构。
有没有办法直接在我写的另一个传递中使用这些变量? 如果有,怎么样? (我不确定getAnalysisUsage是否适用于此?) 需要紧急帮助
答案 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.
};
有趣的东西发生在第二遍。你需要做的两件事:
代码方面,第二遍看起来像这样:
/// 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 ++对象一样使用它。