一种强制特定内联函数的汇编列表的方法,更好的方法?

orl*_*rlp 5 c++ gcc

我需要能够使用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)

现在,这有效,但它有两个问题:

  1. 它使用一次性变量来污染全局命名空间,这些变量可能会也可能不会被优化掉.
  2. 它不适用于重载功能.

有没有更好的方法?

gre*_*olf 4

来自函数属性下的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)