我需要能够使用GCC查看特定函数的汇编输出。我使用-S
,但有时如果函数是内联的,则不输出该函数的单独汇编代码。我不想完全阻止内联,因为我也在做性能基准测试,我想要内联。
我知道选项-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);
现在,这有效,但它有两个问题:
还有更好的方法吗?
答案 0 :(得分:4)
来自功能属性下的gcc onlinedocs:
<强>使用强>
此属性附加到函数,意味着即使看起来函数未被引用,也必须为函数发出代码。这很有用,例如,仅在内联汇编中引用该函数时。
所以你可以尝试的一个想法是做这样的事情:
int __attribute__ ((used)) f(int x) { return x*x; }
初步测试表明这似乎有效:
g ++ -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