瀏覽代碼

* fixed arg. area calculation

florian 21 年之前
父節點
當前提交
06a33abebd
共有 7 個文件被更改,包括 48 次插入18 次删除
  1. 9 3
      compiler/ncal.pas
  2. 8 4
      compiler/nobj.pas
  3. 5 1
      compiler/powerpc/cpupara.pas
  4. 6 3
      compiler/powerpc/cpupi.pas
  5. 7 1
      compiler/procinfo.pas
  6. 5 2
      compiler/psub.pas
  7. 8 4
      compiler/symdef.pas

+ 9 - 3
compiler/ncal.pas

@@ -2439,13 +2439,16 @@ type
          { calculate the parameter info for the procdef }
          if not procdefinition.has_paraloc_info then
            begin
-             paramanager.create_paraloc_info(procdefinition,callerside);
+             procdefinition.requiredargarea:=paramanager.create_paraloc_info(procdefinition,callerside);
              procdefinition.has_paraloc_info:=true;
            end;
 
+         current_procinfo.maxpushedparasize:=max(current_procinfo.maxpushedparasize,procdefinition.requiredargarea);
+
          { calculate the parameter info for varargs }
          if assigned(varargsparas) then
-           paramanager.create_varargs_paraloc_info(procdefinition,varargsparas);
+           current_procinfo.maxpushedparasize:=max(current_procinfo.maxpushedparasize,
+             paramanager.create_varargs_paraloc_info(procdefinition,varargsparas));
 
          { work trough all parameters to get the register requirements }
          if assigned(left) then
@@ -2716,7 +2719,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.225  2004-02-13 15:42:21  peter
+  Revision 1.226  2004-02-19 17:07:42  florian
+    * fixed arg. area calculation
+
+  Revision 1.225  2004/02/13 15:42:21  peter
     * compare_defs_ext has now a options argument
     * fixes for variants
 

+ 8 - 4
compiler/nobj.pas

@@ -623,7 +623,7 @@ implementation
                                { compare only if the definition is not hidden }
                                if not procdefcoll^.hidden then
                                 begin
-                                  { check that all methods have overload directive } 
+                                  { check that all methods have overload directive }
                                   if not(m_fpc in aktmodeswitches) and
                                      (_class=pd._class) and
                                      (procdefcoll^.data._class=pd._class) and
@@ -634,7 +634,7 @@ implementation
                                       include(procdefcoll^.data.procoptions,po_overload);
                                       include(pd.procoptions,po_overload);
                                     end;
-                                    
+
                                   { check if one of the two methods has virtual }
                                   if (po_virtualmethod in procdefcoll^.data.procoptions) or
                                      (po_virtualmethod in pd.procoptions) then
@@ -1340,6 +1340,7 @@ implementation
          dataSegment.concat(Tai_symbol_end.Createname(_class.vmt_mangledname));
       end;
 
+
   procedure tclassheader.adjustselfvalue(procdef: tprocdef;ioffset: aword);
     var
       hsym : tsym;
@@ -1349,7 +1350,7 @@ implementation
       { calculate the parameter info for the procdef }
       if not procdef.has_paraloc_info then
         begin
-          paramanager.create_paraloc_info(procdef,callerside);
+          procdef.requiredargarea:=paramanager.create_paraloc_info(procdef,callerside);
           procdef.has_paraloc_info:=true;
         end;
       hsym:=tsym(procdef.parast.search('self'));
@@ -1379,7 +1380,10 @@ initialization
 end.
 {
   $Log$
-  Revision 1.61  2004-02-13 15:41:24  peter
+  Revision 1.62  2004-02-19 17:07:42  florian
+    * fixed arg. area calculation
+
+  Revision 1.61  2004/02/13 15:41:24  peter
     * overload directive checking for methods is now done
       when the vmt is generated
 

+ 5 - 1
compiler/powerpc/cpupara.pas

@@ -406,6 +406,7 @@ unit cpupara;
          curfloatreg:=nextfloatreg;
          curmmreg:=nextmmreg;
          cur_stack_offset:=stack_offset;
+         result:=cur_stack_offset;
       end;
 
 
@@ -453,7 +454,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.58  2004-02-11 23:18:59  florian
+  Revision 1.59  2004-02-19 17:07:42  florian
+    * fixed arg. area calculation
+
+  Revision 1.58  2004/02/11 23:18:59  florian
     * fixed to compile the rtl again
 
   Revision 1.57  2004/01/17 15:55:11  jonas

+ 6 - 3
compiler/powerpc/cpupi.pas

@@ -36,8 +36,6 @@ unit cpupi;
        tppcprocinfo = class(tcgprocinfo)
           { offset where the frame pointer from the outer procedure is stored. }
           parent_framepointer_offset : longint;
-          { max. of space need for parameters, currently used by the PowerPC port only }
-          maxpushedparasize : aword;
           constructor create(aparent:tprocinfo);override;
           procedure set_first_temp_offset;override;
           procedure allocate_push_parasize(size: longint);override;
@@ -75,6 +73,8 @@ unit cpupi;
                 ofs:=align(maxpushedparasize+LinkageAreaSizeAIX,16);
               abi_powerpc_sysv:
                 ofs:=align(maxpushedparasize+LinkageAreaSizeSYSV,16);
+              else
+                internalerror(200402191);
             end;
             tg.setfirsttemp(ofs);
           end
@@ -145,7 +145,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.33  2003-12-29 14:17:50  jonas
+  Revision 1.34  2004-02-19 17:07:42  florian
+    * fixed arg. area calculation
+
+  Revision 1.33  2003/12/29 14:17:50  jonas
     * fixed saving/restoring of volatile fpu registers under sysv
     + better provisions for abi differences regarding fpu registers that have
       to be saved

+ 7 - 1
compiler/procinfo.pas

@@ -93,6 +93,9 @@ unit procinfo;
           { Data (like jump tables) that belongs to this routine }
           aktlocaldata : taasmoutput;
 
+          { max. of space need for parameters }
+          maxpushedparasize : aword;
+
           constructor create(aparent:tprocinfo);virtual;
           destructor destroy;override;
 
@@ -178,7 +181,10 @@ implementation
 end.
 {
   $Log$
-  Revision 1.11  2003-12-26 14:02:30  peter
+  Revision 1.12  2004-02-19 17:07:42  florian
+    * fixed arg. area calculation
+
+  Revision 1.11  2003/12/26 14:02:30  peter
     * sparc updates
     * use registertype in spill_register
 

+ 5 - 2
compiler/psub.pas

@@ -674,7 +674,7 @@ implementation
               code of the ppc (and possibly other processors)               }
             if not procdef.has_paraloc_info then
               begin
-                paramanager.create_paraloc_info(procdef,callerside);
+                procdef.requiredargarea:=paramanager.create_paraloc_info(procdef,callerside);
                 procdef.has_paraloc_info:=true;
               end;
 
@@ -1345,7 +1345,10 @@ implementation
 end.
 {
   $Log$
-  Revision 1.185  2004-02-08 18:08:59  jonas
+  Revision 1.186  2004-02-19 17:07:42  florian
+    * fixed arg. area calculation
+
+  Revision 1.185  2004/02/08 18:08:59  jonas
     * fixed regvars support. Needs -doldregvars to activate. Only tested with
       ppc, other processors should however only require maxregvars and
       maxfpuregvars constants in cpubase.pas. Remember to take scratch-

+ 8 - 4
compiler/symdef.pas

@@ -443,6 +443,7 @@ interface
           proctypeoption  : tproctypeoption;
           proccalloption  : tproccalloption;
           procoptions     : tprocoptions;
+          requiredargarea : aword;
           maxparacount,
           minparacount    : byte;
 {$ifdef i386}
@@ -5325,15 +5326,15 @@ implementation
                              internalerror(200402171);
                            inc(address,tvarsym(hp^.sym).fieldoffset);
                            def:=tvarsym(hp^.sym).vartype.def;
-                         end;  
+                         end;
                        sl_vec :
                          begin
                            if not(assigned(def) and (def.deftype=arraydef)) then
                              internalerror(200402172);
                            def:=tarraydef(def).elementtype.def;
                            inc(address,def.size*hp^.value);
-                         end;  
-                     end;      
+                         end;
+                     end;
                      hp:=hp^.next;
                   end;
                 rttiList.concat(Tai_const.Create_32bit(address));
@@ -6117,7 +6118,10 @@ implementation
 end.
 {
   $Log$
-  Revision 1.219  2004-02-17 15:57:49  peter
+  Revision 1.220  2004-02-19 17:07:42  florian
+    * fixed arg. area calculation
+
+  Revision 1.219  2004/02/17 15:57:49  peter
   - fix rtti generation for properties containing sl_vec
   - fix crash when overloaded operator is not available
   - fix record alignment for C style variant records