Prechádzať zdrojové kódy

* updated for posinfo change
* updated for mangledname change
* include i386 registers, removed reference to cpubase unit that would
make ppudump dependent on the source processor

peter 23 rokov pred
rodič
commit
51c5fb965e
1 zmenil súbory, kde vykonal 102 pridanie a 22 odobranie
  1. 102 22
      compiler/utils/ppudump.pp

+ 102 - 22
compiler/utils/ppudump.pp

@@ -24,10 +24,7 @@
 {$endif}
 program pppdump;
 uses
-{$ifdef go32v2}
-  dpmiexcp,
-{$endif go32v2}
-  ppu, cpubase;
+  ppu;
 
 const
   Version   = 'Version 1.10';
@@ -44,6 +41,19 @@ const
   v_browser        = $20;
   v_all            = $ff;
 
+type
+  { Copied from systems.pas }
+  ttargetcpu=
+  (
+        no_cpu,                   { 0 }
+        i386,                     { 1 }
+        m68k,                     { 2 }
+        alpha,                    { 3 }
+        powerpc,                  { 4 }
+        sparc,                    { 5 }
+        vm                        { 6 }
+  );
+
 var
   ppufile     : tppufile;
   space       : string;
@@ -128,18 +138,6 @@ end;
 
 
 Function Cpu2Str(w:longint):string;
-type
-       { Copied from systems.pas }
-       ttargetcpu=
-       (
-             no_cpu,                   { 0 }
-             i386,                     { 1 }
-             m68k,                     { 2 }
-             alpha,                    { 3 }
-             powerpc,                  { 4 }
-             sparc,                    { 5 }
-             vm                        { 6 }
-       );
 const
   CpuTxt : array[ttargetcpu] of string[7]=
     ('none','i386','m68k','alpha','powerpc','sparc','vis');
@@ -301,8 +299,39 @@ end;
 
 
 Procedure ReadPosInfo;
+var
+  info : byte;
+  fileindex,line,column : longint;
 begin
-  Writeln(ppufile.getword,' (',ppufile.getlongint,',',ppufile.getword,')');
+  with ppufile do
+   begin
+     {
+       info byte layout in bits:
+       0-1 - amount of bytes for fileindex
+       2-3 - amount of bytes for line
+       4-5 - amount of bytes for column
+     }
+     info:=getbyte;
+     case (info and $03) of
+      0 : fileindex:=getbyte;
+      1 : fileindex:=getword;
+      2 : fileindex:=(getbyte shl 16) or getword;
+      3 : fileindex:=getlongint;
+     end;
+     case ((info shr 2) and $03) of
+      0 : line:=getbyte;
+      1 : line:=getword;
+      2 : line:=(getbyte shl 16) or getword;
+      3 : line:=getlongint;
+     end;
+     case ((info shr 4) and $03) of
+      0 : column:=getbyte;
+      1 : column:=getword;
+      2 : column:=(getbyte shl 16) or getword;
+      3 : column:=getlongint;
+     end;
+     Writeln(fileindex,' (',line,',',column,')');
+   end;
 end;
 
 
@@ -944,7 +973,41 @@ end;
                          Read defintions Part
 ****************************************************************************}
 
-procedure getusedregisters;
+procedure getusedregisters_i386;
+type
+  tregister = (R_NO,
+    R_EAX,R_ECX,R_EDX,R_EBX,R_ESP,R_EBP,R_ESI,R_EDI,
+    R_AX,R_CX,R_DX,R_BX,R_SP,R_BP,R_SI,R_DI,
+    R_AL,R_CL,R_DL,R_BL,R_AH,R_CH,R_BH,R_DH,
+    R_CS,R_DS,R_ES,R_SS,R_FS,R_GS,
+    R_ST,R_ST0,R_ST1,R_ST2,R_ST3,R_ST4,R_ST5,R_ST6,R_ST7,
+    R_DR0,R_DR1,R_DR2,R_DR3,R_DR6,R_DR7,
+    R_CR0,R_CR2,R_CR3,R_CR4,
+    R_TR3,R_TR4,R_TR5,R_TR6,R_TR7,
+    R_MM0,R_MM1,R_MM2,R_MM3,R_MM4,R_MM5,R_MM6,R_MM7,
+    R_XMM0,R_XMM1,R_XMM2,R_XMM3,R_XMM4,R_XMM5,R_XMM6,R_XMM7
+  );
+  tregisterset = set of tregister;
+  reg2strtable = array[tregister] of string[6];
+const
+  std_reg2str : reg2strtable = ('',
+    'eax','ecx','edx','ebx','esp','ebp','esi','edi',
+    'ax','cx','dx','bx','sp','bp','si','di',
+    'al','cl','dl','bl','ah','ch','bh','dh',
+    'cs','ds','es','ss','fs','gs',
+    'st','st(0)','st(1)','st(2)','st(3)','st(4)','st(5)','st(6)','st(7)',
+    'dr0','dr1','dr2','dr3','dr6','dr7',
+    'cr0','cr2','cr3','cr4',
+    'tr3','tr4','tr5','tr6','tr7',
+    'mm0','mm1','mm2','mm3','mm4','mm5','mm6','mm7',
+    'xmm0','xmm1','xmm2','xmm3','xmm4','xmm5','xmm6','xmm7'
+  );
+  firstsaveintreg = R_EAX;
+  lastsaveintreg = R_EBX;
+  firstsavefpureg = R_NO;
+  lastsavefpureg = R_NO;
+  firstsavemmreg = R_MM0;
+  lastsavemmreg = R_MM7;
 var
   regs: tregisterset;
   r: tregister;
@@ -1007,6 +1070,7 @@ var
   totaldefs,l,j,
   defcnt : longint;
   calloption : tproccalloption;
+  regs : set of char;
 begin
   defcnt:=0;
   with ppufile do
@@ -1086,9 +1150,19 @@ begin
              readcommondef('Procedure definition');
              calloption:=read_abstract_proc_def;
              write  (space,'   Used Registers : ');
-             getusedregisters;
-             writeln(space,'     Mangled name : ',getstring);
-             writeln(space,'           Number : ',getlongint);
+             case ttargetcpu(header.cpu) of
+               i386 :
+                 getusedregisters_i386
+               else
+                 begin
+                   getnormalset(regs);
+                   writeln('<not yet implemented>');
+                 end;
+             end;
+             if (getbyte<>0) then
+               writeln(space,'     Mangled name : ',getstring);
+             writeln(space,'  Overload Number : ',getword);
+             writeln(space,'           Number : ',getword);
              write  (space,'            Class : ');
              readdefref;
              write  (space,'          Procsym : ');
@@ -1700,7 +1774,13 @@ begin
 end.
 {
   $Log$
-  Revision 1.20  2002-04-15 19:15:09  carl
+  Revision 1.21  2002-04-23 13:12:58  peter
+    * updated for posinfo change
+    * updated for mangledname change
+    * include i386 registers, removed reference to cpubase unit that would
+      make ppudump dependent on the source processor
+
+  Revision 1.20  2002/04/15 19:15:09  carl
   + write std_reg2str instead of gas registers
 
   Revision 1.19  2002/04/14 17:02:19  carl