gcc程序可以检测到何时启用了链接时间优化(-flto)吗?

时间:2018-11-08 00:01:16

标签: gcc avr-gcc lto

我有一些必须启用链接时间优化才能正常工作的代码。我需要以下内容的常量表达式求值:

  extern const char[] PROGMEM constantTable = {1,2,3,4,5};
    :
   char x = constantTable[4];

(PROGMEM是avr-gcc构造,将常量放在单独的内存部分中,然后将其加载到闪存而不是ram中,并且在执行时需要特别小心地进行访问。但不是在编译时...)

是否有某种方法可以在编译时(或链接时)检测到未指定-flto以便发出错误消息?

我已经使用“ -dM -E”技巧比较了带有-flto和不带有-flto的预定义符号,并且似乎没有任何区别。对其他技巧有想法吗?

(应该在链接时为-flto“评估” __builtin_constant_p()吗?不是从gcc 5.4.0开始(最新的“供应商支持的” avr编译器。))

1 个答案:

答案 0 :(得分:0)

一种方法是尝试测试外部全局变量的不可能值:

// foo.c
const int LTO_in_use = 1;

// bar.c
#include <stdio.h>
extern int LTO_in_use;
void LTO_Not_Enabled(void) __attribute__ (( error("") ));

int main() {
    if (LTO_in_use == 99) {
        LTO_Not_Enabled();
    }
}

任何全局变量都将起作用,只要您知道一个不可能的值即可。 如果您确实创建了一个特定的新变量,则该变量永远不会真正在运行时中被引用,因此无论如何它将被lto进行GC处理。

相关问题