Может ли программа gcc определить, когда включена оптимизация времени компоновки (-flto)?

У меня есть код, в котором ДОЛЖНА быть включена оптимизация времени ссылки, чтобы работать правильно. Мне нужна постоянная оценка выражения:

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

(PROGMEM — это конструкция avr-gcc, которая помещает константу в отдельный раздел памяти, который впоследствии загружается во флэш-память, а не в оперативную память, и во время выполнения для доступа потребуется особая осторожность. Но не во время компиляции. ...)

Есть ли способ, которым я могу обнаружить во время компиляции (или во время компоновки), что -flto НЕ был указан, чтобы я мог выдать сообщение об ошибке?

Я уже сравнил предопределенные символы с -flto и без него, используя трюк "-dM -E", и, кажется, нет никаких различий. Есть идеи для других трюков?

(должен ли __builtin_constant_p() "оцениваться" во время компоновки для -flto? Это не так, как в gcc 5.4.0 (последний "поддерживаемый поставщиком" компилятор avr.))


person WestfW    schedule 08.11.2018    source источник
comment
Значит, PROGMEN не будет работать без -flto? Каковы последствия? Или я неправильно понимаю вопрос?   -  person Rev    schedule 08.11.2018
comment
PROGMEM работает нормально и является чем-то вроде красной селедки по отношению к реальному вопросу (определение того, использовался ли -flto.) Это просто ПОЧЕМУ мне нужно знать. Если используется -flto, компилятор может получить доступ к ConstantTable[4] и получить 5 во время компиляции. если -flto НЕ используется, тогда код среды выполнения должен будет использовать pgm_read_byte(&constantTable[4])   -  person WestfW    schedule 09.11.2018
comment
Тело вопроса, кажется, противоречит заголовку. Для каждого заголовка вы хотите, чтобы программа проверяла наличие -flto. Это время выполнения. В теле вопроса вы хотите проверить наличие -flto во время времени компиляции или компоновки. Что, безусловно, не должно быть проблемой, поскольку ваша система сборки знает, каковы ее параметры компиляции/связывания.   -  person Mike Kinghan    schedule 09.11.2018
comment
Я думаю, что название немного двусмысленно. Я хочу проверить во время компиляции, но изнутри исходного кода. Система сборки может знать, что -flto включен, но я хочу, чтобы исходный код мог обнаружить это на случай, если кто-то испортит систему сборки.   -  person WestfW    schedule 11.11.2018


Ответы (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();
    }
}

Любая глобальная переменная будет работать, если вы знаете невозможное значение. Если вы создаете специальную новую переменную, на нее никогда не должны ссылаться в среде выполнения, поэтому lto все равно получит ее сборщик мусора.

person WestfW    schedule 09.11.2018