1 /* -*- mode: hugs-c; -*- */
2 /* -----------------------------------------------------------------------------
3 * $Id: Disassembler.c,v 1.3 1999/02/05 16:02:37 simonm Exp $
5 * Copyright (c) The GHC Team 1994-1999.
7 * Bytecode disassembler
9 * ---------------------------------------------------------------------------*/
16 #include "Bytecodes.h"
17 #include "Assembler.h"
19 #include "Disassembler.h"
21 /* --------------------------------------------------------------------------
23 * ------------------------------------------------------------------------*/
25 static InstrPtr disNone ( StgBCO *bco, InstrPtr pc, char* i );
26 static InstrPtr disInt ( StgBCO *bco, InstrPtr pc, char* i );
27 static InstrPtr disIntInt ( StgBCO *bco, InstrPtr pc, char* i );
28 static InstrPtr disInfo ( StgBCO *bco, InstrPtr pc, char* i );
29 static InstrPtr disConstPtr ( StgBCO *bco, InstrPtr pc, char* i );
30 static InstrPtr disConstInt ( StgBCO *bco, InstrPtr pc, char* i );
31 static InstrPtr disConstChar ( StgBCO *bco, InstrPtr pc, char* i );
32 static InstrPtr disConstFloat ( StgBCO *bco, InstrPtr pc, char* i );
34 static InstrPtr disNone ( StgBCO *bco, InstrPtr pc, char* i )
36 fprintf(stderr,"%s",i);
40 static InstrPtr disInt ( StgBCO *bco, InstrPtr pc, char* i )
42 StgInt x = bcoInstr(bco,pc++);
43 ASSERT(pc < bco->n_instrs);
44 fprintf(stderr,"%s %d",i,x);
48 static InstrPtr disIntInt ( StgBCO *bco, InstrPtr pc, char* i )
50 StgInt x = bcoInstr(bco,pc++);
51 StgInt y = bcoInstr(bco,pc++);
52 fprintf(stderr,"%s %d %d",i,x,y);
56 static InstrPtr disIntPC ( StgBCO *bco, InstrPtr pc, char* i )
58 StgInt x = bcoInstr(bco,pc++);
59 StgWord y = bcoInstr(bco,pc++);
60 fprintf(stderr,"%s %d %d",i,x,pc+y);
64 static InstrPtr disPC ( StgBCO *bco, InstrPtr pc, char* i )
66 StgWord y = bcoInstr(bco,pc++);
67 fprintf(stderr,"%s %d",i,pc+y);
71 static InstrPtr disInfo ( StgBCO *bco, InstrPtr pc, char* i )
73 StgInfoTable* info = bcoConstInfoPtr(bco,bcoInstr(bco,pc++));
74 /* ToDo: print contents of infotable */
75 fprintf(stderr,"%s ",i);
76 printPtr(stgCast(StgPtr,info));
80 static InstrPtr disConstPtr ( StgBCO *bco, InstrPtr pc, char* i )
82 StgInt o = bcoInstr(bco,pc++);
83 StgPtr x = bcoConstPtr(bco,o);
84 fprintf(stderr,"%s [%d]=",i,o);
85 printPtr(x); /* bad way to print it... */
89 static InstrPtr disConst2Ptr ( StgBCO *bco, InstrPtr pc, char* i )
91 StgWord o1 = bcoInstr(bco,pc++);
92 StgWord o2 = bcoInstr(bco,pc++);
93 StgWord o = o1*256 + o2;
94 StgPtr x = bcoConstPtr(bco,o);
95 fprintf(stderr,"%s [%d]=",i,o);
96 printPtr(x); /* bad way to print it... */
100 static InstrPtr disConstInt ( StgBCO *bco, InstrPtr pc, char* i )
102 StgInt x = bcoConstInt(bco,bcoInstr(bco,pc++));
103 fprintf(stderr,"%s %d",i,x);
107 static InstrPtr disConstAddr ( StgBCO *bco, InstrPtr pc, char* i )
109 StgAddr x = bcoConstAddr(bco,bcoInstr(bco,pc++));
110 fprintf(stderr,"%s ",i);
115 static InstrPtr disConstChar ( StgBCO *bco, InstrPtr pc, char* i )
117 StgChar x = bcoConstChar(bco,bcoInstr(bco,pc++));
118 fprintf(stderr,"%s '%c'",i,x);
122 static InstrPtr disConstFloat ( StgBCO *bco, InstrPtr pc, char* i )
124 StgFloat x = bcoConstFloat(bco,bcoInstr(bco,pc++));
125 fprintf(stderr,"%s %f",i,x);
129 static InstrPtr disConstDouble ( StgBCO *bco, InstrPtr pc, char* i )
131 StgDouble x = bcoConstDouble(bco,bcoInstr(bco,pc++));
132 fprintf(stderr,"%s %f",i,x);
136 InstrPtr disInstr( StgBCO *bco, InstrPtr pc )
139 ASSERT(pc < bco->n_instrs);
140 in = bcoInstr(bco,pc++);
142 case i_INTERNAL_ERROR:
143 return disNone(bco,pc,"INTERNAL_ERROR");
145 return disNone(bco,pc,"PANIC");
147 return disInt(bco,pc,"HP_CHECK");
149 return disInt(bco,pc,"STK_CHECK");
151 return disInt(bco,pc,"ARG_CHECK");
153 return disInt(bco,pc,"ALLOC_AP");
155 return disInt(bco,pc,"ALLOC_PAP");
157 return disInfo(bco,pc,"ALLOC_CONSTR");
159 return disIntInt(bco,pc,"MKAP");
161 return disIntInt(bco,pc,"MKPAP");
163 return disInt(bco,pc,"PACK");
165 return disIntInt(bco,pc,"SLIDE");
167 return disNone(bco,pc,"ENTER");
169 return disConstPtr(bco,pc,"RETADDR");
171 return disIntPC(bco,pc,"TEST");
173 return disNone(bco,pc,"UNPACK");
175 return disInt(bco,pc,"VAR");
177 return disConstPtr(bco,pc,"CONST");
179 return disConst2Ptr(bco,pc,"CONST2");
182 return disNone(bco,pc,"VOID");
184 case i_RETURN_GENERIC:
185 return disNone(bco,pc,"RETURN_GENERIC");
188 return disInt(bco,pc,"VAR_INT");
190 return disConstInt(bco,pc,"CONST_INT");
192 return disNone(bco,pc,"RETURN_INT");
194 return disNone(bco,pc,"PACK_INT");
196 return disNone(bco,pc,"UNPACK_INT");
198 return disPC(bco,pc,"TEST_INT");
202 return disInt(bco,pc,"VAR_INT64");
204 return disConstInt(bco,pc,"CONST_INT64");
206 return disNone(bco,pc,"RETURN_INT64");
208 return disNone(bco,pc,"PACK_INT64");
210 return disNone(bco,pc,"UNPACK_INT64");
212 #ifdef PROVIDE_INTEGER
213 case i_CONST_INTEGER:
214 return disConstAddr(bco,pc,"CONST_INTEGER");
218 return disInt(bco,pc,"VAR_WORD");
220 return disConstInt(bco,pc,"CONST_WORD");
222 return disNone(bco,pc,"RETURN_WORD");
224 return disNone(bco,pc,"PACK_WORD");
226 return disNone(bco,pc,"UNPACK_WORD");
230 return disInt(bco,pc,"VAR_ADDR");
232 return disConstAddr(bco,pc,"CONST_ADDR");
234 return disNone(bco,pc,"RETURN_ADDR");
236 return disNone(bco,pc,"PACK_ADDR");
238 return disNone(bco,pc,"UNPACK_ADDR");
241 return disInt(bco,pc,"VAR_CHAR");
243 return disConstChar(bco,pc,"CONST_CHAR");
245 return disNone(bco,pc,"RETURN_CHAR");
247 return disNone(bco,pc,"PACK_CHAR");
249 return disNone(bco,pc,"UNPACK_CHAR");
252 return disInt(bco,pc,"VAR_FLOAT");
254 return disConstFloat(bco,pc,"CONST_FLOAT");
256 return disNone(bco,pc,"RETURN_FLOAT");
258 return disNone(bco,pc,"PACK_FLOAT");
260 return disNone(bco,pc,"UNPACK_FLOAT");
263 return disInt(bco,pc,"VAR_DOUBLE");
265 return disConstDouble(bco,pc,"CONST_DOUBLE");
266 case i_RETURN_DOUBLE:
267 return disNone(bco,pc,"RETURN_DOUBLE");
269 return disNone(bco,pc,"PACK_DOUBLE");
270 case i_UNPACK_DOUBLE:
271 return disNone(bco,pc,"UNPACK_DOUBLE");
273 #ifdef PROVIDE_STABLE
275 return disInt(bco,pc,"VAR_STABLE");
276 case i_RETURN_STABLE:
277 return disNone(bco,pc,"RETURN_STABLE");
279 return disNone(bco,pc,"PACK_STABLE");
280 case i_UNPACK_STABLE:
281 return disNone(bco,pc,"UNPACK_STABLE");
286 Primop1 op = bcoInstr(bco,pc++);
288 case i_INTERNAL_ERROR1:
289 return disNone(bco,pc,"INTERNAL_ERROR1");
292 const AsmPrim* p = asmFindPrimop(i_PRIMOP1,op);
294 return disNone(bco,pc,p->name);
296 barf("Unrecognised primop1 %d\n",op);
302 Primop2 op = bcoInstr(bco,pc++);
304 case i_INTERNAL_ERROR2:
305 return disNone(bco,pc,"INTERNAL_ERROR2");
307 return disNone(bco,pc,"ccall_Id");
309 return disNone(bco,pc,"ccall_IO");
312 const AsmPrim* p = asmFindPrimop(i_PRIMOP2,op);
314 return disNone(bco,pc,p->name);
316 barf("Unrecognised primop2 %d\n",op);
321 barf("Unrecognised instruction %d\n",in);
325 void disassemble( StgBCO *bco, char* prefix )
328 int pcLim = bco->n_instrs;
329 ASSERT( get_itbl(bco)->type == BCO);
331 fprintf(stderr,"%s%d:\t",prefix,pc);
332 pc = disInstr(bco,pc);
333 fprintf(stderr,"\n");
337 #endif /* INTERPRETER */