GCC编译指示优化不会覆盖`-Og'命令行设置

时间:2019-07-03 23:39:22

标签: c gcc compiler-optimization

单个功能或编译单元是否可以用-Og / O2覆盖O3 GCC优化级别?

如果在命令行中使用#pragma GCC optimize("O2"),编译器似乎不会遵守__attribute__((optimize("O2"))-Og

例如,在ARM Cortex-M4上为this function doing saturating addition。仅当我使用ssat进行编译时,它才会编译为-O2,但是最右边的编译器使用-Og并忽略编译指示。

另一方面,使用降低优化级别可以进行杂乱操作,即在命令行中将O0指定为杂乱操作会覆盖-Og

这是预期的行为吗?

1 个答案:

答案 0 :(得分:1)

  

对于单个功能或编译单元,是否可以用O2 / O3覆盖-Og GCC优化级别?

是,不是。实用工具的文档所引用的The documentation for the optimize attribute说:

  

optimize属性用于指定要使用与命令行上指定的优化选项不同的优化选项来编译函数。

因此,属性或杂注确实会覆盖命令行。但是,这适用于每个功能级别,而the -Og option has both per-function and global effects

  

-O0-Og一样,它会完全禁用许多优化过程,因此控制它们的各个选项无效。

因此,尽管使用属性或编译指示来设置优化级别O2O3确实会打开该级别中包含的所有单个优化,但这样做可能不会完全影响设置在命令行上可以做到。

还请注意文档中的警告

  

optimize属性应仅用于调试目的。它不适用于生产代码。

我认为您正在 进行调试,因为这是-Og的目的,但是您应该从该注释中提取的一些内容是,您不应依赖该技术来强制执行优化选项打开或关闭。如您所见,它可能无法有效或完全地做到这一点。

  

这是预期的行为吗?

您描述的行为似乎与文档一致,尽管它们未指定细节。但是,您将其描述为特征的方式是:在命令行上设置-Og时会忽略编译指示–这是不期望的,而且我认为这不准确。