我想在函数的CFG上应用DFS遍历算法。因此,我需要CFG的内部表示。我需要定向边缘和斑点MachineBasicBlock::const_succ_iterator。有没有办法用FunctionPass代替MachineFunctionPass来获得边缘定向的CFG?我之所以要这样做,是因为我在使用MachineFunctionPass时遇到了问题。到目前为止,我已经编写了几个复杂的过程,但我不能运行MachineFunctionPass过程。
我发现:“MachineFunctionPass是LLVM代码生成器的一部分,它在程序中每个LLVM函数的依赖于机器的表示形式上执行。代码生成器通道是由TargetMachine::addPassesToEmitFile和类似例程专门注册和初始化的,所以它们通常不能从opt或bugpoint命令运行。”...So我如何运行MachineFunctionPass?
当我尝试使用opt a simple MachineFunctionPass运行时,我得到了错误:
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的类似方法吗?到目前为止,我发现的是来自CFG.h的succ_iterator/succ_begin/succ_end,但我认为我仍然必须以某种方式获得CFG分析。
提前谢谢你!
发布于 2013-03-17 06:46:44
我想你可能把一些术语搞混了。每个函数中的基本块已经被安排在某种形式的CFG中,LLVM为您提供了遍历它的工具。例如,请参见my answer to this question。
MachineFunction生活在一个不同的层次上,除非您正在做一些非常特别的事情,否则这不是您应该操作的层次。它的层次太低,而且目标太具体。下面是关于levels here的一些概述
https://stackoverflow.com/questions/15433417
复制相似问题