X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fvm%2Fjit%2Fstacktrace.h;h=a2eddd4c4c4b7d6455e73663ec9af6cff35bd99d;hb=9f859ad50d3d5d98c185d40b86b2179bc4dc9aeb;hp=d6312865999d2a666216a24587327b47f3b08f45;hpb=8471dd5ead3b99695b52b59e132097e006037c07;p=cacao.git diff --git a/src/vm/jit/stacktrace.h b/src/vm/jit/stacktrace.h index d63128659..a2eddd4c4 100644 --- a/src/vm/jit/stacktrace.h +++ b/src/vm/jit/stacktrace.h @@ -1,9 +1,9 @@ /* src/vm/jit/stacktrace.h - header file for stacktrace generation - 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, 2006, 2007 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. @@ -19,16 +19,8 @@ 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. - - Contact: cacao@complang.tuwien.ac.at - - Authors: Christian Thalinger - - Changes: - - $Id: stacktrace.h 3414 2005-10-12 13:07:12Z twisti $ + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. */ @@ -38,30 +30,15 @@ /* forward typedefs ***********************************************************/ -typedef struct exceptionentry exceptionentry; typedef struct stackframeinfo stackframeinfo; -typedef struct stackTraceBuffer stackTraceBuffer; -typedef struct stacktraceelement stacktraceelement; +typedef struct stacktracebuffer stacktracebuffer; +typedef struct stacktrace_entry stacktrace_entry; #include "config.h" #include "vm/types.h" -#include "vm/method.h" - - -/* exceptionentry ************************************************************** - - Datastructure which represents an exception entry in the exception - table residing in the data segment. - -*******************************************************************************/ - -struct exceptionentry { - classinfo *catchtype; - void *handlerpc; - void *endpc; - void *startpc; -}; +#include "vmcore/class.h" +#include "vmcore/method.h" /* stackframeinfo ************************************************************** @@ -76,12 +53,14 @@ struct stackframeinfo { methodinfo *method; /* methodinfo of current function */ u1 *pv; /* PV of current function */ u1 *sp; /* SP of parent Java function */ - functionptr ra; /* RA to parent Java function */ - functionptr xpc; /* XPC (for inline stubs) */ + u1 *ra; /* RA to parent Java function */ + u1 *xpc; /* XPC (for inline stubs) */ }; -struct stacktraceelement { +/* stacktrace_entry ***********************************************************/ + +struct stacktrace_entry { #if SIZEOF_VOID_P == 8 u8 linenumber; #else @@ -91,83 +70,78 @@ struct stacktraceelement { }; -struct stackTraceBuffer { - s4 needsFree; - stacktraceelement *start; - s4 size; - s4 full; +/* stacktracebuffer ***********************************************************/ + +#define STACKTRACE_CAPACITY_DEFAULT 80 +#define STACKTRACE_CAPACITY_INCREMENT 80 + +struct stacktracebuffer { + s4 capacity; /* size of the buffer */ + s4 used; /* current entries in the buffer */ + stacktrace_entry *entries; /* the actual entries */ }; +/* stacktracecontainer ******************************************************** + + ATTENTION: Use the stacktracecontainer to place a stacktrace onto the heap + with stacktrace_fillInStackTrace() so that the GC does not get confused. + +*******************************************************************************/ + +typedef struct stacktracecontainer { + java_array_t header; /* default array header for the GC */ + struct stacktracebuffer stb; /* let entries point to data below */ + stacktrace_entry data[1]; /* the actual array of entries */ +} stacktracecontainer; + + /* function prototypes ********************************************************/ #if defined(ENABLE_INTRP) -void stacktrace_create_stackframeinfo(stackframeinfo *sfi, u1 *pv, - u1 *sp, functionptr ra); +void stacktrace_create_stackframeinfo(stackframeinfo *sfi, u1 *pv, u1 *sp, + u1 *ra); #endif -void stacktrace_create_inline_stackframeinfo(stackframeinfo *sfi, u1 *pv, - u1 *sp, functionptr ra, - functionptr xpc); - void stacktrace_create_extern_stackframeinfo(stackframeinfo *sfi, u1 *pv, - u1 *sp, functionptr ra, - functionptr xpc); + u1 *sp, u1 *ra, u1 *xpc); void stacktrace_create_native_stackframeinfo(stackframeinfo *sfi, u1 *pv, - u1 *sp, functionptr ra); + u1 *sp, u1 *ra); void stacktrace_remove_stackframeinfo(stackframeinfo *sfi); -/* inline exception creating functions */ -java_objectheader *stacktrace_inline_arithmeticexception(u1 *pv, u1 *sp, - functionptr ra, - functionptr xpc); - -java_objectheader *stacktrace_inline_arrayindexoutofboundsexception(u1 *pv, - u1 *sp, - functionptr ra, - functionptr xpc, - s4 index); - -java_objectheader *stacktrace_inline_arraystoreexception(u1 *pv, u1 *sp, - functionptr ra, - functionptr xpc); - -java_objectheader *stacktrace_inline_classcastexception(u1 *pv, u1 *sp, - functionptr ra, - functionptr xpc); -java_objectheader *stacktrace_inline_nullpointerexception(u1 *pv, u1 *sp, - functionptr ra, - functionptr xpc); +stacktracebuffer *stacktrace_create(stackframeinfo *sfi); +stacktracecontainer *stacktrace_fillInStackTrace(void); -/* hardware exception creating functions */ -java_objectheader *stacktrace_hardware_arithmeticexception(u1 *pv, u1 *sp, - functionptr ra, - functionptr xpc); +#if defined(ENABLE_JAVASE) +java_handle_objectarray_t *stacktrace_getClassContext(void); +classinfo *stacktrace_getCurrentClass(void); +java_handle_objectarray_t *stacktrace_getStack(void); +#endif -java_objectheader *stacktrace_hardware_nullpointerexception(u1 *pv, u1 *sp, - functionptr ra, - functionptr xpc); +void stacktrace_print_trace_from_buffer(stacktracebuffer *stb); +void stacktrace_print_trace(java_handle_t *xptr); -/* refill the stacktrace of an existing exception */ -java_objectheader *stacktrace_inline_fillInStackTrace(u1 *pv, u1 *sp, - functionptr ra, - functionptr xpc); +/* machine dependent functions (code in ARCH_DIR/md.c) */ -bool cacao_stacktrace_NormalTrace(void **target); -java_objectarray *cacao_createClassContextArray(void); -java_objectheader *cacao_currentClassLoader(void); -methodinfo* cacao_callingMethod(void); -java_objectarray *cacao_getStackForVMAccessController(void); +#if defined(ENABLE_JIT) +u1 *md_stacktrace_get_returnaddress(u1 *sp, u4 framesize); +# if defined(__SPARC_64__) +u1 *md_get_framepointer(u1 *sp); +u1 *md_get_pv_from_stackframe(u1 *sp); +# endif +#endif -void stacktrace_dump_trace(void); -void stacktrace_print_trace(stackTraceBuffer *stb); +#if defined(ENABLE_INTRP) +u1 *intrp_md_stacktrace_get_returnaddress(u1 *sp, u4 framesize); +#endif -/* machine dependent functions (code in ARCH_DIR/md.c) */ -functionptr md_stacktrace_get_returnaddress(u1 *sp, u4 framesize); +#if defined(ENABLE_CYCLES_STATS) +void stacktrace_print_cycles_stats(FILE *file); +#endif #endif /* _STACKTRACE_H */