2 /* -----------------------------------------------------------------------------
3 * Bytecode disassembler
5 * Copyright (c) 1994-1998.
7 * $RCSfile: Disassembler.c,v $
9 * $Date: 1999/03/01 14:47:05 $
10 * ---------------------------------------------------------------------------*/
17 #include "Bytecodes.h"
18 #include "Assembler.h"
20 #include "Disassembler.h"
22 /* --------------------------------------------------------------------------
24 * ------------------------------------------------------------------------*/
26 static InstrPtr disNone ( StgBCO *bco, InstrPtr pc, char* i );
27 static InstrPtr disInt ( StgBCO *bco, InstrPtr pc, char* i );
28 static InstrPtr disIntInt ( StgBCO *bco, InstrPtr pc, char* i );
29 static InstrPtr disInfo ( StgBCO *bco, InstrPtr pc, char* i );
30 static InstrPtr disConstPtr ( StgBCO *bco, InstrPtr pc, char* i );
31 static InstrPtr disConstInt ( StgBCO *bco, InstrPtr pc, char* i );
32 static InstrPtr disConstChar ( StgBCO *bco, InstrPtr pc, char* i );
33 static InstrPtr disConstFloat ( StgBCO *bco, InstrPtr pc, char* i );
35 static InstrPtr disNone ( StgBCO *bco, InstrPtr pc, char* i )
37 fprintf(stderr,"%s",i);
41 static InstrPtr disInt ( StgBCO *bco, InstrPtr pc, char* i )
43 StgInt x = bcoInstr(bco,pc++);
44 ASSERT(pc < bco->n_instrs);
45 fprintf(stderr,"%s %d",i,x);
49 static InstrPtr disIntInt ( StgBCO *bco, InstrPtr pc, char* i )
51 StgInt x = bcoInstr(bco,pc++);
52 StgInt y = bcoInstr(bco,pc++);
53 fprintf(stderr,"%s %d %d",i,x,y);
57 static InstrPtr disIntPC ( StgBCO *bco, InstrPtr pc, char* i )
59 StgInt x = bcoInstr(bco,pc++);
60 StgWord y = bcoInstr(bco,pc++);
61 fprintf(stderr,"%s %d %d",i,x,pc+y);
65 static InstrPtr disPC ( StgBCO *bco, InstrPtr pc, char* i )
67 StgWord y = bcoInstr(bco,pc++);
68 fprintf(stderr,"%s %d",i,pc+y);
72 static InstrPtr disInfo ( StgBCO *bco, InstrPtr pc, char* i )
74 StgInfoTable* info = bcoConstInfoPtr(bco,bcoInstr(bco,pc++));
75 /* ToDo: print contents of infotable */
76 fprintf(stderr,"%s ",i);
77 printPtr(stgCast(StgPtr,info));
81 static InstrPtr disConstPtr ( StgBCO *bco, InstrPtr pc, char* i )
83 StgInt o = bcoInstr(bco,pc++);
84 StgPtr x = bcoConstPtr(bco,o);
85 fprintf(stderr,"%s [%d]=",i,o);
86 printPtr(x); /* bad way to print it... */
90 static InstrPtr disConst2Ptr ( StgBCO *bco, InstrPtr pc, char* i )
92 StgWord o1 = bcoInstr(bco,pc++);
93 StgWord o2 = bcoInstr(bco,pc++);
94 StgWord o = o1*256 + o2;
95 StgPtr x = bcoConstPtr(bco,o);
96 fprintf(stderr,"%s [%d]=",i,o);
97 printPtr(x); /* bad way to print it... */
101 static InstrPtr disConstInt ( StgBCO *bco, InstrPtr pc, char* i )
103 StgInt x = bcoConstInt(bco,bcoInstr(bco,pc++));
104 fprintf(stderr,"%s %d",i,x);
108 static InstrPtr disConstAddr ( StgBCO *bco, InstrPtr pc, char* i )
110 StgAddr x = bcoConstAddr(bco,bcoInstr(bco,pc++));
111 fprintf(stderr,"%s ",i);
116 static InstrPtr disConstChar ( StgBCO *bco, InstrPtr pc, char* i )
118 StgChar x = bcoConstChar(bco,bcoInstr(bco,pc++));
120 fprintf(stderr,"%s '%c'",i,x); else
121 fprintf(stderr,"%s 0x%x",i,(int)x);
125 static InstrPtr disConstFloat ( StgBCO *bco, InstrPtr pc, char* i )
127 StgFloat x = bcoConstFloat(bco,bcoInstr(bco,pc++));
128 fprintf(stderr,"%s %f",i,x);
132 static InstrPtr disConstDouble ( StgBCO *bco, InstrPtr pc, char* i )
134 StgDouble x = bcoConstDouble(bco,bcoInstr(bco,pc++));
135 fprintf(stderr,"%s %f",i,x);
139 InstrPtr disInstr( StgBCO *bco, InstrPtr pc )
142 ASSERT(pc < bco->n_instrs);
143 in = bcoInstr(bco,pc++);
145 case i_INTERNAL_ERROR:
146 return disNone(bco,pc,"INTERNAL_ERROR");
148 return disNone(bco,pc,"PANIC");
150 return disInt(bco,pc,"HP_CHECK");
152 return disInt(bco,pc,"STK_CHECK");
154 return disInt(bco,pc,"ARG_CHECK");
156 return disInt(bco,pc,"ALLOC_AP");
158 return disInt(bco,pc,"ALLOC_PAP");
160 return disInfo(bco,pc,"ALLOC_CONSTR");
162 return disIntInt(bco,pc,"MKAP");
164 return disIntInt(bco,pc,"MKPAP");
166 return disInt(bco,pc,"PACK");
168 return disIntInt(bco,pc,"SLIDE");
170 return disNone(bco,pc,"ENTER");
172 return disConstPtr(bco,pc,"RETADDR");
174 return disIntPC(bco,pc,"TEST");
176 return disNone(bco,pc,"UNPACK");
178 return disInt(bco,pc,"VAR");
180 return disConstPtr(bco,pc,"CONST");
182 return disConst2Ptr(bco,pc,"CONST2");
185 return disNone(bco,pc,"VOID");
186 case i_RETURN_GENERIC:
187 return disNone(bco,pc,"RETURN_GENERIC");
190 return disInt(bco,pc,"VAR_INT");
192 return disConstInt(bco,pc,"CONST_INT");
194 return disNone(bco,pc,"RETURN_INT");
196 return disNone(bco,pc,"PACK_INT");
198 return disNone(bco,pc,"UNPACK_INT");
200 return disPC(bco,pc,"TEST_INT");
204 return disInt(bco,pc,"VAR_INT64");
206 return disConstInt(bco,pc,"CONST_INT64");
208 return disNone(bco,pc,"RETURN_INT64");
210 return disNone(bco,pc,"PACK_INT64");
212 return disNone(bco,pc,"UNPACK_INT64");
214 #ifdef PROVIDE_INTEGER
215 case i_CONST_INTEGER:
216 return disConstAddr(bco,pc,"CONST_INTEGER");
220 return disInt(bco,pc,"VAR_WORD");
222 return disConstInt(bco,pc,"CONST_WORD");
224 return disNone(bco,pc,"RETURN_WORD");
226 return disNone(bco,pc,"PACK_WORD");
228 return disNone(bco,pc,"UNPACK_WORD");
232 return disInt(bco,pc,"VAR_ADDR");
234 return disConstAddr(bco,pc,"CONST_ADDR");
236 return disNone(bco,pc,"RETURN_ADDR");
238 return disNone(bco,pc,"PACK_ADDR");
240 return disNone(bco,pc,"UNPACK_ADDR");
243 return disInt(bco,pc,"VAR_CHAR");
245 return disConstChar(bco,pc,"CONST_CHAR");
247 return disNone(bco,pc,"RETURN_CHAR");
249 return disNone(bco,pc,"PACK_CHAR");
251 return disNone(bco,pc,"UNPACK_CHAR");
254 return disInt(bco,pc,"VAR_FLOAT");
256 return disConstFloat(bco,pc,"CONST_FLOAT");
258 return disNone(bco,pc,"RETURN_FLOAT");
260 return disNone(bco,pc,"PACK_FLOAT");
262 return disNone(bco,pc,"UNPACK_FLOAT");
265 return disInt(bco,pc,"VAR_DOUBLE");
267 return disConstDouble(bco,pc,"CONST_DOUBLE");
268 case i_RETURN_DOUBLE:
269 return disNone(bco,pc,"RETURN_DOUBLE");
271 return disNone(bco,pc,"PACK_DOUBLE");
272 case i_UNPACK_DOUBLE:
273 return disNone(bco,pc,"UNPACK_DOUBLE");
275 #ifdef PROVIDE_STABLE
277 return disInt(bco,pc,"VAR_STABLE");
278 case i_RETURN_STABLE:
279 return disNone(bco,pc,"RETURN_STABLE");
281 return disNone(bco,pc,"PACK_STABLE");
282 case i_UNPACK_STABLE:
283 return disNone(bco,pc,"UNPACK_STABLE");
288 Primop1 op = bcoInstr(bco,pc++);
290 case i_INTERNAL_ERROR1:
291 return disNone(bco,pc,"INTERNAL_ERROR1");
293 return disNone(bco,pc,"i_pushseqframe");
294 case i_pushcatchframe:
295 return disNone(bco,pc,"i_pushcatchframe");
298 const AsmPrim* p = asmFindPrimop(i_PRIMOP1,op);
300 return disNone(bco,pc,p->name);
302 barf("Unrecognised primop1 %d\n",op);
308 Primop2 op = bcoInstr(bco,pc++);
310 case i_INTERNAL_ERROR2:
311 return disNone(bco,pc,"INTERNAL_ERROR2");
313 return disNone(bco,pc,"ccall_Id");
315 return disNone(bco,pc,"ccall_IO");
317 return disNone(bco,pc,"primRaise");
320 const AsmPrim* p = asmFindPrimop(i_PRIMOP2,op);
322 return disNone(bco,pc,p->name);
324 barf("Unrecognised primop2 %d\n",op);
329 barf("Unrecognised instruction %d\n",in);
333 void disassemble( StgBCO *bco, char* prefix )
336 int pcLim = bco->n_instrs;
337 ASSERT( get_itbl(bco)->type == BCO);
339 fprintf(stderr,"%s%d:\t",prefix,pc);
340 pc = disInstr(bco,pc);
341 fprintf(stderr,"\n");
344 ppStgExpr(bco->stgexpr);
345 fprintf(stderr, "\n");
348 fprintf(stderr, "\t(handwritten bytecode)\n" );
351 #endif /* INTERPRETER */