/* src/vm/jit/stacktrace.h - header file for stacktrace generation
- Copyright (C) 1996-2005, 2006 R. Grafl, A. Krall, C. Kruegel,
+ 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
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- Contact: cacao@cacaojvm.org
-
- Authors: Christian Thalinger
-
- Changes:
-
- $Id: stacktrace.h 4357 2006-01-22 23:33:38Z twisti $
-
*/
/* forward typedefs ***********************************************************/
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"
+#include "vmcore/class.h"
+#include "vmcore/method.h"
/* stackframeinfo **************************************************************
u1 *xpc; /* XPC (for inline stubs) */
};
-#if defined(USE_THREADS)
-#define STACKFRAMEINFO (stackframeinfo **) (&THREADINFO->_stackframeinfo)
-#else
-extern stackframeinfo *_no_threads_stackframeinfo;
-
-#define STACKFRAMEINFO (&_no_threads_stackframeinfo)
-#endif
+/* stacktrace_entry ***********************************************************/
-struct stacktraceelement {
+struct stacktrace_entry {
#if SIZEOF_VOID_P == 8
u8 linenumber;
#else
};
-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)
u1 *ra);
#endif
-void stacktrace_create_inline_stackframeinfo(stackframeinfo *sfi, u1 *pv,
- u1 *sp, u1 *ra, u1 *xpc);
-
void stacktrace_create_extern_stackframeinfo(stackframeinfo *sfi, u1 *pv,
u1 *sp, u1 *ra, u1 *xpc);
void stacktrace_remove_stackframeinfo(stackframeinfo *sfi);
-/* inline exception creating functions */
-java_objectheader *stacktrace_inline_arithmeticexception(u1 *pv, u1 *sp, u1 *ra,
- u1 *xpc);
-
-java_objectheader *stacktrace_inline_arrayindexoutofboundsexception(u1 *pv,
- u1 *sp,
- u1 *ra,
- u1 *xpc,
- s4 index);
-
-java_objectheader *stacktrace_inline_arraystoreexception(u1 *pv, u1 *sp, u1 *ra,
- u1 *xpc);
-
-java_objectheader *stacktrace_inline_classcastexception(u1 *pv, u1 *sp, u1 *ra,
- u1 *xpc);
-
-java_objectheader *stacktrace_inline_nullpointerexception(u1 *pv, u1 *sp,
- u1 *ra, u1 *xpc);
+stacktracebuffer *stacktrace_create(stackframeinfo *sfi);
-/* hardware exception creating functions */
-java_objectheader *stacktrace_hardware_arithmeticexception(u1 *pv, u1 *sp,
- u1 *ra, u1 *xpc);
+stacktracecontainer *stacktrace_fillInStackTrace(void);
-java_objectheader *stacktrace_hardware_nullpointerexception(u1 *pv, u1 *sp,
- u1 *ra, u1 *xpc);
-
-/* refill the stacktrace of an existing exception */
-java_objectheader *stacktrace_inline_fillInStackTrace(u1 *pv, u1 *sp, u1 *ra,
- u1 *xpc);
-
-bool cacao_stacktrace_NormalTrace(void **target);
-java_objectarray *cacao_createClassContextArray(void);
-java_objectheader *cacao_currentClassLoader(void);
-java_objectarray *cacao_getStackForVMAccessController(void);
-
-void stacktrace_dump_trace(void);
-void stacktrace_print_trace(java_objectheader *xptr);
+#if defined(ENABLE_JAVASE)
+java_handle_objectarray_t *stacktrace_getClassContext(void);
+classinfo *stacktrace_getCurrentClass(void);
+java_handle_objectarray_t *stacktrace_getStack(void);
+#endif
+void stacktrace_print_trace_from_buffer(stacktracebuffer *stb);
+void stacktrace_print_trace(java_handle_t *xptr);
/* machine dependent functions (code in ARCH_DIR/md.c) */
#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
#if defined(ENABLE_INTRP)
u1 *intrp_md_stacktrace_get_returnaddress(u1 *sp, u4 framesize);
#endif
-
-#ifdef ENABLE_JVMTI
-typedef bool(*CacaoStackTraceCollector)(void **, stackTraceBuffer*);
-
-bool cacao_stacktrace_fillInStackTrace(void **target,
- CacaoStackTraceCollector coll,
- threadobject* thread);
-
-bool stackTraceCollector(void **target, stackTraceBuffer *buffer);
+#if defined(ENABLE_CYCLES_STATS)
+void stacktrace_print_cycles_stats(FILE *file);
#endif
#endif /* _STACKTRACE_H */