0.8.0.3:
[sbcl.git] / src / code / cold-init.lisp
index 187c47b..acf20fb 100644 (file)
@@ -21,6 +21,9 @@
 ;;; which might be tedious to maintain, instead we use a hack:
 ;;; anything whose name matches a magic character pattern is
 ;;; uninterned.
+;;;
+;;; FIXME: Are there other tables that need to have entries removed?
+;;; What about symbols of the form DEF!FOO?
 (defun !unintern-init-only-stuff ()
   (do ((any-changes? nil nil))
       (nil)
                         (string= name "*!" :end1 2 :end2 2)))
            (/show0 "uninterning cold-init-only symbol..")
            (/primitive-print name)
+           ;; FIXME: Is this (FIRST (LAST *INFO-ENVIRONMENT*)) really
+           ;; meant to be an idiom to use?  Is there a more obvious
+           ;; name for this? [e.g. (GLOBAL-ENVIRONMENT)?]
+           (do-info ((first (last *info-environment*))
+                           :name entry :class class :type type)
+             (when (eq entry symbol)
+               (clear-info class type entry)))
            (unintern symbol package)
            (setf any-changes? t)))))
     (unless any-changes?
       (return))))
 \f
+;;;; putting ourselves out of our misery when things become too much to bear
+
+(declaim (ftype (function (simple-string) nil) critically-unreachable))
+(defun !cold-lose (msg)
+  (%primitive print msg)
+  (%primitive print "too early in cold init to recover from errors")
+  (%halt))
+
+;;; last-ditch error reporting for things which should never happen
+;;; and which, if they do happen, are sufficiently likely to torpedo
+;;; the normal error-handling system that we want to bypass it
+(declaim (ftype (function (simple-string) nil) critically-unreachable))
+(defun critically-unreachable (where)
+  (%primitive print "internal error: Control should never reach here, i.e.")
+  (%primitive print where)
+  (%halt))
+\f
 ;;;; !COLD-INIT
 
 ;;; a list of toplevel things set by GENESIS
 ;;; a SIMPLE-VECTOR set by GENESIS
 (defvar *!load-time-values*)
 
-(defun !cold-lose (msg)
-  (%primitive print msg)
-  (%primitive print "too early in cold init to recover from errors")
-  (%halt))
-
 (eval-when (:compile-toplevel :execute)
   ;; FIXME: Perhaps we should make SHOW-AND-CALL-AND-FMAKUNBOUND, too,
   ;; and use it for most of the cold-init functions. (Just be careful
@@ -73,8 +95,7 @@
   (setf *gc-notify-stream* nil
         *before-gc-hooks* nil
         *after-gc-hooks* nil
-        *already-maybe-gcing* t
-       *gc-inhibit* t
+       *gc-inhibit* 1
        *need-to-collect-garbage* nil
        sb!unix::*interrupts-enabled* t
        sb!unix::*interrupt-pending* nil
         *cold-init-complete-p* nil
         *type-system-initialized* nil)
 
+  (show-and-call !typecheckfuns-cold-init)
+
   ;; Anyone might call RANDOM to initialize a hash value or something;
   ;; and there's nothing which needs to be initialized in order for
   ;; this to be initialized, so we initialize it right away.
   (show-and-call !random-cold-init)
 
   (show-and-call !package-cold-init)
-
+  
   ;; All sorts of things need INFO and/or (SETF INFO).
   (/show0 "about to SHOW-AND-CALL !GLOBALDB-COLD-INIT")
   (show-and-call !globaldb-cold-init)
 
   ;; This needs to be done early, but needs to be after INFO is
   ;; initialized.
+  (show-and-call !function-names-cold-init)
   (show-and-call !fdefn-cold-init)
 
   ;; Various toplevel forms call MAKE-ARRAY, which calls SUBTYPEP, so
            (setf (svref *!load-time-values* (third toplevel-thing))
                  (funcall (second toplevel-thing))))
           (:load-time-value-fixup
-           #!-gengc
            (setf (sap-ref-32 (second toplevel-thing) 0)
                  (get-lisp-obj-address
                   (svref *!load-time-values* (third toplevel-thing)))))
           #!+(and x86 gencgc)
           (:load-time-code-fixup
-           (sb!vm::!do-load-time-code-fixup (second toplevel-thing)
-                                            (third  toplevel-thing)
-                                            (fourth toplevel-thing)
-                                            (fifth  toplevel-thing)))
+           (sb!vm::!envector-load-time-code-fixup (second toplevel-thing)
+                                                  (third  toplevel-thing)
+                                                  (fourth toplevel-thing)
+                                                  (fifth  toplevel-thing)))
           (t
            (!cold-lose "bogus fixup code in *!REVERSED-COLD-TOPLEVELS*"))))
        (t (!cold-lose "bogus function in *!REVERSED-COLD-TOPLEVELS*")))))
 
   ;; FIXME: This list of modes should be defined in one place and
   ;; explicitly shared between here and REINIT.
-  ;;
-  ;; FIXME: In CMU CL, this is done "here" (i.e. in the analogous
-  ;; lispinit.lisp code) for every processor architecture. But Daniel
-  ;; Barlow's Alpha patches suppress it for Alpha. Why the difference?
-  #!+alpha
-  (set-floating-point-modes :traps '(:overflow
-                                    #!-x86 :underflow
-                                    :invalid
-                                    :divide-by-zero))
+
+  ;; Why was this marked #!+alpha?  CMUCL does it here on all architectures
+  (set-floating-point-modes :traps '(:overflow :invalid :divide-by-zero))
 
   (show-and-call !class-finalize)
 
 
   ;; the ANSI-specified initial value of *PACKAGE*
   (setf *package* (find-package "COMMON-LISP-USER"))
-  ;; FIXME: I'm not sure where it should be done, but CL-USER really
-  ;; ought to USE-PACKAGE publicly accessible packages like SB-DEBUG
-  ;; (for ARG and VAR), SB-EXT, SB-EXT-C-CALL, and SB-EXT-ALIEN so
-  ;; that the user has a hint about which symbols we consider public.
-  ;; (Perhaps SB-DEBUG wouldn't need to be in the list if ARG and VAR
-  ;; could be typed directly, with no parentheses, at the debug prompt
-  ;; the way that e.g. F or BACKTRACE can be?)
 
   (/show0 "done initializing, setting *COLD-INIT-COMPLETE-P*")
   (setf *cold-init-complete-p* t)
 
   ;; The system is finally ready for GC.
-  #!-gengc (setf *already-maybe-gcing* nil)
   (/show0 "enabling GC")
   (gc-on)
   (/show0 "doing first GC")
   (terpri)
   (/show0 "going into toplevel loop")
   (handling-end-of-the-world 
-    (toplevel-init)))
+    (toplevel-init)
+    (critically-unreachable "after TOPLEVEL-INIT")))
 
 (defun quit (&key recklessly-p
                  (unix-code 0 unix-code-p)
   "Terminate the current Lisp. Things are cleaned up (with UNWIND-PROTECT
   and so forth) unless RECKLESSLY-P is non-NIL. On UNIX-like systems,
   UNIX-STATUS is used as the status code."
-  (declare (type (signed-byte 32) unix-code))
+  (declare (type (signed-byte 32) unix-status unix-code))
+  (/show0 "entering QUIT")
   ;; FIXME: UNIX-CODE was deprecated in sbcl-0.6.8, after having been
   ;; around for less than a year. It should be safe to remove it after
   ;; a year.
 instead (which is another name for the same thing)."))
   (if recklessly-p
       (sb!unix:unix-exit unix-status)
-      (throw '%end-of-the-world unix-status)))
+      (throw '%end-of-the-world unix-status))
+  (critically-unreachable "after trying to die in QUIT"))
 \f
 ;;;; initialization functions
 
@@ -264,20 +276,13 @@ instead (which is another name for the same thing)."))
       (os-cold-init-or-reinit)
       (stream-reinit)
       (signal-cold-init-or-reinit)
-      (gc-reinit)
       (setf (sb!alien:extern-alien "internal_errors_enabled" boolean) t)
-      (set-floating-point-modes :traps
-                               '(:overflow
-                                 :invalid
-                                 :divide-by-zero
-                                 ;; PRINT seems not to like x86 NPX
-                                 ;; denormal floats like
-                                 ;; LEAST-NEGATIVE-SINGLE-FLOAT, so
-                                 ;; the :UNDERFLOW exceptions are
-                                 ;; disabled by default. Joe User can
-                                 ;; explicitly enable them if
-                                 ;; desired.
-                                 #!-x86 :underflow))
+      ;; PRINT seems not to like x86 NPX denormal floats like
+      ;; LEAST-NEGATIVE-SINGLE-FLOAT, so the :UNDERFLOW exceptions are
+      ;; disabled by default. Joe User can explicitly enable them if
+      ;; desired.
+      (set-floating-point-modes :traps '(:overflow :invalid :divide-by-zero))
+
       ;; Clear pseudo atomic in case this core wasn't compiled with
       ;; support.
       ;;
@@ -286,8 +291,9 @@ instead (which is another name for the same thing)."))
       ;; reason.. (Perhaps we should do it anyway in case someone
       ;; manages to save an image from within a pseudo-atomic-atomic
       ;; operation?)
-      #!+x86 (setf *pseudo-atomic-atomic* 0))
-    (gc-on)))
+      #!+x86 (setf *pseudo-atomic-atomic* 0)))
+  (gc-on)
+  (gc))
 \f
 ;;;; some support for any hapless wretches who end up debugging cold
 ;;;; init code
@@ -297,7 +303,7 @@ instead (which is another name for the same thing)."))
 #!+sb-show
 (defun hexstr (thing)
   (/noshow0 "entering HEXSTR")
-  (let ((addr (sb!kernel:get-lisp-obj-address thing))
+  (let ((addr (get-lisp-obj-address thing))
        (str (make-string 10)))
     (/noshow0 "ADDR and STR calculated")
     (setf (char str 0) #\0