CACAO
disass.cpp
Go to the documentation of this file.
1 /* src/vm/jit/intrp/disass.c - disassembler wrapper for interpreter
2 
3  Copyright (C) 1996-2005, 2006, 2008
4  CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
5 
6  This file is part of CACAO.
7 
8  This program is free software; you can redistribute it and/or
9  modify it under the terms of the GNU General Public License as
10  published by the Free Software Foundation; either version 2, or (at
11  your option) any later version.
12 
13  This program is distributed in the hope that it will be useful, but
14  WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  General Public License for more details.
17 
18  You should have received a copy of the GNU General Public License
19  along with this program; if not, write to the Free Software
20  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21  02110-1301, USA.
22 
23 */
24 
25 
26 #include "config.h"
27 
28 #include <stdio.h>
29 
30 #include "vm/types.hpp"
31 
32 #include "vm/jit/intrp/intrp.h"
33 
34 
35 /* function disassinstr ********************************************************
36 
37  outputs a disassembler listing of one machine code instruction on 'stdout'
38  c: instructions machine code
39 
40 *******************************************************************************/
41 
43 {
44  FILE *savedout;
45  u1 *r;
46 
47  savedout = vm_out;
48  vm_out = stdout;
49  r = (u1 *) vm_disassemble_inst((Inst *) code, vm_prim);
50  vm_out = savedout;
51 
52  return r;
53 }
54 
55 
56 /* function disassemble ********************************************************
57 
58  outputs a disassembler listing of some machine code on 'stdout'
59  code: pointer to first instruction
60  len: code size (number of instructions * 4)
61 
62 *******************************************************************************/
63 
64 void intrp_disassemble(u1 *start, u1 *end)
65 {
66  FILE *savedout;
67 
68  printf(" --- disassembler listing ---\n");
69  savedout = vm_out;
70  vm_out = stdout;
71  vm_disassemble((Inst *) start, (Inst *) end, vm_prim);
72  vm_out = savedout;
73 }
74 
75 
76 void printarg_ui (u4 ui )
77 {
78  fprintf(vm_out, "%ud", ui);
79 }
80 
81 void printarg_v (Cell v )
82 {
83  fprintf(vm_out, "%lld", (long long)v);
84 }
85 
87 {
88  fprintf(vm_out, "%lld", (long long)x);
89 }
90 
91 
92 void printarg_b (s4 b )
93 {
94  fprintf(vm_out, "%d", b);
95 }
96 
97 void printarg_s (s4 s )
98 {
99  fprintf(vm_out, "%d", s);
100 }
101 
102 void printarg_i (s4 i )
103 {
104  fprintf(vm_out, "%d", i);
105 }
106 
107 void printarg_l (s8 l )
108 {
109  fprintf(vm_out, "%lld", (long long)l);
110 }
111 
112 void printarg_f (float f )
113 {
114  fprintf(vm_out, "%f", (double)f);
115 }
116 
117 void printarg_d (double d )
118 {
119  fprintf(vm_out, "%f", d);
120 }
121 
122 void printarg_aRef (java_objectheader *aRef )
123 {
124  fprintf(vm_out, "obj: %p", (void *)aRef);
125 }
126 
127 void printarg_aArray (java_arrayheader * aArray )
128 {
129  fprintf(vm_out, "array %p", (void *)aArray);
130 }
131 
132 void printarg_aaTarget(Inst ** aaTarget)
133 {
134  if (aaTarget) {
135  methodinfo *m=((methodinfo **)aaTarget)[3];
136  printarg_am(m);
137  } else
138  fprintf(vm_out, "NULL");
139 }
140 
141 void printarg_aClass (classinfo * aClass )
142 {
143  if (aClass)
145  else
146  fprintf(vm_out, "NULL");
147 }
148 
150 {
151  fprintf(vm_out, "cr: %p", (void *)acr);
152 }
153 
154 void printarg_addr (u1 * addr )
155 {
156  fprintf(vm_out, "%p", (void *)addr);
157 }
158 
160 {
161  fprintf(vm_out, "f: %p", (void *)af);
162 }
163 
164 void printarg_afi (fieldinfo * afi )
165 {
166  if (afi) {
168  fprintf(vm_out, ".");
171  } else
172  fprintf(vm_out, "fi=NULL");
173 }
174 
176 {
177  if (am) {
179  fprintf(vm_out, ".");
182  } else
183  fprintf(vm_out, "m=NULL");
184 }
185 
186 void printarg_acell (Cell * acell )
187 {
188  fprintf(vm_out, "%p", (void *)acell);
189 }
190 
191 void printarg_ainst (Inst * ainst )
192 {
193  fprintf(vm_out, "%p", (void *)ainst);
194 }
195 
197 {
198  if (auf) {
200  fprintf(vm_out, " (type ");
202  fprintf(vm_out, ")");
203  } else
204  fprintf(vm_out, "NULL");
205 }
206 
208 {
209  if (aum) {
211  fprintf(vm_out, ".");
214  } else
215  fprintf(vm_out, "NULL");
216 }
217 
218 void printarg_avftbl (vftbl_t * avftbl )
219 {
220  if (avftbl) {
221  fprintf(vm_out, "vftbl: ");
222  utf_fprint_printable_ascii_classname(vm_out, avftbl->class->name);
223  } else
224  fprintf(vm_out, "NULL");
225 }
226 
227 
228 /*
229  * These are local overrides for various environment variables in Emacs.
230  * Please do not remove this and leave it at the end of the file, where
231  * Emacs will automagically detect them.
232  * ---------------------------------------------------------------------
233  * Local variables:
234  * mode: c++
235  * indent-tabs-mode: t
236  * c-basic-offset: 4
237  * tab-width: 4
238  * End:
239  * vim:noexpandtab:sw=4:ts=4:
240  */
Utf8String name
Definition: method.hpp:71
void printarg_acr(constant_classref *acr)
Definition: disass.cpp:149
Utf8String name
Definition: field.hpp:61
void printarg_aClass(classinfo *aClass)
Definition: disass.cpp:141
void printarg_aaTarget(Inst **aaTarget)
Definition: disass.cpp:132
s8 Cell
Definition: intrp.h:42
Inst * vm_prim
Definition: md.c:48
void printarg_aArray(java_arrayheader *aArray)
Definition: disass.cpp:127
void printarg_avftbl(vftbl_t *avftbl)
Definition: disass.cpp:218
void printarg_f(float f)
Definition: disass.cpp:112
void printarg_s(s4 s)
Definition: disass.cpp:97
void utf_fprint_printable_ascii_classname(FILE *file, Utf8String u)
Definition: utf8.cpp:665
uint8_t u1
Definition: types.hpp:40
void printarg_d(double d)
Definition: disass.cpp:117
void printarg_ui(u4 ui)
Definition: disass.cpp:76
int64_t s8
Definition: types.hpp:48
const Utf8String name
Definition: references.hpp:103
void(* functionptr)(void)
Definition: global.hpp:39
void printarg_addr(u1 *addr)
Definition: disass.cpp:154
Utf8String descriptor
Definition: field.hpp:62
Utf8String descriptor
Definition: method.hpp:72
void printarg_acell(Cell *acell)
Definition: disass.cpp:186
void * Inst
Definition: intrp.h:58
constant_FMIref * fieldref
Definition: resolve.hpp:88
classinfo * clazz
Definition: method.hpp:80
void printarg_aum(unresolved_method *aum)
Definition: disass.cpp:207
Utf8String name
Definition: class.hpp:91
void printarg_auf(unresolved_field *auf)
Definition: disass.cpp:196
void printarg_af(functionptr af)
Definition: disass.cpp:159
void printarg_l(s8 l)
Definition: disass.cpp:107
MIIterator i
int32_t s4
Definition: types.hpp:45
classinfo * clazz
Definition: field.hpp:55
const Utf8String descriptor
Definition: references.hpp:104
void printarg_v(Cell v)
Definition: disass.cpp:81
void printarg_ainst(Inst *ainst)
Definition: disass.cpp:191
void printarg_i(s4 i)
Definition: disass.cpp:102
void utf_fprint_printable_ascii(FILE *file, Utf8String u)
Definition: utf8.cpp:650
uint32_t u4
Definition: types.hpp:46
u1 * intrp_disassinstr(u1 *code)
Definition: disass.cpp:42
#define METHODREF_CLASSNAME(fmiref)
Definition: references.hpp:198
void intrp_disassemble(u1 *start, u1 *end)
Definition: disass.cpp:64
constant_FMIref * methodref
Definition: resolve.hpp:97
Inst * vm_disassemble_inst(Inst *ip, Inst vm_prim[])
Definition: disasm.c:49
void printarg_Cell(Cell x)
Definition: disass.cpp:86
void printarg_am(methodinfo *am)
Definition: disass.cpp:175
void vm_disassemble(Inst *ip, Inst *endp, Inst vm_prim[])
Definition: disasm.c:64
void printarg_afi(fieldinfo *afi)
Definition: disass.cpp:164
FILE * vm_out
Definition: md.c:49
void printarg_b(s4 b)
Definition: disass.cpp:92
#define printf(...)
Definition: ssa2.cpp:40
void printarg_aRef(java_objectheader *aRef)
Definition: disass.cpp:122