[project @ 1999-07-06 16:40:22 by sewardj]
[ghc-hetmet.git] / ghc / rts / Disassembler.c
index 63de39d..0cfc6b7 100644 (file)
@@ -5,8 +5,8 @@
  * Copyright (c) 1994-1998.
  *
  * $RCSfile: Disassembler.c,v $
- * $Revision: 1.4 $
- * $Date: 1999/03/01 14:47:05 $
+ * $Revision: 1.7 $
+ * $Date: 1999/07/06 16:40:24 $
  * ---------------------------------------------------------------------------*/
 
 #include "Rts.h"
@@ -41,7 +41,15 @@ static InstrPtr disNone      ( StgBCO *bco, InstrPtr pc, char* i )
 static InstrPtr disInt       ( StgBCO *bco, InstrPtr pc, char* i )
 {
     StgInt x = bcoInstr(bco,pc++);
-    ASSERT(pc < bco->n_instrs);
+    ASSERT(pc <= bco->n_instrs);
+    fprintf(stderr,"%s %d",i,x);
+    return pc;
+}
+
+static InstrPtr disInt16      ( StgBCO *bco, InstrPtr pc, char* i )
+{
+    StgInt x = bcoInstr16(bco,pc); pc+=2;
+    ASSERT(pc <= bco->n_instrs);
     fprintf(stderr,"%s %d",i,x);
     return pc;
 }
@@ -54,17 +62,28 @@ static InstrPtr disIntInt    ( StgBCO *bco, InstrPtr pc, char* i )
     return pc;
 }
 
+static InstrPtr disIntInt16  ( StgBCO *bco, InstrPtr pc, char* i )
+{
+    StgInt x, y;
+    x = bcoInstr16(bco,pc); pc += 2;
+    y = bcoInstr16(bco,pc); pc += 2;
+    fprintf(stderr,"%s %d %d",i,x,y);
+    return pc;
+}
+
 static InstrPtr disIntPC     ( StgBCO *bco, InstrPtr pc, char* i )
 {
-    StgInt  x = bcoInstr(bco,pc++);
-    StgWord y = bcoInstr(bco,pc++);
+    StgInt  x;
+    StgWord y;
+    x = bcoInstr(bco,pc++);
+    y = bcoInstr16(bco,pc); pc += 2;
     fprintf(stderr,"%s %d %d",i,x,pc+y);
     return pc;
 }
 
 static InstrPtr disPC        ( StgBCO *bco, InstrPtr pc, char* i )
 {
-    StgWord y = bcoInstr(bco,pc++);
+    StgWord y = bcoInstr16(bco,pc); pc += 2;
     fprintf(stderr,"%s %d",i,pc+y);
     return pc;
 }
@@ -87,12 +106,12 @@ static InstrPtr disConstPtr  ( StgBCO *bco, InstrPtr pc, char* i )
     return pc;
 }
 
-static InstrPtr disConst2Ptr ( StgBCO *bco, InstrPtr pc, char* i )
+static InstrPtr disConstPtr16 ( StgBCO *bco, InstrPtr pc, char* i )
 {
-    StgWord o1 = bcoInstr(bco,pc++);
-    StgWord o2 = bcoInstr(bco,pc++);
-    StgWord o  = o1*256 + o2;
-    StgPtr x = bcoConstPtr(bco,o);
+    StgInt o; 
+    StgPtr x;
+    o = bcoInstr16(bco,pc); pc += 2;
+    x = bcoConstPtr(bco,o);
     fprintf(stderr,"%s [%d]=",i,o); 
     printPtr(x); /* bad way to print it... */
     return pc;
@@ -101,7 +120,14 @@ static InstrPtr disConst2Ptr ( StgBCO *bco, InstrPtr pc, char* i )
 static InstrPtr disConstInt  ( StgBCO *bco, InstrPtr pc, char* i )
 {
     StgInt x = bcoConstInt(bco,bcoInstr(bco,pc++));
-    fprintf(stderr,"%s %d",i,x);
+    fprintf(stderr,"%s %d (0x%x)",i,x,x);
+    return pc;
+}
+
+static InstrPtr disConstInt16 ( StgBCO *bco, InstrPtr pc, char* i )
+{
+    StgInt x = bcoConstInt(bco,bcoInstr16(bco,pc)); pc += 2;
+    fprintf(stderr,"%s %d (0x%x)",i,x,x);
     return pc;
 }
 
@@ -113,6 +139,14 @@ static InstrPtr disConstAddr ( StgBCO *bco, InstrPtr pc, char* i )
     return pc;
 }
 
+static InstrPtr disConstAddr16 ( StgBCO *bco, InstrPtr pc, char* i )
+{
+    StgAddr x = bcoConstAddr(bco,bcoInstr16(bco,pc)); pc += 2;
+    fprintf(stderr,"%s ",i);
+    printPtr(x);
+    return pc;
+}
+
 static InstrPtr disConstChar ( StgBCO *bco, InstrPtr pc, char* i )
 {
     StgChar x = bcoConstChar(bco,bcoInstr(bco,pc++));
@@ -122,6 +156,15 @@ static InstrPtr disConstChar ( StgBCO *bco, InstrPtr pc, char* i )
     return pc;
 }
 
+static InstrPtr disConstChar16 ( StgBCO *bco, InstrPtr pc, char* i )
+{
+    StgChar x = bcoConstChar(bco,bcoInstr16(bco,pc)); pc += 2;
+    if (isprint((int)x))
+       fprintf(stderr,"%s '%c'",i,x); else
+       fprintf(stderr,"%s 0x%x",i,(int)x);
+    return pc;
+}
+
 static InstrPtr disConstFloat ( StgBCO *bco, InstrPtr pc, char* i )
 {
     StgFloat x = bcoConstFloat(bco,bcoInstr(bco,pc++));
@@ -129,6 +172,13 @@ static InstrPtr disConstFloat ( StgBCO *bco, InstrPtr pc, char* i )
     return pc;
 }
 
+static InstrPtr disConstFloat16 ( StgBCO *bco, InstrPtr pc, char* i )
+{
+    StgFloat x = bcoConstFloat(bco,bcoInstr16(bco,pc)); pc += 2;
+    fprintf(stderr,"%s %f",i,x);
+    return pc;
+}
+
 static InstrPtr disConstDouble ( StgBCO *bco, InstrPtr pc, char* i )
 {
     StgDouble x = bcoConstDouble(bco,bcoInstr(bco,pc++));
@@ -136,6 +186,13 @@ static InstrPtr disConstDouble ( StgBCO *bco, InstrPtr pc, char* i )
     return pc;
 }
 
+static InstrPtr disConstDouble16 ( StgBCO *bco, InstrPtr pc, char* i )
+{
+    StgDouble x = bcoConstDouble(bco,bcoInstr16(bco,pc)); pc += 2;
+    fprintf(stderr,"%s %f",i,x);
+    return pc;
+}
+
 InstrPtr disInstr( StgBCO *bco, InstrPtr pc )
 {
     Instr in;
@@ -146,8 +203,6 @@ InstrPtr disInstr( StgBCO *bco, InstrPtr pc )
             return disNone(bco,pc,"INTERNAL_ERROR");
     case i_PANIC:
             return disNone(bco,pc,"PANIC");
-    case i_HP_CHECK:
-            return disInt(bco,pc,"HP_CHECK");
     case i_STK_CHECK:
             return disInt(bco,pc,"STK_CHECK");
     case i_ARG_CHECK:
@@ -160,38 +215,54 @@ InstrPtr disInstr( StgBCO *bco, InstrPtr pc )
             return disInfo(bco,pc,"ALLOC_CONSTR");
     case i_MKAP:
             return disIntInt(bco,pc,"MKAP");
+    case i_MKAP_big:
+            return disIntInt16(bco,pc,"MKAP_big");
     case i_MKPAP:
             return disIntInt(bco,pc,"MKPAP");
     case i_PACK:
             return disInt(bco,pc,"PACK");
     case i_SLIDE:
             return disIntInt(bco,pc,"SLIDE");
+    case i_RV:
+            return disIntInt(bco,pc,"R_V");
+    case i_RVE:
+            return disIntInt(bco,pc,"R_V_E");
+    case i_VV:
+            return disIntInt(bco,pc,"V_V");
+    case i_SE:
+            return disIntInt(bco,pc,"S_E");
+    case i_SLIDE_big:
+            return disIntInt16(bco,pc,"SLIDE_big");
     case i_ENTER:
             return disNone(bco,pc,"ENTER");
     case i_RETADDR:
             return disConstPtr(bco,pc,"RETADDR");
+    case i_RETADDR_big:
+            return disConstPtr16(bco,pc,"RETADDR_big");
     case i_TEST:
             return disIntPC(bco,pc,"TEST");
     case i_UNPACK:
             return disNone(bco,pc,"UNPACK");
     case i_VAR:
             return disInt(bco,pc,"VAR");
+    case i_VAR_big:
+            return disInt16(bco,pc,"VAR_big");
     case i_CONST:
             return disConstPtr(bco,pc,"CONST");
-    case i_CONST2:
-            return disConst2Ptr(bco,pc,"CONST2");
+    case i_CONST_big:
+            return disConstPtr16(bco,pc,"CONST_big");
 
     case i_VOID:
             return disNone(bco,pc,"VOID");
-    case i_RETURN_GENERIC:
-            return disNone(bco,pc,"RETURN_GENERIC");
 
     case i_VAR_INT:
             return disInt(bco,pc,"VAR_INT");
+    case i_VAR_INT_big:
+            return disInt16(bco,pc,"VAR_INT_big");
     case i_CONST_INT:
             return disConstInt(bco,pc,"CONST_INT");
-    case i_RETURN_INT:
-            return disNone(bco,pc,"RETURN_INT");
+    case i_CONST_INT_big:
+            return disConstInt16(bco,pc,"CONST_INT_big");
     case i_PACK_INT:
             return disNone(bco,pc,"PACK_INT");
     case i_UNPACK_INT:
@@ -199,52 +270,41 @@ InstrPtr disInstr( StgBCO *bco, InstrPtr pc )
     case i_TEST_INT:
             return disPC(bco,pc,"TEST_INT");
 
-#ifdef PROVIDE_INT64
-    case i_VAR_INT64:
-            return disInt(bco,pc,"VAR_INT64");
-    case i_CONST_INT64:
-            return disConstInt(bco,pc,"CONST_INT64");
-    case i_RETURN_INT64:
-            return disNone(bco,pc,"RETURN_INT64");
-    case i_PACK_INT64:
-            return disNone(bco,pc,"PACK_INT64");
-    case i_UNPACK_INT64:
-            return disNone(bco,pc,"UNPACK_INT64");
-#endif
-#ifdef PROVIDE_INTEGER
     case i_CONST_INTEGER:
             return disConstAddr(bco,pc,"CONST_INTEGER");
-#endif
-#ifdef PROVIDE_WORD
+    case i_CONST_INTEGER_big:
+            return disConstAddr16(bco,pc,"CONST_INTEGER_big");
+
     case i_VAR_WORD:
             return disInt(bco,pc,"VAR_WORD");
     case i_CONST_WORD:
             return disConstInt(bco,pc,"CONST_WORD");
-    case i_RETURN_WORD:
-            return disNone(bco,pc,"RETURN_WORD");
     case i_PACK_WORD:
             return disNone(bco,pc,"PACK_WORD");
     case i_UNPACK_WORD:
             return disNone(bco,pc,"UNPACK_WORD");
-#endif
-#ifdef PROVIDE_ADDR
+
     case i_VAR_ADDR:
             return disInt(bco,pc,"VAR_ADDR");
+    case i_VAR_ADDR_big:
+            return disInt16(bco,pc,"VAR_ADDR_big");
     case i_CONST_ADDR:
             return disConstAddr(bco,pc,"CONST_ADDR");
-    case i_RETURN_ADDR:
-            return disNone(bco,pc,"RETURN_ADDR");
+    case i_CONST_ADDR_big:
+            return disConstAddr16(bco,pc,"CONST_ADDR_big");
     case i_PACK_ADDR:
             return disNone(bco,pc,"PACK_ADDR");
     case i_UNPACK_ADDR:
             return disNone(bco,pc,"UNPACK_ADDR");
-#endif
+
     case i_VAR_CHAR:
             return disInt(bco,pc,"VAR_CHAR");
+    case i_VAR_CHAR_big:
+            return disInt16(bco,pc,"VAR_CHAR_big");
     case i_CONST_CHAR:
             return disConstChar(bco,pc,"CONST_CHAR");
-    case i_RETURN_CHAR:
-            return disNone(bco,pc,"RETURN_CHAR");
+    case i_CONST_CHAR_big:
+            return disConstChar16(bco,pc,"CONST_CHAR_big");
     case i_PACK_CHAR:
             return disNone(bco,pc,"PACK_CHAR");
     case i_UNPACK_CHAR:
@@ -252,10 +312,12 @@ InstrPtr disInstr( StgBCO *bco, InstrPtr pc )
 
     case i_VAR_FLOAT:
             return disInt(bco,pc,"VAR_FLOAT");
+    case i_VAR_FLOAT_big:
+            return disInt16(bco,pc,"VAR_FLOAT_big");
     case i_CONST_FLOAT:
             return disConstFloat(bco,pc,"CONST_FLOAT");
-    case i_RETURN_FLOAT:
-            return disNone(bco,pc,"RETURN_FLOAT");
+    case i_CONST_FLOAT_big:
+            return disConstFloat16(bco,pc,"CONST_FLOAT_big");
     case i_PACK_FLOAT:
             return disNone(bco,pc,"PACK_FLOAT");
     case i_UNPACK_FLOAT:
@@ -263,10 +325,12 @@ InstrPtr disInstr( StgBCO *bco, InstrPtr pc )
 
     case i_VAR_DOUBLE:
             return disInt(bco,pc,"VAR_DOUBLE");
+    case i_VAR_DOUBLE_big:
+            return disInt16(bco,pc,"VAR_DOUBLE_big");
     case i_CONST_DOUBLE:
             return disConstDouble(bco,pc,"CONST_DOUBLE");
-    case i_RETURN_DOUBLE:
-            return disNone(bco,pc,"RETURN_DOUBLE");
+    case i_CONST_DOUBLE_big:
+            return disConstDouble16(bco,pc,"CONST_DOUBLE_big");
     case i_PACK_DOUBLE:
             return disNone(bco,pc,"PACK_DOUBLE");
     case i_UNPACK_DOUBLE:
@@ -275,8 +339,6 @@ InstrPtr disInstr( StgBCO *bco, InstrPtr pc )
 #ifdef PROVIDE_STABLE
     case i_VAR_STABLE:
             return disInt(bco,pc,"VAR_STABLE");
-    case i_RETURN_STABLE:
-            return disNone(bco,pc,"RETURN_STABLE");
     case i_PACK_STABLE:
             return disNone(bco,pc,"PACK_STABLE");
     case i_UNPACK_STABLE:
@@ -345,7 +407,7 @@ void  disassemble( StgBCO *bco, char* prefix )
        fprintf(stderr, "\n");
     }
     else
-       fprintf(stderr, "\t(handwritten bytecode)\n" );
+       fprintf(stderr, "\t(no associated tree)\n" );
 }
 
 #endif /* INTERPRETER */