Bläddra i källkod

* abstractprocdef.para_size needs alignment parameter
* secondcallparan gets para_alignment size instead of dword_align

peter 25 år sedan
förälder
incheckning
62df907953
5 ändrade filer med 60 tillägg och 44 borttagningar
  1. 24 19
      compiler/cg386cal.pas
  2. 16 18
      compiler/cg386inl.pas
  3. 8 3
      compiler/symdef.inc
  4. 6 2
      compiler/symdefh.inc
  5. 6 2
      compiler/tree.pas

+ 24 - 19
compiler/cg386cal.pas

@@ -29,7 +29,7 @@ interface
       symtable,tree;
 
     procedure secondcallparan(var p : ptree;defcoll : pparaitem;
-                push_from_left_to_right,inlined,dword_align : boolean;para_offset : longint);
+                push_from_left_to_right,inlined : boolean;para_alignment,para_offset : longint);
     procedure secondcalln(var p : ptree);
     procedure secondprocinline(var p : ptree);
 
@@ -52,7 +52,7 @@ implementation
 *****************************************************************************}
 
     procedure secondcallparan(var p : ptree;defcoll : pparaitem;
-                push_from_left_to_right,inlined,dword_align : boolean;para_offset : longint);
+                push_from_left_to_right,inlined : boolean;para_alignment,para_offset : longint);
 
       procedure maybe_push_high;
         begin
@@ -74,15 +74,18 @@ implementation
 
       var
          otlabel,oflabel : pasmlabel;
-         align : longint;
          { temporary variables: }
          tempdeftype : tdeftype;
          r : preference;
       begin
+         { set default para_alignment to target_os.stackalignment }
+         if para_alignment=0 then
+          para_alignment:=target_os.stackalignment;
+
          { push from left to right if specified }
          if push_from_left_to_right and assigned(p^.right) then
            secondcallparan(p^.right,pparaitem(defcoll^.next),push_from_left_to_right,
-             inlined,dword_align,para_offset);
+             inlined,para_alignment,para_offset);
          otlabel:=truelabel;
          oflabel:=falselabel;
          getlabel(truelabel);
@@ -194,10 +197,7 @@ implementation
                 end
               else
                 begin
-                   align:=target_os.stackalignment;
-                   if dword_align then
-                     align:=4;
-                   push_value_para(p^.left,inlined,para_offset,align);
+                   push_value_para(p^.left,inlined,para_offset,para_alignment);
                 end;
            end;
          truelabel:=otlabel;
@@ -205,7 +205,7 @@ implementation
          { push from right to left }
          if not push_from_left_to_right and assigned(p^.right) then
            secondcallparan(p^.right,pparaitem(defcoll^.next),push_from_left_to_right,
-             inlined,dword_align,para_offset);
+             inlined,para_alignment,para_offset);
       end;
 
 
@@ -239,6 +239,7 @@ implementation
          pp,params : ptree;
          inlined : boolean;
          inlinecode : ptree;
+         para_alignment,
          para_offset : longint;
          { instruction for alignement correction }
 {        corr : paicpu;}
@@ -261,6 +262,12 @@ implementation
          unusedregisters:=unused;
          usablecount:=usablereg32;
 
+         if (pocall_cdecl in p^.procdefinition^.proccalloptions) or
+            (pocall_stdcall in p^.procdefinition^.proccalloptions) then
+          para_alignment:=4
+         else
+          para_alignment:=target_os.stackalignment;
+
          if not assigned(p^.procdefinition) then
           exit;
          if (pocall_inline in p^.procdefinition^.proccalloptions) then
@@ -343,7 +350,7 @@ implementation
             if i>0 then
              inc(pop_size,4-i);
           { This parasize aligned on 4 ? }
-            i:=p^.procdefinition^.para_size and 3;
+            i:=p^.procdefinition^.para_size(para_alignment) and 3;
             if i>0 then
              inc(pop_size,4-i);
           { insert the opcode and update pushedparasize }
@@ -396,17 +403,11 @@ implementation
               if assigned(p^.right) then
                 secondcallparan(p^.left,pparaitem(pabstractprocdef(p^.right^.resulttype)^.para^.first),
                   (pocall_leftright in p^.procdefinition^.proccalloptions),
-                  inlined,
-                  (pocall_cdecl in p^.procdefinition^.proccalloptions) or
-                   (pocall_stdcall in p^.procdefinition^.proccalloptions),
-                  para_offset)
+                  inlined,para_alignment,para_offset)
               else
                 secondcallparan(p^.left,pparaitem(p^.procdefinition^.para^.first),
                   (pocall_leftright in p^.procdefinition^.proccalloptions),
-                  inlined,
-                  (pocall_cdecl in p^.procdefinition^.proccalloptions) or
-                   (pocall_stdcall in p^.procdefinition^.proccalloptions),
-                  para_offset);
+                  inlined,para_alignment,para_offset);
            end;
          params:=p^.left;
          p^.left:=nil;
@@ -1332,7 +1333,11 @@ implementation
 end.
 {
   $Log$
-  Revision 1.121  2000-01-23 18:50:07  peter
+  Revision 1.122  2000-01-26 12:02:29  peter
+    * abstractprocdef.para_size needs alignment parameter
+    * secondcallparan gets para_alignment size instead of dword_align
+
+  Revision 1.121  2000/01/23 18:50:07  peter
     * fixed missing push esi for constructor calling
 
   Revision 1.120  2000/01/21 22:06:16  florian

+ 16 - 18
compiler/cg386inl.pas

@@ -338,7 +338,7 @@ implementation
                         else
                           if (is_chararray(hp^.resulttype)) then
                             dummycoll.paratype.setdef(openchararraydef);
-                        secondcallparan(hp,@dummycoll,false,false,false,0);
+                        secondcallparan(hp,@dummycoll,false,false,0,0);
                         if ft=ft_typed then
                           never_copy_const_param:=false;
                       end;
@@ -382,7 +382,7 @@ implementation
                                    hp^.right:=nil;
                                    dummycoll.paratype.setdef(hp^.resulttype);
                                    dummycoll.paratyp:=vs_value;
-                                   secondcallparan(hp,@dummycoll,false,false,false,0);
+                                   secondcallparan(hp,@dummycoll,false,false,0,0);
                                    hp^.right:=node;
                                    if codegenerror then
                                      exit;
@@ -400,7 +400,7 @@ implementation
                                    hp^.right:=nil;
                                    dummycoll.paratype.setdef(hp^.resulttype);
                                    dummycoll.paratyp:=vs_value;
-                                   secondcallparan(hp,@dummycoll,false,false,false,0);
+                                   secondcallparan(hp,@dummycoll,false,false,0,0);
                                    hp^.right:=node;
                                    if pararesult^.deftype<>floatdef then
                                      CGMessage(parser_e_illegal_colon_qualifier);
@@ -562,7 +562,7 @@ implementation
            else
              dummycoll.paratype.setdef(hp^.resulttype);
            procedureprefix:='FPC_'+pstringdef(hp^.resulttype)^.stringtypname+'_';
-           secondcallparan(hp,@dummycoll,false,false,false,0);
+           secondcallparan(hp,@dummycoll,false,false,0,0);
            if codegenerror then
              exit;
 
@@ -584,9 +584,7 @@ implementation
              begin
                 dummycoll.paratype.setdef(hp^.resulttype);
                 dummycoll.paratyp:=vs_value;
-                secondcallparan(hp,@dummycoll,false
-                  ,false,false,0
-                  );
+                secondcallparan(hp,@dummycoll,false,false,0,0);
                 if codegenerror then
                   exit;
                 disposetree(hp);
@@ -603,9 +601,7 @@ implementation
              begin
                 dummycoll.paratype.setdef(hp^.resulttype);
                 dummycoll.paratyp:=vs_value;
-                secondcallparan(hp,@dummycoll,false
-                  ,false,false,0
-                  );
+                secondcallparan(hp,@dummycoll,false,false,0,0);
                 if codegenerror then
                   exit;
                 disposetree(hp);
@@ -629,9 +625,7 @@ implementation
            { last arg longint or real }
            dummycoll.paratype.setdef(hp^.resulttype);
            dummycoll.paratyp:=vs_value;
-           secondcallparan(hp,@dummycoll,false
-             ,false,false,0
-             );
+           secondcallparan(hp,@dummycoll,false,false,0,0);
            if codegenerror then
              exit;
 
@@ -701,7 +695,7 @@ implementation
           {load and push the address of the destination}
            dummycoll.paratyp:=vs_var;
            dummycoll.paratype.setdef(dest_para^.resulttype);
-           secondcallparan(dest_para,@dummycoll,false,false,false,0);
+           secondcallparan(dest_para,@dummycoll,false,false,0,0);
            if codegenerror then
              exit;
 
@@ -715,7 +709,7 @@ implementation
              Begin
                dummycoll.paratyp:=vs_var;
                dummycoll.paratype.setdef(code_para^.resulttype);
-               secondcallparan(code_para,@dummycoll,false,false,false,0);
+               secondcallparan(code_para,@dummycoll,false,false,0,0);
                if codegenerror then
                  exit;
                Disposetree(code_para);
@@ -730,7 +724,7 @@ implementation
           {node = first parameter = string}
            dummycoll.paratyp:=vs_const;
            dummycoll.paratype.setdef(node^.resulttype);
-           secondcallparan(node,@dummycoll,false,false,false,0);
+           secondcallparan(node,@dummycoll,false,false,0,0);
            if codegenerror then
              exit;
 
@@ -1513,7 +1507,11 @@ implementation
 end.
 {
   $Log$
-  Revision 1.91  2000-01-24 20:11:10  florian
+  Revision 1.92  2000-01-26 12:02:29  peter
+    * abstractprocdef.para_size needs alignment parameter
+    * secondcallparan gets para_alignment size instead of dword_align
+
+  Revision 1.91  2000/01/24 20:11:10  florian
     * internalerror 10 for inlined math functions fixed
 
   Revision 1.90  2000/01/09 23:16:05  peter
@@ -1659,4 +1657,4 @@ end.
     * some fixes for qword
     * start of register calling conventions
 
-}
+}

+ 8 - 3
compiler/symdef.inc

@@ -2372,7 +2372,7 @@
       end;
 
 
-    function tabstractprocdef.para_size : longint;
+    function tabstractprocdef.para_size(alignsize:longint) : longint;
       var
          pdc : pparaitem;
          l : longint;
@@ -2387,8 +2387,9 @@
               vs_const : if push_addr_param(pdc^.paratype.def) then
                           inc(l,target_os.size_of_pointer)
                          else
-                          inc(l,align(pdc^.paratype.def^.size,target_os.stackalignment));
+                          inc(l,pdc^.paratype.def^.size);
             end;
+            l:=align(l,alignsize);
             pdc:=pparaitem(pdc^.next);
           end;
          para_size:=l;
@@ -3858,7 +3859,11 @@ Const local_symtable_index : longint = $8001;
 
 {
   $Log$
-  Revision 1.188  2000-01-23 16:35:31  peter
+  Revision 1.189  2000-01-26 12:02:29  peter
+    * abstractprocdef.para_size needs alignment parameter
+    * secondcallparan gets para_alignment size instead of dword_align
+
+  Revision 1.188  2000/01/23 16:35:31  peter
     * localbrowser loading of absolute fixed. It needed a symtablestack
       which was not setup correctly
 

+ 6 - 2
compiler/symdefh.inc

@@ -346,7 +346,7 @@
           procedure  write;virtual;
           procedure deref;virtual;
           procedure concatpara(tt:ttype;vsp : tvarspez);
-          function  para_size : longint;
+          function  para_size(alignsize:longint) : longint;
           function  demangled_paras : string;
           function  proccalloption2str : string;
           procedure test_if_fpu_result;
@@ -528,7 +528,11 @@
 
 {
   $Log$
-  Revision 1.50  2000-01-07 01:14:40  peter
+  Revision 1.51  2000-01-26 12:02:30  peter
+    * abstractprocdef.para_size needs alignment parameter
+    * secondcallparan gets para_alignment size instead of dword_align
+
+  Revision 1.50  2000/01/07 01:14:40  peter
     * updated copyright to 2000
 
   Revision 1.49  2000/01/03 19:26:04  peter

+ 6 - 2
compiler/tree.pas

@@ -1298,7 +1298,7 @@ unit tree;
          p^.inlineprocsym:=callp^.symtableprocentry;
          p^.retoffset:=-4; { less dangerous as zero (PM) }
          p^.para_offset:=0;
-         p^.para_size:=p^.inlineprocsym^.definition^.para_size;
+         p^.para_size:=p^.inlineprocsym^.definition^.para_size(target_os.stackalignment);
          if ret_in_param(p^.inlineprocsym^.definition^.rettype.def) then
            p^.para_size:=p^.para_size+target_os.size_of_pointer;
          { copy args }
@@ -1918,7 +1918,11 @@ unit tree;
 end.
 {
   $Log$
-  Revision 1.109  2000-01-09 23:16:07  peter
+  Revision 1.110  2000-01-26 12:02:30  peter
+    * abstractprocdef.para_size needs alignment parameter
+    * secondcallparan gets para_alignment size instead of dword_align
+
+  Revision 1.109  2000/01/09 23:16:07  peter
     * added st_default stringtype
     * genstringconstnode extended with stringtype parameter using st_default
       will do the old behaviour