X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fvm%2Fbuiltin.h;h=7cfe035e1b3b1040daf84e517f8df013ca8e3a61;hb=e319da867e904e08f0a6497dfea083b0596f2cde;hp=d734fd286d56e0b5048a7dcfa0f9c03017463313;hpb=e450b241a18412d5bef08a36fbe96596e0710980;p=cacao.git diff --git a/src/vm/builtin.h b/src/vm/builtin.h index d734fd286..7cfe035e1 100644 --- a/src/vm/builtin.h +++ b/src/vm/builtin.h @@ -1,9 +1,9 @@ -/* builtin.h - prototypes of builtin functions +/* src/vm/builtin.h - prototypes of builtin functions - Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 - R. Grafl, A. Krall, C. Kruegel, C. Oates, R. Obermaisser, - M. Probst, S. Ring, E. Steiner, C. Thalinger, D. Thuernbeck, - P. Tomsich, J. Wenninger + 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 This file is part of CACAO. @@ -27,8 +27,9 @@ Authors: Reinhard Grafl Changes: Edwin Steiner + Christian Thalinger - $Id: builtin.h 1571 2004-11-23 16:05:04Z twisti $ + $Id: builtin.h 3133 2005-08-23 14:34:49Z cacao $ */ @@ -36,10 +37,19 @@ #ifndef _BUILTIN_H #define _BUILTIN_H +#include "arch.h" #include "config.h" #include "toolbox/logging.h" -#include "threads/thread.h" -#include "arch.h" + +#if defined(USE_THREADS) +# if defined(NATIVE_THREADS) +# include "threads/native/threads.h" +# else +# include "threads/green/threads.h" +# endif +#endif + +#include "vm/jit/stacktrace.h" /* define infinity for floating point numbers */ @@ -55,7 +65,7 @@ #define DBL_NEGINF 0xfff0000000000000LL -/* float versions are not defined in gnu classpath's fdlibm */ +/* float versions are not defined in GNU classpath's fdlibm */ #define copysignf copysign #define finitef finite @@ -63,64 +73,25 @@ #define isnanf isnan -/**********************************************************************/ -/* BUILTIN FUNCTIONS TABLE */ -/**********************************************************************/ +/* builtin functions table ****************************************************/ -/* IMPORTANT: - * For each builtin function which is used in a BUILTIN* opcode there - * must be an entry in the builtin_desc table in jit/jit.c. - */ - -typedef struct builtin_descriptor builtin_descriptor; +typedef struct builtintable_entry builtintable_entry; -/* There is a builtin_descriptor in builtin_desc for every builtin - * function used in BUILTIN* opcodes. - */ -struct builtin_descriptor { - int opcode; /* opcode which is replaced by this builtin */ - /* (255 means no automatic replacement, */ - /* 0 means end of list.) */ - functionptr builtin; /* the builtin function (specify BUILTIN_...*/ - /* macro) */ - int icmd; /* the BUILTIN* opcode to use (# of args) */ - u1 type_s1; /* type of 1st argument */ - u1 type_s2; /* type of 2nd argument, or TYPE_VOID */ - u1 type_s3; /* type of 3rd argument, or TYPE_VOID */ - u1 type_d; /* type of result (may be TYPE_VOID) */ - bool supported;/* is supported without builtin? */ - bool isfloat; /* is this a floating point operation? */ - char *name; /* display name of the builtin function */ +struct builtintable_entry { + s4 opcode; /* opcode which is replaced */ + functionptr fp; /* function pointer of builtin */ + char *descriptor; + char *name; + methoddesc *md; }; -extern builtin_descriptor builtin_desc[]; -/**********************************************************************/ -/* GLOBAL VARIABLES */ -/**********************************************************************/ +/* function prototypes ********************************************************/ -#define THREADSPECIFIC -#define exceptionptr (&_exceptionptr) -#define threadrootmethod (&_threadrootmethod) +bool builtin_init(void); -#if defined(USE_THREADS) && defined(NATIVE_THREADS) -#ifdef HAVE___THREAD - -#undef THREADSPECIFIC -#define THREADSPECIFIC __thread - -#endif - -#undef exceptionptr -#undef threadrootmethod -#define exceptionptr builtin_get_exceptionptrptr() -#define threadrootmethod builtin_get_threadrootmethod() -#endif - -#if !defined(USE_THREADS) || !defined(NATIVE_THREADS) -extern java_objectheader *_exceptionptr; -extern methodinfo* _threadrootmethod; -#endif +builtintable_entry *builtintable_get_internal(functionptr fp); +builtintable_entry *builtintable_get_automatic(s4 opcode); /**********************************************************************/ @@ -158,17 +129,8 @@ s4 builtin_checkcast(java_objectheader *obj, classinfo *class); /* NOT AN OP */ s4 builtin_arrayinstanceof(java_objectheader *obj, vftbl_t *target); #define BUILTIN_arrayinstanceof (functionptr) builtin_arrayinstanceof - -#if defined(__I386__) -s4 asm_builtin_arrayinstanceof(java_objectheader *obj, classinfo *class); /* XXX ? */ -#undef BUILTIN_arrayinstanceof -#define BUILTIN_arrayinstanceof (functionptr) asm_builtin_arrayinstanceof -#endif - -s4 builtin_checkarraycast(java_objectheader *obj, vftbl_t *target); -/* NOT AN OP */ -s4 asm_builtin_checkarraycast(java_objectheader *obj, vftbl_t *target); -#define BUILTIN_checkarraycast (functionptr) asm_builtin_checkarraycast +s4 builtin_arraycheckcast(java_objectheader *o, vftbl_t *target); +#define BUILTIN_arraycheckcast (functionptr) builtin_arraycheckcast java_objectheader *builtin_throw_exception(java_objectheader *exception); /* NOT AN OP */ @@ -180,23 +142,13 @@ java_objectheader *builtin_trace_exception(java_objectheader *xptr, /* NOT AN OP */ java_objectheader *builtin_new(classinfo *c); -#ifdef __I386__ -java_objectheader *asm_builtin_new(classinfo *c); -#define BUILTIN_new (functionptr) asm_builtin_new -#else #define BUILTIN_new (functionptr) builtin_new -#endif java_arrayheader *builtin_newarray(s4 size, vftbl_t *arrayvftbl); #define BUILTIN_newarray (functionptr) builtin_newarray -java_objectarray *builtin_anewarray(s4 size, classinfo *component); -/* NOT AN OP */ -#if defined(__I386__) -void asm_builtin_newarray(s4 size, vftbl_t *arrayvftbl); -#undef BUILTIN_newarray -#define BUILTIN_newarray (functionptr) asm_builtin_newarray -#endif +java_objectarray *builtin_anewarray(s4 size, classinfo *component); +#define BUILTIN_anewarray (functionptr) builtin_anewarray java_booleanarray *builtin_newarray_boolean(s4 size); #define BUILTIN_newarray_boolean (functionptr) builtin_newarray_boolean @@ -214,48 +166,44 @@ java_intarray *builtin_newarray_int(s4 size); #define BUILTIN_newarray_int (functionptr) builtin_newarray_int java_longarray *builtin_newarray_long(s4 size); #define BUILTIN_newarray_long (functionptr) builtin_newarray_long -java_arrayheader *builtin_nmultianewarray(int n, vftbl_t *arrayvftbl, long *dims); -/* java_arrayheader *builtin_nmultianewarray(int n, classinfo *arrayclass, long *dims); */ -/* NOT AN OP */ + +java_arrayheader *builtin_multianewarray(int n, vftbl_t *arrayvftbl, long *dims); +#define BUILTIN_multianewarray (functionptr) builtin_multianewarray s4 builtin_canstore(java_objectarray *a, java_objectheader *o); -/* NOT AN OP */ -void asm_builtin_aastore(java_objectarray *a, s4 index, java_objectheader *o); -#define BUILTIN_aastore (functionptr) asm_builtin_aastore +#define BUILTIN_canstore (functionptr) builtin_canstore + +#if defined(TRACE_ARGS_NUM) +void builtin_trace_args(s8 a0, s8 a1, +#if TRACE_ARGS_NUM >= 4 + s8 a2, s8 a3, +#endif /* TRACE_ARGS_NUM >= 4 */ +#if TRACE_ARGS_NUM >= 6 + s8 a4, s8 a5, +#endif /* TRACE_ARGS_NUM >= 6 */ +#if TRACE_ARGS_NUM == 8 + s8 a6, s8 a7, +#endif /* TRACE_ARGS_NUM == 8 */ + methodinfo *m); +/* NOT AN OP */ +#endif /* defined(TRACE_ARGS_NUM) */ -#ifdef TRACE_ARGS_NUM -#if TRACE_ARGS_NUM == 6 -void builtin_trace_args(s8 a0, s8 a1, s8 a2, s8 a3, s8 a4, s8 a5, methodinfo *m); -/* NOT AN OP */ -#else -void builtin_trace_args(s8 a0, s8 a1, s8 a2, s8 a3, s8 a4, s8 a5, s8 a6, s8 a7, methodinfo *m); -/* NOT AN OP */ -#endif -#endif -void builtin_displaymethodstart(methodinfo *m); -/* NOT AN OP */ void builtin_displaymethodstop(methodinfo *m, s8 l, double d, float f); /* NOT AN OP */ +#if defined(USE_THREADS) void builtin_monitorenter(java_objectheader *o); -/* NOT AN OP */ +#define BUILTIN_monitorenter (functionptr) builtin_monitorenter void builtin_staticmonitorenter(classinfo *c); -/* NOT AN OP */ -void asm_builtin_monitorenter(java_objectheader *o); -#define BUILTIN_monitorenter (functionptr) asm_builtin_monitorenter -void *builtin_monitorexit(java_objectheader *o); -/* NOT AN OP */ -void *asm_builtin_monitorexit(java_objectheader *o); -#define BUILTIN_monitorexit (functionptr) asm_builtin_monitorexit +#define BUILTIN_staticmonitorenter (functionptr) builtin_staticmonitorenter +void builtin_monitorexit(java_objectheader *o); +#define BUILTIN_monitorexit (functionptr) builtin_monitorexit +#endif s4 builtin_idiv(s4 a, s4 b); -/* NOT AN OP */ -s4 asm_builtin_idiv(s4 a, s4 b); -#define BUILTIN_idiv (functionptr) asm_builtin_idiv +#define BUILTIN_idiv (functionptr) builtin_idiv s4 builtin_irem(s4 a, s4 b); -/* NOT AN OP */ -s4 asm_builtin_irem(s4 a, s4 b); -#define BUILTIN_irem (functionptr) asm_builtin_irem +#define BUILTIN_irem (functionptr) builtin_irem s8 builtin_ladd(s8 a, s8 b); #define BUILTIN_ladd (functionptr) builtin_ladd @@ -263,14 +211,12 @@ s8 builtin_lsub(s8 a, s8 b); #define BUILTIN_lsub (functionptr) builtin_lsub s8 builtin_lmul(s8 a, s8 b); #define BUILTIN_lmul (functionptr) builtin_lmul + s8 builtin_ldiv(s8 a, s8 b); -/* NOT AN OP */ -s8 asm_builtin_ldiv(s8 a, s8 b); -#define BUILTIN_ldiv (functionptr) asm_builtin_ldiv +#define BUILTIN_ldiv (functionptr) builtin_ldiv s8 builtin_lrem(s8 a, s8 b); -/* NOT AN OP */ -s8 asm_builtin_lrem(s8 a, s8 b); -#define BUILTIN_lrem (functionptr) asm_builtin_lrem +#define BUILTIN_lrem (functionptr) builtin_lrem + s8 builtin_lshl(s8 a, s4 b); #define BUILTIN_lshl (functionptr) builtin_lshl s8 builtin_lshr(s8 a, s4 b); @@ -289,36 +235,36 @@ s4 builtin_lcmp(s8 a, s8 b); #define BUILTIN_lcmp (functionptr) builtin_lcmp float builtin_fadd(float a, float b); -/* NOT AN OP */ +#define BUILTIN_fadd (functionptr) builtin_fadd float builtin_fsub(float a, float b); -/* NOT AN OP */ +#define BUILTIN_fsub (functionptr) builtin_fsub float builtin_fmul(float a, float b); -/* NOT AN OP */ +#define BUILTIN_fmul (functionptr) builtin_fmul float builtin_fdiv(float a, float b); -/* NOT AN OP */ +#define BUILTIN_fdiv (functionptr) builtin_fdiv float builtin_fneg(float a); -/* NOT AN OP */ +#define BUILTIN_fneg (functionptr) builtin_fneg s4 builtin_fcmpl(float a, float b); -/* NOT AN OP */ +#define BUILTIN_fcmpl (functionptr) builtin_fcmpl s4 builtin_fcmpg(float a, float b); -/* NOT AN OP */ +#define BUILTIN_fcmpg (functionptr) builtin_fcmpg float builtin_frem(float a, float b); #define BUILTIN_frem (functionptr) builtin_frem double builtin_dadd(double a, double b); -/* NOT AN OP */ +#define BUILTIN_dadd (functionptr) builtin_dadd double builtin_dsub(double a, double b); -/* NOT AN OP */ +#define BUILTIN_dsub (functionptr) builtin_dsub double builtin_dmul(double a, double b); -/* NOT AN OP */ +#define BUILTIN_dmul (functionptr) builtin_dmul double builtin_ddiv(double a, double b); -/* NOT AN OP */ +#define BUILTIN_ddiv (functionptr) builtin_ddiv double builtin_dneg(double a); -/* NOT AN OP */ +#define BUILTIN_dneg (functionptr) builtin_dneg s4 builtin_dcmpl(double a, double b); -/* NOT AN OP */ +#define BUILTIN_dcmpl (functionptr) builtin_dcmpl s4 builtin_dcmpg(double a, double b); -/* NOT AN OP */ +#define BUILTIN_dcmpg (functionptr) builtin_dcmpg double builtin_drem(double a, double b); #define BUILTIN_drem (functionptr) builtin_drem @@ -345,7 +291,7 @@ s8 asm_builtin_f2l(float a); /* NOT AN OP */ double builtin_f2d(float a); -/* NOT AN OP */ +#define BUILTIN_f2d (functionptr) builtin_f2d s4 builtin_d2i(double a); #define BUILTIN_d2i (functionptr) builtin_d2i @@ -357,34 +303,36 @@ s8 asm_builtin_d2l(double a); /* NOT AN OP */ float builtin_d2f(double a); -/* NOT AN OP */ +#define BUILTIN_d2f (functionptr) builtin_d2f java_arrayheader *builtin_clone_array(void *env, java_arrayheader *o); /* NOT AN OP */ -/* builtin_dummy just panics if it is executed. */ -s4 builtin_dummy(); -/* NOT AN OP */ - /* conversion helper functions */ inline float intBitsToFloat(s4 i); inline float longBitsToDouble(s8 l); /* this is a wrapper for calls from asmpart */ -java_objectheader **builtin_asm_get_exceptionptrptr(); +java_objectheader **builtin_asm_get_exceptionptrptr(void); #if defined(USE_THREADS) && defined(NATIVE_THREADS) -static inline java_objectheader **builtin_get_exceptionptrptr(); +static inline java_objectheader **builtin_get_exceptionptrptr(void); +static inline u1 *builtin_get_dontfillinexceptionstacktrace(void); /* NOT AN OP */ -static inline methodinfo **builtin_get_threadrootmethod(); +static inline methodinfo **builtin_get_threadrootmethod(void); /* NOT AN OP */ -inline java_objectheader **builtin_get_exceptionptrptr() +inline java_objectheader **builtin_get_exceptionptrptr(void) { return &THREADINFO->_exceptionptr; } -inline methodinfo **builtin_get_threadrootmethod() +inline u1 *builtin_get_dontfillinexceptionstacktrace(void) +{ + return &THREADINFO->_dontfillinexceptionstacktrace; +} + +inline methodinfo **builtin_get_threadrootmethod(void) { return &THREADINFO->_threadrootmethod; } @@ -394,7 +342,7 @@ inline methodinfo **builtin_get_threadrootmethod() /* returns the root method of a thread. this is used in asmpart.S and delivers the abort condition for the stack unwinding for getClassContext and getClassLoader. For the main thread this is the main function. Otherwhise it is the thread's run method (at least that's how I see it) (jowenn) */ -methodinfo *builtin_asm_get_threadrootmethod(); +methodinfo *builtin_asm_get_threadrootmethod(void); /* returns the current top element of the stack frame info list (needed for unwinding across native functions) */ /* on i386 this is a pointer to a structure @@ -405,8 +353,11 @@ methodinfo *builtin_asm_get_threadrootmethod(); points here---->| previous element in list | ------------------------------------------------ */ -void *builtin_asm_get_stackframeinfo(); -stacktraceelement *builtin_stacktrace_copy(stacktraceelement **,stacktraceelement *begin, stacktraceelement *end); +void *builtin_asm_get_stackframeinfo(void); +stacktraceelement *builtin_stacktrace_copy(stacktraceelement **el, + stacktraceelement *begin, + stacktraceelement *end); + #endif /* _BUILTIN_H */