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