0.7.1.18:
[sbcl.git] / src / compiler / generic / genesis.lisp
index 2a19595..93ea581 100644 (file)
 (defun cold-intern (symbol &optional (package (symbol-package symbol)))
 
   ;; Anything on the cross-compilation host which refers to the target
-  ;; machinery through the host SB-XC package can be translated to
+  ;; machinery through the host SB-XC package should be translated to
   ;; something on the target which refers to the same machinery
   ;; through the target COMMON-LISP package.
   (let ((p (find-package "SB-XC")))
     (when (eq (symbol-package symbol) p)
       (setf symbol (intern (symbol-name symbol) *cl-package*))))
 
+  ;; Make sure that the symbol has an appropriate package. In
+  ;; particular, catch the so-easy-to-make error of typing something
+  ;; like SB-KERNEL:%BYTE-BLT in cold sources when what you really
+  ;; need is SB!KERNEL:%BYTE-BLT.
+  (let ((package-name (package-name package)))
+    (cond ((find package-name '("COMMON-LISP" "KEYWORD") :test #'string=)
+          ;; That's OK then.
+          (values))
+         ((string= package-name "SB!" :end1 3 :end2 3)
+          ;; That looks OK, too. (All the target-code packages
+          ;; have names like that.)
+          (values))
+         (t
+          ;; looks bad: maybe COMMON-LISP-USER? maybe an extension
+          ;; package in the xc host? something we can't think of
+          ;; a valid reason to dump, anyway...
+          (bug "internal error: PACKAGE-NAME=~S looks too much like a typo."
+               package-name))))
+
   (let (;; Information about each cold-interned symbol is stored
        ;; in COLD-INTERN-INFO.
        ;;   (CAR COLD-INTERN-INFO) = descriptor of symbol
 
   (cold-set '*current-catch-block*          (make-fixnum-descriptor 0))
   (cold-set '*current-unwind-protect-block* (make-fixnum-descriptor 0))
-  (cold-set '*eval-stack-top*               (make-fixnum-descriptor 0))
 
   (cold-set '*free-interrupt-context-index* (make-fixnum-descriptor 0))
 
                                sb!vm:fun-pointer-lowtag))
         (next (read-wordindexed code-object sb!vm:code-entry-points-slot)))
     (unless (zerop (logand offset sb!vm:lowtag-mask))
-      ;; FIXME: This should probably become a fatal error.
-      (warn "unaligned function entry: ~S at #X~X" name offset))
+      (error "unaligned function entry: ~S at #X~X" name offset))
     (write-wordindexed code-object sb!vm:code-entry-points-slot fn)
     (write-memory fn
                  (make-other-immediate-descriptor
                       ;; code instead of a pointer back to the object
                       ;; itself.) Ask on the mailing list whether
                       ;; this is documented somewhere, and if not,
-                      ;; try to reverse engineer some documentation
-                      ;; before release.
+                      ;; try to reverse engineer some documentation.
                       #!-x86
                       ;; a pointer back to the function object, as
                       ;; described in CMU CL
 
   ;; writing codes/strings for internal errors
   (format t "#define ERRORS { \\~%")
-  ;; FIXME: Is this just DOVECTOR?
   (let ((internal-errors sb!c:*backend-internal-errors*))
     (dotimes (i (length internal-errors))
       (format t "    ~S, /*~D*/ \\~%" (cdr (aref internal-errors i)) i)))
 
   ;; writing static symbol offsets
   (dolist (symbol (cons nil sb!vm:*static-symbols*))
-    ;; FIXME: It would be nice to use longer names NIL and (particularly) T
-    ;; in #define statements.
+    ;; FIXME: It would be nice to use longer names than NIL and
+    ;; (particularly) T in #define statements.
     (format t "#define ~A LISPOBJ(0x~X)~%"
            (nsubstitute #\_ #\-
                         (remove-if (lambda (char)
@@ -2745,8 +2760,8 @@ initially undefined function references:~2%")
 (defparameter initial-fun-entry-type-code 3863)
 (defparameter end-entry-type-code 3840)
 
-(declaim (ftype (function (sb!vm:word) sb!vm:word) write-long))
-(defun write-long (num) ; FIXME: WRITE-WORD would be a better name.
+(declaim (ftype (function (sb!vm:word) sb!vm:word) write-word))
+(defun write-word (num)
   (ecase sb!c:*backend-byte-order*
     (:little-endian
      (dotimes (i 4)
@@ -2794,14 +2809,14 @@ initially undefined function references:~2%")
     ;;   DATA PAGE
     ;;   ADDRESS
     ;;   PAGE COUNT
-    (write-long (gspace-identifier gspace))
-    (write-long (gspace-free-word-index gspace))
-    (write-long *data-page*)
+    (write-word (gspace-identifier gspace))
+    (write-word (gspace-free-word-index gspace))
+    (write-word *data-page*)
     (multiple-value-bind (floor rem)
        (floor (gspace-byte-address gspace) sb!c:*backend-page-size*)
       (aver (zerop rem))
-      (write-long floor))
-    (write-long pages)
+      (write-word floor))
+    (write-word pages)
 
     (incf *data-page* pages)))
 
@@ -2826,24 +2841,24 @@ initially undefined function references:~2%")
                                 :if-exists :rename-and-delete)
 
       ;; Write the magic number.
-      (write-long core-magic)
+      (write-word core-magic)
 
       ;; Write the Version entry.
-      (write-long version-entry-type-code)
-      (write-long 3)
-      (write-long sbcl-core-version-integer)
+      (write-word version-entry-type-code)
+      (write-word 3)
+      (write-word sbcl-core-version-integer)
 
       ;; Write the New Directory entry header.
-      (write-long new-directory-entry-type-code)
-      (write-long 17) ; length = (5 words/space) * 3 spaces + 2 for header.
+      (write-word new-directory-entry-type-code)
+      (write-word 17) ; length = (5 words/space) * 3 spaces + 2 for header.
 
       (output-gspace *read-only*)
       (output-gspace *static*)
       (output-gspace *dynamic*)
 
       ;; Write the initial function.
-      (write-long initial-fun-entry-type-code)
-      (write-long 3)
+      (write-word initial-fun-entry-type-code)
+      (write-word 3)
       (let* ((cold-name (cold-intern '!cold-init))
             (cold-fdefn (cold-fdefinition-object cold-name))
             (initial-fun (read-wordindexed cold-fdefn
@@ -2851,11 +2866,11 @@ initially undefined function references:~2%")
        (format t
                "~&/(DESCRIPTOR-BITS INITIAL-FUN)=#X~X~%"
                (descriptor-bits initial-fun))
-       (write-long (descriptor-bits initial-fun)))
+       (write-word (descriptor-bits initial-fun)))
 
       ;; Write the End entry.
-      (write-long end-entry-type-code)
-      (write-long 2)))
+      (write-word end-entry-type-code)
+      (write-word 2)))
 
   (format t "done]~%")
   (force-output)