LLVM遍历CFG [英] LLVM traverse CFG
问题描述
我想对函数的CFG应用DFS遍历算法。因此,我需要CFG的内部代表。我需要有方向的边和带斑点的MachineBasicBlock::const_succ_iterator
。有没有办法用FunctionPass
代替MachineFunctionPass
得到边缘定向的CFG?我想要它的原因是我在使用MachineFunctionPass
时遇到问题。到目前为止,我已经编写了几个复杂的PASS,但我不能运行MachineFunctionPass
PASS。
我发现:"AMachineFunctionPass
是LLVM代码生成器的一部分,它在程序中每个LLVM函数的与机器相关的表示形式上执行。代码生成器传递是由TargetMachine::addPassesToEmitFile
和类似例程专门注册和初始化的,因此它们通常不能从opt或bugpoint命令运行。"……那么我如何才能运行MachineFunctionPass
呢?
当我尝试使用OPT A SIMPLEMachineFunctionPass
运行时,出现错误:
Pass 'mycfg' is not initialized.
Verify if there is a pass dependency cycle.
Required Passes:
opt: PassManager.cpp:638: void llvm::PMTopLevelManager::schedulePass(llvm::Pass*): Assertion `PI && "Expected required passes to be initialized"' failed.
所以我必须初始化PASS。但是在我的所有其他PASS中,我没有进行任何初始化,我不想使用INITIALIZE_PASS
,因为我必须重新编译保存PASS注册的llvm文件.有没有办法对MachineFunctionPass
继续使用static RegisterPass
?我提到,如果我更改为FunctionPass
,我没有问题,因此确实可能是OPT问题。
我已开始另一个CallGraph过程。我正在高效地使用CallGraph &CG = getAnalysis<CallGraph>();
。这是一种类似的获得cfg-s的方式吗?到目前为止,我发现的是succ_iterator/succ_begin/succ_end
,它们来自CFG.h
,但我想我还是要以某种方式得到CFG分析。
提前感谢您!
推荐答案
我认为您可能混淆了某些术语。每个函数中的基本块都已经安排在一种CFG中,LLVM为您提供了遍历它的工具。例如,请参阅my answer to this question。
MachineFunction
位于不同的级别,除非您正在进行非常特殊的操作,否则不应该在此级别进行操作。级别太低,目标太具体。下面是级别的一些概述here
这篇关于LLVM遍历CFG的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!