X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fbacktrace.c;h=e10af61db11226cb8881abdaa656e1694fd6e195;hb=63817d29028c8551cda23f432a3328acd7fdd62f;hp=7e58e80d06f1609b2f9a179cb8f249fa77ca745e;hpb=5f338d314224411587a7cac218ea320bc982f19f;p=sbcl.git diff --git a/src/runtime/backtrace.c b/src/runtime/backtrace.c index 7e58e80..e10af61 100644 --- a/src/runtime/backtrace.c +++ b/src/runtime/backtrace.c @@ -13,20 +13,22 @@ * files for more information. */ -/* - * $Header$ - */ - #include #include -#include "runtime.h" #include "sbcl.h" +#include "runtime.h" #include "globals.h" #include "os.h" #include "interrupt.h" #include "lispregs.h" +#ifdef LISP_FEATURE_GENCGC +#include "gencgc-alloc-region.h" +#endif +#include "genesis/static-symbols.h" +#include "genesis/primitive-objects.h" +#include "thread.h" -#ifndef __i386__ +#ifndef LISP_FEATURE_X86 /* KLUDGE: Sigh ... I know what the call frame looks like and it had * better not change. */ @@ -68,16 +70,15 @@ code_pointer(lispobj object) lispobj *headerp, header; int type, len; - headerp = (lispobj *) PTR(object); + headerp = (lispobj *) native_pointer(object); header = *headerp; - type = TypeOf(header); + type = widetag_of(header); switch (type) { - case type_CodeHeader: + case CODE_HEADER_WIDETAG: break; - case type_ReturnPcHeader: - case type_FunctionHeader: - case type_ClosureFunctionHeader: + case RETURN_PC_HEADER_WIDETAG: + case SIMPLE_FUN_HEADER_WIDETAG: len = HEADER_LENGTH(header); if (len == 0) headerp = NULL; @@ -94,8 +95,8 @@ code_pointer(lispobj object) static boolean cs_valid_pointer_p(struct call_frame *pointer) { - lose("stub: hasn't been updated for X86"); - return (((char *) CONTROL_STACK_START <= (char *) pointer) && + struct thread *thread=arch_os_get_current_thread(); + return (((char *) thread->control_stack_start <= (char *) pointer) && ((char *) pointer < (char *) current_control_stack_pointer)); } @@ -117,8 +118,8 @@ call_info_from_context(struct call_info *info, os_context_t *context) unsigned long pc; info->interrupted = 1; - if (LowtagOf(*os_context_register_addr(context, reg_CODE)) - == type_FunctionPointer) { + if (lowtag_of(*os_context_register_addr(context, reg_CODE)) + == FUN_POINTER_LOWTAG) { /* We tried to call a function, but crapped out before $CODE could * be fixed up. Probably an undefined function. */ info->frame = @@ -126,7 +127,7 @@ call_info_from_context(struct call_info *info, os_context_t *context) reg_OCFP)); info->lra = (lispobj)(*os_context_register_addr(context, reg_LRA)); info->code = code_pointer(info->lra); - pc = (unsigned long)PTR(info->lra); + pc = (unsigned long)native_pointer(info->lra); } else { info->frame = @@ -151,6 +152,7 @@ static int previous_info(struct call_info *info) { struct call_frame *this_frame; + struct thread *thread=arch_os_get_current_thread(); int free; if (!cs_valid_pointer_p(info->frame)) { @@ -168,10 +170,10 @@ previous_info(struct call_info *info) if (info->lra == NIL) { /* We were interrupted. Find the correct signal context. */ - free = SymbolValue(FREE_INTERRUPT_CONTEXT_INDEX)>>2; + free = SymbolValue(FREE_INTERRUPT_CONTEXT_INDEX,thread)>>2; while (free-- > 0) { os_context_t *context = - lisp_interrupt_contexts[free]; + thread->interrupt_contexts[free]; if ((struct call_frame *)(*os_context_register_addr(context, reg_CFP)) == info->frame) { @@ -183,7 +185,7 @@ previous_info(struct call_info *info) else { info->code = code_pointer(info->lra); if (info->code != NULL) - info->pc = (unsigned long)PTR(info->lra) - + info->pc = (unsigned long)native_pointer(info->lra) - (unsigned long)info->code - #ifndef alpha (HEADER_LENGTH(info->code->header) * sizeof(lispobj)); @@ -211,7 +213,7 @@ backtrace(int nframes) if (info.code != (struct code *) 0) { lispobj function; - printf("CODE: 0x%08X, ", (unsigned long) info.code | type_OtherPointer); + printf("CODE: 0x%08X, ", (unsigned long) info.code | OTHER_POINTER_LOWTAG); #ifndef alpha function = info.code->entry_points; @@ -219,24 +221,24 @@ backtrace(int nframes) function = ((struct code *)info.code)->entry_points; #endif while (function != NIL) { - struct function *header; + struct simple_fun *header; lispobj name; - header = (struct function *) PTR(function); + header = (struct simple_fun *) native_pointer(function); name = header->name; - if (LowtagOf(name) == type_OtherPointer) { + if (lowtag_of(name) == OTHER_POINTER_LOWTAG) { lispobj *object; - object = (lispobj *) PTR(name); + object = (lispobj *) native_pointer(name); - if (TypeOf(*object) == type_SymbolHeader) { + if (widetag_of(*object) == SYMBOL_HEADER_WIDETAG) { struct symbol *symbol; symbol = (struct symbol *) object; - object = (lispobj *) PTR(symbol->name); + object = (lispobj *) native_pointer(symbol->name); } - if (TypeOf(*object) == type_SimpleString) { + if (widetag_of(*object) == SIMPLE_BASE_STRING_WIDETAG) { struct vector *string; string = (struct vector *) object; @@ -268,6 +270,8 @@ backtrace(int nframes) #else + + void backtrace(int nframes) {