Browse Source

Fix failures for rtl ppudump on sparc cpu

git-svn-id: trunk@37250 -
pierre 8 years ago
parent
commit
ce332eb2e2
1 changed files with 60 additions and 40 deletions
  1. 60 40
      compiler/utils/ppuutils/ppudump.pp

+ 60 - 40
compiler/utils/ppuutils/ppudump.pp

@@ -1571,6 +1571,7 @@ var
   first  : boolean;
   first  : boolean;
   copy_size, min_size, tokenbufsize : longint;
   copy_size, min_size, tokenbufsize : longint;
   tokenbuf : pbyte;
   tokenbuf : pbyte;
+  tbi : longint;
 //  idtoken,
 //  idtoken,
   token : ttoken;
   token : ttoken;
 //  state : tmsgstate;
 //  state : tmsgstate;
@@ -1584,26 +1585,29 @@ var
     var
     var
       b,b2 : byte;
       b,b2 : byte;
     begin
     begin
-      b:=tokenbuf[i];
-      inc(i);
+      b:=tokenbuf[tbi];
+      inc(tbi);
       if (b and $80)<>0 then
       if (b and $80)<>0 then
         begin
         begin
-          b2:=tokenbuf[i];
-          inc(i);
+          b2:=tokenbuf[tbi];
+          inc(tbi);
           result:=ttoken(((b and $7f) shl 8) or b2);
           result:=ttoken(((b and $7f) shl 8) or b2);
         end
         end
       else
       else
         result:=ttoken(b);
         result:=ttoken(b);
     end;
     end;
-
   function gettokenbufdword : dword;
   function gettokenbufdword : dword;
   var
   var
     var32 : dword;
     var32 : dword;
   begin
   begin
-    var32:=pdword(@tokenbuf[i])^;
-    inc(i,sizeof(dword));
+    var32:=unaligned(pdword(@tokenbuf[tbi])^);
+    inc(tbi,sizeof(dword));
     if ppufile.change_endian then
     if ppufile.change_endian then
       var32:=swapendian(var32);
       var32:=swapendian(var32);
+{$ifdef FPC_BIG_ENDIAN}
+    { Tokens seems to be swapped to little endian in compiler code }
+    var32:=swapendian(var32);
+{$endif}
     result:=var32;
     result:=var32;
   end;
   end;
 
 
@@ -1611,10 +1615,14 @@ var
   var
   var
     var16 : word;
     var16 : word;
   begin
   begin
-    var16:=pword(@tokenbuf[i])^;
-    inc(i,sizeof(word));
+    var16:=unaligned(pword(@tokenbuf[tbi])^);
+    inc(tbi,sizeof(word));
     if ppufile.change_endian then
     if ppufile.change_endian then
       var16:=swapendian(var16);
       var16:=swapendian(var16);
+{$ifdef FPC_BIG_ENDIAN}
+    { Tokens seems to be swapped to little endian in compiler code }
+    var16:=swapendian(var16);
+{$endif}
     result:=var16;
     result:=var16;
   end;
   end;
 
 
@@ -1628,26 +1636,38 @@ var
   begin
   begin
     if CpuAddrBitSize[cpu]=64 then
     if CpuAddrBitSize[cpu]=64 then
       begin
       begin
-        var64:=pint64(@tokenbuf[i])^;
-        inc(i,sizeof(int64));
+        var64:=unaligned(pint64(@tokenbuf[tbi])^);
+        inc(tbi,sizeof(int64));
         if ppufile.change_endian then
         if ppufile.change_endian then
           var64:=swapendian(var64);
           var64:=swapendian(var64);
+{$ifdef FPC_BIG_ENDIAN}
+        { Tokens seems to be swapped to little endian in compiler code }
+        var64:=swapendian(var64);
+{$endif}
         result:=var64;
         result:=var64;
       end
       end
     else if CpuAddrBitSize[cpu]=32 then
     else if CpuAddrBitSize[cpu]=32 then
       begin
       begin
-        var32:=plongint(@tokenbuf[i])^;
-        inc(i,sizeof(longint));
+        var32:=unaligned(plongint(@tokenbuf[tbi])^);
+        inc(tbi,sizeof(longint));
         if ppufile.change_endian then
         if ppufile.change_endian then
           var32:=swapendian(var32);
           var32:=swapendian(var32);
+{$ifdef FPC_BIG_ENDIAN}
+        { Tokens seems to be swapped to little endian in compiler code }
+        var32:=swapendian(var32);
+{$endif}
         result:=var32;
         result:=var32;
       end
       end
     else if CpuAddrBitSize[cpu]=16 then
     else if CpuAddrBitSize[cpu]=16 then
       begin
       begin
-        var16:=psmallint(@tokenbuf[i])^;
-        inc(i,sizeof(smallint));
+        var16:=unaligned(psmallint(@tokenbuf[tbi])^);
+        inc(tbi,sizeof(smallint));
         if ppufile.change_endian then
         if ppufile.change_endian then
           var16:=swapendian(var16);
           var16:=swapendian(var16);
+{$ifdef FPC_BIG_ENDIAN}
+        { Tokens seems to be swapped to little endian in compiler code }
+        var16:=swapendian(var16);
+{$endif}
         result:=var16;
         result:=var16;
       end
       end
     else
     else
@@ -1755,9 +1775,9 @@ begin
       writeln([space,' Tokenbuffer size : ',tokenbufsize]);
       writeln([space,' Tokenbuffer size : ',tokenbufsize]);
       tokenbuf:=allocmem(tokenbufsize);
       tokenbuf:=allocmem(tokenbufsize);
       ppufile.getdata(tokenbuf^,tokenbufsize);
       ppufile.getdata(tokenbuf^,tokenbufsize);
-      i:=0;
+      tbi:=0;
       write([space,' Tokens: ']);
       write([space,' Tokens: ']);
-      while i<tokenbufsize do
+      while tbi<tokenbufsize do
         begin
         begin
           token:=readtoken;
           token:=readtoken;
           if token<>_GENERICSPECIALTOKEN then
           if token<>_GENERICSPECIALTOKEN then
@@ -1778,44 +1798,44 @@ begin
               begin
               begin
                 len:=gettokenbufsizeint;
                 len:=gettokenbufsizeint;
                 setlength(wstring,len);
                 setlength(wstring,len);
-                move(tokenbuf[i],wstring[1],len*2);
+                move(tokenbuf[tbi],wstring[1],len*2);
                 write([' ',wstring]);
                 write([' ',wstring]);
-                inc(i,len*2);
+                inc(tbi,len*2);
               end;
               end;
             _CSTRING:
             _CSTRING:
               begin
               begin
                 len:=gettokenbufsizeint;
                 len:=gettokenbufsizeint;
                 setlength(astring,len);
                 setlength(astring,len);
-                move(tokenbuf[i],astring[1],len);
+                move(tokenbuf[tbi],astring[1],len);
                 write([' ',astring]);
                 write([' ',astring]);
-                inc(i,len);
+                inc(tbi,len);
               end;
               end;
             _CCHAR,
             _CCHAR,
             _INTCONST,
             _INTCONST,
             _REALNUMBER :
             _REALNUMBER :
               begin
               begin
-                write([' ',pshortstring(@tokenbuf[i])^]);
-                inc(i,tokenbuf[i]+1);
+                write([' ',unaligned(pshortstring(@tokenbuf[tbi])^)]);
+                inc(tbi,tokenbuf[tbi]+1);
               end;
               end;
             _ID :
             _ID :
               begin
               begin
-                write([' ',pshortstring(@tokenbuf[i])^]);
-                inc(i,tokenbuf[i]+1);
+                write([' ',unaligned(pshortstring(@tokenbuf[tbi])^)]);
+                inc(tbi,tokenbuf[tbi]+1);
               end;
               end;
             _GENERICSPECIALTOKEN:
             _GENERICSPECIALTOKEN:
               begin
               begin
                 { Short version of column change,
                 { Short version of column change,
                   byte or $80 used }
                   byte or $80 used }
-                if (tokenbuf[i] and $80)<>0 then
+                if (tokenbuf[tbi] and $80)<>0 then
                   begin
                   begin
-                    write(['Col: ',tokenbuf[i] and $7f]);
-                    inc(i);
+                    write(['Col: ',tokenbuf[tbi] and $7f]);
+                    inc(tbi);
                   end
                   end
                 else
                 else
-                  case tspecialgenerictoken(tokenbuf[i]) of
+                  case tspecialgenerictoken(tokenbuf[tbi]) of
                     ST_LOADSETTINGS:
                     ST_LOADSETTINGS:
                       begin
                       begin
-                        inc(i);
+                        inc(tbi);
                         write('Settings');
                         write('Settings');
                         { This does not load pmessage pointer }
                         { This does not load pmessage pointer }
                         new_settings.pmessage:=nil;
                         new_settings.pmessage:=nil;
@@ -1827,42 +1847,42 @@ begin
                           min_size:=copy_size
                           min_size:=copy_size
                         else
                         else
                           min_size:= sizeof(tsettings)-sizeof(pointer);
                           min_size:= sizeof(tsettings)-sizeof(pointer);
-                        move(tokenbuf[i],new_settings, min_size);
-                        inc(i,copy_size);
+                        move(tokenbuf[tbi],new_settings, min_size);
+                        inc(tbi,copy_size);
                       end;
                       end;
                     ST_LOADMESSAGES:
                     ST_LOADMESSAGES:
                       begin
                       begin
-                        inc(i);
+                        inc(tbi);
                         write('Messages:');
                         write('Messages:');
-                        mesgnb:=tokenbuf[i];
-                        inc(i);
+                        mesgnb:=tokenbuf[tbi];
+                        inc(tbi);
                         for nb:=1 to mesgnb do
                         for nb:=1 to mesgnb do
                           begin
                           begin
                             {msgvalue:=}gettokenbufsizeint;
                             {msgvalue:=}gettokenbufsizeint;
-                            inc(i,sizeof(sizeint));
+                            inc(tbi,sizeof(sizeint));
                             //state:=tmsgstate(gettokenbufsizeint);
                             //state:=tmsgstate(gettokenbufsizeint);
                           end;
                           end;
                       end;
                       end;
                     ST_LINE:
                     ST_LINE:
                       begin
                       begin
-                        inc(i);
+                        inc(tbi);
                         write(['Line: ',gettokenbufdword]);
                         write(['Line: ',gettokenbufdword]);
                       end;
                       end;
                     ST_COLUMN:
                     ST_COLUMN:
                       begin
                       begin
-                        inc(i);
+                        inc(tbi);
                         write(['Col: ',gettokenbufword]);
                         write(['Col: ',gettokenbufword]);
                       end;
                       end;
                     ST_FILEINDEX:
                     ST_FILEINDEX:
                       begin
                       begin
-                        inc(i);
+                        inc(tbi);
                         write(['File: ',gettokenbufword]);
                         write(['File: ',gettokenbufword]);
                       end;
                       end;
                   end;
                   end;
               end;
               end;
           end;
           end;
 
 
-          if i<tokenbufsize then
+          if tbi<tokenbufsize then
             write(',');
             write(',');
         end;
         end;
       writeln;
       writeln;