[fpc-pascal]Default calling convention
mm10 at ellipsa.net
Fri Jul 2 17:34:04 CEST 2004
Peter Vreman a écrit :
> Check what Delphi does for nested procedures. If it is different from FPC
> then FPC will be adapted.
Overall, no :-) Delphi (at least the version 5.01) is bugged.
For instance, with
function Add: Longword;
var x : Longword;
function DoAdd(a: Longword): Longword; register;
var y : Longword;
mov y, 1
add eax, x
add eax, y
x := 7;
Result := DoAdd(1);
The result should be 9 (1+7+1) but for Delphi it is only 3.
"DoAdd" is coded this way
mov [ebp-$04], $00000001 // mov y, 1
add eax, [ebp-$4] // add eax, x
add eax, [ebp-$4] // add eax, y
i.e., for Delphi 5.01, x and y are the same thing!
I think the best thing that could be done would be to manage so that
FPC always makes use of [ebp-something] to access a parameter when
the programmer makes use of the parameter name, i,e., with any calling
convention the instruction "mov eax,param" should never be coded as
"mov eax,reg" but always as "mov eax,[ebp-something]".
More information about the fpc-pascal