2 /* -----------------------------------------------------------------------------
3 * Bytecode disassembler
5 * Copyright (c) 1994-1998.
7 * $RCSfile: Disassembler.c,v $
9 * $Date: 2000/12/20 14:47:22 $
10 * ---------------------------------------------------------------------------*/
21 #include "Bytecodes.h"
23 #include "Disassembler.h"
24 #include "Interpreter.h"
26 /* --------------------------------------------------------------------------
28 * ------------------------------------------------------------------------*/
30 int disInstr ( StgBCO *bco, int pc )
34 StgArrWords* instr_arr = bco->instrs;
35 UShort* instrs = (UShort*)(&instr_arr->payload[0]);
37 StgArrWords* literal_arr = bco->literals;
38 StgWord* literals = (StgWord*)(&literal_arr->payload[0]);
40 StgMutArrPtrs* ptrs_arr = bco->ptrs;
41 StgPtr* ptrs = (StgPtr*)(&ptrs_arr->payload[0]);
43 StgArrWords* itbls_arr = bco->itbls;
44 StgInfoTable** itbls = (StgInfoTable**)(&itbls_arr->payload[0]);
46 switch (instrs[pc++]) {
48 fprintf(stderr, "ARGCHECK %d\n", instrs[pc] );
51 fprintf(stderr, "PUSH_L %d\n", instrs[pc] );
54 fprintf(stderr, "PUSH_LL %d %d\n", instrs[pc], instrs[pc+1] );
57 fprintf(stderr, "PUSH_LLL %d %d %d\n", instrs[pc], instrs[pc+1],
61 fprintf(stderr, "PUSH_G " ); printPtr( ptrs[instrs[pc]] );
64 fprintf(stderr, "PUSH_AS " ); printPtr( ptrs[instrs[pc]] );
65 fprintf(stderr, " 0x%x", literals[instrs[pc+1]] );
68 fprintf(stderr, "PUSH_UBX ");
69 for (i = 0; i < instrs[pc+1]; i++)
70 fprintf(stderr, "0x%x ", literals[i + instrs[pc]] );
71 fprintf(stderr, "\n");
74 fprintf(stderr, "PUSH_TAG %d\n", instrs[pc] );
77 fprintf(stderr, "SLIDE %d down by %d\n", instrs[pc], instrs[pc+1] );
80 fprintf(stderr, "ALLOC %d words\n", instrs[pc] );
83 fprintf(stderr, "MKAP %d words, %d stkoff\n", instrs[pc+1],
87 fprintf(stderr, "UNPACK %d\n", instrs[pc] );
90 fprintf(stderr, "UPK_TAG %d words, %d conoff, %d stkoff\n",
91 instrs[pc], instrs[pc+1], instrs[pc+2] );
94 fprintf(stderr, "PACK %d words with itbl ", instrs[pc+1] );
95 printPtr( (StgPtr)itbls[instrs[pc]] );
99 fprintf(stderr, "TESTLT_I %d, fail to %d\n", literals[instrs[pc]],
103 fprintf(stderr, "TESTEQ_I %d, fail to %d\n", literals[instrs[pc]],
108 fprintf(stderr, "TESTLT_F %d, fail to %d\n", literals[instrs[pc]],
112 fprintf(stderr, "TESTEQ_F %d, fail to %d\n", literals[instrs[pc]],
117 fprintf(stderr, "TESTLT_D %d, fail to %d\n", literals[instrs[pc]],
121 fprintf(stderr, "TESTEQ_D %d, fail to %d\n", literals[instrs[pc]],
126 fprintf(stderr, "TESTLT_P %d, fail to %d\n", instrs[pc],
130 fprintf(stderr, "TESTEQ_P %d, fail to %d\n", instrs[pc],
134 fprintf(stderr, "RETURN " ); printPtr( (StgPtr)itbls[instrs[pc]] );
135 fprintf(stderr, "\n");
138 fprintf(stderr, "ENTER\n");
141 barf("disInstr: unknown opcode");
147 /* Something of a kludge .. how do we know where the end of the insn
148 array is, since it isn't recorded anywhere? Answer: the first
149 short is the number of bytecodes which follow it.
150 See ByteCodeGen.linkBCO.insns_arr for construction ...
152 void disassemble( StgBCO *bco )
154 StgArrWords* instr_arr = bco->instrs;
155 UShort* instrs = (UShort*)(&instr_arr->payload[0]);
156 int nbcs = (int)instrs[0];
159 fprintf(stderr, "\n\nBCO %p =\n", bco );
162 fprintf(stderr, "\t%2d: ", pc );
163 pc = disInstr ( bco, pc );
165 ASSERT(pc == nbcs+1);