You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在单个文件中生成单模块CFG与调用图?

需求描述

需要生成每个模块的CFG(控制流图)与调用图,示例参考类似rustc开发指南中的MIR控制流图。

已尝试方案

我发现可以使用opt工具,通过-dot-cfg和-dot-callgraph两个命令行选项从LLVM-IR生成调用图和CFG,但这两个选项相互独立,无法整合输出。以如下C++代码为例:

int main() { [] {} (); }

执行以下命令生成CFG与调用图:

$ clang++ -S -emit-llvm Main.C
$ opt -enable-new-pm=0 -dot-cfg -dot-callgraph Main.ll
Writing '.main.dot'...
Writing '._ZZ4mainENK3$_0clEv.dot'...
Writing 'Main.ll.callgraph.dot'...

使用-enable-new-pm=0的原因:新Pass管理器不支持相关选项,需切换回旧Pass管理器以兼容

最终会生成三个独立文件:一个调用图文件,以及每个函数对应的CFG文件。

可行解决方案

手动合并这些生成的文件是一种可行方案,也是我最终选择的方案。

环境信息

  • LLVM工具链版本:
    • Clang: 16.0.0-++20220814102906+6afcc4a459ea-1exp120220814222919.677
    • Opt: 16.0.0 (x86_64-pc-linux-gnu, westmere)
  • 操作系统: Debian 10 buster, x86_64 Linux 4.19.0-21-amd64
  • GraphVIZ: 2.40.1-6+deb10u1
    • dot: graphviz version 2.40.1 (20161225.0304)

内容的提问来源于stack exchange,提问作者Ghasem Ramezani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 20:33:21