使用方法:
# 使用 ninja 编译 LLVM 和工具
./build-release.sh
cd build-release/ninja
# 运行工具
cd ../graph-generation/
./tool npe/input.json
# 输出位于 input.json 所在目录
为了确保函数调用成为 CFGBlock 的最后一跳语句, 修改了 clang/lib/Analysis/CFG.cpp, 见 22308f8d25fc9bd183461b362c1971c806134394。
clang/tools/thebesttv/ICFG.cpp
的 ICFG::addFunction()
函数
将 CFG 中 CFGBlock 的连边信息加入 ICFG 中。
为了减少内存占用,ICFG 中的每个节点只会记录对应函数和 Block ID, 不保存更细粒度的语句信息。
为了确保生成路径中,函数的进入和返回能够匹配,ICFG**有三种边:
INTRA_PROC
: 过程内 CFGBlock 的连边CALL_EDGE
: 调用边,从调用点所在的 block 指向被调用函数的 entryRETURN_EDGE
: 返回边,从被调用函数的 exit 指向调用点的后继 block