Browse Source

* fixed previous commit

florian 20 years ago
parent
commit
e33bf907d8
3 changed files with 42 additions and 9 deletions
  1. 6 4
      compiler/ncgmem.pas
  2. 26 1
      compiler/nmem.pas
  3. 10 4
      compiler/pdecsub.pas

+ 6 - 4
compiler/ncgmem.pas

@@ -190,13 +190,12 @@ implementation
                 hsym:=tparavarsym(currpi.procdef.parast.search('parentfp'));
                 if not assigned(hsym) then
                   internalerror(200309282);
-                {
+
                 if hsym.localloc.loc<>LOC_REFERENCE then
                   internalerror(200309283);
 
                 reference_reset_base(href,location.register,hsym.localloc.reference.offset);
-                }
-                cg.a_load_loc_reg(exprasmlist,OS_ADDR,hsym.localloc,location.register);
+                cg.a_load_ref_reg(exprasmlist,OS_ADDR,OS_ADDR,href,location.register);
               end;
           end;
       end;
@@ -864,7 +863,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.105  2005-04-06 19:09:39  florian
+  Revision 1.106  2005-04-06 19:39:04  florian
+    * fixed previous commit
+
+  Revision 1.105  2005/04/06 19:09:39  florian
     * hidden parameters can be put now in registers as well
 
   Revision 1.104  2005/02/14 17:13:06  peter

+ 26 - 1
compiler/nmem.pas

@@ -230,9 +230,31 @@ implementation
 
 
     function tloadparentfpnode.det_resulttype:tnode;
+      var
+        currpi : tprocinfo;
+        hsym   : tparavarsym;
       begin
         result:=nil;
         resulttype:=voidpointertype;
+        {
+          currently parentfps are never loaded in registers (FK)
+
+        if (current_procinfo.procdef.parast.symtablelevel<>parentpd.parast.symtablelevel) then
+          begin
+            currpi:=current_procinfo;
+            { walk parents }
+            while (currpi.procdef.owner.symtablelevel>parentpd.parast.symtablelevel) do
+              begin
+                currpi:=currpi.parent;
+                if not assigned(currpi) then
+                  internalerror(2005040602);
+                hsym:=tparavarsym(currpi.procdef.parast.search('parentfp'));
+                if not assigned(hsym) then
+                  internalerror(2005040601);
+                hsym.varregable:=vr_none;
+              end;
+          end;
+        }
       end;
 
 
@@ -933,7 +955,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.95  2005-03-25 22:20:19  peter
+  Revision 1.96  2005-04-06 19:39:04  florian
+    * fixed previous commit
+
+  Revision 1.95  2005/03/25 22:20:19  peter
     * add hint when passing an uninitialized variable to a var parameter
 
   Revision 1.94  2005/02/14 17:13:06  peter

+ 10 - 4
compiler/pdecsub.pas

@@ -2078,13 +2078,16 @@ const
         { insert funcret parameter if required }
         insert_funcret_para(pd);
 
-        { insert parentfp parameter if required }
-        insert_parentfp_para(pd);
-
         { Make var parameters regable, this must be done after the calling
           convention is set. }
+        { this must be done before parentfp is insert, because getting all cases
+          where parentfp must be in a memory location isn't catched properly so
+          we put parentfp never in a register }
         pd.parast.foreach_static(@set_addr_param_regable,pd);
 
+        { insert parentfp parameter if required }
+        insert_parentfp_para(pd);
+
         { Calculate parameter tlist }
         pd.calcparas;
       end;
@@ -2458,7 +2461,10 @@ const
 end.
 {
   $Log$
-  Revision 1.232  2005-04-06 19:09:39  florian
+  Revision 1.233  2005-04-06 19:39:04  florian
+    * fixed previous commit
+
+  Revision 1.232  2005/04/06 19:09:39  florian
     * hidden parameters can be put now in registers as well
 
   Revision 1.231  2005/03/27 14:10:52  jonas