Mac 上的 G++ 链接时优化 - 编译器/链接器错误?
Posted
技术标签:
【中文标题】Mac 上的 G++ 链接时优化 - 编译器/链接器错误?【英文标题】:G++ Link-time optimisation on Mac - compiler/linker bug? 【发布时间】:2015-08-16 15:55:04 【问题描述】:我有一个使用 OpenMP 的项目(在当前的 OS X 默认 clang 设置中似乎不可用),但也想使用 LTO。我在使用 SSE4 的 SIMD 内在函数中有部分代码,发现 G++ 无法在不使用 OS X 提供的 clang 链接器(标志 -Wa,-q
)的情况下链接此代码。 G++ 5.10 是通过 Homebrew 安装的,并且在没有 multilib 的情况下编译。
我可以使用 clang 使用 LTO 进行编译,但是当我将 -flto
添加到 G++ 时,我会丢失并行的“for”:
lto1: internal compiler error: in add_symbol_to_partition_1, at lto/lto-partition.c:211
lto1: internal compiler error: Abort trap: 6
g++-5: internal compiler error: Abort trap: 6 (program lto1)
Please submit a full bug report,
with preprocessed source if appropriate.
See <https://github.com/Homebrew/homebrew/issues> for instructions.
lto-wrapper: fatal error: g++-5 returned 4 exit status
compilation terminated.
collect2: fatal error: lto-wrapper returned 1 exit status
compilation terminated.
如果我删除了内在函数以便它可以编译剩余的代码,那么在没有 -Wa,-q
的情况下也会发生这种情况。
我尝试了一个简单的两文件程序,它可以在 G++ 中使用 LTO 进行良好编译,所以我不确定问题出在哪里。虽然 LTO 似乎对这段代码没有太大的影响,但在 clang 中我测量了大约 7%,这是不可忽略的,因为程序需要一段时间才能运行。
我知道错误要求提交错误报告,但我不想这样做,除非我知道这不仅仅是我自己的愚蠢。
有没有人遇到过这类问题,或者我真的遇到了编译器错误? (据我所知还没有遇到过)
干杯!
【问题讨论】:
编译器在编译过程中的任何时候都不应该崩溃,所以这绝对是一个编译器错误——即使你的代码是“坏的”,它也应该给出错误或成功[有可能,如果你代码受未定义行为的影响,即生成的代码做了未定义的事情,但在编译期间崩溃编译器不在允许的范围内] @MatsPetersson 谢谢,要提交报告,O0
没有出现错误,这对我来说似乎很奇怪。我相当确定它不是 UB,因为该软件是按照严格的标准编写的,可以在不同的系统和编译器上编译。
@Goobley:如果它是未定义的行为并不重要。编译器应该从不报告 ICE。
【参考方案1】:
编译器从不应该报告 ICE。这是一个错误。它可能已经是一个报告的错误,但它肯定是一个错误。
【讨论】:
谢谢,然后我会提交一份适当的报告,有趣的是,我注意到 -flto 不会导致O0
的 ICE,我还没有在合理大小的示例中复制它,所以我会先尝试这样做。
-O0 即使使用 -flto 我认为意味着“不要优化”,所以它可能与它有关。以上是关于Mac 上的 G++ 链接时优化 - 编译器/链接器错误?的主要内容,如果未能解决你的问题,请参考以下文章