Clang LLVM不';t生成CFG
我有一个程序Clang LLVM不';t生成CFG,clang,llvm,Clang,Llvm,我有一个程序foo.c,我用clang-c-emit llvm foo.c-o foo.bc编译它。它返回一个foo.bc。 因此,我运行opt-dotcgfoo.bc以获得.dotcfg。但是,我收到一个警告: 警告:您正在尝试打印位代码文件。 这是不可取的,因为它可能会导致显示问题。如果 你真的想亲自体验LLVM位代码吗 可以使用-f选项强制输出 如果我使用-f,我会得到一个不可读的文件。更新 警告与opt的位码输出有关,与点输出无关。您可以使用-disable output禁用位码输出,或
foo.c
,我用clang-c-emit llvm foo.c-o foo.bc
编译它。它返回一个foo.bc
。
因此,我运行opt-dotcgfoo.bc
以获得.dot
cfg。但是,我收到一个警告:
警告:您正在尝试打印位代码文件。
这是不可取的,因为它可能会导致显示问题。如果
你真的想亲自体验LLVM位代码吗
可以使用-f
选项强制输出
如果我使用
-f
,我会得到一个不可读的文件。更新
opt
的位码输出有关,与点输出无关。您可以使用-disable output
禁用位码输出,或使用-S
生成人类可读的.ll
文件以抑制警告clang
默认情况下将优化级别设置为-O0
,因此每个函数都附加了optnone
,防止大多数优化过程操作该函数opt
最近启用了新的Pass Manager(),如果目标函数具有optnone
,则将自动跳过可选Pass(IIUC,不影响功能)-dot cfg
是一个可选过程optnone
属性,因为它是在-O0
下编译的,CFGPrinter
会跳过它,因此您不会得到任何点文件输出
您有几种选择:
-O0
下禁用optnone
属性生成:foo.ll
中的optnone
属性,然后保存它opt
时切换回旧版通行证管理器:optnone
属性,但它是通过在真正想要这样做的过程中显式添加skipFunction()
来实现的CFGPrinter
不处理optnone
,因此在旧版pass manager管道中,可以按预期转储点文件
顺便说一句,点输出将直接写入名称以
开头的文件(如果您没有为opt
指定-cfg dot filename prefix
参数)。试试ls-a
有关opt
实施的详细信息,请参见:
static void writeCFGToDotFile(函数&F,BlockFrequencyInfo*BFI,
分支概率信息*BPI,uint64\u t最大频率,
bool CFGOnly=false){
std::字符串文件名=
(CFGDotFilenamePrefix++“+F.getName()++“.dot”).str();
errs()您使用什么查看器读取点文件?我使用的是GraphViz,但没有生成点文件…您是否尝试将输出管道化到一个文件,然后使用GraphViz打开该文件?是的!我得到了警告:语法歧义-cfg.main.dot的第1行中分隔错误的数字“2R”拆分为两个标记。
,我得到了main.bc
(或main.ll
,具体取决于构建)。警告确实消失了。但是,ls-a
除了返回main.c
和main.bc
(或.ll
)之外,还返回我//code>和。
)。没有.main.dot
或类似的文件。@Evaldo你能发布你的foo.c
?是的!我的foo.c
(以前被错误地称为main.c
)是:包含int main(){int i;int n=10;int arr[n];for(i=0;i
@Evaldo我已经更新了答案。希望有帮助。非常感谢,@nulll!你解决了我的问题!
clang -S -emit-llvm foo.c -o foo.ll -disable-O0-optnone
opt -dot-cfg foo.ll -disable-output -enable-new-pm=0