浏览代码

* 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 年之前
父节点
当前提交
f2096de53a
共有 2 个文件被更改,包括 3 次插入13 次删除
  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;