* 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:
Jonas Maebe 2015-03-14 18:35:44 +00:00
parent 25340480b0
commit 165aaea8a4
8 changed files with 38 additions and 27 deletions

View File

@ -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

View File

@ -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;

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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}),

View File

@ -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;
);

View File

@ -87,7 +87,7 @@ unit i_macos;
first_parm_offset : 8;
stacksize : 262144;
stackalign : 16;
abi : abi_powerpc_aix;
abi : abi_powerpc_darwin;
);
implementation