;;; FIXME: This information should probably be pulled out of the
;;; cross-compiler's tables at genesis time instead of inserted by
;;; hand here as a bare numeric constant.
-(defconstant target-layout-length 17)
+(defconstant target-layout-length 18)
;;; Return a list of names created from the cold layout INHERITS data
;;; in X.
;; the target Lisp's (RANDOM-LAYOUT-CLOS-HASH) sequence
;; and show up as the CLOS-HASH value of some other
;; LAYOUT.
- ;;
- ;; FIXME: This expression here can generate a zero value,
- ;; and the CMU CL code goes out of its way to generate
- ;; strictly positive values (even though the field is
- ;; declared as an INDEX). Check that it's really OK to
- ;; have zero values in the CLOS-HASH slots.
- (hash-value (mod (logxor (logand (random-layout-clos-hash) 15253)
- (logandc2 (random-layout-clos-hash) 15253)
- 1)
- ;; (The MOD here is defensive programming
- ;; to make sure we never write an
- ;; out-of-range value even if some joker
- ;; sets LAYOUT-CLOS-HASH-MAX to other
- ;; than 2^n-1 at some time in the
- ;; future.)
- (1+ sb!kernel:layout-clos-hash-max))))
+ (hash-value
+ (1+ (mod (logxor (logand (random-layout-clos-hash) 15253)
+ (logandc2 (random-layout-clos-hash) 15253)
+ 1)
+ ;; (The MOD here is defensive programming
+ ;; to make sure we never write an
+ ;; out-of-range value even if some joker
+ ;; sets LAYOUT-CLOS-HASH-MAX to other
+ ;; than 2^n-1 at some time in the
+ ;; future.)
+ sb!kernel:layout-clos-hash-max))))
(write-wordindexed result
(+ i sb!vm:instance-slots-offset 1)
(make-fixnum-descriptor hash-value))))
;; the names to highlight that something weird is going on. Perhaps
;; *MAYBE-GC-FUN*, *INTERNAL-ERROR-FUN*, *HANDLE-BREAKPOINT-FUN*,
;; and *HANDLE-FUN-END-BREAKPOINT-FUN*...
- (macrolet ((frob (symbol)
- `(cold-set ',symbol
- (cold-fdefinition-object (cold-intern ',symbol)))))
- (frob sub-gc)
- (frob internal-error)
- (frob sb!kernel::control-stack-exhausted-error)
- (frob sb!kernel::undefined-alien-variable-error)
- (frob sb!kernel::undefined-alien-function-error)
- (frob sb!kernel::memory-fault-error)
- (frob sb!di::handle-breakpoint)
- (frob sb!di::handle-fun-end-breakpoint)
- #!+sb-thread (frob sb!thread::run-interruption))
+ (dolist (symbol sb!vm::*c-callable-static-symbols*)
+ (cold-set symbol (cold-fdefinition-object (cold-intern symbol))))
(cold-set 'sb!vm::*current-catch-block* (make-fixnum-descriptor 0))
(cold-set 'sb!vm::*current-unwind-protect-block* (make-fixnum-descriptor 0))
(logior (mask-field (byte 16 16)
(bvref-32 gspace-bytes gspace-byte-offset))
(ldb (byte 16 0) value))))))
+ ;; FIXME: PowerPC Fixups are not fully implemented. The bit
+ ;; here starts to set things up to work properly, but there
+ ;; needs to be corresponding code in ppc-vm.lisp
(:ppc
- (ecase kind
- (:ba
- (setf (bvref-32 gspace-bytes gspace-byte-offset)
- (dpb (ash value -2) (byte 24 2)
- (bvref-32 gspace-bytes gspace-byte-offset))))
- (:ha
- (let* ((h (ldb (byte 16 16) value))
- (l (ldb (byte 16 0) value)))
- (setf (bvref-16 gspace-bytes (+ gspace-byte-offset 2))
- (if (logbitp 15 l) (ldb (byte 16 0) (1+ h)) h))))
- (:l
- (setf (bvref-16 gspace-bytes (+ gspace-byte-offset 2))
- (ldb (byte 16 0) value)))))
+ (ecase kind
+ (:ba
+ (setf (bvref-32 gspace-bytes gspace-byte-offset)
+ (dpb (ash value -2) (byte 24 2)
+ (bvref-32 gspace-bytes gspace-byte-offset))))
+ (:ha
+ (let* ((un-fixed-up (bvref-16 gspace-bytes
+ (+ gspace-byte-offset 2)))
+ (fixed-up (+ un-fixed-up value))
+ (h (ldb (byte 16 16) fixed-up))
+ (l (ldb (byte 16 0) fixed-up)))
+ (setf (bvref-16 gspace-bytes (+ gspace-byte-offset 2))
+ (if (logbitp 15 l) (ldb (byte 16 0) (1+ h)) h))))
+ (:l
+ (let* ((un-fixed-up (bvref-16 gspace-bytes
+ (+ gspace-byte-offset 2)))
+ (fixed-up (+ un-fixed-up value)))
+ (setf (bvref-16 gspace-bytes (+ gspace-byte-offset 2))
+ (ldb (byte 16 0) fixed-up))))))
(:sparc
(ecase kind
(:call