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

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

  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 (последний компилятор "поддерживаемый вендором").))

1 Ответ

0 голосов
/ 09 ноября 2018

Один из способов - попытаться проверить внешнюю глобальную переменную на невозможное значение:

// 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.

...