X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fgeneric%2Fcore.lisp;h=8488eee0ae443f0757127043feffcaada5b9bad9;hb=f22ad70037030c07074327cf239bd84dc17b44b6;hp=e13513684dcd26b2accaecbb487013805a455f58;hpb=97106bb159710a2e816bf4e72669d6a3818d08aa;p=sbcl.git diff --git a/src/compiler/generic/core.lisp b/src/compiler/generic/core.lisp index e135136..8488eee 100644 --- a/src/compiler/generic/core.lisp +++ b/src/compiler/generic/core.lisp @@ -14,11 +14,11 @@ ;;; A CORE-OBJECT structure holds the state needed to resolve cross-component ;;; references during in-core compilation. (defstruct (core-object - (:constructor make-core-object ()) - #-no-ansi-print-object - (:print-object (lambda (x s) - (print-unreadable-object (x s :type t)))) - (:copier nil)) + (:constructor make-core-object ()) + #-no-ansi-print-object + (:print-object (lambda (x s) + (print-unreadable-object (x s :type t)))) + (:copier nil)) ;; A hashtable translating ENTRY-INFO structures to the corresponding actual ;; FUNCTIONs for functions in this compilation. (entry-table (make-hash-table :test 'eq) :type hash-table) @@ -33,7 +33,7 @@ ;;; Note the existence of FUNCTION. (defun note-fun (info function object) (declare (type function function) - (type core-object object)) + (type core-object object)) (let ((patch-table (core-object-patch-table object))) (dolist (patch (gethash info patch-table)) (setf (code-header-ref (car patch) (the index (cdr patch))) function)) @@ -46,41 +46,41 @@ (declare (list fixup-notes)) (dolist (note fixup-notes) (let* ((kind (fixup-note-kind note)) - (fixup (fixup-note-fixup note)) - (position (fixup-note-position note)) - (name (fixup-name fixup)) - (flavor (fixup-flavor fixup)) - (value (ecase flavor - (:assembly-routine - (aver (symbolp name)) - (or (gethash name *assembler-routines*) - (error "undefined assembler routine: ~S" name))) - (:foreign - (aver (stringp name)) - ;; FOREIGN-SYMBOL-ADDRESS-AS-INTEGER signals an error - ;; if the symbol isn't found. - (foreign-symbol-address-as-integer name)) - #!+linkage-table - (:foreign-dataref - (aver (stringp name)) - (foreign-symbol-address-as-integer name t)) - #!+(or x86 x86-64) - (:code-object - (aver (null name)) - (values (get-lisp-obj-address code) t))))) + (fixup (fixup-note-fixup note)) + (position (fixup-note-position note)) + (name (fixup-name fixup)) + (flavor (fixup-flavor fixup)) + (value (ecase flavor + (:assembly-routine + (aver (symbolp name)) + (or (gethash name *assembler-routines*) + (error "undefined assembler routine: ~S" name))) + (:foreign + (aver (stringp name)) + ;; FOREIGN-SYMBOL-ADDRESS signals an error + ;; if the symbol isn't found. + (foreign-symbol-address name)) + #!+linkage-table + (:foreign-dataref + (aver (stringp name)) + (foreign-symbol-address name t)) + #!+(or x86 x86-64) + (:code-object + (aver (null name)) + (values (get-lisp-obj-address code) t))))) (sb!vm:fixup-code-object code position value kind)))) ;;; Stick a reference to the function FUN in CODE-OBJECT at index I. If the ;;; function hasn't been compiled yet, make a note in the patch table. (defun reference-core-fun (code-obj i fun object) (declare (type core-object object) (type functional fun) - (type index i)) + (type index i)) (let* ((info (leaf-info fun)) - (found (gethash info (core-object-entry-table object)))) + (found (gethash info (core-object-entry-table object)))) (if found - (setf (code-header-ref code-obj i) found) - (push (cons code-obj i) - (gethash info (core-object-patch-table object))))) + (setf (code-header-ref code-obj i) found) + (push (cons code-obj i) + (gethash info (core-object-patch-table object))))) (values)) ;;; Call the top level lambda function dumped for ENTRY, returning the @@ -88,18 +88,17 @@ (defun core-call-toplevel-lambda (entry object) (declare (type functional entry) (type core-object object)) (funcall (or (gethash (leaf-info entry) - (core-object-entry-table object)) - (error "Unresolved forward reference.")))) + (core-object-entry-table object)) + (error "Unresolved forward reference.")))) ;;; Backpatch all the DEBUG-INFOs dumped so far with the specified ;;; SOURCE-INFO list. We also check that there are no outstanding ;;; forward references to functions. (defun fix-core-source-info (info object &optional function) (declare (type core-object object) - (type (or null function) function)) + (type (or null function) function)) (aver (zerop (hash-table-count (core-object-patch-table object)))) - (let ((source (debug-source-for-info info))) - (setf (debug-source-function source) function) + (let ((source (debug-source-for-info info :function function))) (dolist (info (core-object-debug-info object)) (setf (debug-info-source info) source))) (setf (core-object-debug-info object) nil)