gpt4 book ai didi

LLVM遍历CFG

转载 作者:行者123 更新时间:2023-12-02 19:46:16 26 4
gpt4 key购买 nike

我想对函数的 CFG 应用 DFS 遍历算法。因此,我需要 CFG 的内部表示。我需要定向边缘和 Blob MachineBasicBlock::const_succ_iterator 。有一种方法可以通过使用 FunctionPass 来获得具有定向边缘的 CFG ,而不是 MachineFunctionPass ?我想要这个的原因是我在使用 MachineFunctionPass 时遇到问题。到目前为止,我已经写了几个复杂的过程,但我无法运行 MachineFunctionPass经过。

我发现:“A MachineFunctionPass 是 LLVM 代码生成器的一部分,它在程序中每个 LLVM 函数的机器相关表示上执行。代码生成器 channel 由 TargetMachine::addPassesToEmitFile 和类似的专门注册和初始化例程,因此它们通常不能从 opt 或 bugpoint 命令运行。”...那么我如何运行 MachineFunctionPass

当我尝试使用 opt 运行一个简单的 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对于MachineFunctionPass ?我提到如果我更改为 FunctionPass ,我没有任何问题,所以确实可能是一个 opt 问题。

我已经开始了 CallGraph 的另一次传递。我正在使用CallGraph &CG = getAnalysis<CallGraph>();有效率的。是不是和CFG-s的获取方式类似?到目前为止我发现的是succ_iterator/succ_begin/succ_end来自CFG.h ,但我想我还是得以某种方式得到CFG分析。

提前谢谢您!

最佳答案

我认为您可能混淆了一些术语。每个函数中的基本 block 已经排列在一种 CFG 中,LLVM 为您提供了遍历它的工具。请参阅my answer to this question ,例如。

MachineFunction 位于不同的级别,除非您正在做一些非常特殊的事情,否则这不是您应该操作的级别。它的层次太低,而且目标太具体。有一些级别概述 here

关于LLVM遍历CFG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15433417/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com