Bladeren bron

* fixed some crashes and a rte 201

florian 22 jaren geleden
bovenliggende
commit
938f46f246
3 gewijzigde bestanden met toevoegingen van 40 en 24 verwijderingen
  1. 10 5
      compiler/powerpc/cgcpu.pas
  2. 23 16
      compiler/powerpc/cpupara.pas
  3. 7 3
      compiler/powerpc/cpupi.pas

+ 10 - 5
compiler/powerpc/cgcpu.pas

@@ -1426,9 +1426,10 @@ const
          else if ref2.offset <> 0 Then
            if ref2.base <> R_NO then
              a_op_const_reg_reg(list,OP_ADD,OS_32,ref2.offset,ref2.base,r)
-  { FixRef makes sure that "(ref.index <> R_NO) and (ref.offset <> 0)" never}
-  { occurs, so now only ref.offset has to be loaded                         }
-           else a_load_const_reg(list,OS_32,ref2.offset,r)
+           { FixRef makes sure that "(ref.index <> R_NO) and (ref.offset <> 0)" never}
+           { occurs, so now only ref.offset has to be loaded                         }
+           else
+             a_load_const_reg(list,OS_32,ref2.offset,r)
          else if ref.index <> R_NO Then
            list.concat(taicpu.op_reg_reg_reg(A_ADD,r,ref2.base,ref2.index))
          else if (ref2.base <> R_NO) and
@@ -1681,7 +1682,8 @@ const
     function tcgppc.get_rlwi_const(a: aword; var l1, l2: longint): boolean;
 
       var
-        temp, testbit: longint;
+        temp : longint;
+        testbit : aword;
         compare: boolean;
 
       begin
@@ -1933,7 +1935,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.66  2002-11-28 10:55:16  olle
+  Revision 1.67  2002-12-15 19:22:01  florian
+    * fixed some crashes and a rte 201
+
+  Revision 1.66  2002/11/28 10:55:16  olle
     * macos: changing code gen for references to globals
 
   Revision 1.65  2002/11/07 15:50:23  jonas

+ 23 - 16
compiler/powerpc/cpupara.pas

@@ -129,6 +129,24 @@ unit cpupara;
          loc : tloc;
          is_64bit: boolean;
 
+      procedure assignintreg;
+
+        begin
+           if nextintreg<=R_10 then
+             begin
+                hp.paraloc.loc:=LOC_REGISTER;
+                hp.paraloc.register:=nextintreg;
+                inc(nextintreg);
+             end
+           else
+              begin
+                 hp.paraloc.loc:=LOC_REFERENCE;
+                 hp.paraloc.reference.index:=stack_pointer_reg;
+                 hp.paraloc.reference.offset:=stack_offset;
+                 inc(stack_offset,4);
+             end;
+        end;
+
       begin
          nextintreg:=R_3;
          nextfloatreg:=R_F1;
@@ -217,21 +235,7 @@ unit cpupara;
                    begin
                       hp.paraloc.size:=OS_ADDR;
                       if push_addr_param(hp.paratype.def,p.proccalloption) or (hp.paratyp in [vs_var,vs_out]) then
-                        begin
-                           if nextintreg<=R_10 then
-                             begin
-                                hp.paraloc.loc:=LOC_REGISTER;
-                                hp.paraloc.register:=nextintreg;
-                                inc(nextintreg);
-                             end
-                           else
-                              begin
-                                 hp.paraloc.loc:=LOC_REFERENCE;
-                                 hp.paraloc.reference.index:=stack_pointer_reg;
-                                 hp.paraloc.reference.offset:=stack_offset;
-                                 inc(stack_offset,4);
-                             end;
-                        end
+                        assignintreg
                       else
                         begin
                            hp.paraloc.loc:=LOC_REFERENCE;
@@ -295,7 +299,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.17  2002-11-25 17:43:27  peter
+  Revision 1.18  2002-12-15 19:22:01  florian
+    * fixed some crashes and a rte 201
+
+  Revision 1.17  2002/11/25 17:43:27  peter
     * splitted defbase in defutil,symutil,defcmp
     * merged isconvertable and is_equal into compare_defs(_ext)
     * made operator search faster by walking the list only once

+ 7 - 3
compiler/powerpc/cpupi.pas

@@ -66,7 +66,7 @@ unit cpupi;
     procedure tppcprocinfo.after_header;
       begin
          procdef.parast.address_fixup:=0;
-         if procdef.localst.symtablelevel>1 then
+         if assigned(procdef.localst) and (procdef.localst.symtablelevel>1) then
            begin
               procinfo.framepointer_offset:=procdef.parast.address_fixup;
               inc(procdef.parast.address_fixup,4);
@@ -82,7 +82,8 @@ unit cpupi;
               inc(procdef.parast.address_fixup,4);
            end;
          { this value is necessary for nested procedures }
-         procdef.localst.address_fixup:=align(procdef.parast.address_fixup+procdef.parast.datasize,16);
+         if assigned(procdef.localst) then
+           procdef.localst.address_fixup:=align(procdef.parast.address_fixup+procdef.parast.datasize,16);
          if assigned(aktprocdef.funcretsym) and
            not(paramanager.ret_in_param(procdef.rettype.def,procdef.proccalloption)) then
            procinfo.return_offset:=tg.direction*tfuncretsym(aktprocdef.funcretsym).address+procdef.localst.address_fixup;
@@ -123,7 +124,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.5  2002-11-18 17:32:01  peter
+  Revision 1.6  2002-12-15 19:22:01  florian
+    * fixed some crashes and a rte 201
+
+  Revision 1.5  2002/11/18 17:32:01  peter
     * pass proccalloption to ret_in_xxx and push_xxx functions
 
   Revision 1.4  2002/09/10 20:30:42  florian