0.8.16.9:
[sbcl.git] / src / runtime / backtrace.c
index 7e58e80..e10af61 100644 (file)
  * files for more information.
  */
 
-/*
- * $Header$
- */
-
 #include <stdio.h>
 #include <signal.h>
-#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)
 {