Может ли программа gcc определить, когда включена оптимизация времени соединения (-flto)?
У меня есть код, который ДОЛЖЕН иметь включенную оптимизацию времени соединения, чтобы работать правильно. Мне нужна постоянная оценка выражения:
extern const char[] PROGMEM constantTable = {1,2,3,4,5};
:
char x = constantTable[4];
(PROGMEM - это конструкция avr-gcc, которая помещает константу в отдельный раздел памяти, который впоследствии загружается во флэш-память, а не в ram, и во время выполнения требует особого внимания для доступа. Но не во время компиляции...)
Есть ли способ, которым я могу обнаружить во время компиляции (или во время компоновки), что -flto НЕ был указан, чтобы я мог выдать сообщение об ошибке?
Я уже сравнил предопределенные символы с -flto и без него с помощью трюка "-dM -E", и, похоже, нет никаких отличий. Есть идеи для других трюков?
(Должен ли __builtin_constant_p() быть "оценен" во время ссылки для -flto? Это не так, как в gcc 5.4.0 (последний компилятор avr с поддержкой "поставщика".))
1 ответ
Один из способов - попытаться проверить внешнюю глобальную переменную на невозможное значение:
// 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();
}
}
Любая глобальная переменная будет работать, если вы знаете невозможное значение. Если вы создаете указанную новую переменную, она никогда не должна в конечном итоге ссылаться во время выполнения, поэтому она все равно получит GC'ed от lto.