* Merged gc7-branch to default.
[cacao.git] / src / vm / global.h
1 /* src/vm/global.h - global definitions
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 _GLOBAL_H
27 #define _GLOBAL_H
28
29 #include "config.h"
30
31 #include <stdint.h>
32
33 #include "vm/types.h"
34
35
36 /* additional data types ******************************************************/
37
38 typedef void *voidptr;                  /* generic pointer                    */
39 typedef void (*functionptr) (void);     /* generic function pointer           */
40 typedef u1* methodptr;
41
42 typedef unsigned int bool;              /* boolean data type                  */
43
44 #define true         1
45 #define false        0
46
47 #if defined(ENABLE_SSA)
48 /* immediate to get an addidional target Local Var Index */
49 /* for IINC in Combination with SSA */
50 struct imm {
51         s4 i;
52         s4 op1_t;
53 };
54 #endif
55
56 /* immediate data union */
57
58 typedef union {
59         s4          i;
60         s8          l;
61         float       f;
62         double      d;
63         void       *a;
64         functionptr fp;
65         u1          b[8];
66 #if defined(ENABLE_SSA)
67         struct imm  _i;
68 #endif
69 } imm_union;
70
71
72 /* alignment macros ***********************************************************/
73
74 #define ALIGN_EVEN(a)                   ((a) = (((a) + 1) & ~1))
75 #define ALIGN_ODD(a)                    ((a) =   (a) | 1       )
76
77 #define ALIGN_2(a)                      ALIGN_EVEN(a)
78
79
80 /* printf format defines ******************************************************/
81
82 /* Define printf formats which change size between 32- and 64-bit. */
83
84 #if SIZEOF_VOID_P == 8
85 # define PRINTF_FORMAT_INT64_T    "%ld"
86 #else
87 # define PRINTF_FORMAT_INT64_T    "%lld"
88 #endif
89
90
91 /* convenience macros *********************************************************/
92
93 /* Makes a string of the argument (which is not macro-expanded). */
94
95 #define STR(a)  #a
96
97
98 /* forward typedefs ***********************************************************/
99
100 typedef struct java_object_t java_object_t; 
101 typedef struct java_objectarray_t java_objectarray_t;
102
103
104 #define MAX_ALIGN 8             /* most generic alignment for JavaVM values   */
105
106
107 /* basic data types ***********************************************************/
108
109 /* The JavaVM types must numbered in the same order as the ICMD_Ixxx
110    to ICMD_Axxx instructions (LOAD and STORE).  All other types can be
111    numbered arbitrarily. */
112
113 #define TYPE_INT     0
114 #define TYPE_LNG     1
115 #define TYPE_FLT     2
116 #define TYPE_DBL     3
117 #define TYPE_ADR     4
118
119 #define TYPE_RET     8   /* must not share bits with TYPE_FLT or TYPE_LNG */
120
121 #define TYPE_VOID    10
122
123
124 #define IS_INT_LNG_TYPE(a)      (!((a) & TYPE_FLT))
125 #define IS_FLT_DBL_TYPE(a)      ((a) & TYPE_FLT)
126 #define IS_2_WORD_TYPE(a)       ((a) & TYPE_LNG)
127
128 #define IS_INT_TYPE(a)          ((a) == TYPE_INT)
129 #define IS_LNG_TYPE(a)          ((a) == TYPE_LNG)
130 #define IS_FLT_TYPE(a)          ((a) == TYPE_FLT)
131 #define IS_DBL_TYPE(a)          ((a) == TYPE_DBL)
132 #define IS_ADR_TYPE(a)          ((a) == TYPE_ADR)
133
134 #define IS_VOID_TYPE(a)         ((a) == TYPE_VOID)
135
136
137 /* some Java related defines **************************************************/
138
139 #define JAVA_VERSION    "1.5.0"         /* this version is supported by CACAO */
140 #define CLASS_VERSION   "50.0"
141
142
143 /* Java class file constants **************************************************/
144
145 #define MAGIC             0xCAFEBABE
146 #define MAJOR_VERSION     50
147 #define MINOR_VERSION     0
148
149
150 /* Constant pool tags *********************************************************/
151
152 #define CONSTANT_Class                 7
153 #define CONSTANT_Fieldref              9
154 #define CONSTANT_Methodref            10
155 #define CONSTANT_InterfaceMethodref   11
156 #define CONSTANT_String                8
157 #define CONSTANT_Integer               3
158 #define CONSTANT_Float                 4
159 #define CONSTANT_Long                  5
160 #define CONSTANT_Double                6
161 #define CONSTANT_NameAndType          12
162 #define CONSTANT_Utf8                  1
163
164 #define CONSTANT_UNUSED                0
165
166
167 /* Class/Field/Method access and property flags *******************************/
168
169 #define ACC_UNDEF               -1      /* used internally                    */
170 #define ACC_NONE                 0      /* used internally                    */
171
172 #define ACC_PUBLIC          0x0001
173 #define ACC_PRIVATE         0x0002
174 #define ACC_PROTECTED       0x0004
175 #define ACC_STATIC          0x0008
176 #define ACC_FINAL           0x0010
177 #define ACC_SUPER           0x0020
178 #define ACC_SYNCHRONIZED    0x0020
179 #define ACC_VOLATILE        0x0040
180 #define ACC_BRIDGE          0x0040
181 #define ACC_TRANSIENT       0x0080
182 #define ACC_VARARGS         0x0080
183 #define ACC_NATIVE          0x0100
184 #define ACC_INTERFACE       0x0200
185 #define ACC_ABSTRACT        0x0400
186 #define ACC_STRICT          0x0800
187 #define ACC_SYNTHETIC       0x1000
188 #define ACC_ANNOTATION      0x2000
189 #define ACC_ENUM            0x4000
190 #define ACC_MIRANDA         0x8000
191
192 /* special flags used in classinfo ********************************************/
193
194 #define ACC_CLASS_REFLECT_MASK      0x0000ffff/* flags reported by reflection */
195
196 #define ACC_CLASS_PRIMITIVE         0x00010000
197 #define ACC_CLASS_MEMBER            0x00020000
198 #define ACC_CLASS_ANONYMOUS         0x00040000
199
200 #define ACC_CLASS_HAS_POINTERS      0x00080000/* instance contains pointers   */
201
202 #define ACC_CLASS_REFERENCE_MASK    0x00700000
203 #define ACC_CLASS_REFERENCE_SOFT    0x00100000
204 #define ACC_CLASS_REFERENCE_WEAK    0x00200000
205 #define ACC_CLASS_REFERENCE_PHANTOM 0x00400000
206
207
208 /* special flags used in methodinfo *******************************************/
209
210 #define ACC_METHOD_BUILTIN     0x00010000     /* use for descriptor parsing   */
211 #define ACC_METHOD_IMPLEMENTED 0x00020000     /* there is an implementation   */
212 #define ACC_METHOD_MONOMORPHIC 0x00040000     /* currently monomorphic method */
213 #define ACC_METHOD_EA          0x00080000     /* method being escape analyzed */
214
215
216 /* data structures of the runtime system **************************************/
217
218 /* java_object_t ***************************************************************
219
220    All objects (and arrays) which resides on the heap need the
221    following header at the beginning of the data structure.
222
223    TODO: Include detailed description from the Wiki (ObjectHeader) here.
224
225 *******************************************************************************/
226
227 #define HDRFLAG_MARK1         0x02
228 #define HDRFLAG_MARK2         0x04
229 #define HDRFLAG_UNCOLLECTABLE 0x08
230 #define HDRFLAG_HASH_TAKEN    0x10
231 #define HDRFLAG_HASH_ATTACHED 0x20
232 #define HDRFLAG_REFERENCING   0x40
233
234 struct java_object_t {                 /* header for all objects              */
235         struct _vftbl *vftbl;              /* pointer to virtual function table   */
236 #if defined(ENABLE_THREADS)
237         uintptr_t      lockword;
238 #endif
239 #if defined(ENABLE_GC_CACAO)
240         uintptr_t      hdrflags;           /* word containing the GC bits         */
241 #endif
242 };
243
244
245 /* arrays **********************************************************************
246
247         All arrays are objects (they need the object header with a pointer
248         to a vftbl (array class table). There is one class for each array
249         type. The array type is described by an arraydescriptor struct
250         which is referenced by the vftbl.
251 */
252
253 typedef struct java_array_t {           /* header for all arrays              */
254         java_object_t objheader;            /* object header                      */
255         s4 size;                            /* array size                         */
256 } java_array_t;
257
258
259
260 /* structs for all kinds of arrays ********************************************/
261
262 /*  booleanarray and bytearray need identical memory layout (access methods
263     use the same machine code */
264
265 typedef struct java_booleanarray_t {
266         java_array_t header;
267         u1 data[1];
268 } java_booleanarray_t;
269
270 typedef struct java_bytearray_t {
271         java_array_t header;
272         s1 data[1];
273 } java_bytearray_t;
274
275 typedef struct java_chararray_t {
276         java_array_t header;
277         u2 data[1];
278 } java_chararray_t;
279
280 typedef struct java_shortarray_t {
281         java_array_t header;
282         s2 data[1];
283 } java_shortarray_t;
284
285 typedef struct java_intarray_t {
286         java_array_t header;
287         s4 data[1];
288 } java_intarray_t;
289
290 typedef struct java_longarray_t {
291         java_array_t header;
292         s8 data[1];
293 } java_longarray_t;
294
295 typedef struct java_floatarray_t {
296         java_array_t header;
297         float data[1];
298 } java_floatarray_t;
299
300 typedef struct java_doublearray_t {
301         java_array_t header;
302         double data[1];
303 } java_doublearray_t;
304
305 /*  objectarray and arrayarray need identical memory layout (access methods
306     use the same machine code */
307
308 struct java_objectarray_t {
309         java_array_t   header;
310         java_object_t *data[1];
311 };
312
313
314 /* java_handle_t ***************************************************************
315
316    TODO: document me!
317
318 *******************************************************************************/
319
320 #if defined(ENABLE_HANDLES)
321 typedef struct java_handle_t {
322         java_object_t *heap_object;
323 } java_handle_t;
324
325 typedef struct java_handle_objectarray_t  { java_objectarray_t  *heap_object; } java_handle_objectarray_t;
326 typedef struct java_handle_booleanarray_t { java_booleanarray_t *heap_object; } java_handle_booleanarray_t;
327 typedef struct java_handle_bytearray_t    { java_bytearray_t    *heap_object; } java_handle_bytearray_t;
328 typedef struct java_handle_chararray_t    { java_chararray_t    *heap_object; } java_handle_chararray_t;
329 typedef struct java_handle_shortarray_t   { java_shortarray_t   *heap_object; } java_handle_shortarray_t;
330 typedef struct java_handle_intarray_t     { java_intarray_t     *heap_object; } java_handle_intarray_t;
331 typedef struct java_handle_longarray_t    { java_longarray_t    *heap_object; } java_handle_longarray_t;
332 typedef struct java_handle_floatarray_t   { java_floatarray_t   *heap_object; } java_handle_floatarray_t;
333 typedef struct java_handle_doublearray_t  { java_doublearray_t  *heap_object; } java_handle_doublearray_t;
334 #else
335 typedef java_object_t       java_handle_t;
336 typedef java_objectarray_t  java_handle_objectarray_t;
337 typedef java_booleanarray_t java_handle_booleanarray_t;
338 typedef java_bytearray_t    java_handle_bytearray_t;
339 typedef java_chararray_t    java_handle_chararray_t;
340 typedef java_shortarray_t   java_handle_shortarray_t;
341 typedef java_intarray_t     java_handle_intarray_t;
342 typedef java_longarray_t    java_handle_longarray_t;
343 typedef java_floatarray_t   java_handle_floatarray_t;
344 typedef java_doublearray_t  java_handle_doublearray_t;
345 #endif
346
347
348 /* global constants related to the verifier ***********************************/
349
350 /* The verifier needs additional variables in the variable array. Since these */
351 /* must be reserved and set by parse.c and stack.c, we define these numbers   */
352 /* here to avoid mysterious hard-coded constants.                             */
353 /* stack.c needs an extra variable if the verifier is disabled.               */
354
355 #if defined(ENABLE_VERIFIER)
356 #    define VERIFIER_EXTRA_LOCALS  1
357 #    define VERIFIER_EXTRA_VARS    1
358 #    define STACK_EXTRA_VARS       0
359 #else
360 #    define VERIFIER_EXTRA_LOCALS  0
361 #    define VERIFIER_EXTRA_VARS    0
362 #    define STACK_EXTRA_VARS       1
363 #endif
364
365 #endif /* _GLOBAL_H */
366
367
368 /*
369  * These are local overrides for various environment variables in Emacs.
370  * Please do not remove this and leave it at the end of the file, where
371  * Emacs will automagically detect them.
372  * ---------------------------------------------------------------------
373  * Local variables:
374  * mode: c
375  * indent-tabs-mode: t
376  * c-basic-offset: 4
377  * tab-width: 4
378  * End:
379  * vim:noexpandtab:sw=4:ts=4:
380  */