mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-08 22:47:54 +02:00
* made a separate abi entry for powerpc_darwin, as it's not exactly the same
as the AIX abi (especially on ppc64) o replaced (for now) all checks for the AIX abi with a check for either the AIX or Darwin abi o changed the ABI of Darwin/ppc, Darwin/ppc64 and Mac OS/ppc to abi_powerpc_darwin git-svn-id: trunk@30202 -
This commit is contained in:
parent
25340480b0
commit
165aaea8a4
@ -1582,7 +1582,8 @@ implementation
|
||||
(32-bit) alignment, in which case the alignment is determined by
|
||||
the alignment of the first field. */
|
||||
}
|
||||
if (target_info.abi=abi_powerpc_aix) and
|
||||
{ TODO: check whether this is also for AIX }
|
||||
if (target_info.abi in [abi_powerpc_aix,abi_powerpc_darwin]) and
|
||||
is_first_type and
|
||||
(symtablestack.top.symtabletype=recordsymtable) and
|
||||
(trecordsymtable(symtablestack.top).usefieldalignment=C_alignment) then
|
||||
|
@ -802,7 +802,8 @@ const
|
||||
list.concat(taicpu.op_reg(A_MFLR,NR_R0));
|
||||
{ ... in caller's frame }
|
||||
case target_info.abi of
|
||||
abi_powerpc_aix:
|
||||
abi_powerpc_aix,
|
||||
abi_powerpc_darwin:
|
||||
reference_reset_base(href,NR_STACK_POINTER_REG,LA_LR_AIX,4);
|
||||
abi_powerpc_sysv:
|
||||
reference_reset_base(href,NR_STACK_POINTER_REG,LA_LR_SYSV,4);
|
||||
@ -814,7 +815,7 @@ const
|
||||
|
||||
(*
|
||||
{ save the CR if necessary in callers frame. }
|
||||
if target_info.abi = abi_powerpc_aix then
|
||||
if target_info.abi in [abi_powerpc_aix,abi_powerpc_darwin] then
|
||||
if false then { Not needed at the moment. }
|
||||
begin
|
||||
a_reg_alloc(list,NR_R0);
|
||||
@ -1014,7 +1015,8 @@ const
|
||||
if (pi_do_call in current_procinfo.flags) then
|
||||
begin
|
||||
case target_info.abi of
|
||||
abi_powerpc_aix:
|
||||
abi_powerpc_aix,
|
||||
abi_powerpc_darwin:
|
||||
reference_reset_base(href,NR_STACK_POINTER_REG,LA_LR_AIX,4);
|
||||
abi_powerpc_sysv:
|
||||
reference_reset_base(href,NR_STACK_POINTER_REG,LA_LR_SYSV,4);
|
||||
@ -1027,7 +1029,7 @@ const
|
||||
|
||||
(*
|
||||
{ restore the CR if necessary from callers frame}
|
||||
if target_info.abi = abi_powerpc_aix then
|
||||
if target_info.abi in [abi_powerpc_aix,abi_powerpc_darwin] then
|
||||
if false then { Not needed at the moment. }
|
||||
begin
|
||||
reference_reset_base(href,NR_STACK_POINTER_REG,LA_CR_AIX);
|
||||
@ -1061,7 +1063,8 @@ const
|
||||
begin
|
||||
{ FIXME: has to be R_F14 instad of R_F8 for SYSV-64bit }
|
||||
case target_info.abi of
|
||||
abi_powerpc_aix:
|
||||
abi_powerpc_aix,
|
||||
abi_powerpc_darwin:
|
||||
firstfpureg := RS_F14;
|
||||
abi_powerpc_sysv:
|
||||
firstfpureg := RS_F9;
|
||||
@ -1144,7 +1147,8 @@ const
|
||||
begin
|
||||
{ FIXME: has to be R_F14 instad of R_F8 for SYSV-64bit }
|
||||
case target_info.abi of
|
||||
abi_powerpc_aix:
|
||||
abi_powerpc_aix,
|
||||
abi_powerpc_darwin:
|
||||
firstfpureg := RS_F14;
|
||||
abi_powerpc_sysv:
|
||||
firstfpureg := RS_F9;
|
||||
|
@ -69,6 +69,7 @@ unit cpupara;
|
||||
begin
|
||||
case target_info.abi of
|
||||
abi_powerpc_aix,
|
||||
abi_powerpc_darwin,
|
||||
abi_powerpc_sysv:
|
||||
result := [RS_F0..RS_F13];
|
||||
else
|
||||
@ -108,7 +109,7 @@ unit cpupara;
|
||||
begin
|
||||
loc:=LOC_REFERENCE;
|
||||
paraloc^.reference.index:=NR_STACK_POINTER_REG;
|
||||
if (target_info.abi <> abi_powerpc_aix) then
|
||||
if not(target_info.abi in [abi_powerpc_aix,abi_powerpc_darwin]) then
|
||||
reference.offset:=sizeof(pint)*(nr-8)
|
||||
else
|
||||
reference.offset:=sizeof(pint)*(nr);
|
||||
@ -138,14 +139,14 @@ unit cpupara;
|
||||
classrefdef:
|
||||
result:=LOC_REGISTER;
|
||||
procvardef:
|
||||
if (target_info.abi = abi_powerpc_aix) or
|
||||
if (target_info.abi in [abi_powerpc_aix,abi_powerpc_darwin]) or
|
||||
(p.size = sizeof(pint)) then
|
||||
result:=LOC_REGISTER
|
||||
else
|
||||
result:=LOC_REFERENCE;
|
||||
recorddef:
|
||||
if not(target_info.system in systems_aix) and
|
||||
((target_info.abi<>abi_powerpc_aix) or
|
||||
(not(target_info.abi in [abi_powerpc_aix,abi_powerpc_darwin]) or
|
||||
((p.size >= 3) and
|
||||
((p.size mod 4) <> 0))) then
|
||||
result:=LOC_REFERENCE
|
||||
@ -209,11 +210,11 @@ unit cpupara;
|
||||
}
|
||||
procvardef :
|
||||
result:=
|
||||
(target_info.abi <> abi_powerpc_aix) and
|
||||
not(target_info.abi in [abi_powerpc_aix,abi_powerpc_darwin]) and
|
||||
(def.size <> sizeof(pint));
|
||||
recorddef :
|
||||
result :=
|
||||
(target_info.abi<>abi_powerpc_aix) or
|
||||
not(target_info.abi in [abi_powerpc_aix,abi_powerpc_darwin]) or
|
||||
((varspez = vs_const) and
|
||||
((calloption = pocall_mwpascal) or
|
||||
(not (calloption in [pocall_cdecl,pocall_cppdecl]) and
|
||||
@ -239,7 +240,8 @@ unit cpupara;
|
||||
procedure tppcparamanager.init_values(var curintreg, curfloatreg, curmmreg: tsuperregister; var cur_stack_offset: aword);
|
||||
begin
|
||||
case target_info.abi of
|
||||
abi_powerpc_aix:
|
||||
abi_powerpc_aix,
|
||||
abi_powerpc_darwin:
|
||||
cur_stack_offset:=24;
|
||||
abi_powerpc_sysv:
|
||||
cur_stack_offset:=8;
|
||||
@ -349,7 +351,8 @@ unit cpupara;
|
||||
nextmmreg := curmmreg;
|
||||
stack_offset := cur_stack_offset;
|
||||
case target_info.abi of
|
||||
abi_powerpc_aix:
|
||||
abi_powerpc_aix,
|
||||
abi_powerpc_darwin:
|
||||
maxfpureg := RS_F13;
|
||||
abi_powerpc_sysv:
|
||||
maxfpureg := RS_F8;
|
||||
@ -394,7 +397,7 @@ unit cpupara;
|
||||
paralen := paradef.size
|
||||
else
|
||||
paralen := tcgsize2size[def_cgsize(paradef)];
|
||||
if (target_info.abi = abi_powerpc_aix) and
|
||||
if (target_info.abi in [abi_powerpc_aix,abi_powerpc_darwin]) and
|
||||
(paradef.typ = recorddef) and
|
||||
(hp.varspez in [vs_value,vs_const]) then
|
||||
begin
|
||||
@ -429,7 +432,7 @@ unit cpupara;
|
||||
|
||||
loc := getparaloc(paradef);
|
||||
if varargsparas and
|
||||
(target_info.abi = abi_powerpc_aix) and
|
||||
(target_info.abi in [abi_powerpc_aix,abi_powerpc_darwin]) and
|
||||
(paradef.typ = floatdef) then
|
||||
begin
|
||||
loc := LOC_REGISTER;
|
||||
@ -506,7 +509,7 @@ unit cpupara;
|
||||
paraloc^.register:=newreg(R_INTREGISTER,nextintreg,R_SUBNONE);
|
||||
inc(nextintreg);
|
||||
dec(paralen,tcgsize2size[paraloc^.size]);
|
||||
if target_info.abi=abi_powerpc_aix then
|
||||
if target_info.abi in [abi_powerpc_aix,abi_powerpc_darwin] then
|
||||
inc(stack_offset,align(tcgsize2size[paraloc^.size],4));
|
||||
end
|
||||
else if (loc = LOC_FPUREGISTER) and
|
||||
@ -520,7 +523,7 @@ unit cpupara;
|
||||
dec(paralen,tcgsize2size[paraloc^.size]);
|
||||
{ if nextfpureg > maxfpureg, all intregs are already used, since there }
|
||||
{ are less of those available for parameter passing in the AIX abi }
|
||||
if target_info.abi=abi_powerpc_aix then
|
||||
if target_info.abi in [abi_powerpc_aix,abi_powerpc_darwin] then
|
||||
{$ifndef cpu64bitaddr}
|
||||
if (paracgsize = OS_F32) then
|
||||
begin
|
||||
@ -584,7 +587,7 @@ unit cpupara;
|
||||
|
||||
if not((target_info.system in systems_aix) and
|
||||
(paradef.typ=recorddef)) and
|
||||
(target_info.abi = abi_powerpc_aix) and
|
||||
(target_info.abi in [abi_powerpc_aix,abi_powerpc_darwin]) and
|
||||
(hp.paraloc[side].intsize < 3) then
|
||||
paraloc^.reference.offset:=stack_offset+(4-paralen)
|
||||
else
|
||||
@ -628,7 +631,7 @@ unit cpupara;
|
||||
begin
|
||||
result:=create_paraloc_info_intern(p,callerside,varargspara,curintreg,curfloatreg,curmmreg,cur_stack_offset,true);
|
||||
{ varargs routines have to reserve at least 32 bytes for the AIX abi }
|
||||
if (target_info.abi = abi_powerpc_aix) and
|
||||
if (target_info.abi in [abi_powerpc_aix,abi_powerpc_darwin]) and
|
||||
(result < 32) then
|
||||
result := 32;
|
||||
end
|
||||
|
@ -83,7 +83,8 @@ unit cpupi;
|
||||
if not(po_assembler in procdef.procoptions) then
|
||||
begin
|
||||
case target_info.abi of
|
||||
abi_powerpc_aix:
|
||||
abi_powerpc_aix,
|
||||
abi_powerpc_darwin:
|
||||
ofs:=maxpushedparasize+LinkageAreaSizeAIX;
|
||||
abi_powerpc_sysv:
|
||||
ofs:=maxpushedparasize+LinkageAreaSizeSYSV;
|
||||
@ -143,7 +144,8 @@ unit cpupi;
|
||||
first_save_int_reg := 32;
|
||||
{ FIXME: has to be R_F14 instead of R_F8 for SYSV-64bit }
|
||||
case target_info.abi of
|
||||
abi_powerpc_aix:
|
||||
abi_powerpc_aix,
|
||||
abi_powerpc_darwin:
|
||||
low_nonvol_fpu_reg := RS_F14;
|
||||
abi_powerpc_sysv:
|
||||
low_nonvol_fpu_reg := RS_F14;
|
||||
@ -168,7 +170,7 @@ unit cpupi;
|
||||
end;
|
||||
if not(pi_do_call in flags) and
|
||||
(not uses_stack_temps) and
|
||||
(((target_info.abi = abi_powerpc_aix) and
|
||||
(((target_info.abi in [abi_powerpc_aix,abi_powerpc_darwin]) and
|
||||
((32-first_save_int_reg)*4+(32-first_save_fpu_reg)*8 <= 220)) or
|
||||
((target_info.abi = abi_powerpc_sysv) and
|
||||
(first_save_int_reg + first_save_fpu_reg = 64))) then
|
||||
|
@ -284,7 +284,7 @@
|
||||
);
|
||||
|
||||
tabi = (abi_default
|
||||
,abi_powerpc_sysv,abi_powerpc_aix,abi_powerpc_elfv2
|
||||
,abi_powerpc_sysv,abi_powerpc_aix,abi_powerpc_darwin,abi_powerpc_elfv2
|
||||
,abi_eabi,abi_armeb,abi_eabihf
|
||||
,abi_old_win32_gnu
|
||||
,abi_aarch64_darwin
|
||||
|
@ -363,6 +363,7 @@ interface
|
||||
(name: 'DEFAULT'; supported: true),
|
||||
(name: 'SYSV' ; supported:{$if defined(powerpc) or defined(powerpc64)}true{$else}false{$endif}),
|
||||
(name: 'AIX' ; supported:{$if defined(powerpc) or defined(powerpc64)}true{$else}false{$endif}),
|
||||
(name: 'DARWIN' ; supported:{$if defined(powerpc) or defined(powerpc64)}true{$else}false{$endif}),
|
||||
(name: 'ELFV2' ; supported:{$if defined(powerpc64)}true{$else}false{$endif}),
|
||||
(name: 'EABI' ; supported:{$ifdef FPC_ARMEL}true{$else}false{$endif}),
|
||||
(name: 'ARMEB' ; supported:{$ifdef FPC_ARMEB}true{$else}false{$endif}),
|
||||
|
@ -692,7 +692,7 @@ unit i_bsd;
|
||||
first_parm_offset : 24;
|
||||
stacksize : 262144;
|
||||
stackalign : 16;
|
||||
abi : abi_powerpc_aix;
|
||||
abi : abi_powerpc_darwin;
|
||||
);
|
||||
|
||||
|
||||
@ -884,7 +884,7 @@ unit i_bsd;
|
||||
first_parm_offset : 48;
|
||||
stacksize : 262144;
|
||||
stackalign : 16;
|
||||
abi : abi_powerpc_aix;
|
||||
abi : abi_powerpc_darwin;
|
||||
);
|
||||
|
||||
|
||||
|
@ -87,7 +87,7 @@ unit i_macos;
|
||||
first_parm_offset : 8;
|
||||
stacksize : 262144;
|
||||
stackalign : 16;
|
||||
abi : abi_powerpc_aix;
|
||||
abi : abi_powerpc_darwin;
|
||||
);
|
||||
|
||||
implementation
|
||||
|
Loading…
Reference in New Issue
Block a user