(sort insts #'> :key #'specializer-rank))
(defun specialization-error (insts)
- (error "~@<internal disassembler error: ~2I~_Instructions either aren't related or conflict in some way: ~4I~_~S~:>"
- insts))
+ (bug
+ "~@<Instructions either aren't related or conflict in some way: ~4I~_~S~:>"
+ insts))
;;; Given a list of instructions INSTS, Sees if one of these instructions is a
;;; more general form of all the others, in which case they are put into its
(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)
(setf (dstate-cur-offs dstate) 0)
(setf (dstate-cur-labels dstate) (dstate-labels dstate)))
-(defun do-offs-hooks (before-address stream dstate)
+(defun call-offs-hooks (before-address stream dstate)
(declare (type (or null stream) stream)
(type disassem-state dstate))
(let ((cur-offs (dstate-cur-offs dstate)))
(unless (= (dstate-next-offs dstate) cur-offs)
(return)))))))
-(defun do-fun-hooks (chunk stream dstate)
+(defun call-fun-hooks (chunk stream dstate)
(let ((hooks (dstate-fun-hooks dstate))
(cur-offs (dstate-cur-offs dstate)))
(setf (dstate-next-offs dstate) cur-offs)
(setf (dstate-next-offs dstate) (dstate-cur-offs dstate))
- (do-offs-hooks t stream dstate)
+ (call-offs-hooks t stream dstate)
(unless (or prefix-p (null stream))
(print-current-address stream dstate))
- (do-offs-hooks nil stream dstate)
+ (call-offs-hooks nil stream dstate)
(unless (> (dstate-next-offs dstate) (dstate-cur-offs dstate))
(sb!sys:without-gcing
(sap-ref-dchunk (dstate-segment-sap dstate)
(dstate-cur-offs dstate)
(dstate-byte-order dstate))))
- (let ((fun-prefix-p (do-fun-hooks chunk stream dstate)))
+ (let ((fun-prefix-p (call-fun-hooks chunk stream dstate)))
(if (> (dstate-next-offs dstate) (dstate-cur-offs dstate))
(setf prefix-p fun-prefix-p)
(let ((inst (find-inst chunk ispace)))
(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)