Browse Source

* correct handling of result register allocation of exception helpers

git-svn-id: trunk@4522 -
florian 19 years ago
parent
commit
d4d4d03b3b
1 changed files with 5 additions and 1 deletions
  1. 5 1
      compiler/ncgutil.pas

+ 5 - 1
compiler/ncgutil.pas

@@ -412,9 +412,11 @@ implementation
         cg.allocallcpuregisters(list);
         cg.allocallcpuregisters(list);
         cg.a_call_name(list,'FPC_SETJMP');
         cg.a_call_name(list,'FPC_SETJMP');
         cg.deallocallcpuregisters(list);
         cg.deallocallcpuregisters(list);
+        cg.alloccpuregisters(list,R_INTREGISTER,[RS_FUNCTION_RESULT_REG]);
 
 
         cg.g_exception_reason_save(list, t.reasonbuf);
         cg.g_exception_reason_save(list, t.reasonbuf);
         cg.a_cmp_const_reg_label(list,OS_S32,OC_NE,0,cg.makeregsize(list,NR_FUNCTION_RESULT_REG,OS_S32),exceptlabel);
         cg.a_cmp_const_reg_label(list,OS_S32,OC_NE,0,cg.makeregsize(list,NR_FUNCTION_RESULT_REG,OS_S32),exceptlabel);
+        cg.dealloccpuregisters(list,R_INTREGISTER,[RS_FUNCTION_RESULT_REG]);
         paraloc1.done;
         paraloc1.done;
         paraloc2.done;
         paraloc2.done;
         paraloc3.done;
         paraloc3.done;
@@ -429,8 +431,10 @@ implementation
 
 
          if not onlyfree then
          if not onlyfree then
           begin
           begin
+            cg.alloccpuregisters(list,R_INTREGISTER,[RS_FUNCTION_RESULT_REG]);
             cg.g_exception_reason_load(list, t.reasonbuf);
             cg.g_exception_reason_load(list, t.reasonbuf);
             cg.a_cmp_const_reg_label(list,OS_INT,OC_EQ,a,NR_FUNCTION_RESULT_REG,endexceptlabel);
             cg.a_cmp_const_reg_label(list,OS_INT,OC_EQ,a,NR_FUNCTION_RESULT_REG,endexceptlabel);
+            cg.dealloccpuregisters(list,R_INTREGISTER,[RS_FUNCTION_RESULT_REG]);
           end;
           end;
      end;
      end;
 
 
@@ -1132,7 +1136,7 @@ implementation
         list:=TAsmList(arg);
         list:=TAsmList(arg);
         if (tsym(p).typ=paravarsym) then
         if (tsym(p).typ=paravarsym) then
          begin
          begin
-           needs_inittable := 
+           needs_inittable :=
              not is_class_or_interface(tparavarsym(p).vartype.def) and
              not is_class_or_interface(tparavarsym(p).vartype.def) and
              tparavarsym(p).vartype.def.needs_inittable;
              tparavarsym(p).vartype.def.needs_inittable;
            case tparavarsym(p).varspez of
            case tparavarsym(p).varspez of