c++ - 有没有办法告诉clang生成TBAA元数据而无需其他优化?

标签 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到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/

相关文章:

c++ - 为什么 std::regex_iterator 会导致此数据的堆栈溢出?

c - UDP服务器套接字IP分配

c++ - 函数参数太少 ‘memcpy’

c++ - 针对iOS 4.x使用Boost和C++ 0x方言

c++ - Clang - 删除某些文件的 "conversion function converting <A> to base class <B> will never be used"警告

c# - 内存映射读取器找不到全局内存映射对象

c++ - 从二叉树中删除并找到一个节点

c++ - 如何确定 UBSAN 是否已使用 clang 或 gcc 编译?

c++ - 如何找到没有整数溢出的n%(k * k)?

c - char[] 和 &char[] 的区别?