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