[project @ 2004-02-12 02:04:59 by mthomas]
[ghc-hetmet.git] / ghc / rts / Disassembler.c
index 29d40d6..f8660e6 100644 (file)
@@ -1,16 +1,16 @@
-
 /* -----------------------------------------------------------------------------
  * Bytecode disassembler
  *
- * Copyright (c) 1994-1998.
+ * Copyright (c) 1994-2002.
  *
  * $RCSfile: Disassembler.c,v $
- * $Revision: 1.17 $
- * $Date: 2001/01/03 16:44:30 $
+ * $Revision: 1.27 $
+ * $Date: 2003/03/25 17:04:09 $
  * ---------------------------------------------------------------------------*/
 
-#ifdef GHCI
+#ifdef DEBUG
 
+#include "PosixSource.h"
 #include "Rts.h"
 #include "RtsAPI.h"
 #include "RtsUtils.h"
 #include "Disassembler.h"
 #include "Interpreter.h"
 
+#include <stdio.h>
+
 /* --------------------------------------------------------------------------
  * Disassembler
  * ------------------------------------------------------------------------*/
 
-int disInstr ( StgBCO *bco, int pc )
+int
+disInstr ( StgBCO *bco, int pc )
 {
    int i;
 
-   StgArrWords*   instr_arr   = bco->instrs;
-   UShort*        instrs      = (UShort*)(&instr_arr->payload[0]);
+   StgWord16*     instrs      = (StgWord16*)(bco->instrs->payload);
 
    StgArrWords*   literal_arr = bco->literals;
    StgWord*       literals    = (StgWord*)(&literal_arr->payload[0]);
@@ -44,8 +46,16 @@ int disInstr ( StgBCO *bco, int pc )
    StgInfoTable** itbls       = (StgInfoTable**)(&itbls_arr->payload[0]);
 
    switch (instrs[pc++]) {
-      case bci_ARGCHECK: 
-         fprintf(stderr, "ARGCHECK %d\n", 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_PUSH_L: 
          fprintf(stderr, "PUSH_L   %d\n", instrs[pc] );
@@ -61,83 +71,169 @@ int disInstr ( StgBCO *bco, int 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]] );
-         pc += 2; break;
+
+      case bci_PUSH_ALTS:
+         fprintf(stderr, "PUSH_ALTS  " ); printPtr( ptrs[instrs[pc]] );
+         fprintf(stderr, "\n");
+         pc += 1; break;
+      case bci_PUSH_ALTS_P:
+         fprintf(stderr, "PUSH_ALTS_P  " ); printPtr( ptrs[instrs[pc]] );
+         fprintf(stderr, "\n");
+         pc += 1; break;
+      case bci_PUSH_ALTS_N:
+         fprintf(stderr, "PUSH_ALTS_N  " ); printPtr( ptrs[instrs[pc]] );
+         fprintf(stderr, "\n");
+         pc += 1; break;
+      case bci_PUSH_ALTS_F:
+         fprintf(stderr, "PUSH_ALTS_F  " ); printPtr( ptrs[instrs[pc]] );
+         fprintf(stderr, "\n");
+         pc += 1; break;
+      case bci_PUSH_ALTS_D:
+         fprintf(stderr, "PUSH_ALTS_D  " ); printPtr( ptrs[instrs[pc]] );
+         fprintf(stderr, "\n");
+         pc += 1; break;
+      case bci_PUSH_ALTS_L:
+         fprintf(stderr, "PUSH_ALTS_L  " ); printPtr( ptrs[instrs[pc]] );
+         fprintf(stderr, "\n");
+         pc += 1; break;
+      case bci_PUSH_ALTS_V:
+         fprintf(stderr, "PUSH_ALTS_V  " ); printPtr( ptrs[instrs[pc]] );
+         fprintf(stderr, "\n");
+         pc += 1; break;
+
       case bci_PUSH_UBX:
          fprintf(stderr, "PUSH_UBX ");
          for (i = 0; i < instrs[pc+1]; i++) 
             fprintf(stderr, "0x%x ", literals[i + instrs[pc]] );
          fprintf(stderr, "\n");
          pc += 2; break;
-      case bci_PUSH_TAG:
-         fprintf(stderr, "PUSH_TAG %d\n", instrs[pc] );
-         pc += 1; break;
+      case bci_PUSH_APPLY_N:
+         fprintf(stderr, "PUSH_APPLY_N\n");
+         break;
+      case bci_PUSH_APPLY_V:
+         fprintf(stderr, "PUSH_APPLY_V\n");
+         break;
+      case bci_PUSH_APPLY_F:
+         fprintf(stderr, "PUSH_APPLY_F\n");
+         break;
+      case bci_PUSH_APPLY_D:
+         fprintf(stderr, "PUSH_APPLY_D\n");
+         break;
+      case bci_PUSH_APPLY_L:
+         fprintf(stderr, "PUSH_APPLY_L\n");
+         break;
+      case bci_PUSH_APPLY_P:
+         fprintf(stderr, "PUSH_APPLY_P\n");
+         break;
+      case bci_PUSH_APPLY_PP:
+         fprintf(stderr, "PUSH_APPLY_PP\n");
+         break;
+      case bci_PUSH_APPLY_PPP:
+         fprintf(stderr, "PUSH_APPLY_PPP\n");
+         break;
+      case bci_PUSH_APPLY_PPPP:
+         fprintf(stderr, "PUSH_APPLY_PPPP\n");
+         break;
+      case bci_PUSH_APPLY_PPPPP:
+         fprintf(stderr, "PUSH_APPLY_PPPPP\n");
+         break;
+      case bci_PUSH_APPLY_PPPPPP:
+         fprintf(stderr, "PUSH_APPLY_PPPPPP\n");
+         break;
+      case bci_PUSH_APPLY_PPPPPPP:
+         fprintf(stderr, "PUSH_APPLY_PPPPPPP\n");
+         break;
       case bci_SLIDE: 
-         fprintf(stderr, "SLIDE    %d down by %d\n", instrs[pc], instrs[pc+1] );
+         fprintf(stderr, "SLIDE     %d down by %d\n", instrs[pc], instrs[pc+1] );
          pc += 2; break;
-      case bci_ALLOC:
-         fprintf(stderr, "ALLOC    %d words\n", instrs[pc] );
+      case bci_ALLOC_AP:
+         fprintf(stderr, "ALLOC_AP  %d words\n", instrs[pc] );
          pc += 1; break;
+      case bci_ALLOC_PAP:
+         fprintf(stderr, "ALLOC_PAP %d words, %d arity\n",
+                instrs[pc], instrs[pc+1] );
+         pc += 2; break;
       case bci_MKAP:
-         fprintf(stderr, "MKAP     %d words, %d stkoff\n", instrs[pc+1], 
+         fprintf(stderr, "MKAP      %d words, %d stkoff\n", instrs[pc+1], 
                                                            instrs[pc] );
          pc += 2; break;
       case bci_UNPACK:
-         fprintf(stderr, "UNPACK   %d\n", instrs[pc] );
+         fprintf(stderr, "UNPACK    %d\n", instrs[pc] );
          pc += 1; break;
-      case bci_UPK_TAG:
-         fprintf(stderr, "UPK_TAG  %d words, %d conoff, %d stkoff\n",
-                         instrs[pc], instrs[pc+1], instrs[pc+2] );
-         pc += 3; break;
       case bci_PACK:
-         fprintf(stderr, "PACK     %d words with itbl ", instrs[pc+1] );
+         fprintf(stderr, "PACK      %d words with itbl ", instrs[pc+1] );
          printPtr( (StgPtr)itbls[instrs[pc]] );
+         fprintf(stderr, "\n");
          pc += 2; break;
 
       case bci_TESTLT_I:
-         fprintf(stderr, "TESTLT_I %d, fail to %d\n", literals[instrs[pc]],
+         fprintf(stderr, "TESTLT_I  %d, fail to %d\n", literals[instrs[pc]],
                                                       instrs[pc+1]);
          pc += 2; break;
       case bci_TESTEQ_I:
-         fprintf(stderr, "TESTEQ_I %d, fail to %d\n", literals[instrs[pc]],
+         fprintf(stderr, "TESTEQ_I  %d, fail to %d\n", literals[instrs[pc]],
                                                       instrs[pc+1]);
          pc += 2; break;
 
       case bci_TESTLT_F:
-         fprintf(stderr, "TESTLT_F %d, fail to %d\n", literals[instrs[pc]],
+         fprintf(stderr, "TESTLT_F  %d, fail to %d\n", literals[instrs[pc]],
                                                       instrs[pc+1]);
          pc += 2; break;
       case bci_TESTEQ_F:
-         fprintf(stderr, "TESTEQ_F %d, fail to %d\n", literals[instrs[pc]],
+         fprintf(stderr, "TESTEQ_F  %d, fail to %d\n", literals[instrs[pc]],
                                                       instrs[pc+1]);
          pc += 2; break;
 
       case bci_TESTLT_D:
-         fprintf(stderr, "TESTLT_D %d, fail to %d\n", literals[instrs[pc]],
+         fprintf(stderr, "TESTLT_D  %d, fail to %d\n", literals[instrs[pc]],
                                                       instrs[pc+1]);
          pc += 2; break;
       case bci_TESTEQ_D:
-         fprintf(stderr, "TESTEQ_D %d, fail to %d\n", literals[instrs[pc]],
+         fprintf(stderr, "TESTEQ_D  %d, fail to %d\n", literals[instrs[pc]],
                                                       instrs[pc+1]);
          pc += 2; break;
 
       case bci_TESTLT_P:
-         fprintf(stderr, "TESTLT_P %d, fail to %d\n", instrs[pc],
+         fprintf(stderr, "TESTLT_P  %d, fail to %d\n", instrs[pc],
                                                       instrs[pc+1]);
          pc += 2; break;
       case bci_TESTEQ_P:
-         fprintf(stderr, "TESTEQ_P %d, fail to %d\n", instrs[pc],
+         fprintf(stderr, "TESTEQ_P  %d, fail to %d\n", instrs[pc],
                                                       instrs[pc+1]);
          pc += 2; break;
-      case bci_RETURN:
-         fprintf(stderr, "RETURN  " ); printPtr( (StgPtr)itbls[instrs[pc]] );
-         fprintf(stderr, "\n");
+      case bci_CASEFAIL: 
+         fprintf(stderr, "CASEFAIL\n" );
+         break;
+      case bci_JMP:
+         fprintf(stderr, "JMP to    %d\n", instrs[pc]);
          pc += 1; break;
+
       case bci_ENTER:
          fprintf(stderr, "ENTER\n");
          break;
+
+      case bci_RETURN:
+         fprintf(stderr, "RETURN\n" );
+        break;
+      case bci_RETURN_P:
+         fprintf(stderr, "RETURN_P\n" );
+        break;
+      case bci_RETURN_N:
+         fprintf(stderr, "RETURN_N\n" );
+        break;
+      case bci_RETURN_F:
+         fprintf(stderr, "RETURN_F\n" );
+        break;
+      case bci_RETURN_D:
+         fprintf(stderr, "RETURN_D\n" );
+        break;
+      case bci_RETURN_L:
+         fprintf(stderr, "RETURN_L\n" );
+        break;
+      case bci_RETURN_V:
+         fprintf(stderr, "RETURN_V\n" );
+        break;
+
       default:
          barf("disInstr: unknown opcode");
    }
@@ -153,8 +249,7 @@ 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]);
+   StgWord16*     instrs    = (StgWord16*)(bco->instrs->payload);
    StgMutArrPtrs* ptrs      = bco->ptrs;
    nat            nbcs      = (int)instrs[0];
    nat            pc        = 1;
@@ -188,4 +283,4 @@ void disassemble( StgBCO *bco )
    ASSERT(pc == nbcs+1);
 }
 
-#endif /* GHCI */
+#endif /* DEBUG */