0.9.2.42:
[sbcl.git] / src / runtime / backtrace.c
index 89bff2f..09179c7 100644 (file)
 
 #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__
+#if !(defined(LISP_FEATURE_X86) || defined(LISP_FEATURE_X86_64))
 
 /* KLUDGE: Sigh ... I know what the call frame looks like and it had
  * better not change. */
 
 struct call_frame {
-#ifndef alpha
-       struct call_frame *old_cont;
+#ifndef LISP_FEATURE_ALPHA
+        struct call_frame *old_cont;
 #else
         u32 old_cont;
 #endif
-       lispobj saved_lra;
+        lispobj saved_lra;
         lispobj code;
-       lispobj other_state[5];
+        lispobj other_state[5];
 };
 
 struct call_info {
-#ifndef alpha
+#ifndef LISP_FEATURE_ALPHA
     struct call_frame *frame;
 #else
     u32 frame;
 #endif
     int interrupted;
-#ifndef alpha
+#ifndef LISP_FEATURE_ALPHA
     struct code *code;
 #else
     u32 code;
@@ -73,7 +79,6 @@ code_pointer(lispobj object)
             break;
         case RETURN_PC_HEADER_WIDETAG:
         case SIMPLE_FUN_HEADER_WIDETAG:
-        case CLOSURE_FUN_HEADER_WIDETAG:
             len = HEADER_LENGTH(header);
             if (len == 0)
                 headerp = NULL;
@@ -90,9 +95,9 @@ 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) &&
-           ((char *) pointer < (char *) current_control_stack_pointer));
+    struct thread *thread=arch_os_get_current_thread();
+    return (((char *) thread->control_stack_start <= (char *) pointer) &&
+            ((char *) pointer < (char *) current_control_stack_pointer));
 }
 
 static void
@@ -114,27 +119,27 @@ call_info_from_context(struct call_info *info, os_context_t *context)
 
     info->interrupted = 1;
     if (lowtag_of(*os_context_register_addr(context, reg_CODE))
-       == FUN_POINTER_LOWTAG) {
+        == FUN_POINTER_LOWTAG) {
         /* We tried to call a function, but crapped out before $CODE could
          * be fixed up. Probably an undefined function. */
         info->frame =
-           (struct call_frame *)(*os_context_register_addr(context,
-                                                           reg_OCFP));
+            (struct call_frame *)(*os_context_register_addr(context,
+                                                            reg_OCFP));
         info->lra = (lispobj)(*os_context_register_addr(context, reg_LRA));
         info->code = code_pointer(info->lra);
         pc = (unsigned long)native_pointer(info->lra);
     }
     else {
         info->frame =
-           (struct call_frame *)(*os_context_register_addr(context, reg_CFP));
+            (struct call_frame *)(*os_context_register_addr(context, reg_CFP));
         info->code =
-           code_pointer(*os_context_register_addr(context, reg_CODE));
+            code_pointer(*os_context_register_addr(context, reg_CODE));
         info->lra = NIL;
         pc = *os_context_pc_addr(context);
     }
     if (info->code != NULL)
         info->pc = pc - (unsigned long) info->code -
-#ifndef alpha
+#ifndef LISP_FEATURE_ALPHA
             (HEADER_LENGTH(info->code->header) * sizeof(lispobj));
 #else
             (HEADER_LENGTH(((struct code *)info->code)->header) * sizeof(lispobj));
@@ -147,10 +152,11 @@ 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)) {
-        printf("Bogus callee value (0x%08x).\n", (unsigned long)info->frame);
+        printf("Bogus callee value (0x%08lx).\n", (unsigned long)info->frame);
         return 0;
     }
 
@@ -164,13 +170,13 @@ 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];
+            os_context_t *context =
+                thread->interrupt_contexts[free];
             if ((struct call_frame *)(*os_context_register_addr(context,
-                                                               reg_CFP))
-               == info->frame) {
+                                                                reg_CFP))
+                == info->frame) {
                 call_info_from_context(info, context);
                 break;
             }
@@ -181,7 +187,7 @@ previous_info(struct call_info *info)
         if (info->code != NULL)
             info->pc = (unsigned long)native_pointer(info->lra) -
                 (unsigned long)info->code -
-#ifndef alpha
+#ifndef LISP_FEATURE_ALPHA
                 (HEADER_LENGTH(info->code->header) * sizeof(lispobj));
 #else
                 (HEADER_LENGTH(((struct code *)info->code)->header) * sizeof(lispobj));
@@ -197,19 +203,19 @@ void
 backtrace(int nframes)
 {
     struct call_info info;
-       
+
     call_info_from_lisp_state(&info);
 
     do {
-        printf("<Frame 0x%08x%s, ", (unsigned long) info.frame,
+        printf("<Frame 0x%08lx%s, ", (unsigned long) info.frame,
                 info.interrupted ? " [interrupted]" : "");
 
         if (info.code != (struct code *) 0) {
             lispobj function;
 
-            printf("CODE: 0x%08X, ", (unsigned long) info.code | OTHER_POINTER_LOWTAG);
+            printf("CODE: 0x%08lX, ", (unsigned long) info.code | OTHER_POINTER_LOWTAG);
 
-#ifndef alpha
+#ifndef LISP_FEATURE_ALPHA
             function = info.code->entry_points;
 #else
             function = ((struct code *)info.code)->entry_points;
@@ -232,12 +238,13 @@ backtrace(int nframes)
                         symbol = (struct symbol *) object;
                         object = (lispobj *) native_pointer(symbol->name);
                     }
-                    if (widetag_of(*object) == SIMPLE_STRING_WIDETAG) {
+                    if (widetag_of(*object) == SIMPLE_BASE_STRING_WIDETAG) {
                         struct vector *string;
 
                         string = (struct vector *) object;
                         printf("%s, ", (char *) string->data);
                     } else
+                        /* FIXME: broken from (VECTOR NIL) */
                         printf("(Not simple string??\?), ");
                 } else
                     printf("(Not other pointer??\?), ");
@@ -250,7 +257,7 @@ backtrace(int nframes)
             printf("CODE: ???, ");
 
         if (info.lra != NIL)
-            printf("LRA: 0x%08x, ", (unsigned long)info.lra);
+            printf("LRA: 0x%08lx, ", (unsigned long)info.lra);
         else
             printf("<no LRA>, ");
 
@@ -264,6 +271,8 @@ backtrace(int nframes)
 
 #else
 
+
+
 void
 backtrace(int nframes)
 {