Authors: Joseph Wenninger
- $Id: stacktrace.c 2358 2005-04-22 22:01:51Z jowenn $
+ $Id: stacktrace.c 2402 2005-04-27 13:17:07Z jowenn $
*/
#include "vm/class.h"
#include "vm/tables.h"
#include "vm/jit/codegen.inc.h"
+#include "vm/loader.h"
-
-#undef JWDEBUG
+#define JWDEBUG
/*JoWenn: simplify collectors (trace doesn't contain internal methods)*/
typedef struct lineNumberTableEntry {
/* The special value of -1 means that a inlined function starts, a value of -2 means that an inlined function ends*/
LineNumber lineNr;
- void *pc;
+ u1 *pc;
} lineNumberTableEntry;
typedef struct lineNumberTableEntryInlineBegin {
}
static int fillInStackTrace_methodRecursive(stackTraceBuffer *buffer,methodinfo
- *method,lineNumberTableEntry *startEntry, lineNumberTableEntry **entry, size_t *entriesAhead,void *adress) {
+ *method,lineNumberTableEntry *startEntry, lineNumberTableEntry **entry, size_t *entriesAhead,u1 *adress) {
size_t ahead=*entriesAhead;
lineNumberTableEntry *ent=*entry;
}
-static void fillInStackTrace_method(stackTraceBuffer *buffer,methodinfo *method,char *dataSeg, void* adress) {
+static void fillInStackTrace_method(stackTraceBuffer *buffer,methodinfo *method,u1 *dataSeg, u1* adress) {
size_t lineNumberTableSize=(*((size_t*)(dataSeg+LineNumberTableSize)));
lineNumberTableEntry *startEntry;
/* printf("dataSeg: %p\n",dataSeg);*/
- calc=dataSeg+LineNumberTableStart;
+ calc=(void**)(dataSeg+LineNumberTableStart);
/* printf("position of line number table start reference in data segment: %p\n",calc);
printf("line number table start as found in table: %p\n",*calc);*/
ent=(lineNumberTableEntry *) (((char*)(*calc) - (sizeof(lineNumberTableEntry)-sizeof(void*))));
}
+typedef union {
+ u1* u1ptr;
+ functionptr funcptr;
+ void* voidptr;
+} u1ptr_functionptr_union;
+
+#define cast_funcptr_u1ptr(dest,src) \
+ { u1f.funcptr=src;\
+ dest=u1f.u1ptr; }
+
+#define cast_u1ptr_funcptr(dest,src) \
+ { u1f.u1ptr=src;\
+ dest=u1f.funcptr; }
+
void cacao_stacktrace_fillInStackTrace(void **target,CacaoStackTraceCollector coll)
{
*target=0;
return;
} else {
- char *dataseg; /*make it byte addressable*/
+ u1 *tmp;
+ u1 *dataseg; /*make it byte addressable*/
methodinfo *currentMethod=0;
- void *returnAdress;
- char* stackPtr;
+ /*void*/ functionptr returnAdress;
+ u1* stackPtr;
+ u1ptr_functionptr_union u1f;
/* utf_display(info->method->class->name);
utf_display(info->method->name);*/
while ((currentMethod!=0) || (info!=0)) {
if (currentMethod==0) { /*some builtin native */
currentMethod=info->method;
- returnAdress=info->returnToFromNative;
+ returnAdress=(functionptr)info->returnToFromNative;
/*log_text("native");*/
if (currentMethod) {
/*utf_display(currentMethod->class->name);
else
dataseg=codegen_findmethod(returnAdress);
#elif defined(__I386__) || defined (__X86_64__)
- dataseg=codegen_findmethod(returnAdress);
+ cast_funcptr_u1ptr(dataseg,codegen_findmethod(returnAdress));
#endif
currentMethod=(*((methodinfo**)(dataseg+MethodPointer)));
if (info->beginOfJavaStackframe==0)
- stackPtr=((char*)info)+sizeof(native_stackframeinfo);
+ stackPtr=((u1*)info)+sizeof(native_stackframeinfo);
else
#if defined(__ALPHA__)
- stackPtr=(char*)(info->beginOfJavaStackframe);
+ stackPtr=(u1*)(info->beginOfJavaStackframe);
#elif defined(__I386__) || defined (__X86_64__)
- stackPtr=(char*)(info->beginOfJavaStackframe)+sizeof(void*);
+ stackPtr=(u1*)(info->beginOfJavaStackframe)+sizeof(void*);
#endif
info=info->oldThreadspecificHeadValue;
} else { /*method created by jit*/
#endif
/*utf_display(currentMethod->class->name);
utf_display(currentMethod->name);*/
- fillInStackTrace_method(&buffer,currentMethod,dataseg,returnAdress-1);
+ cast_funcptr_u1ptr(tmp,returnAdress);
+ fillInStackTrace_method(&buffer,currentMethod,dataseg,tmp-1);
frameSize=*((u4*)(dataseg+FrameSize));
#if defined(__ALPHA__)
/* cacao saves the return adress as the first element of the stack frame on alphas*/
- dataseg=codegen_findmethod(*((void**)(stackPtr+frameSize-sizeof(void*))));
+ cast_funcptr_u1ptr (dataseg,codegen_findmethod(*((void**)(stackPtr+frameSize-sizeof(void*)))));
returnAdress=(*((void**)(stackPtr+frameSize-sizeof(void*))));
#elif defined(__I386__) || defined (__x86_64__)
/* on i386 the return adress is the first element before the stack frme*/
- returnAdress=(*((void**)(stackPtr+frameSize)));
- dataseg=codegen_findmethod(*((void**)(stackPtr+frameSize)));
+ cast_u1ptr_funcptr(returnAdress,*((u1**)(stackPtr+frameSize)));
+ cast_funcptr_u1ptr(dataseg,codegen_findmethod(returnAdress));
#endif
/* printf ("threadrootmethod %p\n",builtin_asm_get_threadrootmethod());
if (currentMethod==builtin_asm_get_threadrootmethod()) break;*/
dest->needsFree=0;
dest->size=dest->full;
- dest->start=dest+1;
+ dest->start=(stacktraceelement*)(dest+1);
/*
if (buffer->full>0) {
java_objectarray *cacao_createClassContextArray() {
java_objectarray *array=0;
- cacao_stacktrace_fillInStackTrace(&array,&classContextCollector);
+ cacao_stacktrace_fillInStackTrace((void**)&array,&classContextCollector);
return array;
}
if (size > 1) {
size--;
start=&(buffer->start[1]);
- if (start == class_java_lang_SecurityManager) {
+ if (start->method && (start->method->class == class_java_lang_SecurityManager)) {
size--;
start--;
}
java_objectheader *cacao_currentClassLoader() {
java_objectheader *header=0;
- cacao_stacktrace_fillInStackTrace(&header,&classLoaderCollector);
+ cacao_stacktrace_fillInStackTrace((void**)&header,&classLoaderCollector);
return header;
}
methodinfo *cacao_callingMethod() {
methodinfo *method;
- cacao_stacktrace_fillInStackTrace(&method,&callingMethodCollector);
+ cacao_stacktrace_fillInStackTrace((void**)&method,&callingMethodCollector);
return method;
}