X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fgeneric%2Ftarget-core.lisp;h=3174ae5e30d2534a50f09b3e149c3f3f77c39090;hb=11f6bc8c710bfa83e8cddbc9a389be02ae6ee7ef;hp=4168eba6cd4ea647b88a595e861914dd0c7dc70f;hpb=361040122aed4fd4e24bd014818955e5e3028a8f;p=sbcl.git diff --git a/src/compiler/generic/target-core.lisp b/src/compiler/generic/target-core.lisp index 4168eba..3174ae5 100644 --- a/src/compiler/generic/target-core.lisp +++ b/src/compiler/generic/target-core.lisp @@ -16,6 +16,17 @@ (in-package "SB!C") +(declaim (ftype (function (fixnum fixnum) (values code-component &optional)) + allocate-code-object)) +(defun allocate-code-object (boxed unboxed) + #!+gencgc + (without-gcing + (%make-lisp-obj + (alien-funcall (extern-alien "alloc_code_object" (function unsigned unsigned unsigned)) + boxed unboxed))) + #!-gencgc + (%primitive allocate-code-object boxed unboxed)) + ;;; Make a function entry, filling in slots from the ENTRY-INFO. (defun make-fun-entry (entry-info code-obj object) (declare (type entry-info entry-info) (type core-object object)) @@ -30,6 +41,7 @@ (setf (%simple-fun-name res) (entry-info-name entry-info)) (setf (%simple-fun-arglist res) (entry-info-arguments entry-info)) (setf (%simple-fun-type res) (entry-info-type entry-info)) + (setf (%simple-fun-info res) (entry-info-info entry-info)) (note-fun entry-info res object)))) @@ -37,63 +49,71 @@ ;;; vector and node info. (defun make-core-component (component segment length trace-table fixup-notes object) (declare (type component component) - (type sb!assem:segment segment) - (type index length) - (list trace-table fixup-notes) - (type core-object object)) + (type sb!assem:segment segment) + (type index length) + (list trace-table fixup-notes) + (type core-object object)) (without-gcing (let* ((2comp (component-info component)) - (constants (ir2-component-constants 2comp)) - (trace-table (pack-trace-table trace-table)) - (trace-table-len (length trace-table)) - (trace-table-bits (* trace-table-len tt-bits-per-entry)) - (total-length (+ length - (ceiling trace-table-bits sb!vm:n-byte-bits))) - (box-num (- (length constants) sb!vm:code-trace-table-offset-slot)) - (code-obj - (%primitive allocate-code-object box-num total-length)) - (fill-ptr (code-instructions code-obj))) + (constants (ir2-component-constants 2comp)) + (trace-table (pack-trace-table trace-table)) + (trace-table-len (length trace-table)) + (trace-table-bits (* trace-table-len tt-bits-per-entry)) + (total-length (+ length + (ceiling trace-table-bits sb!vm:n-byte-bits))) + (box-num (- (length constants) sb!vm:code-trace-table-offset-slot)) + (code-obj (allocate-code-object box-num total-length)) + (fill-ptr (code-instructions code-obj))) (declare (type index box-num total-length)) (sb!assem:on-segment-contents-vectorly segment (lambda (v) - (declare (type (simple-array sb!assem:assembly-unit 1) v)) - (copy-byte-vector-to-system-area v fill-ptr) - (setf fill-ptr (sap+ fill-ptr (length v))))) + (declare (type (simple-array sb!assem:assembly-unit 1) v)) + (copy-byte-vector-to-system-area v fill-ptr) + (setf fill-ptr (sap+ fill-ptr (length v))))) (do-core-fixups code-obj fixup-notes) (dolist (entry (ir2-component-entries 2comp)) - (make-fun-entry entry code-obj object)) + (make-fun-entry entry code-obj object)) (sb!vm:sanctify-for-execution code-obj) (let ((info (debug-info-for-component component))) - (push info (core-object-debug-info object)) - (setf (%code-debug-info code-obj) info)) + (push info (core-object-debug-info object)) + (setf (%code-debug-info code-obj) info)) (setf (code-header-ref code-obj sb!vm:code-trace-table-offset-slot) - length) - (copy-to-system-area trace-table - (* sb!vm:vector-data-offset sb!vm:n-word-bits) - fill-ptr - 0 - trace-table-bits) + length) + ;; KLUDGE: the "old" COPY-TO-SYSTEM-AREA automagically worked if + ;; somebody changed the number of bytes in a trace table entry. + ;; This version is a bit more fragile; if only there were some way + ;; to insulate ourselves against changes like that... + ;; + ;; Then again, PACK-TRACE-TABLE in src/compiler/trace-table.lisp + ;; doesn't appear to do anything interesting, returning a 0-length + ;; array. So it seemingly doesn't matter what we do here. Is this + ;; stale code? + ;; --njf, 2005-03-23 + (copy-ub16-to-system-area trace-table 0 fill-ptr 0 trace-table-len) (do ((index sb!vm:code-constants-offset (1+ index))) - ((>= index (length constants))) - (let ((const (aref constants index))) - (etypecase const - (null) - (constant - (setf (code-header-ref code-obj index) - (constant-value const))) - (list - (ecase (car const) - (:entry - (reference-core-fun code-obj index (cdr const) object)) - (:fdefinition - (setf (code-header-ref code-obj index) - (fdefinition-object (cdr const) t)))))))))) + ((>= index (length constants))) + (let ((const (aref constants index))) + (etypecase const + (null) + (constant + (setf (code-header-ref code-obj index) + (constant-value const))) + (list + (ecase (car const) + (:entry + (reference-core-fun code-obj index (cdr const) object)) + (:fdefinition + (setf (code-header-ref code-obj index) + (fdefinition-object (cdr const) t))) + (:known-fun + (setf (code-header-ref code-obj index) + (%coerce-name-to-fun (cdr const))))))))))) (values))