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
到clang才能获得这些;问题是我不希望发生其他优化/转换(例如instcombine)(clang -O1
使用的过程与this answer给出的结果相似)。有什么办法可以实现这个目标?
最佳答案
我不建议将其用于生产,但是您可以执行以下操作:
clang -cc1 -O1 -no-struct-path-tbaa -disable-llvm-optzns foo.cpp -emit-llvm -o-
查看TBAA元数据(如果您也想删除-no-struct-path-tbaa)。
否则,您可以很轻松地修改clang以始终打开TBAA元数据。
关于c++ - 有没有办法告诉clang生成TBAA元数据而无需其他优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27686595/