/* 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 5805 2006-10-19 09:32:29Z twisti $
-
*/
#include "config.h"
#include "vm/types.h"
-#if defined(ENABLE_THREADS)
-# include "threads/native/threads.h"
-#else
-# include "threads/none/threads.h"
-#endif
+#include "md-abi.h"
-#include "vm/method.h"
+#include "vmcore/class.h"
+#include "vmcore/method.h"
/* stackframeinfo **************************************************************
u1 *sp; /* SP of parent Java function */
u1 *ra; /* RA to parent Java function */
u1 *xpc; /* XPC (for inline stubs) */
-};
-
-#if defined(ENABLE_THREADS)
-#define STACKFRAMEINFO (&(THREADOBJECT->_stackframeinfo))
-#else
-extern stackframeinfo *_no_threads_stackframeinfo;
-
-#define STACKFRAMEINFO (&_no_threads_stackframeinfo)
+#if defined(ENABLE_GC_CACAO)
+ /*
+ * The exact GC needs to be able to recover saved registers, so the
+ * native-stub saves these registers here
+ */
+# if defined(HAS_ADDRESS_REGISTER_FILE)
+ ptrint adrregs[ADR_SAV_CNT];
+# else
+ ptrint intregs[INT_SAV_CNT];
+# endif
#endif
+};
/* stacktrace_entry ***********************************************************/
#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 */
+ s4 capacity; /* size of the buffer */
+ s4 used; /* current entries in the buffer */
+ stacktrace_entry entries[80]; /* 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; /* wrapped stacktracebuffer */
+} 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);
-#define STACKTRACE_inline_arithmeticexception \
- (functionptr) stacktrace_inline_arithmeticexception
-
-
-java_objectheader *stacktrace_inline_arrayindexoutofboundsexception(u1 *pv,
- u1 *sp,
- u1 *ra,
- u1 *xpc,
- s4 index);
-#define STACKTRACE_inline_arrayindexoutofboundsexception \
- (functionptr) stacktrace_inline_arrayindexoutofboundsexception
-
-java_objectheader *stacktrace_inline_arraystoreexception(u1 *pv, u1 *sp, u1 *ra,
- u1 *xpc);
-#define STACKTRACE_inline_arraystoreexception \
- (functionptr) stacktrace_inline_arraystoreexception
-java_objectheader *stacktrace_inline_classcastexception(u1 *pv, u1 *sp, u1 *ra,
- u1 *xpc,
- java_objectheader *o);
-#define STACKTRACE_inline_classcastexception \
- (functionptr) stacktrace_inline_classcastexception
+stacktracebuffer *stacktrace_create(stackframeinfo *sfi);
-java_objectheader *stacktrace_inline_nullpointerexception(u1 *pv, u1 *sp,
- u1 *ra, u1 *xpc);
-#define STACKTRACE_inline_nullpointerexception \
- (functionptr) stacktrace_inline_nullpointerexception
+stacktracecontainer *stacktrace_fillInStackTrace(void);
-/* refill the stacktrace of an existing exception */
-java_objectheader *stacktrace_inline_fillInStackTrace(u1 *pv, u1 *sp, u1 *ra,
- u1 *xpc);
-#define STACKTRACE_inline_fillInStackTrace \
- (functionptr) stacktrace_inline_fillInStackTrace
-
-
-/* hardware exception creating functions */
-java_objectheader *stacktrace_hardware_arithmeticexception(u1 *pv, u1 *sp,
- u1 *ra, u1 *xpc);
-
-java_objectheader *stacktrace_hardware_nullpointerexception(u1 *pv, u1 *sp,
- u1 *ra, u1 *xpc);
-
-
-stacktracebuffer *stacktrace_fillInStackTrace(void);
-java_objectarray *stacktrace_getClassContext(void);
-classinfo *stacktrace_getCurrentClass(void);
-java_objectarray *stacktrace_getStack(void);
-
-void stacktrace_dump_trace(threadobject *thread);
-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)
* c-basic-offset: 4
* tab-width: 4
* End:
+ * vim:noexpandtab:sw=4:ts=4:
*/