2013-12-09 2 views
5

Мне нужно уметь просматривать сборку определенной функции с помощью 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); 

Теперь, это работает, но у него есть две проблемы:

  1. Это загрязняет глобальное пространство имен бросовым переменных которые могут быть оптимизированы или не могут быть оптимизированы.
  2. Он не работает для перегруженных функций.

Есть ли лучший способ?

+0

GCC имеет '#pragma НКУ push_op и '#pragma GCC pop_options', так что, возможно, вам удастся выполнить то, что вам нужно с этим – jcxz

+0

Не могли бы вы использовать атрибут' noinline'? –

+0

Я думаю, что один из 'искусственных' и' noinline' делает то, что вы хотите. Не уверен. – tmyklebu

ответ

4

Из gcc onlinedocs под функцией Атрибуты:

использовал

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

Так одна идея, которую вы можете попробовать это сделать что-то вроде этого:

int __attribute__ ((used)) f(int x) { return x*x; } 

Первоначальное тестирование показывает, что это похоже на работу:

г ++ -Wall -pedantic -O2 -masm = Intel -S example.cpp

; example.S 
    .globl __Z1fi 
    .def __Z1fi; .scl 2; .type 32; .endef 
__Z1fi: 
    mov eax, DWORD PTR [esp+4] 
    imul eax, eax 
    ret 
+1

Удивительно, только то, что я искал. – orlp

Смежные вопросы