我想在函数的 CFG 上应用 DFS 遍历算法。因此,我需要 CFG 的内部表示。我需要定向边缘和斑点MachineBasicBlock::const_succ_iterator
。FunctionPass
有没有办法通过使用 a而不是 a来获得具有定向边缘的 CFG MachineFunctionPass
?我想要这个的原因是我在使用MachineFunctionPass
. 到目前为止,我已经编写了几个复杂的传递,但我无法运行MachineFunctionPass
传递。
我发现:“AMachineFunctionPass
是 LLVM 代码生成器的一部分,它在程序中每个 LLVM 函数的机器相关表示上执行。代码生成器传递是由TargetMachine::addPassesToEmitFile
类似的例程专门注册和初始化的,因此它们通常不能从opt 或 bugpoint 命令。”...那么我该如何运行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.
所以我必须初始化通行证。但是在我的所有其他通行证中,我没有进行任何初始化并且我不想使用INITIALIZE_PASS
,因为我必须重新编译保持通行证注册的 llvm 文件......有没有办法继续使用static RegisterPass
a MachineFunctionPass
?我提到如果我更改为FunctionPass
,我没有问题,所以确实可能是一个 opt 问题。
我已经开始了 CallGraph 的另一个通行证。我正在CallGraph &CG = getAnalysis<CallGraph>();
有效地使用。这是获得CFG-s的类似方式吗?到目前为止我发现的succ_iterator/succ_begin/succ_end
是来自CFG.h
,但我认为我仍然必须以某种方式获得 CFG 分析。
先感谢您 !