* tcg386.g_proc_exit: instead of recalculating stack size, use current_procinfo.final_localsize which was calculated in g_proc_entry.

* tcgx86.g_proc_entry: don't over-allocate stack in SEH finalizer procedures.

git-svn-id: trunk@26251 -
This commit is contained in:
sergei 2013-12-19 10:32:32 +00:00
parent 258e8c58a4
commit f2096de53a
2 changed files with 3 additions and 13 deletions

View File

@ -303,8 +303,6 @@ unit cgcpu;
list.concat(Taicpu.op_ref_reg(A_LEA,TCGSize2OpSize[OS_ADDR],href,NR_STACK_POINTER_REG)); list.concat(Taicpu.op_ref_reg(A_LEA,TCGSize2OpSize[OS_ADDR],href,NR_STACK_POINTER_REG));
end; end;
var
stacksize : longint;
begin begin
{ MMX needs to call EMMS } { MMX needs to call EMMS }
if assigned(rg[R_MMXREGISTER]) and if assigned(rg[R_MMXREGISTER]) and
@ -317,16 +315,8 @@ unit cgcpu;
if (current_procinfo.framepointer=NR_STACK_POINTER_REG) or if (current_procinfo.framepointer=NR_STACK_POINTER_REG) or
(current_procinfo.procdef.proctypeoption=potype_exceptfilter) then (current_procinfo.procdef.proctypeoption=potype_exceptfilter) then
begin begin
stacksize:=current_procinfo.calc_stackframe_size; if current_procinfo.final_localsize<>0 then
if (target_info.stackalign>4) and increase_sp(current_procinfo.final_localsize);
((stacksize <> 0) or
(pi_do_call in current_procinfo.flags) or
{ can't detect if a call in this case -> use nostackframe }
{ if you (think you) know what you are doing }
(po_assembler in current_procinfo.procdef.procoptions)) then
stacksize := align(stacksize+sizeof(aint),target_info.stackalign) - sizeof(aint);
if stacksize<>0 then
increase_sp(stacksize);
if (not paramanager.use_fixed_stack) then if (not paramanager.use_fixed_stack) then
internal_restore_regs(list,true); internal_restore_regs(list,true);
if (current_procinfo.procdef.proctypeoption=potype_exceptfilter) then if (current_procinfo.procdef.proctypeoption=potype_exceptfilter) then

View File

@ -2660,7 +2660,7 @@ unit cgx86;
Exception filters don't have own local vars, and temps are 'mapped' Exception filters don't have own local vars, and temps are 'mapped'
to the parent procedure. to the parent procedure.
maxpushedparasize is already aligned at least on x86_64. } maxpushedparasize is already aligned at least on x86_64. }
//localsize:=current_procinfo.maxpushedparasize; localsize:=current_procinfo.maxpushedparasize;
end; end;
current_asmdata.asmcfi.cfa_def_cfa_register(list,NR_FRAME_POINTER_REG); current_asmdata.asmcfi.cfa_def_cfa_register(list,NR_FRAME_POINTER_REG);
end; end;