1 /* src/vm/global.h - global definitions
3 Copyright (C) 1996-2005, 2006, 2007, 2008
4 CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
6 This file is part of CACAO.
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.
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.
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
37 /* additional data types ******************************************************/
39 typedef void (*functionptr) (void); /* generic function pointer */
40 typedef u1* methodptr;
42 #if defined(ENABLE_SSA)
43 /* immediate to get an addidional target Local Var Index */
44 /* for IINC in Combination with SSA */
51 /* immediate data union */
61 #if defined(ENABLE_SSA)
67 /* alignment macros ***********************************************************/
69 #define ALIGN_EVEN(a) ((a) = (((a) + 1) & ~1))
70 #define ALIGN_ODD(a) ((a) = (a) | 1 )
72 #define ALIGN_2(a) ALIGN_EVEN(a)
75 /* printf format defines ******************************************************/
77 /* Define printf formats which change size between 32- and 64-bit. */
79 #if SIZEOF_VOID_P == 8
80 # define PRINTF_FORMAT_INT64_T "%ld"
82 # define PRINTF_FORMAT_INT64_T "%lld"
86 /* convenience macros *********************************************************/
88 /* Makes a string of the argument (which is not macro-expanded). */
93 /* forward typedefs ***********************************************************/
95 typedef struct java_object_t java_object_t;
96 typedef struct java_objectarray_t java_objectarray_t;
99 #define MAX_ALIGN 8 /* most generic alignment for JavaVM values */
102 /* basic data types ***********************************************************/
104 /* The JavaVM types must numbered in the same order as the ICMD_Ixxx
105 to ICMD_Axxx instructions (LOAD and STORE). All other types can be
106 numbered arbitrarily. */
114 #define TYPE_RET 8 /* must not share bits with TYPE_FLT or TYPE_LNG */
119 #define IS_INT_LNG_TYPE(a) (!((a) & TYPE_FLT))
120 #define IS_FLT_DBL_TYPE(a) ((a) & TYPE_FLT)
121 #define IS_2_WORD_TYPE(a) ((a) & TYPE_LNG)
123 #define IS_INT_TYPE(a) ((a) == TYPE_INT)
124 #define IS_LNG_TYPE(a) ((a) == TYPE_LNG)
125 #define IS_FLT_TYPE(a) ((a) == TYPE_FLT)
126 #define IS_DBL_TYPE(a) ((a) == TYPE_DBL)
127 #define IS_ADR_TYPE(a) ((a) == TYPE_ADR)
129 #define IS_VOID_TYPE(a) ((a) == TYPE_VOID)
132 /* some Java related defines **************************************************/
134 #define JAVA_VERSION "1.5.0" /* this version is supported by CACAO */
135 #define CLASS_VERSION "50.0"
138 /* Java class file constants **************************************************/
140 #define MAGIC 0xCAFEBABE
141 #define MAJOR_VERSION 50
142 #define MINOR_VERSION 0
145 /* Constant pool tags *********************************************************/
147 #define CONSTANT_Class 7
148 #define CONSTANT_Fieldref 9
149 #define CONSTANT_Methodref 10
150 #define CONSTANT_InterfaceMethodref 11
151 #define CONSTANT_String 8
152 #define CONSTANT_Integer 3
153 #define CONSTANT_Float 4
154 #define CONSTANT_Long 5
155 #define CONSTANT_Double 6
156 #define CONSTANT_NameAndType 12
157 #define CONSTANT_Utf8 1
159 #define CONSTANT_UNUSED 0
162 /* Class/Field/Method access and property flags *******************************/
164 #define ACC_UNDEF -1 /* used internally */
165 #define ACC_NONE 0 /* used internally */
167 #define ACC_PUBLIC 0x0001
168 #define ACC_PRIVATE 0x0002
169 #define ACC_PROTECTED 0x0004
170 #define ACC_STATIC 0x0008
171 #define ACC_FINAL 0x0010
172 #define ACC_SUPER 0x0020
173 #define ACC_SYNCHRONIZED 0x0020
174 #define ACC_VOLATILE 0x0040
175 #define ACC_BRIDGE 0x0040
176 #define ACC_TRANSIENT 0x0080
177 #define ACC_VARARGS 0x0080
178 #define ACC_NATIVE 0x0100
179 #define ACC_INTERFACE 0x0200
180 #define ACC_ABSTRACT 0x0400
181 #define ACC_STRICT 0x0800
182 #define ACC_SYNTHETIC 0x1000
183 #define ACC_ANNOTATION 0x2000
184 #define ACC_ENUM 0x4000
185 #define ACC_MIRANDA 0x8000
187 /* special flags used in classinfo ********************************************/
189 #define ACC_CLASS_REFLECT_MASK 0x0000ffff/* flags reported by reflection */
191 #define ACC_CLASS_PRIMITIVE 0x00010000
192 #define ACC_CLASS_MEMBER 0x00020000
193 #define ACC_CLASS_ANONYMOUS 0x00040000
195 #define ACC_CLASS_HAS_POINTERS 0x00080000/* instance contains pointers */
197 #define ACC_CLASS_REFERENCE_MASK 0x00700000
198 #define ACC_CLASS_REFERENCE_SOFT 0x00100000
199 #define ACC_CLASS_REFERENCE_WEAK 0x00200000
200 #define ACC_CLASS_REFERENCE_PHANTOM 0x00400000
203 /* special flags used in methodinfo *******************************************/
205 #define ACC_METHOD_BUILTIN 0x00010000 /* use for descriptor parsing */
206 #define ACC_METHOD_IMPLEMENTED 0x00020000 /* there is an implementation */
207 #define ACC_METHOD_MONOMORPHIC 0x00040000 /* currently monomorphic method */
208 #define ACC_METHOD_EA 0x00080000 /* method being escape analyzed */
209 #define ACC_METHOD_MONOMORPHY_USED \
211 #define ACC_METHOD_PARENT_MONOMORPHY_USED \
215 /* data structures of the runtime system **************************************/
217 /* java_object_t ***************************************************************
219 All objects (and arrays) which resides on the heap need the
220 following header at the beginning of the data structure.
222 TODO: Include detailed description from the Wiki (ObjectHeader) here.
224 *******************************************************************************/
226 #define HDRFLAG_MARK1 0x02
227 #define HDRFLAG_MARK2 0x04
228 #define HDRFLAG_UNCOLLECTABLE 0x08
229 #define HDRFLAG_HASH_TAKEN 0x10
230 #define HDRFLAG_HASH_ATTACHED 0x20
231 #define HDRFLAG_REFERENCING 0x40
233 struct java_object_t { /* header for all objects */
234 struct _vftbl *vftbl; /* pointer to virtual function table */
235 #if defined(ENABLE_THREADS)
238 #if defined(ENABLE_GC_CACAO)
239 uintptr_t hdrflags; /* word containing the GC bits */
241 #if defined(ENABLE_ESCAPE_CHECK)
249 /* arrays **********************************************************************
251 All arrays are objects (they need the object header with a pointer
252 to a vftbl (array class table). There is one class for each array
253 type. The array type is described by an arraydescriptor struct
254 which is referenced by the vftbl.
257 typedef struct java_array_t { /* header for all arrays */
258 java_object_t objheader; /* object header */
259 s4 size; /* array size */
264 /* structs for all kinds of arrays ********************************************/
266 /* booleanarray and bytearray need identical memory layout (access methods
267 use the same machine code */
269 typedef struct java_booleanarray_t {
272 } java_booleanarray_t;
274 typedef struct java_bytearray_t {
279 typedef struct java_chararray_t {
284 typedef struct java_shortarray_t {
289 typedef struct java_intarray_t {
294 typedef struct java_longarray_t {
299 typedef struct java_floatarray_t {
304 typedef struct java_doublearray_t {
307 } java_doublearray_t;
309 /* objectarray and arrayarray need identical memory layout (access methods
310 use the same machine code */
312 struct java_objectarray_t {
314 java_object_t *data[1];
318 /* java_handle_t ***************************************************************
322 *******************************************************************************/
324 #if defined(ENABLE_HANDLES)
325 typedef struct java_handle_t {
326 java_object_t *heap_object;
329 typedef struct java_handle_objectarray_t { java_objectarray_t *heap_object; } java_handle_objectarray_t;
330 typedef struct java_handle_booleanarray_t { java_booleanarray_t *heap_object; } java_handle_booleanarray_t;
331 typedef struct java_handle_bytearray_t { java_bytearray_t *heap_object; } java_handle_bytearray_t;
332 typedef struct java_handle_chararray_t { java_chararray_t *heap_object; } java_handle_chararray_t;
333 typedef struct java_handle_shortarray_t { java_shortarray_t *heap_object; } java_handle_shortarray_t;
334 typedef struct java_handle_intarray_t { java_intarray_t *heap_object; } java_handle_intarray_t;
335 typedef struct java_handle_longarray_t { java_longarray_t *heap_object; } java_handle_longarray_t;
336 typedef struct java_handle_floatarray_t { java_floatarray_t *heap_object; } java_handle_floatarray_t;
337 typedef struct java_handle_doublearray_t { java_doublearray_t *heap_object; } java_handle_doublearray_t;
339 typedef java_object_t java_handle_t;
340 typedef java_objectarray_t java_handle_objectarray_t;
341 typedef java_booleanarray_t java_handle_booleanarray_t;
342 typedef java_bytearray_t java_handle_bytearray_t;
343 typedef java_chararray_t java_handle_chararray_t;
344 typedef java_shortarray_t java_handle_shortarray_t;
345 typedef java_intarray_t java_handle_intarray_t;
346 typedef java_longarray_t java_handle_longarray_t;
347 typedef java_floatarray_t java_handle_floatarray_t;
348 typedef java_doublearray_t java_handle_doublearray_t;
352 /* global constants related to the verifier ***********************************/
354 /* The verifier needs additional variables in the variable array. Since these */
355 /* must be reserved and set by parse.c and stack.c, we define these numbers */
356 /* here to avoid mysterious hard-coded constants. */
357 /* stack.c needs an extra variable if the verifier is disabled. */
359 #if defined(ENABLE_VERIFIER)
360 # define VERIFIER_EXTRA_LOCALS 1
361 # define VERIFIER_EXTRA_VARS 1
362 # define STACK_EXTRA_VARS 0
364 # define VERIFIER_EXTRA_LOCALS 0
365 # define VERIFIER_EXTRA_VARS 0
366 # define STACK_EXTRA_VARS 1
369 #endif /* _GLOBAL_H */
373 * These are local overrides for various environment variables in Emacs.
374 * Please do not remove this and leave it at the end of the file, where
375 * Emacs will automagically detect them.
376 * ---------------------------------------------------------------------
379 * indent-tabs-mode: t
383 * vim:noexpandtab:sw=4:ts=4: