我创建了一个路径配置文件的传递,然后将结果存储在不同的数据结构中,例如与路径相对应的块、路径中的边等。我对每个都有不同的变量和数据结构。
有没有办法在我写的另一遍中直接使用这些变量?如果是,如何?(我不确定 getAnalysisUsage 是否适用于此?)需要紧急帮助
我创建了一个路径配置文件的传递,然后将结果存储在不同的数据结构中,例如与路径相对应的块、路径中的边等。我对每个都有不同的变量和数据结构。
有没有办法在我写的另一遍中直接使用这些变量?如果是,如何?(我不确定 getAnalysisUsage 是否适用于此?)需要紧急帮助
这个答案可能会迟到,但我有同样的问题,遇到了你的帖子,感谢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.
};
有趣的事情发生在第二遍。你需要在这里做两件事:
在代码方面,第二遍看起来像这样:
/// 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.
...
}
};
免责声明:我尚未编译此代码,但这是对您对我有用的示例的改编。希望这很有用:-)
设置从第 2 遍到第 1 遍的依赖关系(通过覆盖getAnalysisUsage
和调用getAnalysis
- 请参阅程序员指南以编写关于如何执行此操作的遍)。一旦你获得了第一遍的实例,你就可以像使用任何其他 C++ 对象一样使用它。