首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LLVM遍历CFG

LLVM遍历CFG
EN

Stack Overflow用户
提问于 2013-03-15 21:12:46
回答 1查看 2.8K关注 0票数 4

我想在函数的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运行时,我得到了错误:

代码语言:javascript
复制
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.hsucc_iterator/succ_begin/succ_end,但我认为我仍然必须以某种方式获得CFG分析。

提前谢谢你!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-17 06:46:44

我想你可能把一些术语搞混了。每个函数中的基本块已经被安排在某种形式的CFG中,LLVM为您提供了遍历它的工具。例如,请参见my answer to this question

MachineFunction生活在一个不同的层次上,除非您正在做一些非常特别的事情,否则这不是您应该操作的层次。它的层次太低,而且目标太具体。下面是关于levels here的一些概述

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15433417

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档