* when calling an inline procedure inside a nested procedure, the

framepointer was being pushed on the stack, but this pushed framepointer
    was never used nor removed from the stack again after the inlining was
    done. It's now simply not pushed anymore, because the inlined procedure
    can get the previous framepointer from the procedure in which it is being
    inlined (merged)
This commit is contained in:
Jonas Maebe 2001-09-09 08:50:15 +00:00
parent bfa379a802
commit 100a911290

View File

@ -837,57 +837,61 @@ implementation
end; end;
{ push base pointer ?} { push base pointer ?}
if (lexlevel>=normal_function_level) and assigned(tprocdef(procdefinition).parast) and { never when inlining, since if necessary, the base pointer }
((tprocdef(procdefinition).parast.symtablelevel)>normal_function_level) then { can/will be gottten from the current procedure's symtable }
begin { (JM) }
{ if we call a nested function in a method, we must } if not inlined then
{ push also SELF! } if (lexlevel>=normal_function_level) and assigned(tprocdef(procdefinition).parast) and
{ THAT'S NOT TRUE, we have to load ESI via frame pointer } ((tprocdef(procdefinition).parast.symtablelevel)>normal_function_level) then
{ access } begin
{ { if we call a nested function in a method, we must }
begin { push also SELF! }
loadesi:=false; { THAT'S NOT TRUE, we have to load ESI via frame pointer }
emit_reg(A_PUSH,S_L,R_ESI); { access }
end; {
} begin
if lexlevel=(tprocdef(procdefinition).parast.symtablelevel) then loadesi:=false;
begin emit_reg(A_PUSH,S_L,R_ESI);
new(r); end;
reset_reference(r^); }
r^.offset:=procinfo^.framepointer_offset; if lexlevel=(tprocdef(procdefinition).parast.symtablelevel) then
r^.base:=procinfo^.framepointer; begin
emit_ref(A_PUSH,S_L,r) new(r);
end reset_reference(r^);
{ this is only true if the difference is one !! r^.offset:=procinfo^.framepointer_offset;
but it cannot be more !! } r^.base:=procinfo^.framepointer;
else if (lexlevel=tprocdef(procdefinition).parast.symtablelevel-1) then emit_ref(A_PUSH,S_L,r)
begin end
emit_reg(A_PUSH,S_L,procinfo^.framepointer) { this is only true if the difference is one !!
end but it cannot be more !! }
else if (lexlevel>tprocdef(procdefinition).parast.symtablelevel) then else if (lexlevel=(tprocdef(procdefinition).parast.symtablelevel)-1) then
begin begin
hregister:=getregister32; emit_reg(A_PUSH,S_L,procinfo^.framepointer)
new(r); end
reset_reference(r^); else if (lexlevel>(tprocdef(procdefinition).parast.symtablelevel)) then
r^.offset:=procinfo^.framepointer_offset; begin
r^.base:=procinfo^.framepointer; hregister:=getregister32;
emit_ref_reg(A_MOV,S_L,r,hregister); new(r);
for i:=(tprocdef(procdefinition).parast.symtablelevel) to lexlevel-1 do reset_reference(r^);
begin r^.offset:=procinfo^.framepointer_offset;
new(r); r^.base:=procinfo^.framepointer;
reset_reference(r^); emit_ref_reg(A_MOV,S_L,r,hregister);
{we should get the correct frame_pointer_offset at each level for i:=(tprocdef(procdefinition).parast.symtablelevel) to lexlevel-1 do
how can we do this !!! } begin
r^.offset:=procinfo^.framepointer_offset; new(r);
r^.base:=hregister; reset_reference(r^);
emit_ref_reg(A_MOV,S_L,r,hregister); {we should get the correct frame_pointer_offset at each level
end; how can we do this !!! }
emit_reg(A_PUSH,S_L,hregister); r^.offset:=procinfo^.framepointer_offset;
ungetregister32(hregister); r^.base:=hregister;
end emit_ref_reg(A_MOV,S_L,r,hregister);
else end;
internalerror(25000); emit_reg(A_PUSH,S_L,hregister);
end; ungetregister32(hregister);
end
else
internalerror(25000);
end;
saveregvars(regs_to_push); saveregvars(regs_to_push);
@ -1584,7 +1588,15 @@ begin
end. end.
{ {
$Log$ $Log$
Revision 1.32 2001-09-01 23:02:30 jonas Revision 1.33 2001-09-09 08:50:15 jonas
* when calling an inline procedure inside a nested procedure, the
framepointer was being pushed on the stack, but this pushed framepointer
was never used nor removed from the stack again after the inlining was
done. It's now simply not pushed anymore, because the inlined procedure
can get the previous framepointer from the procedure in which it is being
inlined (merged)
Revision 1.32 2001/09/01 23:02:30 jonas
* i386*: call and jmp read their first operand * i386*: call and jmp read their first operand
* cgcal: deallocate hlper register only after call statement (fixes bug * cgcal: deallocate hlper register only after call statement (fixes bug
with "procedure of object" and optimizer reported to bugrep on with "procedure of object" and optimizer reported to bugrep on