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提供的结果)。
有没有办法实现这个目标?
答案 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