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

时间:2013-12-09 23:55:19

标签: 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);

用法:

int f(int x) { return x*x; }
DONT_OPT_OUT(f);

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

  1. 它使用可能会或可能不会被优化的一次性变量来污染全局命名空间。
  2. 它不适用于重载功能。
  3. 还有更好的方法吗?

1 个答案:

答案 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