能否在单个文件中生成单模块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
相关产品推荐
相关产品推荐

