/* src/vm/global.h - global definitions
- Copyright (C) 1996-2005 R. Grafl, A. Krall, C. Kruegel, C. Oates,
- R. Obermaisser, M. Platter, M. Probst, S. Ring, E. Steiner,
- C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich, J. Wenninger,
- Institut f. Computersprachen - TU Wien
+ Copyright (C) 1996-2005, 2007, 2006 R. Grafl, A. Krall, C. Kruegel,
+ C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
+ E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
+ J. Wenninger, Institut f. Computersprachen - TU Wien
This file is part of CACAO.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- 02111-1307, USA.
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301, USA.
- Contact: cacao@complang.tuwien.ac.at
-
- Authors: Reinhard Grafl
- Andreas Krall
-
- Changes: Mark Probst
- Philipp Tomsich
- Edwin Steiner
- Joseph Wenninger
- Christian Thalinger
-
- $Id: global.h 3669 2005-11-15 00:18:01Z twisti $
+ $Id: global.h 8299 2007-08-13 08:41:18Z michi $
*/
#define _GLOBAL_H
#include "config.h"
-#include "types.h"
+#include "vm/types.h"
/* additional data types ******************************************************/
typedef void (*functionptr) (void); /* generic function pointer */
typedef u1* methodptr;
-typedef int bool; /* boolean data type */
+typedef unsigned int bool; /* boolean data type */
-#define true 1
-#define false 0
+#define true 1
+#define false 0
+#if defined(ENABLE_SSA)
+/* immediate to get an addidional target Local Var Index */
+/* for IINC in Combination with SSA */
+struct imm {
+ s4 i;
+ s4 op1_t;
+};
+#endif
+
/* immediate data union */
typedef union {
void *a;
functionptr fp;
u1 b[8];
+#if defined(ENABLE_SSA)
+ struct imm _i;
+#endif
} imm_union;
-/* forward typedefs ***********************************************************/
-
-typedef struct java_objectheader java_objectheader;
-typedef struct java_objectarray java_objectarray;
+/* alignment macros ***********************************************************/
+#define ALIGN_EVEN(a) ((a) = (((a) + 1) & ~1))
+#define ALIGN_ODD(a) ((a) = (a) | 1 )
-/* define some CACAO paths ****************************************************/
+#define ALIGN_2(a) ALIGN_EVEN(a)
-#define CACAO_VM_ZIP_PATH "/share/cacao/vm.zip"
-#define CLASSPATH_LIBRARY_PATH "/lib/classpath"
-#define CLASSPATH_GLIBJ_ZIP_PATH "/share/classpath/" GLIBJZ_STRING
+/* forward typedefs ***********************************************************/
-/*
- * CACAO_TYPECHECK activates typechecking (part of bytecode verification)
- */
-#define CACAO_TYPECHECK
-
-/*
- * TYPECHECK_STACK_COMPCAT activates full checking of computational
- * categories for stack manipulations (POP,POP2,SWAP,DUP,DUP2,DUP_X1,
- * DUP2_X1,DUP_X2,DUP2_X2).
- */
-#define TYPECHECK_STACK_COMPCAT
-
-/* if we have threads disabled this one is not defined ************************/
-
-#if !defined(USE_THREADS)
-#define THREADSPECIFIC
-#endif
+typedef struct java_object_t java_object_t;
+typedef struct java_objectarray java_objectarray;
#define MAX_ALIGN 8 /* most generic alignment for JavaVM values */
/* basic data types ***********************************************************/
-/* CAUTION: jit/jit.h relies on these numerical values! */
-#define TYPE_INT 0 /* the JavaVM types must numbered in the */
-#define TYPE_LONG 1 /* same order as the ICMD_Ixxx to ICMD_Axxx */
-#define TYPE_FLOAT 2 /* instructions (LOAD and STORE) */
-#define TYPE_DOUBLE 3 /* integer, long, float, double, address */
-#define TYPE_ADDRESS 4 /* all other types can be numbered arbitrarly */
+/* The JavaVM types must numbered in the same order as the ICMD_Ixxx
+ to ICMD_Axxx instructions (LOAD and STORE). All other types can be
+ numbered arbitrarily. */
+
+#define TYPE_INT 0
+#define TYPE_LNG 1
+#define TYPE_FLT 2
+#define TYPE_DBL 3
+#define TYPE_ADR 4
+
+#define TYPE_RET 8 /* must not share bits with TYPE_FLT or TYPE_LNG */
#define TYPE_VOID 10
-/* primitive data types *******************************************************/
-/* These values are used in parsed descriptors and in some other places */
-/* were the different types handled internally as TYPE_INT have to be */
-/* distinguished. */
+#define IS_INT_LNG_TYPE(a) (!((a) & TYPE_FLT))
+#define IS_FLT_DBL_TYPE(a) ((a) & TYPE_FLT)
+#define IS_2_WORD_TYPE(a) ((a) & TYPE_LNG)
-#define PRIMITIVETYPE_COUNT 11 /* number of primitive types (+ dummies) */
+#define IS_INT_TYPE(a) ((a) == TYPE_INT)
+#define IS_LNG_TYPE(a) ((a) == TYPE_LNG)
+#define IS_FLT_TYPE(a) ((a) == TYPE_FLT)
+#define IS_DBL_TYPE(a) ((a) == TYPE_DBL)
+#define IS_ADR_TYPE(a) ((a) == TYPE_ADR)
+
+#define IS_VOID_TYPE(a) ((a) == TYPE_VOID)
-/* CAUTION: Don't change the numerical values! These constants are
- * used as indices into the primitive type table.
- */
-#define PRIMITIVETYPE_INT TYPE_INT
-#define PRIMITIVETYPE_LONG TYPE_LONG
-#define PRIMITIVETYPE_FLOAT TYPE_FLOAT
-#define PRIMITIVETYPE_DOUBLE TYPE_DOUBLE
-#define PRIMITIVETYPE_DUMMY1 TYPE_ADR /* not used! */
-#define PRIMITIVETYPE_BYTE 5
-#define PRIMITIVETYPE_CHAR 6
-#define PRIMITIVETYPE_SHORT 7
-#define PRIMITIVETYPE_BOOLEAN 8
-#define PRIMITIVETYPE_DUMMY2 9 /* not used! */
-#define PRIMITIVETYPE_VOID TYPE_VOID
/* some Java related defines **************************************************/
-#define JAVA_VERSION "1.4.2" /* this version is supported by CACAO */
-#define CLASS_VERSION "49.0"
+#define JAVA_VERSION "1.5.0" /* this version is supported by CACAO */
+#define CLASS_VERSION "50.0"
/* Java class file constants **************************************************/
#define MAGIC 0xCAFEBABE
-#define MAJOR_VERSION 49
+#define MAJOR_VERSION 50
#define MINOR_VERSION 0
#define ACC_SYNTHETIC 0x1000
#define ACC_ANNOTATION 0x2000
#define ACC_ENUM 0x4000
+#define ACC_MIRANDA 0x8000
+/* special flags used in classinfo ********************************************/
-/* data structure for calls from c code to java methods */
+#define ACC_CLASS_REFLECT_MASK 0x0000ffff/* flags reported by reflection */
+
+#define ACC_CLASS_PRIMITIVE 0x00010000/* class is a primitive class */
+
+#define ACC_CLASS_HAS_POINTERS 0x00020000/* instance contains pointers */
+
+#define ACC_CLASS_REFERENCE_MASK 0x001c0000
+#define ACC_CLASS_REFERENCE_SOFT 0x00040000
+#define ACC_CLASS_REFERENCE_WEAK 0x00080000
+#define ACC_CLASS_REFERENCE_PHANTOM 0x00100000
-struct jni_callblock {
- u8 itemtype;
- u8 item;
-};
-typedef struct jni_callblock jni_callblock;
+/* special flags used in methodinfo *******************************************/
+
+#define ACC_METHOD_BUILTIN 0x00010000 /* use for descriptor parsing */
+#define ACC_METHOD_IMPLEMENTED 0x00020000 /* there is an implementation */
+#define ACC_METHOD_MONOMORPHIC 0x00040000 /* currently monomorphic method */
/* data structures of the runtime system **************************************/
-/* java_objectheader ***********************************************************
+/* java_object_t ***************************************************************
All objects (and arrays) which resides on the heap need the
following header at the beginning of the data structure.
+ TODO: Include detailed description from the Wiki (ObjectHeader) here.
+
*******************************************************************************/
-struct java_objectheader { /* header for all objects */
- struct _vftbl *vftbl; /* pointer to virtual function table */
-#if defined(USE_THREADS) && defined(NATIVE_THREADS)
- void *monitorPtr;
+#define HDRFLAG_FLC 0x01
+#define HDRFLAG_MARK1 0x02
+#define HDRFLAG_MARK2 0x04
+#define HDRFLAG_UNCOLLECTABLE 0x08
+#define HDRFLAG_HASH_TAKEN 0x10
+#define HDRFLAG_HASH_ATTACHED 0x20
+#define HDRFLAG_REFERENCING 0x40
+
+struct java_object_t { /* header for all objects */
+ struct _vftbl *vftbl; /* pointer to virtual function table */
+#if defined(ENABLE_THREADS)
+ struct lock_record_t *monitorPtr;
+#endif
+#if defined(ENABLE_THREADS) || defined(ENABLE_GC_CACAO)
+ ptrint hdrflags; /* word containing the FLC and GC bits */
#endif
};
+#if 0
+typedef struct java_handle_t {
+ java_object_t *heap_object;
+} java_handle_t;
+#else
+typedef java_object_t java_handle_t;
+#endif
+
+
/* arrays **********************************************************************
All arrays are objects (they need the object header with a pointer
which is referenced by the vftbl.
*/
-/* CAUTION: Don't change the numerical values! These constants (with
- * the exception of ARRAYTYPE_OBJECT) are used as indices in the
- * primitive type table.
- */
-#define ARRAYTYPE_INT PRIMITIVETYPE_INT
-#define ARRAYTYPE_LONG PRIMITIVETYPE_LONG
-#define ARRAYTYPE_FLOAT PRIMITIVETYPE_FLOAT
-#define ARRAYTYPE_DOUBLE PRIMITIVETYPE_DOUBLE
-#define ARRAYTYPE_BYTE PRIMITIVETYPE_BYTE
-#define ARRAYTYPE_CHAR PRIMITIVETYPE_CHAR
-#define ARRAYTYPE_SHORT PRIMITIVETYPE_SHORT
-#define ARRAYTYPE_BOOLEAN PRIMITIVETYPE_BOOLEAN
-#define ARRAYTYPE_OBJECT PRIMITIVETYPE_VOID /* don't use as index! */
-
typedef struct java_arrayheader { /* header for all arrays */
- java_objectheader objheader; /* object header */
+ java_object_t objheader; /* object header */
s4 size; /* array size */
} java_arrayheader;
/* structs for all kinds of arrays ********************************************/
-typedef struct java_chararray {
- java_arrayheader header;
- u2 data[1];
-} java_chararray;
-
-typedef struct java_floatheader {
- java_arrayheader header;
- float data[1];
-} java_floatarray;
-
-typedef struct java_doublearray {
- java_arrayheader header;
- double data[1];
-} java_doublearray;
-
/* booleanarray and bytearray need identical memory layout (access methods
use the same machine code */
s1 data[1];
} java_bytearray;
+typedef struct java_chararray {
+ java_arrayheader header;
+ u2 data[1];
+} java_chararray;
+
typedef struct java_shortarray {
java_arrayheader header;
s2 data[1];
s8 data[1];
} java_longarray;
+typedef struct java_floatarray {
+ java_arrayheader header;
+ float data[1];
+} java_floatarray;
+
+typedef struct java_doublearray {
+ java_arrayheader header;
+ double data[1];
+} java_doublearray;
+
/* objectarray and arrayarray need identical memory layout (access methods
use the same machine code */
struct java_objectarray {
- java_arrayheader header;
- java_objectheader *data[1];
+ java_arrayheader header;
+ java_object_t *data[1];
};
-#define VFTBLINTERFACETABLE(v,i) (v)->interfacetable[-i]
-
-
-/* flag variables *************************************************************/
-
-extern bool cacao_initializing;
-
-
-/* Synchronization ************************************************************/
-
-#if defined(USE_THREADS) && defined(NATIVE_THREADS)
-void cast_lock();
-void cast_unlock();
-void compiler_lock();
-void compiler_unlock();
-#endif
-
-
-/**** Methods: called directly by cacao, which defines the callpath ***/
-#define MAINCLASS mainstring
-#define MAINMETH "main"
-#define MAINDESC "([Ljava/lang/String;)V"
-
-#define EXITCLASS "java/lang/System"
-#define EXITMETH "exit"
-#define EXITDESC "(I)V"
+/* global constants related to the verifier ***********************************/
-#if defined(USE_THREADS)
- #define THREADCLASS "java/lang/Thread"
- #define THREADMETH "<init>"
- #define THREADDESC "(Ljava/lang/VMThread;Ljava/lang/String;IZ)V"
+/* The verifier needs additional variables in the variable array. Since these */
+/* must be reserved and set by parse.c and stack.c, we define these numbers */
+/* here to avoid mysterious hard-coded constants. */
+/* stack.c needs an extra variable if the verifier is disabled. */
- #define THREADGROUPCLASS "java/lang/ThreadGroup"
- #define THREADGROUPMETH "addThread"
- #define THREADGROUPDESC "(Ljava/lang/Thread;)V"
+#if defined(ENABLE_VERIFIER)
+# define VERIFIER_EXTRA_LOCALS 1
+# define VERIFIER_EXTRA_VARS 1
+# define STACK_EXTRA_VARS 0
+#else
+# define VERIFIER_EXTRA_LOCALS 0
+# define VERIFIER_EXTRA_VARS 0
+# define STACK_EXTRA_VARS 1
#endif
#endif /* _GLOBAL_H */
* c-basic-offset: 4
* tab-width: 4
* End:
+ * vim:noexpandtab:sw=4:ts=4:
*/