Browse Source

* remove is_single_reference
* revert loading of ref-to-ref para valu

peter 20 years ago
parent
commit
5edffaf371
3 changed files with 33 additions and 23 deletions
  1. 7 2
      compiler/ncgcal.pas
  2. 21 11
      compiler/ncgutil.pas
  3. 5 10
      compiler/parabase.pas

+ 7 - 2
compiler/ncgcal.pas

@@ -705,7 +705,8 @@ implementation
                                  must contain a valid size field }
                                  must contain a valid size field }
 
 
                                if (ppn.tempcgpara.size=OS_NO) and
                                if (ppn.tempcgpara.size=OS_NO) and
-                                  not(ppn.tempcgpara.is_single_reference(tmpparaloc)) then
+                                  ((tmpparaloc^.loc<>LOC_REFERENCE) or
+                                   assigned(tmpparaloc^.next)) then
                                  internalerror(200501281);
                                  internalerror(200501281);
                                reference_reset_base(href,callerparaloc^.reference.index,callerparaloc^.reference.offset);
                                reference_reset_base(href,callerparaloc^.reference.index,callerparaloc^.reference.offset);
                                { copy parameters in case they were moved to a temp. location because we've a fixed stack }
                                { copy parameters in case they were moved to a temp. location because we've a fixed stack }
@@ -1225,7 +1226,11 @@ begin
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.200  2005-02-14 17:13:06  peter
+  Revision 1.201  2005-02-15 21:39:48  peter
+    * remove is_single_reference
+    * revert loading of ref-to-ref para valu
+
+  Revision 1.200  2005/02/14 17:13:06  peter
     * truncate log
     * truncate log
 
 
   Revision 1.199  2005/01/30 21:51:57  jonas
   Revision 1.199  2005/01/30 21:51:57  jonas

+ 21 - 11
compiler/ncgutil.pas

@@ -1337,8 +1337,8 @@ implementation
         hreflo,
         hreflo,
         hrefhi,
         hrefhi,
         href     : treference;
         href     : treference;
-{$ifdef sparc}
         sizeleft : aint;
         sizeleft : aint;
+{$ifdef sparc}
         tempref  : treference;
         tempref  : treference;
 {$endif sparc}
 {$endif sparc}
       begin
       begin
@@ -1376,22 +1376,28 @@ implementation
                   if not paramanager.param_use_paraloc(currpara.paraloc[calleeside]) then
                   if not paramanager.param_use_paraloc(currpara.paraloc[calleeside]) then
                     begin
                     begin
                       href:=currpara.localloc.reference;
                       href:=currpara.localloc.reference;
-                      if (currpara.paraloc[calleeside].is_single_reference(paraloc)) then
+                      sizeleft:=currpara.paraloc[calleeside].intsize;
+                      while assigned(paraloc) do
                         begin
                         begin
                           unget_para(paraloc^);
                           unget_para(paraloc^);
-                          gen_load_ref(paraloc^,href,currpara.paraloc[calleeside].intsize);
-                        end
-                      else
-                        begin
-                          while assigned(paraloc) do
+                          if (paraloc^.size=OS_NO) then
                             begin
                             begin
-                              unget_para(paraloc^);
-                              if (paraloc^.size = OS_NO) then
+                              { Can only be a reference that contains the rest
+                                of the parameter }
+                              if (paraloc^.loc<>LOC_REFERENCE) or
+                                 assigned(paraloc^.next) then
                                 internalerror(2005013010);
                                 internalerror(2005013010);
+                              gen_load_ref(paraloc^,href,sizeleft);
+                              inc(href.offset,sizeleft);
+                              sizeleft:=0;
+                            end
+                          else
+                            begin
                               gen_load_ref(paraloc^,href,tcgsize2size[paraloc^.size]);
                               gen_load_ref(paraloc^,href,tcgsize2size[paraloc^.size]);
                               inc(href.offset,TCGSize2Size[paraloc^.size]);
                               inc(href.offset,TCGSize2Size[paraloc^.size]);
-                              paraloc:=paraloc^.next;
+                              dec(sizeleft,TCGSize2Size[paraloc^.size]);
                             end;
                             end;
+                          paraloc:=paraloc^.next;
                         end;
                         end;
                     end;
                     end;
                 end;
                 end;
@@ -2401,7 +2407,11 @@ implementation
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.261  2005-02-15 19:16:04  peter
+  Revision 1.262  2005-02-15 21:39:48  peter
+    * remove is_single_reference
+    * revert loading of ref-to-ref para valu
+
+  Revision 1.261  2005/02/15 19:16:04  peter
     * fix passing of 64bit values when using -Or
     * fix passing of 64bit values when using -Or
 
 
   Revision 1.260  2005/02/14 17:13:06  peter
   Revision 1.260  2005/02/14 17:13:06  peter

+ 5 - 10
compiler/parabase.pas

@@ -63,7 +63,6 @@ unit parabase;
           procedure   reset;
           procedure   reset;
           function    getcopy:tcgpara;
           function    getcopy:tcgpara;
           procedure   check_simple_location;
           procedure   check_simple_location;
-          function    is_single_reference(l: pcgparalocation): boolean;
           function    add_location:pcgparalocation;
           function    add_location:pcgparalocation;
           procedure   get_location(var newloc:tlocation);
           procedure   get_location(var newloc:tlocation);
        end;
        end;
@@ -177,14 +176,6 @@ implementation
       end;
       end;
 
 
 
 
-    function tcgpara.is_single_reference(l: pcgparalocation): boolean;
-      begin
-        result :=
-          (l^.loc = LOC_REFERENCE) and
-          not assigned(l^.next);
-      end;
-
-
     procedure tcgpara.check_simple_location;
     procedure tcgpara.check_simple_location;
       begin
       begin
         if not assigned(location) then
         if not assigned(location) then
@@ -261,7 +252,11 @@ end.
 
 
 {
 {
    $Log$
    $Log$
-   Revision 1.11  2005-02-14 17:13:07  peter
+   Revision 1.12  2005-02-15 21:39:48  peter
+     * remove is_single_reference
+     * revert loading of ref-to-ref para valu
+
+   Revision 1.11  2005/02/14 17:13:07  peter
      * truncate log
      * truncate log
 
 
    Revision 1.10  2005/01/30 21:51:57  jonas
    Revision 1.10  2005/01/30 21:51:57  jonas