mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-11-11 12:09:25 +01:00
+ mw_pascal calling convention support for ARM, ppc64 and x86_64: identical
to cdecl, except that all const record parameters are passed by reference
(required for Mac OS X interfaces)
git-svn-id: trunk@14114 -
This commit is contained in:
parent
0b57ceef21
commit
62c1781bea
@ -91,7 +91,10 @@ Const
|
|||||||
{ same as stdcall only different name mangling }
|
{ same as stdcall only different name mangling }
|
||||||
pocall_cppdecl,
|
pocall_cppdecl,
|
||||||
{ same as stdcall but floating point numbers are handled like equal sized integers }
|
{ same as stdcall but floating point numbers are handled like equal sized integers }
|
||||||
pocall_softfloat
|
pocall_softfloat,
|
||||||
|
{ same as stdcall (requires that all const records are passed by
|
||||||
|
reference, but that's already done for stdcall) }
|
||||||
|
pocall_mwpascal
|
||||||
];
|
];
|
||||||
|
|
||||||
cputypestr : array[tcputype] of string[8] = ('',
|
cputypestr : array[tcputype] of string[8] = ('',
|
||||||
|
|||||||
@ -164,6 +164,8 @@ unit cpupara;
|
|||||||
objectdef:
|
objectdef:
|
||||||
result:=is_object(def) and ((varspez=vs_const) or (def.size=0));
|
result:=is_object(def) and ((varspez=vs_const) or (def.size=0));
|
||||||
recorddef:
|
recorddef:
|
||||||
|
{ note: should this ever be changed, make sure that const records
|
||||||
|
are always passed by reference for calloption=pocall_mwpascal }
|
||||||
result:=(varspez=vs_const) or (def.size=0);
|
result:=(varspez=vs_const) or (def.size=0);
|
||||||
variantdef,
|
variantdef,
|
||||||
formaldef:
|
formaldef:
|
||||||
|
|||||||
@ -48,7 +48,10 @@ const
|
|||||||
{ the difference to stdcall is only the name mangling }
|
{ the difference to stdcall is only the name mangling }
|
||||||
pocall_cdecl,
|
pocall_cdecl,
|
||||||
{ the difference to stdcall is only the name mangling }
|
{ the difference to stdcall is only the name mangling }
|
||||||
pocall_cppdecl
|
pocall_cppdecl,
|
||||||
|
{ the difference with stdcall is that all const record
|
||||||
|
parameters are passed by reference }
|
||||||
|
pocall_mwpascal
|
||||||
];
|
];
|
||||||
|
|
||||||
cputypestr: array[tcputype] of string[10] = ('',
|
cputypestr: array[tcputype] of string[10] = ('',
|
||||||
|
|||||||
@ -173,10 +173,11 @@ begin
|
|||||||
recorddef:
|
recorddef:
|
||||||
result :=
|
result :=
|
||||||
((varspez = vs_const) and
|
((varspez = vs_const) and
|
||||||
(
|
(
|
||||||
(not (calloption in [pocall_cdecl, pocall_cppdecl]) and
|
(not (calloption in [pocall_cdecl, pocall_cppdecl]) and
|
||||||
(def.size > 8))
|
(def.size > 8))
|
||||||
)
|
) or
|
||||||
|
(calloption = pocall_mwpascal)
|
||||||
);
|
);
|
||||||
arraydef:
|
arraydef:
|
||||||
result := (tarraydef(def).highrange >= tarraydef(def).lowrange) or
|
result := (tarraydef(def).highrange >= tarraydef(def).lowrange) or
|
||||||
|
|||||||
@ -67,7 +67,8 @@ Const
|
|||||||
pocall_safecall,
|
pocall_safecall,
|
||||||
pocall_stdcall,
|
pocall_stdcall,
|
||||||
pocall_cdecl,
|
pocall_cdecl,
|
||||||
pocall_cppdecl
|
pocall_cppdecl,
|
||||||
|
pocall_mwpascal
|
||||||
];
|
];
|
||||||
|
|
||||||
cputypestr : array[tcputype] of string[10] = ('',
|
cputypestr : array[tcputype] of string[10] = ('',
|
||||||
|
|||||||
@ -284,6 +284,11 @@ unit cpupara;
|
|||||||
{ Win ABI depends on size to pass it in a register or not }
|
{ Win ABI depends on size to pass it in a register or not }
|
||||||
if (target_info.system=system_x86_64_win64) then
|
if (target_info.system=system_x86_64_win64) then
|
||||||
result:=not structure_in_registers(varspez,def.size)
|
result:=not structure_in_registers(varspez,def.size)
|
||||||
|
{ MetroWerks Pascal: const records always passed by reference
|
||||||
|
(for Mac OS X interfaces) }
|
||||||
|
else if (calloption=pocall_mwpascal) and
|
||||||
|
(varspez=vs_const) then
|
||||||
|
result:=true
|
||||||
else
|
else
|
||||||
{ linux ABI always passes it as value parameter }
|
{ linux ABI always passes it as value parameter }
|
||||||
result:=false;
|
result:=false;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user