我有一个分析整个模块的传递(使用runOnFunction()
)。但我想在每个执行路径上应用它。通过执行路径,我指的是从程序中的一个点开始的指令序列(用start开头注释)到程序的终止点(用end注释)。
我假设我必须通过构造一个CallGraph将我的模块划分为函数,然后在前面提到的CallGraph的节点中将每个函数划分为构造CFG-s的指令。我假设我选择的节点的执行路径是CallGraph离开的所有路径(我应该能够在CFG-s之间进行通信)。从该节点,我可以使用图搜索算法查看所有路径。
是否有可能将runOnFunction()
/ runOnModule()
方法替换为用户定义的内容,例如runOnExecutionPath()
?如果是这样,LLVM中有一个适合存储执行路径的结构?
另一种可能是使用getAnalysis<CallGraph>
或getAnalysis<CFG>
?我很迷惑。
非常感谢您的任何建议!
答案 0 :(得分:2)
我不知道LLVM中的完全实现是以库的方式暴露给你的,因为这是一个非常具体的需求。
但是,所有构建块都在那里,您只需编写满足您特定需求的代码。函数中的基本块在某种意义上构成了控制流图,您可以以任何您认为合适的方式进行控制。例如,您可以创建它的DFS步骤,它将为您提供从入口到出口的所有路径。
如果您想查看一些类似的示例代码,请查看include/llvm/Analysis/LoopIterator.h