LLVM遍历CFG [英] LLVM traverse CFG

查看:28
本文介绍了LLVM遍历CFG的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想对函数的CFG应用DFS遍历算法。因此,我需要CFG的内部代表。我需要有方向的边和带斑点的MachineBasicBlock::const_succ_iterator。有没有办法用FunctionPass代替MachineFunctionPass得到边缘定向的CFG?我想要它的原因是我在使用MachineFunctionPass时遇到问题。到目前为止,我已经编写了几个复杂的PASS,但我不能运行MachineFunctionPassPASS。

我发现:"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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆