mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-12-08 12:01:30 +01:00
* powerpc nested procedure fixes, should work completely now if all
local variables of the parent procedure are declared before the
nested procedures are declared
This commit is contained in:
parent
66792ee44e
commit
d816c6a8c6
@ -422,6 +422,12 @@ implementation
|
|||||||
|
|
||||||
procedure tprocinfo.after_pass1;
|
procedure tprocinfo.after_pass1;
|
||||||
begin
|
begin
|
||||||
|
{$ifdef powerpc}
|
||||||
|
{ do it again because of implicit para's (HACK, JM) }
|
||||||
|
{ Retrieve function result offset }
|
||||||
|
if assigned(procdef.funcretsym) then
|
||||||
|
current_procinfo.return_offset:=tvarsym(procdef.funcretsym).adjusted_address;
|
||||||
|
{$endif powerpc}
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
@ -579,7 +585,12 @@ implementation
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.48 2003-05-15 18:58:53 peter
|
Revision 1.49 2003-05-16 20:00:39 jonas
|
||||||
|
* powerpc nested procedure fixes, should work completely now if all
|
||||||
|
local variables of the parent procedure are declared before the
|
||||||
|
nested procedures are declared
|
||||||
|
|
||||||
|
Revision 1.48 2003/05/15 18:58:53 peter
|
||||||
* removed selfpointer_offset, vmtpointer_offset
|
* removed selfpointer_offset, vmtpointer_offset
|
||||||
* tvarsym.adjusted_address
|
* tvarsym.adjusted_address
|
||||||
* address in localsymtable is now in the real direction
|
* address in localsymtable is now in the real direction
|
||||||
|
|||||||
@ -66,8 +66,9 @@ unit cpupi;
|
|||||||
procedure tppcprocinfo.after_header;
|
procedure tppcprocinfo.after_header;
|
||||||
begin
|
begin
|
||||||
{ this value is necessary for nested procedures }
|
{ this value is necessary for nested procedures }
|
||||||
|
procdef.parast.address_fixup:=0;
|
||||||
if assigned(procdef.localst) then
|
if assigned(procdef.localst) then
|
||||||
procdef.localst.address_fixup:=align(procdef.parast.address_fixup+procdef.parast.datasize,16);
|
procdef.localst.address_fixup:=procdef.parast.address_fixup+procdef.parast.datasize;
|
||||||
inherited after_header;
|
inherited after_header;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -115,7 +116,12 @@ begin
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.15 2003-05-15 19:39:09 florian
|
Revision 1.16 2003-05-16 20:00:39 jonas
|
||||||
|
* powerpc nested procedure fixes, should work completely now if all
|
||||||
|
local variables of the parent procedure are declared before the
|
||||||
|
nested procedures are declared
|
||||||
|
|
||||||
|
Revision 1.15 2003/05/15 19:39:09 florian
|
||||||
* fixed ppc compiler which was broken by Peter's changes
|
* fixed ppc compiler which was broken by Peter's changes
|
||||||
|
|
||||||
Revision 1.14 2003/05/10 23:57:23 florian
|
Revision 1.14 2003/05/10 23:57:23 florian
|
||||||
|
|||||||
@ -82,7 +82,8 @@ implementation
|
|||||||
{ pass the same framepointer as the current procedure got }
|
{ pass the same framepointer as the current procedure got }
|
||||||
hregister2.enum:=R_INTREGISTER;
|
hregister2.enum:=R_INTREGISTER;
|
||||||
hregister2.number:=NR_R11;
|
hregister2.number:=NR_R11;
|
||||||
cg.a_load_reg_reg(exprasmlist,OS_ADDR,OS_ADDR,current_procinfo.framepointer,hregister2);
|
reference_reset_base(href,current_procinfo.framepointer,current_procinfo.framepointer_offset);
|
||||||
|
cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,hregister2);
|
||||||
{ it must be adjusted! }
|
{ it must be adjusted! }
|
||||||
end
|
end
|
||||||
{ this is only true if the difference is one !!
|
{ this is only true if the difference is one !!
|
||||||
@ -94,19 +95,21 @@ implementation
|
|||||||
hregister1.number:=NR_R1;
|
hregister1.number:=NR_R1;
|
||||||
hregister2.enum:=R_INTREGISTER;
|
hregister2.enum:=R_INTREGISTER;
|
||||||
hregister2.number:=NR_R11;
|
hregister2.number:=NR_R11;
|
||||||
exprasmlist.concat(taicpu.op_reg_reg_const(A_ADDI,hregister2,hregister1,current_procinfo.procdef.localst.address_fixup));
|
exprasmlist.concat(taicpu.op_reg_reg_const(A_ADDI,hregister2,hregister1,current_procinfo.procdef.parast.address_fixup));
|
||||||
end
|
end
|
||||||
else if (current_procdef.parast.symtablelevel>(tprocdef(procdefinition).parast.symtablelevel)) then
|
else if (current_procdef.parast.symtablelevel>(tprocdef(procdefinition).parast.symtablelevel)) then
|
||||||
begin
|
begin
|
||||||
hregister1:=rg.getregisterint(exprasmlist,OS_ADDR);
|
hregister1:=rg.getregisterint(exprasmlist,OS_ADDR);
|
||||||
reference_reset_base(href,current_procinfo.framepointer,current_procinfo.framepointer_offset);
|
reference_reset_base(href,current_procinfo.framepointer,current_procinfo.framepointer_offset);
|
||||||
cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,hregister1);
|
cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,hregister1);
|
||||||
i:=current_procdef.parast.symtablelevel;
|
{ the previous frame pointer is always saved at }
|
||||||
|
{ previous_framepointer-sizeof(pointer) }
|
||||||
|
reference_reset_base(href,hregister1,-POINTER_SIZE);
|
||||||
|
i:=current_procdef.parast.symtablelevel-1;
|
||||||
while (i>tprocdef(procdefinition).parast.symtablelevel) do
|
while (i>tprocdef(procdefinition).parast.symtablelevel) do
|
||||||
begin
|
begin
|
||||||
{we should get the correct frame_pointer_offset at each level
|
{we should get the correct frame_pointer_offset at each level
|
||||||
how can we do this !!! }
|
how can we do this !!! }
|
||||||
reference_reset_base(href,hregister2,current_procinfo.framepointer_offset);
|
|
||||||
cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,hregister1);
|
cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,hregister1);
|
||||||
dec(i);
|
dec(i);
|
||||||
end;
|
end;
|
||||||
@ -123,7 +126,12 @@ begin
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.10 2003-04-27 11:21:36 peter
|
Revision 1.11 2003-05-16 20:00:39 jonas
|
||||||
|
* powerpc nested procedure fixes, should work completely now if all
|
||||||
|
local variables of the parent procedure are declared before the
|
||||||
|
nested procedures are declared
|
||||||
|
|
||||||
|
Revision 1.10 2003/04/27 11:21:36 peter
|
||||||
* aktprocdef renamed to current_procdef
|
* aktprocdef renamed to current_procdef
|
||||||
* procinfo renamed to current_procinfo
|
* procinfo renamed to current_procinfo
|
||||||
* procinfo will now be stored in current_module so it can be
|
* procinfo will now be stored in current_module so it can be
|
||||||
|
|||||||
@ -964,17 +964,28 @@ implementation
|
|||||||
{ Insert local copies for value para }
|
{ Insert local copies for value para }
|
||||||
pd.parast.foreach_static({$ifdef FPCPROCVAR}@{$endif}insert_local_value_para,nil);
|
pd.parast.foreach_static({$ifdef FPCPROCVAR}@{$endif}insert_local_value_para,nil);
|
||||||
|
|
||||||
{ Update parameter information }
|
|
||||||
current_procinfo.allocate_implicit_parameter;
|
|
||||||
{$ifdef i386}
|
{$ifdef i386}
|
||||||
{ add implicit pushes for interrupt routines }
|
{ add implicit pushes for interrupt routines }
|
||||||
if (po_interrupt in pd.procoptions) then
|
if (po_interrupt in pd.procoptions) then
|
||||||
current_procinfo.allocate_interrupt_stackframe;
|
current_procinfo.allocate_interrupt_stackframe;
|
||||||
{$endif i386}
|
{$endif i386}
|
||||||
|
|
||||||
|
{$ifdef powerpc}
|
||||||
|
{ temp hack for nested procedures on ppc }
|
||||||
|
|
||||||
{ Calculate offsets }
|
{ Calculate offsets }
|
||||||
current_procinfo.after_header;
|
current_procinfo.after_header;
|
||||||
|
|
||||||
|
{ Update parameter information }
|
||||||
|
current_procinfo.allocate_implicit_parameter;
|
||||||
|
{$else powerpc}
|
||||||
|
{ Update parameter information }
|
||||||
|
current_procinfo.allocate_implicit_parameter;
|
||||||
|
|
||||||
|
{ Calculate offsets }
|
||||||
|
current_procinfo.after_header;
|
||||||
|
{$endif powerpc}
|
||||||
|
|
||||||
{ set _FAIL as keyword if constructor }
|
{ set _FAIL as keyword if constructor }
|
||||||
if (pd.proctypeoption=potype_constructor) then
|
if (pd.proctypeoption=potype_constructor) then
|
||||||
begin
|
begin
|
||||||
@ -1130,7 +1141,12 @@ implementation
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.113 2003-05-16 14:33:31 peter
|
Revision 1.114 2003-05-16 20:00:39 jonas
|
||||||
|
* powerpc nested procedure fixes, should work completely now if all
|
||||||
|
local variables of the parent procedure are declared before the
|
||||||
|
nested procedures are declared
|
||||||
|
|
||||||
|
Revision 1.113 2003/05/16 14:33:31 peter
|
||||||
* regvar fixes
|
* regvar fixes
|
||||||
|
|
||||||
Revision 1.112 2003/05/13 21:26:38 peter
|
Revision 1.112 2003/05/13 21:26:38 peter
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user