0.8.5.14:
[sbcl.git] / src / compiler / target-disassem.lisp
index 3879374..6e07407 100644 (file)
                    (:copier nil))
   (sap-maker (missing-arg)
             :type (function () sb!sys:system-area-pointer))
-  (length 0 :type length)
+  (length 0 :type disassem-length)
   (virtual-location 0 :type address)
   (storage-info nil :type (or null storage-info))
   (code nil :type (or null sb!kernel:code-component))
              (seg-virtual-location seg)
              (seg-code seg)))))
 \f
-;;; All state during disassembly. We store some seemingly redundant
-;;; information so that we can allow garbage collect during disassembly and
-;;; not get tripped up by a code block being moved...
-(defstruct (disassem-state (:conc-name dstate-)
-                          (:constructor %make-dstate)
-                          (:copier nil))
-  ;; offset of current pos in segment
-  (cur-offs 0 :type offset)            
-  ;; offset of next position
-  (next-offs 0 :type offset)           
-  ;; a sap pointing to our segment
-  (segment-sap (missing-arg) :type sb!sys:system-area-pointer)
-  ;; the current segment                                       
-  (segment nil :type (or null segment))        
-  ;; what to align to in most cases
-  (alignment sb!vm:n-word-bytes :type alignment) 
-  (byte-order :little-endian
-             :type (member :big-endian :little-endian))
-  ;; for user code to hang stuff off of
-  (properties nil :type list)
-  (filtered-values (make-array max-filtered-value-index)
-                  :type filtered-value-vector)
-  ;; used for prettifying printing
-  (addr-print-len nil :type (or null (integer 0 20)))
-  (argument-column 0 :type column)
-  ;; to make output look nicer
-  (output-state :beginning             
-               :type (member :beginning
-                             :block-boundary
-                             nil))
-
-  ;; alist of (address . label-number)
-  (labels nil :type list)              
-  ;; same as LABELS slot data, but in a different form
-  (label-hash (make-hash-table) :type hash-table)
-  ;; list of function
-  (fun-hooks nil :type list)           
-
-  ;; alist of (address . label-number), popped as it's used
-  (cur-labels nil :type list)
-  ;; OFFS-HOOKs, popped as they're used
-  (cur-offs-hooks nil :type list)      
-
-  ;; for the current location
-  (notes nil :type list)
-
-  ;; currently active source variables
-  (current-valid-locations nil :type (or null (vector bit))))
-(def!method print-object ((dstate disassem-state) stream)
-  (print-unreadable-object (dstate stream :type t)
-    (format stream
-           "+~W~@[ in ~S~]"
-           (dstate-cur-offs dstate)
-           (dstate-segment dstate))))
-
-;;; Return the absolute address of the current instruction in DSTATE.
-(defun dstate-cur-addr (dstate)
-  (the address (+ (seg-virtual-location (dstate-segment dstate))
-                 (dstate-cur-offs dstate))))
-
-;;; Return the absolute address of the next instruction in DSTATE.
-(defun dstate-next-addr (dstate)
-  (the address (+ (seg-virtual-location (dstate-segment dstate))
-                 (dstate-next-offs dstate))))
-\f
 ;;;; function ops
 
 (defun fun-self (fun)
   (declare (type compiled-function fun))
   (sb!kernel:%simple-fun-next fun))
 
-(defun fun-address (function)
-  (declare (type compiled-function function))
-  (- (sb!kernel:get-lisp-obj-address function) sb!vm:fun-pointer-lowtag))
+(defun fun-address (fun)
+  (declare (type compiled-function fun))
+  (ecase (sb!kernel:widetag-of fun)
+    (#.sb!vm:simple-fun-header-widetag
+     (- (sb!kernel:get-lisp-obj-address fun) sb!vm:fun-pointer-lowtag))
+    (#.sb!vm:closure-header-widetag
+     (fun-address (sb!kernel:%closure-fun fun)))
+    (#.sb!vm:funcallable-instance-header-widetag
+     (fun-address (sb!kernel:funcallable-instance-fun fun)))))
 
 ;;; the offset of FUNCTION from the start of its code-component's
 ;;; instruction area
                                         (1- lra-size))))
                sb!vm:return-pc-header-widetag))
     (unless (null stream)
-      (princ '.lra stream))
-    (incf (dstate-next-offs dstate) lra-size))
+      (note "possible LRA header" dstate)))
   nil)
 
 ;;; Print the fun-header (entry-point) pseudo-instruction at the
                     debug-fun source-form-cache
                     hooks)
   (declare (type (function () sb!sys:system-area-pointer) sap-maker)
-          (type length length)
+          (type disassem-length length)
           (type (or null address) virtual-location)
           (type (or null sb!di:debug-fun) debug-fun)
           (type (or null source-form-cache) source-form-cache))
                          (length (code-inst-area-length code)))
   (declare (type sb!kernel:code-component code)
           (type offset start-offset)
-          (type length length))
+          (type disassem-length length))
   (let ((segments nil))
     (when code
       (let ((fun-map (code-fun-map code))
     (compile nil lambda)))
 
 (defun compiled-fun-or-lose (thing &optional (name thing))
-  (cond ((or (symbolp thing)
-            (and (listp thing)
-                 (eq (car thing) 'setf)))
+  (cond ((legal-fun-name-p thing)
         (compiled-fun-or-lose (fdefinition thing) thing))
        ((functionp thing)
         thing)
                           code-component
                           (use-labels t))
   (declare (type (or address sb!sys:system-area-pointer) address)
-          (type length length)
+          (type disassem-length length)
           (type stream stream)
           (type (or null sb!kernel:code-component) code-component)
           (type (member t nil) use-labels))
                      assoc-with
                      (sb!di:debug-var-symbol
                       (aref (dstate-debug-vars dstate)
-                            storage-location))
-                     stream))
+                            storage-location))))
            dstate)
       t)))
 \f