我需要能够使用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);
Run Code Online (Sandbox Code Playgroud)
用法:
int f(int x) { return x*x; }
DONT_OPT_OUT(f);
Run Code Online (Sandbox Code Playgroud)
现在,这有效,但它有两个问题:
有没有更好的方法?
来自函数属性下的gcc onlinedocs:
用过的
此属性附加到函数,意味着即使该函数似乎未被引用,也必须为该函数发出代码。例如,当仅在内联汇编中引用该函数时,这很有用。
所以你可以尝试的一个想法是做这样的事情:
int __attribute__ ((used)) f(int x) { return x*x; }
Run Code Online (Sandbox Code Playgroud)
初步测试表明这似乎有效:
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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
88 次 |
最近记录: |