Browse Source

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

git-svn-id: trunk@26157 -
sergei 11 years ago
parent
commit
409e176ded
2 changed files with 17 additions and 11 deletions
  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.