我不明白为什么gcc甚至触及%esp代码:
function getWorkedDaysExcludingHolidays() {
// calculation $days here based on holidays
return $days;
}
使用int foo(char *);
int bar(char** a)
{
if (!a[1]) {
return 1;
}
if (foo(a[1]) == -1) {
return 1;
}
return 0;
}
:
-O2
并且clang在开始时推动bar:
.LFB0:
.cfi_startproc
movq 8(%rdi), %rdi
movl $1, %eax
testq %rdi, %rdi
je .L7
subq $8, %rsp
.cfi_def_cfa_offset 16
call foo
cmpl $-1, %eax
sete %al
addq $8, %rsp
.cfi_def_cfa_offset 8
movzbl %al, %eax
.L7:
rep ret
然后将其弹出到%rax
中,从而做了一些甚至疯狂的事情。
是否要分配堆栈帧?这与这些%rdx
指令有关吗?
答案 0 :(得分:0)
因为在x64中,堆栈必须是16字节对齐,并且调用指令使堆栈失衡。这个特殊的代码没有任何关心,但编译器无法知道foo内部的任何指令。
实际上它总是在调用时未对齐,并且应该在prolog代码中重新对齐;然而,优化者将序言和epilog误认为是无法识别的。