【问题标题】:Is there any way to tell clang to generate TBAA metadata without other optimizations?有没有办法告诉 clang 在没有其他优化的情况下生成 TBAA 元数据?
【发布时间】:2015-02-25 12:07:22
【问题描述】:

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 提供的结果相似)。

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

【问题讨论】:

  • 我不知道一个简单的方法,但一种替代方法是启用 -O1 然后显式禁用 -O1 启用的每个选项
  • @technosaurus 你的意思是在clang中?你能告诉我如何禁用它吗?
  • @technosaurus 是的,我认为该线程应该有所帮助。我正在尝试使用-mllvm 选项,但仍然没有找到启用 tbaa 的方法。

标签: c++ c clang llvm


【解决方案1】:

我不建议将其用于生产,但您可以执行以下操作:

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

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

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

【讨论】:

  • 谢谢,运行顺利。我只是想对 C 的 LLVM TBAA 进行一些实验,不希望用于生产,所以这对我来说已经足够了。顺便说一句,我可以知道您对当前基于 LLVM 类型的别名分析的实现的看法吗?
  • 没关系,struct path的东西有点意思。这不是最先进的,但没关系。
【解决方案2】:

答案有点过时了。我相信-disable-llvm-optzns 已被弃用/删除。您可以使用以下方式对驱动程序执行此操作:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-29
    • 2015-02-12
    • 2019-03-03
    • 1970-01-01
    • 1970-01-01
    • 2019-12-18
    • 2023-03-08
    相关资源
    最近更新 更多