有没有办法告诉clang在没有其他优化的情况下生成TBAA元数据?

时间:2014-12-29 09:51:40

标签: c++ c clang llvm

LLVM包含名为"基于类型的别名分析"(pass source code on github)的别名分析,它利用嵌入在指令中的!tbaa元数据。元数据信息如下:

!1 = metadata !{metadata !2, metadata !2, i64 0}
!2 = metadata !{metadata !"int", metadata !3, i64 0}
!3 = metadata !{metadata !"omnipotent char", metadata !4, i64 0}
!4 = metadata !{metadata !"Simple C/C++ TBAA"}

似乎它需要像clang这样的前端来生成元数据信息。

编译源代码文件而不传递任何优化参数(或-O0)无法生成上述元数据。直到现在我才发现我必须通过至少-O1才能获得这些;问题是我不希望其他优化/转换(例如,instcombine)发生(clang -O1使用的传递类似于this answer提供的结果)。

有没有办法实现这个目标?

2 个答案:

答案 0 :(得分:1)

我不建议将其用于生产用途,但您可以这样做:

clang -cc1 -O1 -no-struct-path-tbaa -disable-llvm-optzns foo.cpp -emit-llvm -o -

查看TBAA元数据(如果你想查看它,请删除-no-struct-path-tbaa)。

否则你可以很容易地修改clang以始终打开TBAA元数据。

答案 1 :(得分:1)

答案有点过时了。我认为-disable-llvm-optzns已过时/已删除。您可以使用类似以下内容的驱动程序来完成此操作:

clang -O2 -Xclang -disable-llvm-passes -S -emit-llvm