Может ли программа 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.

Другие вопросы по тегам