Browse Source

* 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 -

sergei 11 years ago
parent
commit
f2096de53a
2 changed files with 3 additions and 13 deletions
  1. 2 12
      compiler/i386/cgcpu.pas
  2. 1 1
      compiler/x86/cgx86.pas

+ 2 - 12
compiler/i386/cgcpu.pas

@@ -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 (target_info.stackalign>4) and
-                   ((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 current_procinfo.final_localsize<>0 then
+                  increase_sp(current_procinfo.final_localsize);
                 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

+ 1 - 1
compiler/x86/cgx86.pas

@@ -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;