[project @ 2001-08-09 11:19:16 by sewardj]
[ghc-hetmet.git] / ghc / rts / Disassembler.c
index 72715a4..574f0a8 100644 (file)
@@ -5,11 +5,11 @@
  * Copyright (c) 1994-1998.
  *
  * $RCSfile: Disassembler.c,v $
- * $Revision: 1.16 $
- * $Date: 2000/12/20 14:47:22 $
+ * $Revision: 1.23 $
+ * $Date: 2001/08/09 11:19:16 $
  * ---------------------------------------------------------------------------*/
 
-#ifdef GHCI
+#ifdef DEBUG
 
 #include "Rts.h"
 #include "RtsAPI.h"
@@ -44,6 +44,17 @@ int disInstr ( StgBCO *bco, int pc )
    StgInfoTable** itbls       = (StgInfoTable**)(&itbls_arr->payload[0]);
 
    switch (instrs[pc++]) {
+      case bci_SWIZZLE:
+         fprintf(stderr, "SWIZZLE stkoff %d by %d\n",
+                         instrs[pc], (signed int)instrs[pc+1]);
+         pc += 2; break;
+      case bci_CCALL:
+         fprintf(stderr, "CCALL    marshaller at 0x%x\n", 
+                         literals[instrs[pc]] );
+         pc += 1; break;
+      case bci_STKCHECK: 
+         fprintf(stderr, "STKCHECK %d\n", instrs[pc] );
+         pc += 1; break;
       case bci_ARGCHECK: 
          fprintf(stderr, "ARGCHECK %d\n", instrs[pc] );
          pc += 1; break;
@@ -58,11 +69,13 @@ int disInstr ( StgBCO *bco, int pc )
                                                             instrs[pc+2] ); 
          pc += 3; break;
       case bci_PUSH_G:
-         fprintf(stderr, "PUSH_G   " ); printPtr( ptrs[instrs[pc]] ); 
+         fprintf(stderr, "PUSH_G   " ); printPtr( ptrs[instrs[pc]] );
+         fprintf(stderr, "\n" );
          pc += 1; break;
       case bci_PUSH_AS:
          fprintf(stderr, "PUSH_AS  " ); printPtr( ptrs[instrs[pc]] );
          fprintf(stderr, " 0x%x", literals[instrs[pc+1]] );
+         fprintf(stderr, "\n");
          pc += 2; break;
       case bci_PUSH_UBX:
          fprintf(stderr, "PUSH_UBX ");
@@ -93,8 +106,16 @@ int disInstr ( StgBCO *bco, int pc )
       case bci_PACK:
          fprintf(stderr, "PACK     %d words with itbl ", instrs[pc+1] );
          printPtr( (StgPtr)itbls[instrs[pc]] );
+         fprintf(stderr, "\n");
          pc += 2; break;
 
+      case bci_CASEFAIL: 
+         fprintf(stderr, "CASEFAIL\n" );
+         break;
+      case bci_JMP:
+         fprintf(stderr, "JMP to   %d\n", instrs[pc]);
+         pc += 1; break;
+
       case bci_TESTLT_I:
          fprintf(stderr, "TESTLT_I %d, fail to %d\n", literals[instrs[pc]],
                                                       instrs[pc+1]);
@@ -151,18 +172,40 @@ int disInstr ( StgBCO *bco, int pc )
 */
 void disassemble( StgBCO *bco )
 {
+   nat i, j;
    StgArrWords*   instr_arr = bco->instrs;
    UShort*        instrs    = (UShort*)(&instr_arr->payload[0]);
-   int            nbcs      = (int)instrs[0];
-   int            pc        = 1;
+   StgMutArrPtrs* ptrs      = bco->ptrs;
+   nat            nbcs      = (int)instrs[0];
+   nat            pc        = 1;
 
-   fprintf(stderr, "\n\nBCO %p =\n", bco );
+   fprintf(stderr, "BCO\n" );
    pc = 1;
    while (pc <= nbcs) {
       fprintf(stderr, "\t%2d:  ", pc );
       pc = disInstr ( bco, pc );
    }
+
+   fprintf(stderr, "INSTRS:\n   " );
+   j = 16;
+   for (i = 0; i < nbcs; i++) {
+      fprintf(stderr, "%3d ", (int)instrs[i] );
+      j--; 
+      if (j == 0) { j = 16; fprintf(stderr, "\n   "); };
+   }
+   fprintf(stderr, "\n");
+
+   fprintf(stderr, "PTRS:\n   " );
+   j = 8;
+   for (i = 0; i < ptrs->ptrs; i++) {
+      fprintf(stderr, "%8p ", ptrs->payload[i] );
+      j--; 
+      if (j == 0) { j = 8; fprintf(stderr, "\n   "); };
+   }
+   fprintf(stderr, "\n");
+
+   fprintf(stderr, "\n");
    ASSERT(pc == nbcs+1);
 }
 
-#endif /* GHCI */
+#endif /* DEBUG */