4

我想在函数的 CFG 上应用 DFS 遍历算法。因此,我需要 CFG 的内部表示。我需要定向边缘和斑点MachineBasicBlock::const_succ_iteratorFunctionPass有没有办法通过使用 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 RegisterPassa MachineFunctionPass?我提到如果我更改为FunctionPass,我没有问题,所以确实可能是一个 opt 问题。

我已经开始了 CallGraph 的另一个通行证。我正在CallGraph &CG = getAnalysis<CallGraph>();有效地使用。这是获得CFG-s的类似方式吗?到目前为止我发现的succ_iterator/succ_begin/succ_end是来自CFG.h,但我认为我仍然必须以某种方式获得 CFG 分析。

先感谢您 !

4

1 回答 1

3

我想你可能混淆了一些术语。每个函数中的基本块已经安排在一种 CFG 中,LLVM 为您提供了遍历它的工具。例如,请参阅我对这个问题的回答

MachineFunction生活在不同的层次上,除非你正在做一些非常特别的事情,否则这不是你应该操作的层次。它太低级了,也太针对特定目标了。这里有一些级别的概述

于 2013-03-16T22:46:43.723 回答