0.pre7.52:
[sbcl.git] / src / compiler / target-disassem.lisp
index 20f14dc..3f39d3c 100644 (file)
        (string
         (write-string note stream))
        (function
-           (funcall note stream))))
+        (funcall note stream))))
       (terpri stream))
     (fresh-line stream)
     (setf (dstate-notes dstate) nil)))
 ;;; SAP-MAKER and LENGTH bytes long in the disassem-state object DSTATE.
 ;;;
 ;;; &KEY arguments include :VIRTUAL-LOCATION (by default the same as
-;;; the address), :DEBUG-FUNCTION, :SOURCE-FORM-CACHE (a
+;;; the address), :DEBUG-FUN, :SOURCE-FORM-CACHE (a
 ;;; SOURCE-FORM-CACHE object), and :HOOKS (a list of OFFS-HOOK
 ;;; objects).
 (defun make-segment (sap-maker length
                     &key
                     code virtual-location
-                    debug-function source-form-cache
+                    debug-fun source-form-cache
                     hooks)
   (declare (type (function () sb!sys:system-area-pointer) sap-maker)
           (type length length)
           (type (or null address) virtual-location)
-          (type (or null sb!di:debug-function) debug-function)
+          (type (or null sb!di:debug-fun) debug-fun)
           (type (or null source-form-cache) source-form-cache))
   (let* ((segment
          (%make-segment
                                 (sb!sys:sap-int (funcall sap-maker)))
           :hooks hooks
           :code code)))
-    (add-debugging-hooks segment debug-function source-form-cache)
+    (add-debugging-hooks segment debug-fun source-form-cache)
     (add-fun-header-hooks segment)
     segment))
 
     new))
 
 ;;; Return a STORAGE-INFO struction describing the object-to-source
-;;; variable mappings from DEBUG-FUNCTION.
-(defun storage-info-for-debug-function (debug-function)
-  (declare (type sb!di:debug-function debug-function))
+;;; variable mappings from DEBUG-FUN.
+(defun storage-info-for-debug-fun (debug-fun)
+  (declare (type sb!di:debug-fun debug-fun))
   (let ((sc-vec sb!c::*backend-sc-numbers*)
        (groups nil)
-       (debug-vars (sb!di::debug-function-debug-vars
-                    debug-function)))
+       (debug-vars (sb!di::debug-fun-debug-vars
+                    debug-fun)))
     (and debug-vars
         (dotimes (debug-var-offset
                   (length debug-vars)
                       )))))))
         )))
 
-(defun source-available-p (debug-function)
+(defun source-available-p (debug-fun)
   (handler-case
-      (sb!di:do-debug-function-blocks (block debug-function)
+      (sb!di:do-debug-fun-blocks (block debug-fun)
        (declare (ignore block))
        (return t))
     (sb!di:no-debug-blocks () nil)))
 ;;; disassembly. SFCACHE can be either NIL or it can be a
 ;;; SOURCE-FORM-CACHE structure, in which case it is used to cache
 ;;; forms from files.
-(defun add-source-tracking-hooks (segment debug-function &optional sfcache)
+(defun add-source-tracking-hooks (segment debug-fun &optional sfcache)
   (declare (type segment segment)
-          (type (or null sb!di:debug-function) debug-function)
+          (type (or null sb!di:debug-fun) debug-fun)
           (type (or null source-form-cache) sfcache))
   (let ((last-block-pc -1))
     (flet ((add-hook (pc fun &optional before-address)
                    :before-address before-address)
                   (seg-hooks segment))))
       (handler-case
-         (sb!di:do-debug-function-blocks (block debug-function)
+         (sb!di:do-debug-fun-blocks (block debug-fun)
            (let ((first-location-in-block-p t))
              (sb!di:do-debug-block-locations (loc block)
                (let ((pc (sb!di::compiled-code-location-pc loc)))
                  ))))
        (sb!di:no-debug-blocks () nil)))))
 
-(defun add-debugging-hooks (segment debug-function &optional sfcache)
-  (when debug-function
+(defun add-debugging-hooks (segment debug-fun &optional sfcache)
+  (when debug-fun
     (setf (seg-storage-info segment)
-         (storage-info-for-debug-function debug-function))
-    (add-source-tracking-hooks segment debug-function sfcache)
-    (let ((kind (sb!di:debug-function-kind debug-function)))
+         (storage-info-for-debug-fun debug-fun))
+    (add-source-tracking-hooks segment debug-fun sfcache)
+    (let ((kind (sb!di:debug-fun-kind debug-fun)))
       (flet ((anh (n)
               (push (make-offs-hook
                      :offset 0
     (let ((first-block-seen-p nil)
          (nil-block-seen-p nil)
          (last-offset 0)
-         (last-debug-function nil)
+         (last-debug-fun nil)
          (segments nil))
       (flet ((add-seg (offs len df)
               (when (> len 0)
                 (push (make-code-segment code offs len
-                                         :debug-function df
+                                         :debug-fun df
                                          :source-form-cache sfcache)
                       segments))))
        (dotimes (fmap-index (length function-map))
               (when first-block-seen-p
                 (add-seg last-offset
                          (- fmap-entry last-offset)
-                         last-debug-function)
-                (setf last-debug-function nil))
+                         last-debug-fun)
+                (setf last-debug-fun nil))
               (setf last-offset fmap-entry))
-             (sb!c::compiled-debug-function
-              (let ((name (sb!c::compiled-debug-function-name fmap-entry))
-                    (kind (sb!c::compiled-debug-function-kind fmap-entry)))
+             (sb!c::compiled-debug-fun
+              (let ((name (sb!c::compiled-debug-fun-name fmap-entry))
+                    (kind (sb!c::compiled-debug-fun-kind fmap-entry)))
                 #+nil
                 (format t ";;; SAW ~S ~S ~S,~S ~D,~D~%"
                         name kind first-block-seen-p nil-block-seen-p
                         last-offset
-                        (sb!c::compiled-debug-function-start-pc fmap-entry))
+                        (sb!c::compiled-debug-fun-start-pc fmap-entry))
                 (cond (#+nil (eq last-offset fun-offset)
                              (and (equal name fname) (not first-block-seen-p))
                              (setf first-block-seen-p t))
                          (return))
                        (when first-block-seen-p
                          (setf nil-block-seen-p t))))
-                (setf last-debug-function
-                      (sb!di::make-compiled-debug-function fmap-entry code))
+                (setf last-debug-fun
+                      (sb!di::make-compiled-debug-fun fmap-entry code))
                 )))))
        (let ((max-offset (code-inst-area-length code)))
-         (when (and first-block-seen-p last-debug-function)
+         (when (and first-block-seen-p last-debug-fun)
            (add-seg last-offset
                     (- max-offset last-offset)
-                    last-debug-function))
+                    last-debug-fun))
          (if (null segments)
              (let ((offs (fun-insts-offset function)))
                (make-code-segment code offs (- max-offset offs)))
       (let ((function-map (code-function-map code))
            (sfcache (make-source-form-cache)))
        (let ((last-offset 0)
-             (last-debug-function nil))
+             (last-debug-fun nil))
          (flet ((add-seg (offs len df)
                   (let* ((restricted-offs
                           (min (max start-offset offs)
                     (when (> restricted-len 0)
                       (push (make-code-segment code
                                                restricted-offs restricted-len
-                                               :debug-function df
+                                               :debug-fun df
                                                :source-form-cache sfcache)
                             segments)))))
            (dotimes (fmap-index (length function-map))
                (etypecase fmap-entry
                  (integer
                   (add-seg last-offset (- fmap-entry last-offset)
-                           last-debug-function)
-                  (setf last-debug-function nil)
+                           last-debug-fun)
+                  (setf last-debug-fun nil)
                   (setf last-offset fmap-entry))
-                 (sb!c::compiled-debug-function
-                  (setf last-debug-function
-                        (sb!di::make-compiled-debug-function fmap-entry
+                 (sb!c::compiled-debug-fun
+                  (setf last-debug-fun
+                        (sb!di::make-compiled-debug-fun fmap-entry
                                                              code))))))
-           (when last-debug-function
+           (when last-debug-fun
              (add-seg last-offset
                       (- (code-inst-area-length code) last-offset)
-                      last-debug-function))))))
+                      last-debug-fun))))))
     (if (null segments)
        (make-code-segment code start-offset length)
        (nreverse segments))))
             (and (listp thing)
                  (eq (car thing) 'setf)))
         (compiled-function-or-lose (fdefinition thing) thing))
-       ((sb!eval:interpreted-function-p thing)
-        (compile-function-lambda-expr thing))
        ((functionp thing)
         thing)
        ((and (listp thing)
-             (eq (car thing) 'sb!impl::lambda))
+             (eq (car thing) 'lambda))
         (compile nil thing))
        (t
         (error "can't make a compiled function from ~S" name))))
                           (stream *standard-output*)
                           (use-labels t))
   #!+sb-doc
-  "Disassemble the machine code associated with OBJECT, which can be a
+  "Disassemble the compiled code associated with OBJECT, which can be a
   function, a lambda expression, or a symbol with a function definition. If
   it is not already compiled, the compiler is called to produce something to
   disassemble."
           (type (or (member t) stream) stream)
           (type (member t nil) use-labels))
   (pprint-logical-block (*standard-output* nil :per-line-prefix "; ")
-  (let ((fun (compiled-function-or-lose object)))
-    (if (typep fun 'sb!kernel:byte-function)
-       (sb!c:disassem-byte-fun fun)
-       ;; We can't detect closures, so be careful.
-       (disassemble-function (fun-self fun)
-                             :stream stream
-                             :use-labels use-labels)))
-  nil))
+    (disassemble-function (compiled-function-or-lose object)
+                         :stream stream
+                         :use-labels use-labels)
+    nil))
 
 ;;; Disassembles the given area of memory starting at ADDRESS and
 ;;; LENGTH long. Note that if CODE-COMPONENT is NIL and this memory
 ;;; not just 4 on a risc machine!
 (defconstant max-instruction-size 16)
 
-(defun sap-to-vector (sap start end)
-    (let* ((length (- end start))
-          (result (make-array length :element-type '(unsigned-byte 8)))
-          (sap (sb!sys:sap+ sap start)))
-      (dotimes (i length)
-       (setf (aref result i) (sb!sys:sap-ref-8 sap i)))
-      result))
-
-(defun add-block-segments (sap amount seglist location connecting-vec dstate)
+(defun add-block-segments (seg-code-block
+                          seglist
+                          location
+                          connecting-vec
+                          dstate)
   (declare (type list seglist)
           (type integer location)
           (type (or null (vector (unsigned-byte 8))) connecting-vec)
               (setf (seg-length seg) length)
               (incf location length)
               (push seg seglist)))))
-    (let ((connecting-overflow 0))
+    (let ((connecting-overflow 0)
+         (amount (length seg-code-block)))
       (when connecting-vec
        ;; Tack on some of the new block to the old overflow vector.
        (let* ((beginning-of-block-amount
-               (if sap (min max-instruction-size amount) 0))
+               (if seg-code-block (min max-instruction-size amount) 0))
               (connecting-vec
-               (if sap
+               (if seg-code-block
                    (concatenate
                     '(vector (unsigned-byte 8))
                     connecting-vec
-                    (sap-to-vector sap 0 beginning-of-block-amount))
+                    (subseq seg-code-block 0 beginning-of-block-amount))
                    connecting-vec)))
          (when (and (< (length connecting-vec) max-instruction-size)
-                    (not (null sap)))
+                    (not (null seg-code-block)))
            (return-from add-block-segments
              ;; We want connecting vectors to be large enough to hold
-             ;; any instruction, and since the current sap wasn't large
-             ;; enough to do this (and is now entirely on the end of the
-             ;; overflow-vector), just save it for next time.
+             ;; any instruction, and since the current seg-code-block
+             ;; wasn't large enough to do this (and is now entirely
+             ;; on the end of the overflow-vector), just save it for
+             ;; next time.
              (values seglist location connecting-vec)))
          (when (> (length connecting-vec) 0)
            (let ((seg
                                        :virtual-location location)))
              (setf connecting-overflow (segment-overflow seg dstate))
              (addit seg connecting-overflow)))))
-      (cond ((null sap)
+      (cond ((null seg-code-block)
             ;; nothing more to add
             (values seglist location nil))
            ((< (- amount connecting-overflow) max-instruction-size)
             ;; in the overflow vector for the time-being.
             (values seglist
                     location
-                    (sap-to-vector sap connecting-overflow amount)))
+                    (subseq seg-code-block connecting-overflow amount)))
            (t
             ;; Put as much as we can into a new segment, and the rest
             ;; into the overflow-vector.
             (let* ((initial-length
                     (- amount connecting-overflow max-instruction-size))
                    (seg
-                    (make-segment (lambda ()
-                                    (sb!sys:sap+ sap connecting-overflow))
-                                  initial-length
-                                  :virtual-location location))
+                    (make-vector-segment seg-code-block
+                                         connecting-overflow
+                                         initial-length
+                                         :virtual-location location))
                    (overflow
                     (segment-overflow seg dstate)))
               (addit seg overflow)
               (values seglist
                       location
-                      (sap-to-vector sap
-                                     (+ connecting-overflow (seg-length seg))
-                                     amount))))))))
+                      (subseq seg-code-block
+                              (+ connecting-overflow (seg-length seg))
+                              amount))))))))
 \f
 ;;;; code to disassemble assembler segments
 
   (let ((location 0)
        (disassem-segments nil)
        (connecting-vec nil))
-    (error "stub: code not converted to new SEGMENT WHN 19990322" ; KLUDGE
-          assem-segment) ; (to avoid "ASSEM-SEGMENT defined but never used")
-    ;; old code, needs to be converted to use less-SAPpy ASSEM-SEGMENTs:
-    #|(sb!assem:segment-map-output
+    (sb!assem:on-segment-contents-vectorly
      assem-segment
-     (lambda (sap amount)
+     (lambda (seg-code-block)
        (multiple-value-setq (disassem-segments location connecting-vec)
-         (add-block-segments sap amount
-                            disassem-segments location
+         (add-block-segments seg-code-block
+                            disassem-segments
+                            location
                             connecting-vec
-                            dstate))))|#
+                            dstate))))
     (when connecting-vec
       (setf disassem-segments
-           (add-block-segments nil nil
-                               disassem-segments location
+           (add-block-segments nil
+                               disassem-segments
+                               location
                                connecting-vec
                                dstate)))
     (sort disassem-segments #'< :key #'seg-virtual-location)))
 
-;;; FIXME: I noticed that this is only called by #!+SB-SHOW code. It would
-;;; be good to see whether this is the only caller of any other functions.
-;;;
 ;;; Disassemble the machine code instructions associated with
 ;;; ASSEM-SEGMENT (of type assem:segment).
-#!+sb-show
 (defun disassemble-assem-segment (assem-segment stream)
   (declare (type sb!assem:segment assem-segment)
           (type stream stream))
   (declare (type address address))
   (when (null *assembler-routines-by-addr*)
     (setf *assembler-routines-by-addr*
-         (invert-address-hash sb!kernel::*assembler-routines*))
+         (invert-address-hash sb!fasl:*assembler-routines*))
     (setf *assembler-routines-by-addr*
-         (invert-address-hash sb!kernel::*static-foreign-symbols*
+         (invert-address-hash sb!fasl:*static-foreign-symbols*
                               *assembler-routines-by-addr*)))
   (gethash address *assembler-routines-by-addr*))
 \f