1

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

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

(PROGMEM 是一个 avr-gcc 构造,它将常量放在一个单独的内存部分中,该部分随后被加载到闪存而不是 ram 中,并且在执行时需要特别注意访问。但不是在编译时......)

有什么方法可以在编译时(或链接时)检测到 -flto 尚未指定,以便我可以发出错误消息?

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

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

4

1 回答 1

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'ed。

于 2018-11-09T02:51:36.997 回答