CACAO
intrp.h
Go to the documentation of this file.
1 /* src/vm/jit/intrp/intrp.h - definitions for Interpreter
2 
3  Copyright (C) 1996-2005, 2006, 2007, 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 #ifndef _INTRP_H
27 #define _INTRP_H
28 
29 /* #define VM_PROFILING */
30 
31 #include "config.h"
32 
33 #include <stdio.h>
34 
35 #include "vm/types.hpp"
36 
37 #include "arch.hpp"
38 
39 /* we need Cell in some headers below */
40 
41 #if SIZEOF_VOID_P == 8
42 typedef s8 Cell;
43 #else
44 typedef s4 Cell;
45 #endif
46 
47 #include "vm/class.hpp"
48 #include "vm/global.hpp"
49 #include "vm/linker.hpp"
50 #include "vm/method.hpp"
51 #include "vm/references.hpp"
52 #include "vm/resolve.hpp"
53 
55 
56 
57 typedef void *Label;
58 typedef void *Inst;
59 
60 #if 1
61 #define MAYBE_UNUSED __attribute__((unused))
62 #else
63 #define MAYBE_UNUSED
64 #endif
65 
66 #if SIZEOF_VOID_P == 4
67 
68 typedef union {
69  struct {
70  u4 low;
71  s4 high;
72  } cells;
73  s8 l;
74  double d;
75 } Double_Store;
76 
77 #define FETCH_DCELL_T(d_,lo,hi,t_) ({ \
78  Double_Store _d; \
79  _d.cells.low = (lo); \
80  _d.cells.high = (hi); \
81  (d_) = _d.t_; \
82  })
83 
84 #define STORE_DCELL_T(d_,lo,hi,t_) ({ \
85  Double_Store _d; \
86  _d.t_ = (d_); \
87  (lo) = _d.cells.low; \
88  (hi) = _d.cells.high; \
89  })
90 
91 #else /* SIZEOF_VOID_P == 4 */
92 
93 typedef union {
95  s8 l;
96  double d;
97 } Double_Store;
98 
99 
100 #define FETCH_DCELL_T(d_,lo,hi,t_) ({ (d_) = ((Double_Store)(lo)).t_; })
101 #define STORE_DCELL_T(d_,lo,hi,t_) ({ (lo) = ((Double_Store)(d_)).low; })
102 
103 #endif /* SIZEOF_VOID_P == 4 */
104 
105 
106 #if defined(ENABLE_THREADS)
107 
108 #define global_sp (THREADOBJECT->_global_sp)
109 
110 #else /* defined(ENABLE_THREADS) */
111 
112 #define MAX_STACK_SIZE 128*1024
113 static char stack[MAX_STACK_SIZE];
114 
115 static Cell *_global_sp = (Cell *)(stack+MAX_STACK_SIZE);
116 #define global_sp _global_sp
117 
118 #endif /* defined(ENABLE_THREADS) */
119 
120 #define CLEAR_global_sp (global_sp=NULL)
121 
122 
123 #define vm_twoCell2l(hi,lo,d_) FETCH_DCELL_T(d_,lo,hi,l);
124 #define vm_twoCell2d(hi,lo,d_) FETCH_DCELL_T(d_,lo,hi,d);
125 
126 #define vm_l2twoCell(d_,hi,lo) STORE_DCELL_T(d_,lo,hi,l);
127 #define vm_d2twoCell(d_,hi,lo) STORE_DCELL_T(d_,lo,hi,d);
128 
129 #define vm_Cell2v(cell, v) ((v)=(Cell)(cell))
130 #define vm_Cell2b(cell, b) ((b)=(u1)(Cell)(cell))
131 #define vm_Cell2i(cell, i) ((i)=(s4)(Cell)(cell))
132 
133 #define vm_Cell2aRef(x1,x2) ((x2) = (java_objectheader *)(x1))
134 #define vm_Cell2aArray(x1,x2) ((x2) = (java_arrayheader * )(x1))
135 #define vm_Cell2aaTarget(x1,x2) ((x2) = (Inst ** )(x1))
136 #define vm_Cell2aClass(x1,x2) ((x2) = (classinfo * )(x1))
137 #define vm_Cell2acr(x1,x2) ((x2) = (constant_classref *)(x1))
138 #define vm_Cell2addr(x1,x2) ((x2) = (u1 * )(x1))
139 #define vm_Cell2af(x1,x2) ((x2) = (functionptr )(x1))
140 #define vm_Cell2afi(x1,x2) ((x2) = (fieldinfo * )(x1))
141 #define vm_Cell2am(x1,x2) ((x2) = (methodinfo * )(x1))
142 #define vm_Cell2acell(x1,x2) ((x2) = (Cell * )(x1))
143 #define vm_Cell2ainst(x1,x2) ((x2) = (Inst * )(x1))
144 #define vm_Cell2auf(x1,x2) ((x2) = (unresolved_field * )(x1))
145 #define vm_Cell2aum(x1,x2) ((x2) = (unresolved_method *)(x1))
146 #define vm_Cell2avftbl(x1,x2) ((x2) = (vftbl_t * )(x1))
147 
148 #define vm_ui2Cell(x1,x2) ((x2) = (Cell)(x1))
149 #define vm_v2Cell(x1,x2) ((x2) = (Cell)(x1))
150 #define vm_b2Cell(x1,x2) ((x2) = (Cell)(x1))
151 #define vm_s2Cell(x1,x2) ((x2) = (Cell)(x1))
152 #define vm_i2Cell(x1,x2) ((x2) = (Cell)(x1))
153 #define vm_aRef2Cell(x1,x2) ((x2) = (Cell)(x1))
154 #define vm_aArray2Cell(x1,x2) ((x2) = (Cell)(x1))
155 #define vm_aaTarget2Cell(x1,x2) ((x2) = (Cell)(x1))
156 #define vm_aClass2Cell(x1,x2) ((x2) = (Cell)(x1))
157 #define vm_acr2Cell(x1,x2) ((x2) = (Cell)(x1))
158 #define vm_addr2Cell(x1,x2) ((x2) = (Cell)(x1))
159 #define vm_af2Cell(x1,x2) ((x2) = (Cell)(x1))
160 #define vm_afi2Cell(x1,x2) ((x2) = (Cell)(x1))
161 #define vm_am2Cell(x1,x2) ((x2) = (Cell)(x1))
162 #define vm_acell2Cell(x1,x2) ((x2) = (Cell)(x1))
163 #define vm_ainst2Cell(x1,x2) ((x2) = (Cell)(x1))
164 #define vm_auf2Cell(x1,x2) ((x2) = (Cell)(x1))
165 #define vm_aum2Cell(x1,x2) ((x2) = (Cell)(x1))
166 #define vm_avftbl2Cell(x1,x2) ((x2) = (Cell)(x1))
167 
168 #define vm_Cell2Cell(x1,x2) ((x2)=(Cell)(x1))
169 
170 #define IMM_ARG(access,value) (access)
171 
172 /* for disassembler and tracer */
173 #define VM_IS_INST(inst, n) ((inst) == vm_prim[n])
174 
175 
176 #define gen_BBSTART (cd->lastmcodeptr = NULL, append_dispatch(cd))
177 #define gen_BBEND (finish_ss(cd))
178 
179 
180 union Cell_float {
182  float f;
183 };
184 
185 
186 #define access_local_int(_offset) \
187  ( *(Cell*)(((u1 *)fp) + (_offset)) )
188 
189 #define access_local_ref(_offset) \
190  ( *(void **)(((u1 *)fp) + (_offset)) )
191 
192 #define access_local_cell(_offset) \
193  ( *(Cell *)(((u1 *)fp) + (_offset)) )
194 
195 
196 typedef struct block_count block_count;
197 
198 #define vm_f2Cell(x1,x2) ((x2) =(((union Cell_float)(x1)).cell))
199 #define vm_Cell2f(x1,x2) ((x2) =(((union Cell_float)(x1)).f))
200 
201 extern Inst *vm_prim;
202 extern Cell peeptable;
203 extern FILE *vm_out;
204 
205 /* defined in peephole.c: */
206 void init_peeptable(void);
207 ptrint peephole_opt(ptrint inst1, ptrint inst2, Cell peeptable);
208 
209 /* defined in engine.c: */
210 java_objectheader *engine(Inst *ip0, Cell * sp, Cell * fp);
211 
212 /* defined in disass.c: */
213 void vm_disassemble(Inst *ip, Inst *endp, Inst vm_prim[]);
214 Inst *vm_disassemble_inst(Inst *ip, Inst vm_prim[]);
215 
216 /* print types for disassembler and tracer */
217 void printarg_ui (u4 ui );
218 void printarg_v (Cell v );
219 void printarg_b (s4 b );
220 void printarg_s (s4 s );
221 void printarg_i (s4 i );
222 void printarg_l (s8 l );
223 void printarg_f (float f );
224 void printarg_d (double d );
225 void printarg_aRef (java_objectheader *aRef );
226 void printarg_aArray (java_arrayheader * aArray );
227 void printarg_aaTarget(Inst ** aaTarget);
228 void printarg_aClass (classinfo * aClass );
229 void printarg_acr (constant_classref *acr );
230 void printarg_addr (u1 * addr );
231 void printarg_af (functionptr af );
232 void printarg_afi (fieldinfo * afi );
233 void printarg_am (methodinfo * am );
234 void printarg_acell (Cell * acell );
235 void printarg_ainst (Inst * ainst );
236 void printarg_auf (unresolved_field * auf );
237 void printarg_aum (unresolved_method *aum );
238 void printarg_avftbl (vftbl_t * avftbl );
239 void printarg_Cell (Cell x );
240 
241 /* defined in profile.c: */
242 void vm_uncount_block(Inst *ip);
244 
245 /* defined in codegen.c: */
246 Cell *nativecall(functionptr f, methodinfo *m, Cell *sp, Inst *ra, Cell *fp, u1 *addrcif);
248 
249 /* defined in asmpart.c: */
250 Inst *intrp_asm_handle_exception(Inst *ip, java_objectheader *o, Cell *fp, Cell **new_spp, Cell **new_fpp);
251 
252 /* defined in dynamic-super.c: */
253 void gen_inst(codegendata *cd, ptrint instr);
254 void append_dispatch(codegendata *cd);
255 void finish_ss(codegendata *cd);
256 void patchersuper_rewrite(Inst *p);
257 void dynamic_super_init(void);
259 
260 #endif /* _INTRP_H */
261 
262 
263 /*
264  * These are local overrides for various environment variables in Emacs.
265  * Please do not remove this and leave it at the end of the file, where
266  * Emacs will automagically detect them.
267  * ---------------------------------------------------------------------
268  * Local variables:
269  * mode: c
270  * indent-tabs-mode: t
271  * c-basic-offset: 4
272  * tab-width: 4
273  * End:
274  * vim:noexpandtab:sw=4:ts=4:
275  */
void printarg_acr(constant_classref *acr)
Definition: disass.cpp:149
#define ra
Definition: md-asm.hpp:62
Cell * nativecall(functionptr f, methodinfo *m, Cell *sp, Inst *ra, Cell *fp, u1 *addrcif)
Definition: codegen.c:2042
void printarg_aClass(classinfo *aClass)
Definition: disass.cpp:141
void printarg_aaTarget(Inst **aaTarget)
Definition: disass.cpp:132
float f
Definition: intrp.h:182
s8 Cell
Definition: intrp.h:42
void dynamic_super_rewrite(codegendata *cd)
Inst * vm_prim
Definition: md.c:48
void finish_ss(codegendata *cd)
void printarg_aArray(java_arrayheader *aArray)
Definition: disass.cpp:127
double d
Definition: intrp.h:96
#define ip0
Definition: md-asm.hpp:60
void printarg_avftbl(vftbl_t *avftbl)
Definition: disass.cpp:218
void printarg_f(float f)
Definition: disass.cpp:112
void patchersuper_rewrite(Inst *p)
void printarg_s(s4 s)
Definition: disass.cpp:97
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
void gen_inst(codegendata *cd, ptrint instr)
int64_t s8
Definition: types.hpp:48
void init_peeptable(void)
Definition: peephole.c:82
block_count * vm_block_insert(Inst *ip)
Definition: profile.c:60
void(* functionptr)(void)
Definition: global.hpp:39
void printarg_addr(u1 *addr)
Definition: disass.cpp:154
#define vm_uncount_block(_ip)
Definition: engine.c:115
void printarg_acell(Cell *acell)
Definition: disass.cpp:186
void * Inst
Definition: intrp.h:58
void printarg_aum(unresolved_method *aum)
Definition: disass.cpp:207
alloc::list< PassInfo::IDTy >::type & stack
void printarg_auf(unresolved_field *auf)
Definition: disass.cpp:196
void printarg_af(functionptr af)
Definition: disass.cpp:159
Cell cell
Definition: intrp.h:181
void printarg_l(s8 l)
Definition: disass.cpp:107
MIIterator i
void * Label
Definition: intrp.h:57
int32_t s4
Definition: types.hpp:45
Inst * intrp_asm_handle_exception(Inst *ip, java_objectheader *o, Cell *fp, Cell **new_spp, Cell **new_fpp)
Definition: asmpart.c:171
ptrint peephole_opt(ptrint inst1, ptrint inst2, Cell peeptable)
Definition: peephole.c:87
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
uint32_t u4
Definition: types.hpp:46
#define sp
Definition: md-asm.hpp:81
Inst * vm_disassemble_inst(Inst *ip, Inst vm_prim[])
Definition: disasm.c:49
void printarg_Cell(Cell x)
Definition: disass.cpp:86
void append_dispatch(codegendata *cd)
s8 low
Definition: intrp.h:94
#define engine
Definition: engine2.c:34
u1 * createcalljavafunction(methodinfo *m)
Definition: codegen.c:2196
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
uintptr_t ptrint
Definition: types.hpp:54
void dynamic_super_init(void)
#define fp
Definition: md-asm.hpp:79
#define ip
Definition: md-asm.hpp:59
void printarg_aRef(java_objectheader *aRef)
Definition: disass.cpp:122
Cell peeptable
Definition: peephole.c:57