ソースを参照

* Factored reusable (SEH-related) piece of code into separate procedure.

git-svn-id: trunk@26157 -
sergei 12 年 前
コミット
409e176ded
2 ファイル変更17 行追加11 行削除
  1. 15 0
      compiler/ncgutil.pas
  2. 2 11
      compiler/x86_64/cgcpu.pas

+ 15 - 0
compiler/ncgutil.pas

@@ -138,6 +138,7 @@ interface
     function getprocalign : shortint;
     function getprocalign : shortint;
 
 
     procedure gen_fpc_dummy(list : TAsmList);
     procedure gen_fpc_dummy(list : TAsmList);
+    procedure gen_load_frame_for_exceptfilter(list : TAsmList);
 
 
 implementation
 implementation
 
 
@@ -2213,4 +2214,18 @@ implementation
       end;
       end;
 
 
 
 
+    procedure gen_load_frame_for_exceptfilter(list : TAsmList);
+      var
+        para: tparavarsym;
+      begin
+        para:=tparavarsym(current_procinfo.procdef.paras[0]);
+        if not (vo_is_parentfp in para.varoptions) then
+          InternalError(201201142);
+        if (para.paraloc[calleeside].location^.loc<>LOC_REGISTER) or
+          (para.paraloc[calleeside].location^.next<>nil) then
+          InternalError(201201143);
+        cg.a_load_reg_reg(list,OS_ADDR,OS_ADDR,para.paraloc[calleeside].location^.register,
+          NR_FRAME_POINTER_REG);
+      end;
+
 end.
 end.

+ 2 - 11
compiler/x86_64/cgcpu.pas

@@ -57,7 +57,7 @@ unit cgcpu;
     uses
     uses
        globtype,globals,verbose,systems,cutils,cclasses,
        globtype,globals,verbose,systems,cutils,cclasses,
        symsym,symtable,defutil,paramgr,fmodule,cpupi,
        symsym,symtable,defutil,paramgr,fmodule,cpupi,
-       rgobj,tgobj,rgcpu;
+       rgobj,tgobj,rgcpu,ncgutil;
 
 
 
 
     procedure Tcgx86_64.init_register_allocators;
     procedure Tcgx86_64.init_register_allocators;
@@ -140,7 +140,6 @@ unit cgcpu;
         frame_offset: longint;
         frame_offset: longint;
         suppress_endprologue: boolean;
         suppress_endprologue: boolean;
         stackmisalignment: longint;
         stackmisalignment: longint;
-        para: tparavarsym;
         xmmsize: longint;
         xmmsize: longint;
 
 
       procedure push_one_reg(reg: tregister);
       procedure push_one_reg(reg: tregister);
@@ -196,15 +195,7 @@ unit cgcpu;
                 else
                 else
                   begin
                   begin
                     push_regs;
                     push_regs;
-                    { load framepointer from hidden $parentfp parameter }
-                    para:=tparavarsym(current_procinfo.procdef.paras[0]);
-                    if not (vo_is_parentfp in para.varoptions) then
-                      InternalError(201201142);
-                    if (para.paraloc[calleeside].location^.loc<>LOC_REGISTER) or
-                       (para.paraloc[calleeside].location^.next<>nil) then
-                      InternalError(201201143);
-                    list.concat(Taicpu.op_reg_reg(A_MOV,tcgsize2opsize[OS_ADDR],
-                      para.paraloc[calleeside].location^.register,NR_FRAME_POINTER_REG));
+                    gen_load_frame_for_exceptfilter(list);
                     { Need only as much stack space as necessary to do the calls.
                     { Need only as much stack space as necessary to do the calls.
                       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.