我有一些必须启用链接时间优化才能正常工作的代码。我需要以下内容的常量表达式求值:
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编译器。))
答案 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处理。