1 ;;;; target-only code that knows how to load compiled code directly
4 ;;;; This software is part of the SBCL system. See the README file for
7 ;;;; This software is derived from the CMU CL system, which was
8 ;;;; written at Carnegie Mellon University and released into the
9 ;;;; public domain. The software is in the public domain and is
10 ;;;; provided with absolutely no warranty. See the COPYING and CREDITS
11 ;;;; files for more information.
18 ;;; Make a function entry, filling in slots from the ENTRY-INFO.
19 (defun make-function-entry (entry code-obj object)
20 (declare (type entry-info entry) (type core-object object))
21 (let ((offset (label-position (entry-info-offset entry))))
22 (declare (type index offset))
23 (unless (zerop (logand offset sb!vm:lowtag-mask))
24 (error "Unaligned function object, offset = #X~X." offset))
25 (let ((res (%primitive compute-function code-obj offset)))
26 (setf (%function-self res) res)
27 (setf (%function-next res) (%code-entry-points code-obj))
28 (setf (%code-entry-points code-obj) res)
29 (setf (%function-name res) (entry-info-name entry))
30 (setf (%function-arglist res) (entry-info-arguments entry))
31 (setf (%function-type res) (entry-info-type entry))
33 (note-function entry res object))))
35 ;;; Dump a component to core. We pass in the assembler fixups, code vector
37 (defun make-core-component (component segment length trace-table fixups object)
38 (declare (type component component)
39 (type sb!assem:segment segment)
41 (list trace-table fixups)
42 (type core-object object))
44 (let* ((2comp (component-info component))
45 (constants (ir2-component-constants 2comp))
46 (trace-table (pack-trace-table trace-table))
47 (trace-table-len (length trace-table))
48 (trace-table-bits (* trace-table-len tt-bits-per-entry))
49 (total-length (+ length (ceiling trace-table-bits sb!vm:byte-bits)))
50 (box-num (- (length constants) sb!vm:code-trace-table-offset-slot))
53 ;; FIXME: What is this *ENABLE-DYNAMIC-SPACE-CODE* stuff?
54 (if (and (boundp sb!impl::*enable-dynamic-space-code*)
55 sb!impl::*enable-dynamic-space-code*)
56 (%primitive allocate-dynamic-code-object box-num total-length)
57 (%primitive allocate-code-object box-num total-length)))
60 (%primitive allocate-code-object box-num total-length))
61 (fill-ptr (code-instructions code-obj)))
62 (declare (type index box-num total-length))
64 (sb!assem:on-segment-contents-vectorly
67 (declare (type (simple-array sb!assem:assembly-unit 1) v))
68 (copy-byte-vector-to-system-area v fill-ptr)
69 (setf fill-ptr (sap+ fill-ptr (length v)))))
71 (do-core-fixups code-obj fixups)
73 (dolist (entry (ir2-component-entries 2comp))
74 (make-function-entry entry code-obj object))
76 (sb!vm:sanctify-for-execution code-obj)
78 (let ((info (debug-info-for-component component)))
79 (push info (core-object-debug-info object))
80 (setf (%code-debug-info code-obj) info))
82 (setf (code-header-ref code-obj sb!vm:code-trace-table-offset-slot) length)
83 (copy-to-system-area trace-table
84 (* sb!vm:vector-data-offset sb!vm:word-bits)
89 (do ((index sb!vm:code-constants-offset (1+ index)))
90 ((>= index (length constants)))
91 (let ((const (aref constants index)))
95 (setf (code-header-ref code-obj index)
96 (constant-value const)))
100 (reference-core-function code-obj index
103 (setf (code-header-ref code-obj index)
104 (sb!impl::fdefinition-object (cdr const) t))))))))))
107 (defun make-core-byte-component (segment length constants xeps object)
108 (declare (type sb!assem:segment segment)
110 (type vector constants)
112 (type core-object object))
114 (let* ((num-constants (length constants))
115 ;; KLUDGE: On the X86, using ALLOCATE-CODE-OBJECT is
116 ;; supposed to make the result non-relocatable, which is
117 ;; probably not what we want. Could this be made into
118 ;; ALLOCATE-DYNAMIC-CODE-OBJECT? Is there some other fix?
119 ;; Am I just confused? -- WHN 19990916
120 (code-obj (%primitive allocate-code-object
121 (the index (1+ num-constants))
123 (fill-ptr (code-instructions code-obj)))
124 (declare (type index length)
125 (type system-area-pointer fill-ptr))
126 (sb!assem:on-segment-contents-vectorly
129 (declare (type (simple-array sb!assem:assembly-unit 1) v))
130 (copy-byte-vector-to-system-area v fill-ptr)
131 (setf fill-ptr (sap+ fill-ptr (length v)))))
133 (setf (code-header-ref code-obj sb!vm:code-trace-table-offset-slot)
136 (let ((xep (cdr noise)))
137 (setf (byte-function-component xep) code-obj)
138 (initialize-byte-compiled-function xep)
139 (note-function (lambda-info (car noise)) xep object)))
141 (dotimes (index num-constants)
142 (let ((const (aref constants index))
143 (code-obj-index (+ index sb!vm:code-constants-offset)))
147 (setf (code-header-ref code-obj code-obj-index)
148 (constant-value const)))
152 (reference-core-function code-obj code-obj-index (cdr const)
155 (setf (code-header-ref code-obj code-obj-index)
156 (sb!impl::fdefinition-object (cdr const) t)))
158 (let ((*unparse-function-type-simplify* t))
159 (setf (code-header-ref code-obj code-obj-index)
160 (load-type-predicate (type-specifier (cdr const))))))
162 (let ((xep (cdr (assoc (cdr const) xeps :test #'eq))))
164 (setf (code-header-ref code-obj code-obj-index) xep))))))))))