mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-13 04:39:22 +02:00
* use pocalls_cdecl and cstylearrayofconst more consistently instead of
ad hoc set constants containing varying number cdecl-like calling conventions o added pocall_sysv_abi_cdecl and pocall_ms_abi_cdecl to cstylearrayofconst o also allow C-style blocks with mwpascal instead of cdecl (mwpascal = cdecl with "const" = "constref" for record parameters) o did not touch cases related to name mangling and import/export names, because those are a real mess and easily break things left and right :/ git-svn-id: trunk@35479 -
This commit is contained in:
parent
1adde89621
commit
4c68ea1000
@ -132,7 +132,7 @@ unit cpupara;
|
|||||||
if ((target_info.abi=abi_eabihf) or (calloption=pocall_hardfloat)) and
|
if ((target_info.abi=abi_eabihf) or (calloption=pocall_hardfloat)) and
|
||||||
(not isvariadic) then
|
(not isvariadic) then
|
||||||
getparaloc:=LOC_MMREGISTER
|
getparaloc:=LOC_MMREGISTER
|
||||||
else if (calloption in [pocall_cdecl,pocall_cppdecl,pocall_softfloat]) or
|
else if (calloption in cdecl_pocalls) or
|
||||||
(cs_fp_emulation in current_settings.moduleswitches) or
|
(cs_fp_emulation in current_settings.moduleswitches) or
|
||||||
(current_settings.fputype in [fpu_vfpv2,fpu_vfpv3,fpu_vfpv4,fpu_vfpv3_d16,fpu_fpv4_s16]) then
|
(current_settings.fputype in [fpu_vfpv2,fpu_vfpv3,fpu_vfpv4,fpu_vfpv3_d16,fpu_fpv4_s16]) then
|
||||||
{ the ARM eabi also allows passing VFP values via VFP registers,
|
{ the ARM eabi also allows passing VFP values via VFP registers,
|
||||||
|
@ -575,7 +575,7 @@ interface
|
|||||||
pocall_default = pocall_stdcall;
|
pocall_default = pocall_stdcall;
|
||||||
{$endif}
|
{$endif}
|
||||||
|
|
||||||
cstylearrayofconst = [pocall_cdecl,pocall_cppdecl,pocall_mwpascal];
|
cstylearrayofconst = [pocall_cdecl,pocall_cppdecl,pocall_mwpascal,pocall_sysv_abi_cdecl,pocall_ms_abi_cdecl];
|
||||||
|
|
||||||
modeswitchstr : array[tmodeswitch] of string[18] = ('',
|
modeswitchstr : array[tmodeswitch] of string[18] = ('',
|
||||||
'','','','','','','',
|
'','','','','','','',
|
||||||
|
@ -104,7 +104,7 @@ unit cpupara;
|
|||||||
only records of a size of 1,2 or 4 bytes in FUNCTION_RETURN_REG }
|
only records of a size of 1,2 or 4 bytes in FUNCTION_RETURN_REG }
|
||||||
if ((pd.proccalloption in [pocall_stdcall,pocall_register]) and
|
if ((pd.proccalloption in [pocall_stdcall,pocall_register]) and
|
||||||
(def.size in [1,2,4])) or
|
(def.size in [1,2,4])) or
|
||||||
((pd.proccalloption in [pocall_cdecl,pocall_cppdecl]) and
|
((pd.proccalloption in cdecl_pocalls) and
|
||||||
(def.size>0) and
|
(def.size>0) and
|
||||||
(def.size<=8)) then
|
(def.size<=8)) then
|
||||||
begin
|
begin
|
||||||
@ -121,7 +121,7 @@ unit cpupara;
|
|||||||
recorddef :
|
recorddef :
|
||||||
begin
|
begin
|
||||||
{ EMX port of GCC returns small records in the FUNCTION_RETURN_REG up to 4 bytes in registers. }
|
{ EMX port of GCC returns small records in the FUNCTION_RETURN_REG up to 4 bytes in registers. }
|
||||||
if ((pd.proccalloption in [pocall_cdecl,pocall_cppdecl]) and
|
if ((pd.proccalloption in cdecl_pocalls) and
|
||||||
(def.size>0) and
|
(def.size>0) and
|
||||||
(def.size<=4)) then
|
(def.size<=4)) then
|
||||||
begin
|
begin
|
||||||
|
@ -38,6 +38,7 @@ implementation
|
|||||||
|
|
||||||
uses
|
uses
|
||||||
globtype,cpubase,procinfo,
|
globtype,cpubase,procinfo,
|
||||||
|
symconst,
|
||||||
aasmtai,aasmcpu,aasmdata,
|
aasmtai,aasmcpu,aasmdata,
|
||||||
paramgr,
|
paramgr,
|
||||||
ncal;
|
ncal;
|
||||||
@ -47,7 +48,7 @@ begin
|
|||||||
pass_1 := inherited pass_1;
|
pass_1 := inherited pass_1;
|
||||||
if assigned(current_procinfo) and
|
if assigned(current_procinfo) and
|
||||||
assigned(procdefinition) and
|
assigned(procdefinition) and
|
||||||
(procdefinition.proccalloption=pocall_cdecl) then
|
(procdefinition.proccalloption in cdecl_pocalls) then
|
||||||
include(current_procinfo.flags,pi_needs_got);
|
include(current_procinfo.flags,pi_needs_got);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
@ -839,7 +839,7 @@ implementation
|
|||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
if (po_hascallingconvention in tprocvardef(hdef).procoptions) and
|
if (po_hascallingconvention in tprocvardef(hdef).procoptions) and
|
||||||
(tprocvardef(hdef).proccalloption=pocall_cdecl) then
|
(tprocvardef(hdef).proccalloption in [pocall_cdecl,pocall_mwpascal]) then
|
||||||
begin
|
begin
|
||||||
include(tprocvardef(hdef).procoptions,po_is_block);
|
include(tprocvardef(hdef).procoptions,po_is_block);
|
||||||
{ can't check yet whether the parameter types
|
{ can't check yet whether the parameter types
|
||||||
|
@ -3234,7 +3234,7 @@ const
|
|||||||
{ for objcclasses this is checked later, because the entire
|
{ for objcclasses this is checked later, because the entire
|
||||||
class may be external. }
|
class may be external. }
|
||||||
is_objc_class_or_protocol(tprocdef(pd).struct)) and
|
is_objc_class_or_protocol(tprocdef(pd).struct)) and
|
||||||
not(pd.proccalloption in (cdecl_pocalls + [pocall_mwpascal,pocall_stdcall])) then
|
not(pd.proccalloption in (cdecl_pocalls + [pocall_stdcall])) then
|
||||||
Message(parser_e_varargs_need_cdecl_and_external);
|
Message(parser_e_varargs_need_cdecl_and_external);
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
@ -3242,7 +3242,7 @@ const
|
|||||||
{ both must be defined now }
|
{ both must be defined now }
|
||||||
if not((po_external in pd.procoptions) or
|
if not((po_external in pd.procoptions) or
|
||||||
(pd.typ=procvardef)) or
|
(pd.typ=procvardef)) or
|
||||||
not(pd.proccalloption in (cdecl_pocalls + [pocall_mwpascal,pocall_stdcall])) then
|
not(pd.proccalloption in (cdecl_pocalls + [pocall_stdcall])) then
|
||||||
Message(parser_e_varargs_need_cdecl_and_external);
|
Message(parser_e_varargs_need_cdecl_and_external);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
@ -220,7 +220,7 @@ unit cpupara;
|
|||||||
not(target_info.abi in [abi_powerpc_aix,abi_powerpc_darwin]) or
|
not(target_info.abi in [abi_powerpc_aix,abi_powerpc_darwin]) or
|
||||||
((varspez = vs_const) and
|
((varspez = vs_const) and
|
||||||
((calloption = pocall_mwpascal) or
|
((calloption = pocall_mwpascal) or
|
||||||
(not (calloption in [pocall_cdecl,pocall_cppdecl]) and
|
(not (calloption in cdecl_pocalls) and
|
||||||
(def.size > 8)
|
(def.size > 8)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
@ -185,7 +185,7 @@ begin
|
|||||||
(varspez = vs_const) and
|
(varspez = vs_const) and
|
||||||
(
|
(
|
||||||
(
|
(
|
||||||
(not (calloption in [pocall_cdecl, pocall_cppdecl]) and
|
(not (calloption in cdecl_pocalls) and
|
||||||
(def.size > 8))
|
(def.size > 8))
|
||||||
) or
|
) or
|
||||||
(calloption = pocall_mwpascal)
|
(calloption = pocall_mwpascal)
|
||||||
@ -371,7 +371,7 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
{ currently only support C-style array of const }
|
{ currently only support C-style array of const }
|
||||||
if (p.proccalloption in [pocall_cdecl, pocall_cppdecl]) and
|
if (p.proccalloption in cstylearrayofconst) and
|
||||||
is_array_of_const(hp.vardef) then begin
|
is_array_of_const(hp.vardef) then begin
|
||||||
paraloc := hp.paraloc[side].add_location;
|
paraloc := hp.paraloc[side].add_location;
|
||||||
{ hack: the paraloc must be valid, but is not actually used }
|
{ hack: the paraloc must be valid, but is not actually used }
|
||||||
@ -744,7 +744,7 @@ begin
|
|||||||
|
|
||||||
result := create_paraloc_info_intern(p, callerside, p.paras, curintreg,
|
result := create_paraloc_info_intern(p, callerside, p.paras, curintreg,
|
||||||
curfloatreg, curmmreg, cur_stack_offset, false);
|
curfloatreg, curmmreg, cur_stack_offset, false);
|
||||||
if (p.proccalloption in [pocall_cdecl, pocall_cppdecl, pocall_mwpascal]) then begin
|
if (p.proccalloption in cstylearrayofconst) then begin
|
||||||
{ just continue loading the parameters in the registers }
|
{ just continue loading the parameters in the registers }
|
||||||
result := create_paraloc_info_intern(p, callerside, varargspara, curintreg,
|
result := create_paraloc_info_intern(p, callerside, varargspara, curintreg,
|
||||||
curfloatreg, curmmreg, cur_stack_offset, true);
|
curfloatreg, curmmreg, cur_stack_offset, true);
|
||||||
|
Loading…
Reference in New Issue
Block a user