Userò il seguente codice C per spiegare la mia domanda:
#include <stdio.h>
int main(void) {
printf("foo\n");
return 0;
}
Prima di GCC 4.9.0, lo smontaggio produce:
.LC0:
.string "foo"
main:
push ebp
mov ebp, esp
and esp, -16
sub esp, 16
mov DWORD PTR [esp], OFFSET FLAT:.LC0
call puts
mov eax, 0
leave
ret
Tuttavia, dal momento che GHC 4.9.0, il risultato è come:
.LC0:
.string "foo"
main:
lea ecx, [esp+4]
and esp, -16
push DWORD PTR [ecx-4]
push ebp
mov ebp, esp
push ecx
sub esp, 4
sub esp, 12
push OFFSET FLAT:.LC0
call puts
add esp, 16
mov eax, 0
mov ecx, DWORD PTR [ebp-4]
leave
lea esp, [ecx-4]
ret
Qualcuno sa perché questa modifica è stata presa?