【问题标题】:Why does GCC not optimise away the function prologue and epilogue (push ebp; mov ebp, esp; ...; pop ebp) [duplicate]为什么 GCC 不优化功能序言和结尾(push ebp; mov ebp, esp; ...; pop ebp)[重复]
【发布时间】:2014-02-07 05:44:56
【问题描述】:

当编译一个甚至不改变 ebp 寄存器的简单函数时,GCC 仍然保存函数开始时的值,然后在结束时恢复相同的值:

#add.c
int add( int a, int b )
{
  return ( a + b );
}

gcc -c -S -m32 -O3 add.c -o add.S

#add.S
    .file   "add.c"
    .text
    .p2align 4,,15
.globl add
    .type   add, @function
add:
    pushl   %ebp
    movl    %esp, %ebp
    movl    12(%ebp), %eax
    addl    8(%ebp), %eax
    popl    %ebp
    ret
    .size   add, .-add
    .ident  "GCC: (GNU) 4.4.6"
    .section        .note.GNU-stack,"",@progbits

保持 ebp 不变,计算相对于 esp 的偏移量并保存 3 条指令,这似乎是一个简单的优化。

为什么 GCC 不这样做?

谢谢,

安德鲁

【问题讨论】:

  • stackoverflow.com/questions/5086230/… 的答案(出现在您问题旁边的“相关”列表中)也可以回答您的问题。
  • 当我使用 gcc 4.8.1 执行此操作时,我确实优化了序言/结尾
  • 嗨,这个问题确实回答了我的问题。有什么办法可以把我的指向那里吗?

标签: c gcc assembly compiler-optimization calling-convention


【解决方案1】:

调试器和堆栈遍历器等工具过去期望代码具有构造帧指针的序言,而无法理解没有它的代码。随着时间的推移,限制已被取消。

编译器本身生成没有帧指针的代码没有困难,您可以使用-fomit-frame-pointer 要求将其删除。我相信最新版本的 gcc (~4.8) 和 x86-64 上的 gcc 默认会省略帧指针。

【讨论】:

    猜你喜欢
    • 2011-08-23
    • 1970-01-01
    • 2011-01-31
    • 2012-04-03
    • 2011-07-25
    • 2011-04-07
    • 2013-02-07
    相关资源
    最近更新 更多