mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-16 01:31:59 +02:00
+ first (failed) attempt to have a working stackframe generation
git-svn-id: trunk@9040 -
This commit is contained in:
parent
f56c2bcefc
commit
91abb3aeb9
@ -1280,37 +1280,45 @@ unit cgcpu;
|
|||||||
{$ifdef DEBUG_CHARLIE}
|
{$ifdef DEBUG_CHARLIE}
|
||||||
writeln('proc entry, localsize:',localsize);
|
writeln('proc entry, localsize:',localsize);
|
||||||
{$endif DEBUG_CHARLIE}
|
{$endif DEBUG_CHARLIE}
|
||||||
|
|
||||||
if not nostackframe then
|
if not nostackframe then
|
||||||
begin
|
begin
|
||||||
if (localsize<>0) then localsize:=-localsize;
|
if localsize<>0 then
|
||||||
// size can't be negative
|
begin
|
||||||
if (localsize>0) then internalerror(2006122601);
|
{ size can't be negative }
|
||||||
list.concat(taicpu.op_reg_const(A_LINK,S_W,NR_FRAME_POINTER_REG,localsize));
|
if (localsize < 0) then
|
||||||
|
internalerror(2006122601);
|
||||||
|
|
||||||
|
{ Not to complicate the code generator too much, and since some }
|
||||||
|
{ of the systems only support this format, the localsize cannot }
|
||||||
|
{ exceed 32K in size. }
|
||||||
|
if (localsize > high(smallint)) then
|
||||||
|
CGMessage(cg_e_localsize_too_big);
|
||||||
|
|
||||||
|
list.concat(taicpu.op_reg_const(A_LINK,S_W,NR_FRAME_POINTER_REG,-localsize));
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
list.concat(taicpu.op_reg_const(A_LINK,S_W,NR_FRAME_POINTER_REG,0));
|
||||||
|
(*
|
||||||
|
{ FIXME! - Carl's original code uses this method. However,
|
||||||
|
according to the 68060 users manual, a LINK is faster than
|
||||||
|
two moves. So, use a link in #0 case too, for now. I'm not
|
||||||
|
really sure tho', that LINK supports #0 disposition, but i
|
||||||
|
see no reason why it shouldn't support it. (KB) }
|
||||||
|
|
||||||
|
{ when localsize = 0, use two moves, instead of link }
|
||||||
|
r:=NR_FRAME_POINTER_REG;
|
||||||
|
rsp:=NR_STACK_POINTER_REG;
|
||||||
|
|
||||||
|
reference_reset_base(ref,NR_STACK_POINTER_REG,0);
|
||||||
|
ref.direction:=dir_dec;
|
||||||
|
list.concat(taicpu.op_reg_ref(A_MOVE,S_L,r,ref));
|
||||||
|
list.concat(taicpu.op_reg_reg(A_MOVE,S_L,rsp,r));
|
||||||
|
*)
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
(*
|
|
||||||
r:=NR_FRAME_POINTER_REG;
|
|
||||||
rsp:=NR_STACK_POINTER_REG;
|
|
||||||
if localsize<>0 then
|
|
||||||
begin
|
|
||||||
{ Not to complicate the code generator too much, and since some }
|
|
||||||
{ of the systems only support this format, the localsize cannot }
|
|
||||||
{ exceed 32K in size. }
|
|
||||||
if (localsize < low(smallint)) or (localsize > high(smallint)) then
|
|
||||||
CGMessage(cg_e_localsize_too_big);
|
|
||||||
list.concat(taicpu.op_reg_const(A_LINK,S_W,r,-localsize));
|
|
||||||
end { endif localsize <> 0 }
|
|
||||||
else
|
|
||||||
begin
|
|
||||||
reference_reset_base(ref,NR_STACK_POINTER_REG,0);
|
|
||||||
ref.direction:=dir_dec;
|
|
||||||
list.concat(taicpu.op_reg_ref(A_MOVE,S_L,r,ref));
|
|
||||||
list.concat(taicpu.op_reg_reg(A_MOVE,S_L,rsp,r));
|
|
||||||
end;
|
|
||||||
*)
|
|
||||||
// end;
|
|
||||||
|
|
||||||
|
|
||||||
{ procedure tcg68k.g_restore_frame_pointer(list : TAsmList);
|
{ procedure tcg68k.g_restore_frame_pointer(list : TAsmList);
|
||||||
var
|
var
|
||||||
@ -1331,18 +1339,18 @@ unit cgcpu;
|
|||||||
begin
|
begin
|
||||||
if not nostackframe then
|
if not nostackframe then
|
||||||
begin
|
begin
|
||||||
|
writeln(current_procinfo.maxpushedparasize);
|
||||||
localsize := current_procinfo.calc_stackframe_size;
|
localsize := current_procinfo.calc_stackframe_size;
|
||||||
{$ifdef DEBUG_CHARLIE}
|
{$ifdef DEBUG_CHARLIE}
|
||||||
writeln('proc exit with stackframe, size:',localsize);
|
writeln('proc exit with stackframe, size:',localsize,' parasize:',parasize);
|
||||||
{$endif DEBUG_CHARLIE}
|
{$endif DEBUG_CHARLIE}
|
||||||
list.concat(taicpu.op_reg(A_UNLK,S_NO,NR_FRAME_POINTER_REG));
|
list.concat(taicpu.op_reg(A_UNLK,S_NO,NR_FRAME_POINTER_REG));
|
||||||
if (localsize<>0) then
|
if (parasize<>0) then
|
||||||
begin
|
begin
|
||||||
{ only 68020+ supports RTD, so this needs another code path
|
{ only 68020+ supports RTD, so this needs another code path
|
||||||
for 68000 and Coldfire (KB) }
|
for 68000 and Coldfire (KB) }
|
||||||
{$WARNING 68020+ only code generation, without fallback}
|
{$WARNING 68020+ only code generation, without fallback}
|
||||||
inc(localsize,4);
|
list.concat(taicpu.op_const(A_RTD,S_NO,parasize));
|
||||||
list.concat(taicpu.op_const(A_RTD,S_NO,localsize));
|
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
list.concat(taicpu.op_none(A_RTS,S_NO));
|
list.concat(taicpu.op_none(A_RTS,S_NO));
|
||||||
|
Loading…
Reference in New Issue
Block a user