Мне нужно уметь просматривать сборку определенной функции с помощью GCC. Я использую -S
, но иногда, если функция встроена, не выводится отдельный код сборки для функции. Я не хочу, чтобы предотвратить inlining alltogether, потому что я также делаю тесты производительности, и я хочу, чтобы вложение для этого.Способ создания списка сборок для конкретной встроенной функции, лучший способ?
Я знаю вариант -fkeep-inline-functions
, но, к сожалению, это относится и к каждый функции, и я не хочу раздувать свой выходной файл сборки с тысячами строк ассемблерного кода для стандартной библиотеки.
Я выяснил, что если вы возьмете адрес функции, он не будет оптимизирован вдали от сборки. Зная это, я взломанный следующий макрос вместе:
#define DONT_OPT_OUT_CONCAT1(a, b) DONT_OPT_OUT_CONCAT2(a, b)
#define DONT_OPT_OUT_CONCAT2(a, b) a ## b
#define DONT_OPT_OUT(x) \
int DONT_OPT_OUT_CONCAT1(DONT_OPT_OUT_BLACK_HOLE, __COUNTER__) = (&x, 0);
Использование:
int f(int x) { return x*x; }
DONT_OPT_OUT(f);
Теперь, это работает, но у него есть две проблемы:
- Это загрязняет глобальное пространство имен бросовым переменных которые могут быть оптимизированы или не могут быть оптимизированы.
- Он не работает для перегруженных функций.
Есть ли лучший способ?
GCC имеет '#pragma НКУ push_op и '#pragma GCC pop_options', так что, возможно, вам удастся выполнить то, что вам нужно с этим – jcxz
Не могли бы вы использовать атрибут' noinline'? –
Я думаю, что один из 'искусственных' и' noinline' делает то, что вы хотите. Не уверен. – tmyklebu