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++ 链接时优化 - 编译器/链接器错误?的主要内容,如果未能解决你的问题,请参考以下文章

链接程序时是不是需要重复编译标志?

静态链接与动态链接

学习记录:gcc/g++ 编译与链接

链接器优化共享库

C ++静态库未在mac上的xcode中编译[重复]

[g ++用户定义的动态链接库上的全局new和delete运算符