mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-10-30 05:11:29 +01:00
* fixed arm compilation
This commit is contained in:
parent
569b45597b
commit
ad4345c217
@ -40,10 +40,10 @@ unit cpupara;
|
|||||||
function push_addr_param(varspez:tvarspez;def : tdef;calloption : tproccalloption) : boolean;override;
|
function push_addr_param(varspez:tvarspez;def : tdef;calloption : tproccalloption) : boolean;override;
|
||||||
procedure getintparaloc(calloption : tproccalloption; nr : longint;var cgpara:TCGPara);override;
|
procedure getintparaloc(calloption : tproccalloption; nr : longint;var cgpara:TCGPara);override;
|
||||||
function create_paraloc_info(p : tabstractprocdef; side: tcallercallee):longint;override;
|
function create_paraloc_info(p : tabstractprocdef; side: tcallercallee):longint;override;
|
||||||
function create_varargs_paraloc_info(p : tabstractprocdef; varargspara:tvarargspara):longint;override;
|
function create_varargs_paraloc_info(p : tabstractprocdef; varargspara:tvarargsparalist):longint;override;
|
||||||
private
|
private
|
||||||
procedure init_values(var curintreg, curfloatreg, curmmreg: tsuperregister; var cur_stack_offset: aword);
|
procedure init_values(var curintreg, curfloatreg, curmmreg: tsuperregister; var cur_stack_offset: aword);
|
||||||
function create_paraloc_info_intern(p : tabstractprocdef; side: tcallercallee; firstpara: tparaitem;
|
function create_paraloc_info_intern(p : tabstractprocdef; side: tcallercallee; paras: tparalist;
|
||||||
var curintreg, curfloatreg, curmmreg: tsuperregister; var cur_stack_offset: aword):longint;
|
var curintreg, curfloatreg, curmmreg: tsuperregister; var cur_stack_offset: aword):longint;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -52,7 +52,8 @@ unit cpupara;
|
|||||||
uses
|
uses
|
||||||
verbose,systems,
|
verbose,systems,
|
||||||
rgobj,
|
rgobj,
|
||||||
defutil,symsym;
|
defutil,symsym,
|
||||||
|
cgutils;
|
||||||
|
|
||||||
|
|
||||||
function tarmparamanager.get_volatile_registers_int(calloption : tproccalloption):tcpuregisterset;
|
function tarmparamanager.get_volatile_registers_int(calloption : tproccalloption):tcpuregisterset;
|
||||||
@ -191,7 +192,7 @@ unit cpupara;
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
function tarmparamanager.create_paraloc_info_intern(p : tabstractprocdef; side: tcallercallee; firstpara: tparaitem;
|
function tarmparamanager.create_paraloc_info_intern(p : tabstractprocdef; side: tcallercallee; paras: tparalist;
|
||||||
var curintreg, curfloatreg, curmmreg: tsuperregister; var cur_stack_offset: aword):longint;
|
var curintreg, curfloatreg, curmmreg: tsuperregister; var cur_stack_offset: aword):longint;
|
||||||
|
|
||||||
var
|
var
|
||||||
@ -199,10 +200,11 @@ unit cpupara;
|
|||||||
paradef : tdef;
|
paradef : tdef;
|
||||||
paraloc : pcgparalocation;
|
paraloc : pcgparalocation;
|
||||||
stack_offset : aword;
|
stack_offset : aword;
|
||||||
hp : tparaitem;
|
hp : tparavarsym;
|
||||||
loc : tcgloc;
|
loc : tcgloc;
|
||||||
paracgsize : tcgsize;
|
paracgsize : tcgsize;
|
||||||
paralen : longint;
|
paralen : longint;
|
||||||
|
i : integer;
|
||||||
|
|
||||||
procedure assignintreg;
|
procedure assignintreg;
|
||||||
begin
|
begin
|
||||||
@ -229,13 +231,13 @@ unit cpupara;
|
|||||||
nextmmreg:=curmmreg;
|
nextmmreg:=curmmreg;
|
||||||
stack_offset:=cur_stack_offset;
|
stack_offset:=cur_stack_offset;
|
||||||
|
|
||||||
hp:=firstpara;
|
for i:=0 to paras.count-1 do
|
||||||
while assigned(hp) do
|
|
||||||
begin
|
begin
|
||||||
|
hp:=tparavarsym(paras[i]);
|
||||||
{ currently only support C-style array of const,
|
{ currently only support C-style array of const,
|
||||||
there should be no location assigned to the vararg array itself }
|
there should be no location assigned to the vararg array itself }
|
||||||
if (p.proccalloption in [pocall_cdecl,pocall_cppdecl]) and
|
if (p.proccalloption in [pocall_cdecl,pocall_cppdecl]) and
|
||||||
is_array_of_const(hp.paratype.def) then
|
is_array_of_const(hp.vartype.def) then
|
||||||
begin
|
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 }
|
||||||
@ -245,11 +247,11 @@ unit cpupara;
|
|||||||
break;
|
break;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
if push_addr_param(hp.paratyp,hp.paratype.def,p.proccalloption) then
|
if push_addr_param(hp.varspez,hp.vartype.def,p.proccalloption) then
|
||||||
paracgsize:=OS_ADDR
|
paracgsize:=OS_ADDR
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
paracgsize:=def_cgSize(hp.paratype.def);
|
paracgsize:=def_cgSize(hp.vartype.def);
|
||||||
if paracgsize=OS_NO then
|
if paracgsize=OS_NO then
|
||||||
paracgsize:=OS_ADDR;
|
paracgsize:=OS_ADDR;
|
||||||
end;
|
end;
|
||||||
@ -258,14 +260,14 @@ unit cpupara;
|
|||||||
hp.paraloc[side].size:=paracgsize;
|
hp.paraloc[side].size:=paracgsize;
|
||||||
hp.paraloc[side].Alignment:=std_param_align;
|
hp.paraloc[side].Alignment:=std_param_align;
|
||||||
|
|
||||||
if (hp.paratyp in [vs_var,vs_out]) then
|
if (hp.varspez in [vs_var,vs_out]) then
|
||||||
begin
|
begin
|
||||||
paradef:=voidpointertype.def;
|
paradef:=voidpointertype.def;
|
||||||
loc:=LOC_REGISTER;
|
loc:=LOC_REGISTER;
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
paradef:=hp.paratype.def;
|
paradef:=hp.vartype.def;
|
||||||
loc:=getparaloc(p.proccalloption,paradef);
|
loc:=getparaloc(p.proccalloption,paradef);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -332,7 +334,7 @@ unit cpupara;
|
|||||||
LOC_REFERENCE:
|
LOC_REFERENCE:
|
||||||
begin
|
begin
|
||||||
paraloc^.size:=OS_ADDR;
|
paraloc^.size:=OS_ADDR;
|
||||||
if push_addr_param(hp.paratyp,paradef,p.proccalloption) or
|
if push_addr_param(hp.varspez,paradef,p.proccalloption) or
|
||||||
is_open_array(paradef) or
|
is_open_array(paradef) or
|
||||||
is_array_of_const(paradef) then
|
is_array_of_const(paradef) then
|
||||||
assignintreg
|
assignintreg
|
||||||
@ -341,7 +343,7 @@ unit cpupara;
|
|||||||
paraloc^.loc:=LOC_REFERENCE;
|
paraloc^.loc:=LOC_REFERENCE;
|
||||||
paraloc^.reference.index:=NR_STACK_POINTER_REG;
|
paraloc^.reference.index:=NR_STACK_POINTER_REG;
|
||||||
paraloc^.reference.offset:=stack_offset;
|
paraloc^.reference.offset:=stack_offset;
|
||||||
inc(stack_offset,hp.paratype.def.size);
|
inc(stack_offset,hp.vartype.def.size);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
else
|
else
|
||||||
@ -357,8 +359,6 @@ unit cpupara;
|
|||||||
end;
|
end;
|
||||||
dec(paralen,tcgsize2size[paraloc^.size]);
|
dec(paralen,tcgsize2size[paraloc^.size]);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
hp:=tparaitem(hp.next);
|
|
||||||
end;
|
end;
|
||||||
curintreg:=nextintreg;
|
curintreg:=nextintreg;
|
||||||
curfloatreg:=nextfloatreg;
|
curfloatreg:=nextfloatreg;
|
||||||
@ -370,34 +370,35 @@ unit cpupara;
|
|||||||
|
|
||||||
function tarmparamanager.create_paraloc_info(p : tabstractprocdef; side: tcallercallee):longint;
|
function tarmparamanager.create_paraloc_info(p : tabstractprocdef; side: tcallercallee):longint;
|
||||||
var
|
var
|
||||||
paraloc : pcgparalocation;
|
|
||||||
cur_stack_offset: aword;
|
cur_stack_offset: aword;
|
||||||
curintreg, curfloatreg, curmmreg: tsuperregister;
|
curintreg, curfloatreg, curmmreg: tsuperregister;
|
||||||
retcgsize : tcgsize;
|
retcgsize : tcgsize;
|
||||||
begin
|
begin
|
||||||
init_values(curintreg,curfloatreg,curmmreg,cur_stack_offset);
|
init_values(curintreg,curfloatreg,curmmreg,cur_stack_offset);
|
||||||
|
|
||||||
result:=create_paraloc_info_intern(p,side,tparaitem(p.para.first),curintreg,curfloatreg,curmmreg,cur_stack_offset);
|
result:=create_paraloc_info_intern(p,side,p.paras,curintreg,curfloatreg,curmmreg,cur_stack_offset);
|
||||||
|
|
||||||
{ Constructors return self instead of a boolean }
|
{ Constructors return self instead of a boolean }
|
||||||
if (p.proctypeoption=potype_constructor) then
|
if (p.proctypeoption=potype_constructor) then
|
||||||
retcgsize:=OS_ADDR
|
retcgsize:=OS_ADDR
|
||||||
else
|
else
|
||||||
retcgsize:=def_cgsize(p.rettype.def);
|
retcgsize:=def_cgsize(p.rettype.def);
|
||||||
p.funcretloc[side].reset;
|
|
||||||
p.funcretloc[side].Alignment:=std_param_align;
|
location_reset(p.funcretloc[side],LOC_INVALID,OS_NO);
|
||||||
p.funcretloc[side].size:=retcgsize;
|
p.funcretloc[side].size:=retcgsize;
|
||||||
|
|
||||||
{ void has no location }
|
{ void has no location }
|
||||||
if is_void(p.rettype.def) then
|
if is_void(p.rettype.def) then
|
||||||
|
begin
|
||||||
|
location_reset(p.funcretloc[side],LOC_VOID,OS_NO);
|
||||||
exit;
|
exit;
|
||||||
{ Function return }
|
end;
|
||||||
paraloc:=p.funcretloc[side].add_location;
|
|
||||||
|
|
||||||
{ Return in FPU register? }
|
{ Return in FPU register? }
|
||||||
if p.rettype.def.deftype=floatdef then
|
if p.rettype.def.deftype=floatdef then
|
||||||
begin
|
begin
|
||||||
paraloc^.loc:=LOC_FPUREGISTER;
|
p.funcretloc[side].loc:=LOC_FPUREGISTER;
|
||||||
paraloc^.register:=NR_FPU_RESULT_REG;
|
p.funcretloc[side].register:=NR_FPU_RESULT_REG;
|
||||||
end
|
end
|
||||||
{ Return in register? }
|
{ Return in register? }
|
||||||
else if not ret_in_param(p.rettype.def,p.proccalloption) then
|
else if not ret_in_param(p.rettype.def,p.proccalloption) then
|
||||||
@ -405,66 +406,37 @@ unit cpupara;
|
|||||||
if retcgsize in [OS_64,OS_S64] then
|
if retcgsize in [OS_64,OS_S64] then
|
||||||
begin
|
begin
|
||||||
{ low }
|
{ low }
|
||||||
paraloc^.loc:=LOC_REGISTER;
|
p.funcretloc[side].loc:=LOC_REGISTER;
|
||||||
paraloc^.size:=OS_32;
|
p.funcretloc[side].register64.reglo:=NR_FUNCTION_RESULT64_LOW_REG;
|
||||||
paraloc^.register:=NR_FUNCTION_RESULT64_LOW_REG;
|
p.funcretloc[side].register64.reghi:=NR_FUNCTION_RESULT64_HIGH_REG;
|
||||||
|
|
||||||
{ high }
|
|
||||||
paraloc:=p.funcretloc[side].add_location;
|
|
||||||
paraloc^.loc:=LOC_REGISTER;
|
|
||||||
paraloc^.size:=OS_32;
|
|
||||||
paraloc^.register:=NR_FUNCTION_RESULT64_HIGH_REG;
|
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
paraloc^.loc:=LOC_REGISTER;
|
p.funcretloc[side].loc:=LOC_REGISTER;
|
||||||
paraloc^.register:=NR_FUNCTION_RETURN_REG;
|
p.funcretloc[side].register:=NR_FUNCTION_RETURN_REG;
|
||||||
end;
|
end;
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
paraloc^.loc:=LOC_REFERENCE;
|
p.funcretloc[side].loc:=LOC_REFERENCE;
|
||||||
paraloc^.size:=retcgsize;
|
p.funcretloc[side].size:=retcgsize;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
function tarmparamanager.create_varargs_paraloc_info(p : tabstractprocdef; varargspara:tvarargspara):longint;
|
function tarmparamanager.create_varargs_paraloc_info(p : tabstractprocdef; varargspara:tvarargsparalist):longint;
|
||||||
var
|
var
|
||||||
cur_stack_offset: aword;
|
cur_stack_offset: aword;
|
||||||
parasize, l: longint;
|
|
||||||
curintreg, curfloatreg, curmmreg: tsuperregister;
|
curintreg, curfloatreg, curmmreg: tsuperregister;
|
||||||
hp: tparaitem;
|
|
||||||
paraloc: tcgparalocation;
|
|
||||||
begin
|
begin
|
||||||
init_values(curintreg,curfloatreg,curmmreg,cur_stack_offset);
|
init_values(curintreg,curfloatreg,curmmreg,cur_stack_offset);
|
||||||
|
|
||||||
result:=create_paraloc_info_intern(p,callerside,tparaitem(p.para.first),curintreg,curfloatreg,curmmreg,cur_stack_offset);
|
result:=create_paraloc_info_intern(p,callerside,p.paras,curintreg,curfloatreg,curmmreg,cur_stack_offset);
|
||||||
if (p.proccalloption in [pocall_cdecl,pocall_cppdecl]) then
|
if (p.proccalloption in [pocall_cdecl,pocall_cppdecl]) then
|
||||||
{ just continue loading the parameters in the registers }
|
{ just continue loading the parameters in the registers }
|
||||||
result:=create_paraloc_info_intern(p,callerside,tparaitem(varargspara.first),curintreg,curfloatreg,curmmreg,cur_stack_offset)
|
result:=create_paraloc_info_intern(p,callerside,p.paras,curintreg,curfloatreg,curmmreg,cur_stack_offset)
|
||||||
else
|
else
|
||||||
internalerror(200410231);
|
internalerror(200410231);
|
||||||
{
|
|
||||||
begin
|
|
||||||
hp:=tparaitem(varargspara.first);
|
|
||||||
parasize:=cur_stack_offset;
|
|
||||||
while assigned(hp) do
|
|
||||||
begin
|
|
||||||
paraloc.size:=def_cgsize(hp.paratype.def);
|
|
||||||
paraloc.lochigh:=LOC_INVALID;
|
|
||||||
paraloc.loc:=LOC_REFERENCE;
|
|
||||||
paraloc.alignment:=4;
|
|
||||||
paraloc.reference.index:=NR_STACK_POINTER_REG;
|
|
||||||
l:=push_size(hp.paratyp,hp.paratype.def,p.proccalloption);
|
|
||||||
paraloc.reference.offset:=parasize;
|
|
||||||
parasize:=parasize+l;
|
|
||||||
hp.paraloc[callerside]:=paraloc;
|
|
||||||
hp:=tparaitem(hp.next);
|
|
||||||
end;
|
|
||||||
result := parasize;
|
|
||||||
end;
|
|
||||||
}
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
@ -472,7 +444,10 @@ begin
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.26 2004-11-21 17:54:59 peter
|
Revision 1.27 2004-11-24 22:03:26 florian
|
||||||
|
* fixed arm compilation
|
||||||
|
|
||||||
|
Revision 1.26 2004/11/21 17:54:59 peter
|
||||||
* ttempcreatenode.create_reg merged into .create with parameter
|
* ttempcreatenode.create_reg merged into .create with parameter
|
||||||
whether a register is allowed
|
whether a register is allowed
|
||||||
* funcret_paraloc renamed to funcretloc
|
* funcret_paraloc renamed to funcretloc
|
||||||
|
|||||||
@ -428,19 +428,6 @@ Unit raarmgas;
|
|||||||
else
|
else
|
||||||
if expr = '__OLDEBP' then
|
if expr = '__OLDEBP' then
|
||||||
oper.SetupOldEBP
|
oper.SetupOldEBP
|
||||||
else
|
|
||||||
{ check for direct symbolic names }
|
|
||||||
{ only if compiling the system unit }
|
|
||||||
if (cs_compilesystem in aktmoduleswitches) then
|
|
||||||
begin
|
|
||||||
if not oper.SetupDirectVar(expr) then
|
|
||||||
Begin
|
|
||||||
{ not found, finally ... add it anyways ... }
|
|
||||||
Message1(asmr_w_id_supposed_external,expr);
|
|
||||||
oper.InitRef;
|
|
||||||
oper.opr.ref.symbol:=objectlibrary.newasmsymbol(expr,AB_EXTERNAL,AT_FUNCTION);
|
|
||||||
end;
|
|
||||||
end
|
|
||||||
else
|
else
|
||||||
Message1(sym_e_unknown_id,expr);
|
Message1(sym_e_unknown_id,expr);
|
||||||
end;
|
end;
|
||||||
@ -748,7 +735,10 @@ initialization
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.10 2004-11-11 19:31:33 peter
|
Revision 1.11 2004-11-24 22:03:26 florian
|
||||||
|
* fixed arm compilation
|
||||||
|
|
||||||
|
Revision 1.10 2004/11/11 19:31:33 peter
|
||||||
* fixed compile of powerpc,sparc,arm
|
* fixed compile of powerpc,sparc,arm
|
||||||
|
|
||||||
Revision 1.9 2004/06/20 08:55:31 florian
|
Revision 1.9 2004/06/20 08:55:31 florian
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user