1 ;;;; the implementation of the programmer's interface to writing
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.
15 ;;; FIXME: There are an awful lot of package prefixes in this code.
16 ;;; Couldn't we have SB-DI use the SB-C and SB-VM packages?
20 ;;;; The interface to building debugging tools signals conditions that
21 ;;;; prevent it from adhering to its contract. These are
22 ;;;; serious-conditions because the program using the interface must
23 ;;;; handle them before it can correctly continue execution. These
24 ;;;; debugging conditions are not errors since it is no fault of the
25 ;;;; programmers that the conditions occur. The interface does not
26 ;;;; provide for programs to detect these situations other than
27 ;;;; calling a routine that detects them and signals a condition. For
28 ;;;; example, programmers call A which may fail to return successfully
29 ;;;; due to a lack of debug information, and there is no B the they
30 ;;;; could have called to realize A would fail. It is not an error to
31 ;;;; have called A, but it is an error for the program to then ignore
32 ;;;; the signal generated by A since it cannot continue without A's
33 ;;;; correctly returning a value or performing some operation.
35 ;;;; Use DEBUG-SIGNAL to signal these conditions.
37 (define-condition debug-condition (serious-condition)
41 "All DEBUG-CONDITIONs inherit from this type. These are serious conditions
42 that must be handled, but they are not programmer errors."))
44 (define-condition no-debug-fun-returns (debug-condition)
45 ((debug-fun :reader no-debug-fun-returns-debug-fun
49 "The system could not return values from a frame with DEBUG-FUN since
50 it lacked information about returning values.")
51 (:report (lambda (condition stream)
52 (let ((fun (debug-fun-fun
53 (no-debug-fun-returns-debug-fun condition))))
55 "~&Cannot return values from ~:[frame~;~:*~S~] since ~
56 the debug information lacks details about returning ~
60 (define-condition no-debug-blocks (debug-condition)
61 ((debug-fun :reader no-debug-blocks-debug-fun
64 (:documentation "The debug-fun has no debug-block information.")
65 (:report (lambda (condition stream)
66 (format stream "~&~S has no debug-block information."
67 (no-debug-blocks-debug-fun condition)))))
69 (define-condition no-debug-vars (debug-condition)
70 ((debug-fun :reader no-debug-vars-debug-fun
73 (:documentation "The DEBUG-FUN has no DEBUG-VAR information.")
74 (:report (lambda (condition stream)
75 (format stream "~&~S has no debug variable information."
76 (no-debug-vars-debug-fun condition)))))
78 (define-condition lambda-list-unavailable (debug-condition)
79 ((debug-fun :reader lambda-list-unavailable-debug-fun
83 "The DEBUG-FUN has no lambda list since argument DEBUG-VARs are
85 (:report (lambda (condition stream)
86 (format stream "~&~S has no lambda-list information available."
87 (lambda-list-unavailable-debug-fun condition)))))
89 (define-condition invalid-value (debug-condition)
90 ((debug-var :reader invalid-value-debug-var :initarg :debug-var)
91 (frame :reader invalid-value-frame :initarg :frame))
92 (:report (lambda (condition stream)
93 (format stream "~&~S has :invalid or :unknown value in ~S."
94 (invalid-value-debug-var condition)
95 (invalid-value-frame condition)))))
97 (define-condition ambiguous-var-name (debug-condition)
98 ((name :reader ambiguous-var-name-name :initarg :name)
99 (frame :reader ambiguous-var-name-frame :initarg :frame))
100 (:report (lambda (condition stream)
101 (format stream "~&~S names more than one valid variable in ~S."
102 (ambiguous-var-name-name condition)
103 (ambiguous-var-name-frame condition)))))
105 ;;;; errors and DEBUG-SIGNAL
107 ;;; The debug-internals code tries to signal all programmer errors as
108 ;;; subtypes of DEBUG-ERROR. There are calls to ERROR signalling
109 ;;; SIMPLE-ERRORs, but these dummy checks in the code and shouldn't
112 ;;; While under development, this code also signals errors in code
113 ;;; branches that remain unimplemented.
115 (define-condition debug-error (error) ()
118 "All programmer errors from using the interface for building debugging
119 tools inherit from this type."))
121 (define-condition unhandled-debug-condition (debug-error)
122 ((condition :reader unhandled-debug-condition-condition :initarg :condition))
123 (:report (lambda (condition stream)
124 (format stream "~&unhandled DEBUG-CONDITION:~%~A"
125 (unhandled-debug-condition-condition condition)))))
127 (define-condition unknown-code-location (debug-error)
128 ((code-location :reader unknown-code-location-code-location
129 :initarg :code-location))
130 (:report (lambda (condition stream)
131 (format stream "~&invalid use of an unknown code-location: ~S"
132 (unknown-code-location-code-location condition)))))
134 (define-condition unknown-debug-var (debug-error)
135 ((debug-var :reader unknown-debug-var-debug-var :initarg :debug-var)
136 (debug-fun :reader unknown-debug-var-debug-fun
137 :initarg :debug-fun))
138 (:report (lambda (condition stream)
139 (format stream "~&~S is not in ~S."
140 (unknown-debug-var-debug-var condition)
141 (unknown-debug-var-debug-fun condition)))))
143 (define-condition invalid-control-stack-pointer (debug-error)
145 (:report (lambda (condition stream)
146 (declare (ignore condition))
148 (write-string "invalid control stack pointer" stream))))
150 (define-condition frame-fun-mismatch (debug-error)
151 ((code-location :reader frame-fun-mismatch-code-location
152 :initarg :code-location)
153 (frame :reader frame-fun-mismatch-frame :initarg :frame)
154 (form :reader frame-fun-mismatch-form :initarg :form))
155 (:report (lambda (condition stream)
158 "~&Form was preprocessed for ~S,~% but called on ~S:~% ~S"
159 (frame-fun-mismatch-code-location condition)
160 (frame-fun-mismatch-frame condition)
161 (frame-fun-mismatch-form condition)))))
163 ;;; This signals debug-conditions. If they go unhandled, then signal
164 ;;; an UNHANDLED-DEBUG-CONDITION error.
166 ;;; ??? Get SIGNAL in the right package!
167 (defmacro debug-signal (datum &rest arguments)
168 `(let ((condition (make-condition ,datum ,@arguments)))
170 (error 'unhandled-debug-condition :condition condition)))
174 ;;;; Most of these structures model information stored in internal
175 ;;;; data structures created by the compiler. Whenever comments
176 ;;;; preface an object or type with "compiler", they refer to the
177 ;;;; internal compiler thing, not to the object or type with the same
178 ;;;; name in the "SB-DI" package.
182 ;;; These exist for caching data stored in packed binary form in
183 ;;; compiler DEBUG-FUNs.
184 (defstruct (debug-var (:constructor nil)
186 ;; the name of the variable
187 (symbol (missing-arg) :type symbol)
188 ;; a unique integer identification relative to other variables with the same
191 ;; Does the variable always have a valid value?
192 (alive-p nil :type boolean))
193 (def!method print-object ((debug-var debug-var) stream)
194 (print-unreadable-object (debug-var stream :type t :identity t)
197 (debug-var-symbol debug-var)
198 (debug-var-id debug-var))))
201 (setf (fdocumentation 'debug-var-id 'function)
202 "Return the integer that makes DEBUG-VAR's name and package unique
203 with respect to other DEBUG-VARs in the same function.")
205 (defstruct (compiled-debug-var
207 (:constructor make-compiled-debug-var
208 (symbol id alive-p sc-offset save-sc-offset))
210 ;; storage class and offset (unexported)
211 (sc-offset nil :type sb!c:sc-offset)
212 ;; storage class and offset when saved somewhere
213 (save-sc-offset nil :type (or sb!c:sc-offset null)))
217 ;;; These represent call frames on the stack.
218 (defstruct (frame (:constructor nil)
220 ;; the next frame up, or NIL when top frame
221 (up nil :type (or frame null))
222 ;; the previous frame down, or NIL when the bottom frame. Before
223 ;; computing the next frame down, this slot holds the frame pointer
224 ;; to the control stack for the given frame. This lets us get the
225 ;; next frame down and the return-pc for that frame.
226 (%down :unparsed :type (or frame (member nil :unparsed)))
227 ;; the DEBUG-FUN for the function whose call this frame represents
228 (debug-fun nil :type debug-fun)
229 ;; the CODE-LOCATION where the frame's DEBUG-FUN will continue
230 ;; running when program execution returns to this frame. If someone
231 ;; interrupted this frame, the result could be an unknown
233 (code-location nil :type code-location)
234 ;; an a-list of catch-tags to code-locations
235 (%catches :unparsed :type (or list (member :unparsed)))
236 ;; pointer to frame on control stack (unexported)
238 ;; This is the frame's number for prompt printing. Top is zero.
239 (number 0 :type index))
241 (defstruct (compiled-frame
243 (:constructor make-compiled-frame
244 (pointer up debug-fun code-location number
247 ;; This indicates whether someone interrupted the frame.
248 ;; (unexported). If escaped, this is a pointer to the state that was
249 ;; saved when we were interrupted, an os_context_t, i.e. the third
250 ;; argument to an SA_SIGACTION-style signal handler.
252 (def!method print-object ((obj compiled-frame) str)
253 (print-unreadable-object (obj str :type t)
255 "~S~:[~;, interrupted~]"
256 (debug-fun-name (frame-debug-fun obj))
257 (compiled-frame-escaped obj))))
261 ;;; These exist for caching data stored in packed binary form in
262 ;;; compiler DEBUG-FUNs. *COMPILED-DEBUG-FUNS* maps a SB!C::DEBUG-FUN
263 ;;; to a DEBUG-FUN. There should only be one DEBUG-FUN in existence
264 ;;; for any function; that is, all CODE-LOCATIONs and other objects
265 ;;; that reference DEBUG-FUNs point to unique objects. This is
266 ;;; due to the overhead in cached information.
267 (defstruct (debug-fun (:constructor nil)
269 ;; some representation of the function arguments. See
270 ;; DEBUG-FUN-LAMBDA-LIST.
271 ;; NOTE: must parse vars before parsing arg list stuff.
272 (%lambda-list :unparsed)
273 ;; cached DEBUG-VARS information (unexported).
274 ;; These are sorted by their name.
275 (%debug-vars :unparsed :type (or simple-vector null (member :unparsed)))
276 ;; cached debug-block information. This is NIL when we have tried to
277 ;; parse the packed binary info, but none is available.
278 (blocks :unparsed :type (or simple-vector null (member :unparsed)))
279 ;; the actual function if available
280 (%function :unparsed :type (or null function (member :unparsed))))
281 (def!method print-object ((obj debug-fun) stream)
282 (print-unreadable-object (obj stream :type t)
283 (prin1 (debug-fun-name obj) stream)))
285 (defstruct (compiled-debug-fun
287 (:constructor %make-compiled-debug-fun
288 (compiler-debug-fun component))
290 ;; compiler's dumped DEBUG-FUN information (unexported)
291 (compiler-debug-fun nil :type sb!c::compiled-debug-fun)
292 ;; code object (unexported).
294 ;; the :FUN-START breakpoint (if any) used to facilitate
295 ;; function end breakpoints
296 (end-starter nil :type (or null breakpoint)))
298 ;;; This maps SB!C::COMPILED-DEBUG-FUNs to
299 ;;; COMPILED-DEBUG-FUNs, so we can get at cached stuff and not
300 ;;; duplicate COMPILED-DEBUG-FUN structures.
301 (defvar *compiled-debug-funs* (make-hash-table :test 'eq))
303 ;;; Make a COMPILED-DEBUG-FUN for a SB!C::COMPILER-DEBUG-FUN
304 ;;; and its component. This maps the latter to the former in
305 ;;; *COMPILED-DEBUG-FUNS*. If there already is a
306 ;;; COMPILED-DEBUG-FUN, then this returns it from
307 ;;; *COMPILED-DEBUG-FUNS*.
308 (defun make-compiled-debug-fun (compiler-debug-fun component)
309 (or (gethash compiler-debug-fun *compiled-debug-funs*)
310 (setf (gethash compiler-debug-fun *compiled-debug-funs*)
311 (%make-compiled-debug-fun compiler-debug-fun component))))
313 (defstruct (bogus-debug-fun
315 (:constructor make-bogus-debug-fun
324 (defvar *ir1-lambda-debug-fun* (make-hash-table :test 'eq))
328 ;;; These exist for caching data stored in packed binary form in compiler
330 (defstruct (debug-block (:constructor nil)
332 ;; Code-locations where execution continues after this block.
333 (successors nil :type list)
334 ;; This indicates whether the block is a special glob of code shared
335 ;; by various functions and tucked away elsewhere in a component.
336 ;; This kind of block has no start code-location. This slot is in
337 ;; all debug-blocks since it is an exported interface.
338 (elsewhere-p nil :type boolean))
339 (def!method print-object ((obj debug-block) str)
340 (print-unreadable-object (obj str :type t)
341 (prin1 (debug-block-fun-name obj) str)))
344 (setf (fdocumentation 'debug-block-successors 'function)
345 "Return the list of possible code-locations where execution may continue
346 when the basic-block represented by debug-block completes its execution.")
349 (setf (fdocumentation 'debug-block-elsewhere-p 'function)
350 "Return whether debug-block represents elsewhere code.")
352 (defstruct (compiled-debug-block (:include debug-block)
354 make-compiled-debug-block
355 (code-locations successors elsewhere-p))
357 ;; code-location information for the block
358 (code-locations nil :type simple-vector))
360 (defvar *ir1-block-debug-block* (make-hash-table :test 'eq))
364 ;;; This is an internal structure that manages information about a
365 ;;; breakpoint locations. See *COMPONENT-BREAKPOINT-OFFSETS*.
366 (defstruct (breakpoint-data (:constructor make-breakpoint-data
369 ;; This is the component in which the breakpoint lies.
371 ;; This is the byte offset into the component.
372 (offset nil :type index)
373 ;; The original instruction replaced by the breakpoint.
374 (instruction nil :type (or null sb!vm::word))
375 ;; A list of user breakpoints at this location.
376 (breakpoints nil :type list))
377 (def!method print-object ((obj breakpoint-data) str)
378 (print-unreadable-object (obj str :type t)
379 (format str "~S at ~S"
381 (debug-fun-from-pc (breakpoint-data-component obj)
382 (breakpoint-data-offset obj)))
383 (breakpoint-data-offset obj))))
385 (defstruct (breakpoint (:constructor %make-breakpoint
386 (hook-fun what kind %info))
388 ;; This is the function invoked when execution encounters the
389 ;; breakpoint. It takes a frame, the breakpoint, and optionally a
390 ;; list of values. Values are supplied for :FUN-END breakpoints as
391 ;; values to return for the function containing the breakpoint.
392 ;; :FUN-END breakpoint hook functions also take a cookie argument.
393 ;; See the COOKIE-FUN slot.
394 (hook-fun (required-arg) :type function)
395 ;; CODE-LOCATION or DEBUG-FUN
396 (what nil :type (or code-location debug-fun))
397 ;; :CODE-LOCATION, :FUN-START, or :FUN-END for that kind
398 ;; of breakpoint. :UNKNOWN-RETURN-PARTNER if this is the partner of
399 ;; a :code-location breakpoint at an :UNKNOWN-RETURN code-location.
400 (kind nil :type (member :code-location :fun-start :fun-end
401 :unknown-return-partner))
402 ;; Status helps the user and the implementation.
403 (status :inactive :type (member :active :inactive :deleted))
404 ;; This is a backpointer to a breakpoint-data.
405 (internal-data nil :type (or null breakpoint-data))
406 ;; With code-locations whose type is :UNKNOWN-RETURN, there are
407 ;; really two breakpoints: one at the multiple-value entry point,
408 ;; and one at the single-value entry point. This slot holds the
409 ;; breakpoint for the other one, or NIL if this isn't at an
410 ;; :UNKNOWN-RETURN code location.
411 (unknown-return-partner nil :type (or null breakpoint))
412 ;; :FUN-END breakpoints use a breakpoint at the :FUN-START
413 ;; to establish the end breakpoint upon function entry. We do this
414 ;; by frobbing the LRA to jump to a special piece of code that
415 ;; breaks and provides the return values for the returnee. This slot
416 ;; points to the start breakpoint, so we can activate, deactivate,
418 (start-helper nil :type (or null breakpoint))
419 ;; This is a hook users supply to get a dynamically unique cookie
420 ;; for identifying :FUN-END breakpoint executions. That is, if
421 ;; there is one :FUN-END breakpoint, but there may be multiple
422 ;; pending calls of its function on the stack. This function takes
423 ;; the cookie, and the hook function takes the cookie too.
424 (cookie-fun nil :type (or null function))
425 ;; This slot users can set with whatever information they find useful.
427 (def!method print-object ((obj breakpoint) str)
428 (let ((what (breakpoint-what obj)))
429 (print-unreadable-object (obj str :type t)
434 (debug-fun (debug-fun-name what)))
437 (debug-fun (breakpoint-kind obj)))))))
441 (defstruct (code-location (:constructor nil)
443 ;; the DEBUG-FUN containing this CODE-LOCATION
444 (debug-fun nil :type debug-fun)
445 ;; This is initially :UNSURE. Upon first trying to access an
446 ;; :UNPARSED slot, if the data is unavailable, then this becomes T,
447 ;; and the code-location is unknown. If the data is available, this
448 ;; becomes NIL, a known location. We can't use a separate type
449 ;; code-location for this since we must return code-locations before
450 ;; we can tell whether they're known or unknown. For example, when
451 ;; parsing the stack, we don't want to unpack all the variables and
452 ;; blocks just to make frames.
453 (%unknown-p :unsure :type (member t nil :unsure))
454 ;; the DEBUG-BLOCK containing CODE-LOCATION. XXX Possibly toss this
455 ;; out and just find it in the blocks cache in DEBUG-FUN.
456 (%debug-block :unparsed :type (or debug-block (member :unparsed)))
457 ;; This is the number of forms processed by the compiler or loader
458 ;; before the top level form containing this code-location.
459 (%tlf-offset :unparsed :type (or index (member :unparsed)))
460 ;; This is the depth-first number of the node that begins
461 ;; code-location within its top level form.
462 (%form-number :unparsed :type (or index (member :unparsed))))
463 (def!method print-object ((obj code-location) str)
464 (print-unreadable-object (obj str :type t)
465 (prin1 (debug-fun-name (code-location-debug-fun obj))
468 (defstruct (compiled-code-location
469 (:include code-location)
470 (:constructor make-known-code-location
471 (pc debug-fun %tlf-offset %form-number
472 %live-set kind step-info &aux (%unknown-p nil)))
473 (:constructor make-compiled-code-location (pc debug-fun))
475 ;; an index into DEBUG-FUN's component slot
477 ;; a bit-vector indexed by a variable's position in
478 ;; DEBUG-FUN-DEBUG-VARS indicating whether the variable has a
479 ;; valid value at this code-location. (unexported).
480 (%live-set :unparsed :type (or simple-bit-vector (member :unparsed)))
481 ;; (unexported) To see SB!C::LOCATION-KIND, do
482 ;; (SB!KERNEL:TYPE-EXPAND 'SB!C::LOCATION-KIND).
483 (kind :unparsed :type (or (member :unparsed) sb!c::location-kind))
484 (step-info :unparsed :type (or (member :unparsed :foo) simple-string)))
488 ;;; Return the number of top level forms processed by the compiler
489 ;;; before compiling this source. If this source is uncompiled, this
490 ;;; is zero. This may be zero even if the source is compiled since the
491 ;;; first form in the first file compiled in one compilation, for
492 ;;; example, must have a root number of zero -- the compiler saw no
493 ;;; other top level forms before it.
494 (defun debug-source-root-number (debug-source)
495 (sb!c::debug-source-source-root debug-source))
499 ;;; This is used in FIND-ESCAPED-FRAME and with the bogus components
500 ;;; and LRAs used for :FUN-END breakpoints. When a component's
501 ;;; debug-info slot is :BOGUS-LRA, then the REAL-LRA-SLOT contains the
502 ;;; real component to continue executing, as opposed to the bogus
503 ;;; component which appeared in some frame's LRA location.
504 (defconstant real-lra-slot sb!vm:code-constants-offset)
506 ;;; These are magically converted by the compiler.
507 (defun current-sp () (current-sp))
508 (defun current-fp () (current-fp))
509 (defun stack-ref (s n) (stack-ref s n))
510 (defun %set-stack-ref (s n value) (%set-stack-ref s n value))
511 (defun fun-code-header (fun) (fun-code-header fun))
512 (defun lra-code-header (lra) (lra-code-header lra))
513 (defun %make-lisp-obj (value) (%make-lisp-obj value))
514 (defun get-lisp-obj-address (thing) (get-lisp-obj-address thing))
515 (defun fun-word-offset (fun) (fun-word-offset fun))
517 #!-sb-fluid (declaim (inline control-stack-pointer-valid-p))
518 (defun control-stack-pointer-valid-p (x)
519 (declare (type system-area-pointer x))
520 (let* (#!-stack-grows-downward-not-upward
522 (descriptor-sap *control-stack-start*))
523 #!+stack-grows-downward-not-upward
525 (descriptor-sap *control-stack-end*)))
526 #!-stack-grows-downward-not-upward
527 (and (sap< x (current-sp))
528 (sap<= control-stack-start x)
529 (zerop (logand (sap-int x) sb!vm:fixnum-tag-mask)))
530 #!+stack-grows-downward-not-upward
531 (and (sap>= x (current-sp))
532 (sap> control-stack-end x)
533 (zerop (logand (sap-int x) sb!vm:fixnum-tag-mask)))))
535 (declaim (inline component-ptr-from-pc))
536 (sb!alien:define-alien-routine component-ptr-from-pc (system-area-pointer)
537 (pc system-area-pointer))
540 (sb!alien:define-alien-routine valid-lisp-pointer-p sb!alien:int
541 (pointer system-area-pointer))
543 (declaim (inline component-from-component-ptr))
544 (defun component-from-component-ptr (component-ptr)
545 (declare (type system-area-pointer component-ptr))
546 (make-lisp-obj (logior (sap-int component-ptr)
547 sb!vm:other-pointer-lowtag)))
549 ;;;; (OR X86 X86-64) support
551 (defun compute-lra-data-from-pc (pc)
552 (declare (type system-area-pointer pc))
553 (let ((component-ptr (component-ptr-from-pc pc)))
554 (unless (sap= component-ptr (int-sap #x0))
555 (let* ((code (component-from-component-ptr component-ptr))
556 (code-header-len (* (get-header-data code) sb!vm:n-word-bytes))
557 (pc-offset (- (sap-int pc)
558 (- (get-lisp-obj-address code)
559 sb!vm:other-pointer-lowtag)
561 ; (format t "c-lra-fpc ~A ~A ~A~%" pc code pc-offset)
562 (values pc-offset code)))))
567 (defconstant sb!vm::nargs-offset #.sb!vm::ecx-offset)
569 ;;; Check for a valid return address - it could be any valid C/Lisp
572 ;;; XXX Could be a little smarter.
573 #!-sb-fluid (declaim (inline ra-pointer-valid-p))
574 (defun ra-pointer-valid-p (ra)
575 (declare (type system-area-pointer ra))
577 ;; not the first page (which is unmapped)
579 ;; FIXME: Where is this documented? Is it really true of every CPU
580 ;; architecture? Is it even necessarily true in current SBCL?
581 (>= (sap-int ra) 4096)
582 ;; not a Lisp stack pointer
583 (not (control-stack-pointer-valid-p ra))))
585 ;;; Try to find a valid previous stack. This is complex on the x86 as
586 ;;; it can jump between C and Lisp frames. To help find a valid frame
587 ;;; it searches backwards.
589 ;;; XXX Should probably check whether it has reached the bottom of the
592 ;;; XXX Should handle interrupted frames, both Lisp and C. At present
593 ;;; it manages to find a fp trail, see linux hack below.
594 (declaim (maybe-inline x86-call-context))
595 (defun x86-call-context (fp)
596 (declare (type system-area-pointer fp))
603 ((not (control-stack-pointer-valid-p fp))
606 ;; Check the two possible frame pointers.
607 (let ((lisp-ocfp (sap-ref-sap fp (- (* (1+ ocfp-save-offset)
608 sb!vm::n-word-bytes))))
609 (lisp-ra (sap-ref-sap fp (- (* (1+ return-pc-save-offset)
610 sb!vm::n-word-bytes))))
611 (c-ocfp (sap-ref-sap fp (* 0 sb!vm:n-word-bytes)))
612 (c-ra (sap-ref-sap fp (* 1 sb!vm:n-word-bytes))))
613 (cond ((and (sap> lisp-ocfp fp)
614 (control-stack-pointer-valid-p lisp-ocfp)
615 (ra-pointer-valid-p lisp-ra)
617 (control-stack-pointer-valid-p c-ocfp)
618 (ra-pointer-valid-p c-ra))
619 ;; Look forward another step to check their validity.
620 (let ((lisp-ok (handle lisp-ocfp))
621 (c-ok (handle c-ocfp)))
622 (cond ((and lisp-ok c-ok)
623 ;; Both still seem valid - choose the lisp frame.
625 (if (sap> lisp-ocfp c-ocfp)
626 (values t lisp-ra lisp-ocfp)
627 (values t c-ra c-ocfp))
629 (values t lisp-ra lisp-ocfp))
631 ;; The lisp convention is looking good.
632 (values t lisp-ra lisp-ocfp))
634 ;; The C convention is looking good.
635 (values t c-ra c-ocfp))
637 ;; Neither seems right?
639 ((and (sap> lisp-ocfp fp)
640 (control-stack-pointer-valid-p lisp-ocfp)
641 (ra-pointer-valid-p lisp-ra))
642 ;; The lisp convention is looking good.
643 (values t lisp-ra lisp-ocfp))
644 ((and (sap> c-ocfp fp)
645 (control-stack-pointer-valid-p c-ocfp)
646 #!-linux (ra-pointer-valid-p c-ra))
647 ;; The C convention is looking good.
648 (values t c-ra c-ocfp))
655 ;;; Convert the descriptor into a SAP. The bits all stay the same, we just
656 ;;; change our notion of what we think they are.
657 #!-sb-fluid (declaim (inline descriptor-sap))
658 (defun descriptor-sap (x)
659 (int-sap (get-lisp-obj-address x)))
661 ;;; Return the top frame of the control stack as it was before calling
664 (/noshow0 "entering TOP-FRAME")
665 (multiple-value-bind (fp pc) (%caller-frame-and-pc)
666 (compute-calling-frame (descriptor-sap fp) pc nil)))
668 ;;; Flush all of the frames above FRAME, and renumber all the frames
670 (defun flush-frames-above (frame)
671 (setf (frame-up frame) nil)
672 (do ((number 0 (1+ number))
673 (frame frame (frame-%down frame)))
674 ((not (frame-p frame)))
675 (setf (frame-number frame) number)))
677 ;;; Return the frame immediately below FRAME on the stack; or when
678 ;;; FRAME is the bottom of the stack, return NIL.
679 (defun frame-down (frame)
680 (/noshow0 "entering FRAME-DOWN")
681 ;; We have to access the old-fp and return-pc out of frame and pass
682 ;; them to COMPUTE-CALLING-FRAME.
683 (let ((down (frame-%down frame)))
684 (if (eq down :unparsed)
685 (let ((debug-fun (frame-debug-fun frame)))
686 (/noshow0 "in DOWN :UNPARSED case")
687 (setf (frame-%down frame)
690 (let ((c-d-f (compiled-debug-fun-compiler-debug-fun
692 (compute-calling-frame
695 frame ocfp-save-offset
696 (sb!c::compiled-debug-fun-old-fp c-d-f)))
698 frame lra-save-offset
699 (sb!c::compiled-debug-fun-return-pc c-d-f))
702 (let ((fp (frame-pointer frame)))
703 (when (control-stack-pointer-valid-p fp)
705 (multiple-value-bind (ok ra ofp) (x86-call-context fp)
707 (compute-calling-frame ofp ra frame)))
709 (compute-calling-frame
711 (sap-ref-sap fp (* ocfp-save-offset
715 (sap-ref-32 fp (* ocfp-save-offset
716 sb!vm:n-word-bytes)))
718 (stack-ref fp lra-save-offset)
723 ;;; Get the old FP or return PC out of FRAME. STACK-SLOT is the
724 ;;; standard save location offset on the stack. LOC is the saved
725 ;;; SC-OFFSET describing the main location.
726 (defun get-context-value (frame stack-slot loc)
727 (declare (type compiled-frame frame) (type unsigned-byte stack-slot)
728 (type sb!c:sc-offset loc))
729 (let ((pointer (frame-pointer frame))
730 (escaped (compiled-frame-escaped frame)))
732 (sub-access-debug-var-slot pointer loc escaped)
734 (stack-ref pointer stack-slot)
738 (stack-ref pointer stack-slot))
740 (sap-ref-sap pointer (- (* (1+ stack-slot)
741 sb!vm::n-word-bytes))))))))
743 (defun (setf get-context-value) (value frame stack-slot loc)
744 (declare (type compiled-frame frame) (type unsigned-byte stack-slot)
745 (type sb!c:sc-offset loc))
746 (let ((pointer (frame-pointer frame))
747 (escaped (compiled-frame-escaped frame)))
749 (sub-set-debug-var-slot pointer loc value escaped)
751 (setf (stack-ref pointer stack-slot) value)
755 (setf (stack-ref pointer stack-slot) value))
757 (setf (sap-ref-sap pointer (- (* (1+ stack-slot)
758 sb!vm::n-word-bytes))) value))))))
760 (defun foreign-function-backtrace-name (sap)
761 (let ((name (sap-foreign-symbol sap)))
763 (format nil "foreign function: ~A" name)
764 (format nil "foreign function: #x~X" (sap-int sap)))))
766 ;;; This returns a frame for the one existing in time immediately
767 ;;; prior to the frame referenced by current-fp. This is current-fp's
768 ;;; caller or the next frame down the control stack. If there is no
769 ;;; down frame, this returns NIL for the bottom of the stack. UP-FRAME
770 ;;; is the up link for the resulting frame object, and it is null when
771 ;;; we call this to get the top of the stack.
773 ;;; The current frame contains the pointer to the temporally previous
774 ;;; frame we want, and the current frame contains the pc at which we
775 ;;; will continue executing upon returning to that previous frame.
777 ;;; Note: Sometimes LRA is actually a fixnum. This happens when lisp
778 ;;; calls into C. In this case, the code object is stored on the stack
779 ;;; after the LRA, and the LRA is the word offset.
781 (defun compute-calling-frame (caller lra up-frame)
782 (declare (type system-area-pointer caller))
783 (/noshow0 "entering COMPUTE-CALLING-FRAME")
784 (when (control-stack-pointer-valid-p caller)
786 (multiple-value-bind (code pc-offset escaped)
788 (multiple-value-bind (word-offset code)
790 (let ((fp (frame-pointer up-frame)))
792 (stack-ref fp (1+ lra-save-offset))))
793 (values (get-header-data lra)
794 (lra-code-header lra)))
797 (* (1+ (- word-offset (get-header-data code)))
800 (values :foreign-function
803 (find-escaped-frame caller))
804 (if (and (code-component-p code)
805 (eq (%code-debug-info code) :bogus-lra))
806 (let ((real-lra (code-header-ref code real-lra-slot)))
807 (compute-calling-frame caller real-lra up-frame))
808 (let ((d-fun (case code
810 (make-bogus-debug-fun
811 "undefined function"))
813 (make-bogus-debug-fun
814 (foreign-function-backtrace-name
815 (int-sap (get-lisp-obj-address lra)))))
817 (make-bogus-debug-fun
818 "bogus stack frame"))
820 (debug-fun-from-pc code pc-offset)))))
821 (/noshow0 "returning MAKE-COMPILED-FRAME from COMPUTE-CALLING-FRAME")
822 (make-compiled-frame caller up-frame d-fun
823 (code-location-from-pc d-fun pc-offset
825 (if up-frame (1+ (frame-number up-frame)) 0)
829 (defun compute-calling-frame (caller ra up-frame)
830 (declare (type system-area-pointer caller ra))
831 (/noshow0 "entering COMPUTE-CALLING-FRAME")
832 (when (control-stack-pointer-valid-p caller)
834 ;; First check for an escaped frame.
835 (multiple-value-bind (code pc-offset escaped) (find-escaped-frame caller)
838 ;; If it's escaped it may be a function end breakpoint trap.
839 (when (and (code-component-p code)
840 (eq (%code-debug-info code) :bogus-lra))
841 ;; If :bogus-lra grab the real lra.
842 (setq pc-offset (code-header-ref
843 code (1+ real-lra-slot)))
844 (setq code (code-header-ref code real-lra-slot))
847 (multiple-value-setq (pc-offset code)
848 (compute-lra-data-from-pc ra))
850 (setf code :foreign-function
852 (let ((d-fun (case code
854 (make-bogus-debug-fun
855 "undefined function"))
857 (make-bogus-debug-fun
858 (foreign-function-backtrace-name ra)))
860 (make-bogus-debug-fun
861 "bogus stack frame"))
863 (debug-fun-from-pc code pc-offset)))))
864 (/noshow0 "returning MAKE-COMPILED-FRAME from COMPUTE-CALLING-FRAME")
865 (make-compiled-frame caller up-frame d-fun
866 (code-location-from-pc d-fun pc-offset
868 (if up-frame (1+ (frame-number up-frame)) 0)
871 (defun nth-interrupt-context (n)
872 (declare (type (unsigned-byte 32) n)
873 (optimize (speed 3) (safety 0)))
874 (sb!alien:sap-alien (sb!vm::current-thread-offset-sap
875 (+ sb!vm::thread-interrupt-contexts-offset n))
879 (defun find-escaped-frame (frame-pointer)
880 (declare (type system-area-pointer frame-pointer))
881 (/noshow0 "entering FIND-ESCAPED-FRAME")
882 (dotimes (index *free-interrupt-context-index* (values nil 0 nil))
883 (/noshow0 "at head of WITH-ALIEN")
884 (let ((context (nth-interrupt-context index)))
885 (/noshow0 "got CONTEXT")
886 (when (= (sap-int frame-pointer)
887 (sb!vm:context-register context sb!vm::cfp-offset))
889 (/noshow0 "in WITHOUT-GCING")
890 (let* ((component-ptr (component-ptr-from-pc
891 (sb!vm:context-pc context)))
892 (code (unless (sap= component-ptr (int-sap #x0))
893 (component-from-component-ptr component-ptr))))
894 (/noshow0 "got CODE")
896 (return (values code 0 context)))
897 (let* ((code-header-len (* (get-header-data code)
900 (- (sap-int (sb!vm:context-pc context))
901 (- (get-lisp-obj-address code)
902 sb!vm:other-pointer-lowtag)
904 (/noshow "got PC-OFFSET")
905 (unless (<= 0 pc-offset
906 (* (code-header-ref code sb!vm:code-code-size-slot)
908 ;; We were in an assembly routine. Therefore, use the
911 ;; FIXME: Should this be WARN or ERROR or what?
912 (format t "** pc-offset ~S not in code obj ~S?~%"
914 (/noshow0 "returning from FIND-ESCAPED-FRAME")
916 (values code pc-offset context)))))))))
919 (defun find-escaped-frame (frame-pointer)
920 (declare (type system-area-pointer frame-pointer))
921 (/noshow0 "entering FIND-ESCAPED-FRAME")
922 (dotimes (index *free-interrupt-context-index* (values nil 0 nil))
923 (/noshow0 "at head of WITH-ALIEN")
924 (let ((scp (nth-interrupt-context index)))
926 (when (= (sap-int frame-pointer)
927 (sb!vm:context-register scp sb!vm::cfp-offset))
929 (/noshow0 "in WITHOUT-GCING")
930 (let ((code (code-object-from-bits
931 (sb!vm:context-register scp sb!vm::code-offset))))
932 (/noshow0 "got CODE")
934 (return (values code 0 scp)))
935 (let* ((code-header-len (* (get-header-data code)
938 (- (sap-int (sb!vm:context-pc scp))
939 (- (get-lisp-obj-address code)
940 sb!vm:other-pointer-lowtag)
942 (let ((code-size (* (code-header-ref code
943 sb!vm:code-code-size-slot)
944 sb!vm:n-word-bytes)))
945 (unless (<= 0 pc-offset code-size)
946 ;; We were in an assembly routine.
947 (multiple-value-bind (new-pc-offset computed-return)
948 (find-pc-from-assembly-fun code scp)
949 (setf pc-offset new-pc-offset)
950 (unless (<= 0 pc-offset code-size)
952 "Set PC-OFFSET to zero and continue backtrace."
955 "~@<PC-OFFSET (~D) not in code object. Frame details:~
956 ~2I~:@_PC: #X~X~:@_CODE: ~S~:@_CODE FUN: ~S~:@_LRA: ~
957 #X~X~:@_COMPUTED RETURN: #X~X.~:>"
960 (sap-int (sb!vm:context-pc scp))
962 (%code-entry-points code)
963 (sb!vm:context-register scp sb!vm::lra-offset)
965 ;; We failed to pinpoint where PC is, but set
966 ;; pc-offset to 0 to keep the backtrace from
968 (setf pc-offset 0)))))
969 (/noshow0 "returning from FIND-ESCAPED-FRAME")
971 (if (eq (%code-debug-info code) :bogus-lra)
972 (let ((real-lra (code-header-ref code
974 (values (lra-code-header real-lra)
975 (get-header-data real-lra)
977 (values code pc-offset scp))))))))))
980 (defun find-pc-from-assembly-fun (code scp)
981 "Finds the PC for the return from an assembly routine properly.
982 For some architectures (such as PPC) this will not be the $LRA
984 (let ((return-machine-address (sb!vm::return-machine-address scp))
985 (code-header-len (* (get-header-data code) sb!vm:n-word-bytes)))
986 (values (- return-machine-address
987 (- (get-lisp-obj-address code)
988 sb!vm:other-pointer-lowtag)
990 return-machine-address)))
992 ;;; Find the code object corresponding to the object represented by
993 ;;; bits and return it. We assume bogus functions correspond to the
994 ;;; undefined-function.
996 (defun code-object-from-bits (bits)
997 (declare (type (unsigned-byte 32) bits))
998 (let ((object (make-lisp-obj bits nil)))
999 (if (functionp object)
1000 (or (fun-code-header object)
1001 :undefined-function)
1002 (let ((lowtag (lowtag-of object)))
1003 (when (= lowtag sb!vm:other-pointer-lowtag)
1004 (let ((widetag (widetag-of object)))
1005 (cond ((= widetag sb!vm:code-header-widetag)
1007 ((= widetag sb!vm:return-pc-header-widetag)
1008 (lra-code-header object))
1012 ;;;; frame utilities
1014 ;;; This returns a COMPILED-DEBUG-FUN for COMPONENT and PC. We fetch the
1015 ;;; SB!C::DEBUG-INFO and run down its FUN-MAP to get a
1016 ;;; SB!C::COMPILED-DEBUG-FUN from the PC. The result only needs to
1017 ;;; reference the COMPONENT, for function constants, and the
1018 ;;; SB!C::COMPILED-DEBUG-FUN.
1019 (defun debug-fun-from-pc (component pc)
1020 (let ((info (%code-debug-info component)))
1023 ;; FIXME: It seems that most of these (at least on x86) are
1024 ;; actually assembler routines, and could be named by looking
1025 ;; at the sb-fasl:*assembler-routines*.
1026 (make-bogus-debug-fun "no debug information for frame"))
1027 ((eq info :bogus-lra)
1028 (make-bogus-debug-fun "function end breakpoint"))
1030 (let* ((fun-map (sb!c::compiled-debug-info-fun-map info))
1031 (len (length fun-map)))
1032 (declare (type simple-vector fun-map))
1034 (make-compiled-debug-fun (svref fun-map 0) component)
1037 (>= pc (sb!c::compiled-debug-fun-elsewhere-pc
1038 (svref fun-map 0)))))
1039 (declare (type sb!int:index i))
1042 (< pc (if elsewhere-p
1043 (sb!c::compiled-debug-fun-elsewhere-pc
1044 (svref fun-map (1+ i)))
1045 (svref fun-map i))))
1046 (return (make-compiled-debug-fun
1047 (svref fun-map (1- i))
1051 ;;; This returns a code-location for the COMPILED-DEBUG-FUN,
1052 ;;; DEBUG-FUN, and the pc into its code vector. If we stopped at a
1053 ;;; breakpoint, find the CODE-LOCATION for that breakpoint. Otherwise,
1054 ;;; make an :UNSURE code location, so it can be filled in when we
1055 ;;; figure out what is going on.
1056 (defun code-location-from-pc (debug-fun pc escaped)
1057 (or (and (compiled-debug-fun-p debug-fun)
1059 (let ((data (breakpoint-data
1060 (compiled-debug-fun-component debug-fun)
1062 (when (and data (breakpoint-data-breakpoints data))
1063 (let ((what (breakpoint-what
1064 (first (breakpoint-data-breakpoints data)))))
1065 (when (compiled-code-location-p what)
1067 (make-compiled-code-location pc debug-fun)))
1069 ;;; Return an alist mapping catch tags to CODE-LOCATIONs. These are
1070 ;;; CODE-LOCATIONs at which execution would continue with frame as the
1071 ;;; top frame if someone threw to the corresponding tag.
1072 (defun frame-catches (frame)
1073 (let ((catch (descriptor-sap sb!vm:*current-catch-block*))
1074 (reversed-result nil)
1075 (fp (frame-pointer frame)))
1076 (loop until (zerop (sap-int catch))
1077 finally (return (nreverse reversed-result))
1082 (* sb!vm:catch-block-current-cont-slot
1083 sb!vm:n-word-bytes))
1087 (* sb!vm:catch-block-current-cont-slot
1088 sb!vm:n-word-bytes))))
1089 (let* (#!-(or x86 x86-64)
1090 (lra (stack-ref catch sb!vm:catch-block-entry-pc-slot))
1093 catch (* sb!vm:catch-block-entry-pc-slot
1094 sb!vm:n-word-bytes)))
1097 (stack-ref catch sb!vm:catch-block-current-code-slot))
1099 (component (component-from-component-ptr
1100 (component-ptr-from-pc ra)))
1103 (* (- (1+ (get-header-data lra))
1104 (get-header-data component))
1108 (- (get-lisp-obj-address component)
1109 sb!vm:other-pointer-lowtag)
1110 (* (get-header-data component) sb!vm:n-word-bytes))))
1111 (push (cons #!-(or x86 x86-64)
1112 (stack-ref catch sb!vm:catch-block-tag-slot)
1115 (sap-ref-word catch (* sb!vm:catch-block-tag-slot
1116 sb!vm:n-word-bytes)))
1117 (make-compiled-code-location
1118 offset (frame-debug-fun frame)))
1123 (* sb!vm:catch-block-previous-catch-slot
1124 sb!vm:n-word-bytes))
1128 (* sb!vm:catch-block-previous-catch-slot
1129 sb!vm:n-word-bytes)))))))
1131 ;;; Modify the value of the OLD-TAG catches in FRAME to NEW-TAG
1132 (defun replace-frame-catch-tag (frame old-tag new-tag)
1133 (let ((catch (descriptor-sap sb!vm:*current-catch-block*))
1134 (fp (frame-pointer frame)))
1135 (loop until (zerop (sap-int catch))
1139 (* sb!vm:catch-block-current-cont-slot
1140 sb!vm:n-word-bytes))
1144 (* sb!vm:catch-block-current-cont-slot
1145 sb!vm:n-word-bytes))))
1148 (stack-ref catch sb!vm:catch-block-tag-slot)
1151 (sap-ref-word catch (* sb!vm:catch-block-tag-slot
1152 sb!vm:n-word-bytes)))))
1153 (when (eq current-tag old-tag)
1155 (setf (stack-ref catch sb!vm:catch-block-tag-slot) new-tag)
1157 (setf (sap-ref-word catch (* sb!vm:catch-block-tag-slot
1158 sb!vm:n-word-bytes))
1159 (get-lisp-obj-address new-tag)))))
1163 (* sb!vm:catch-block-previous-catch-slot
1164 sb!vm:n-word-bytes))
1168 (* sb!vm:catch-block-previous-catch-slot
1169 sb!vm:n-word-bytes)))))))
1173 ;;;; operations on DEBUG-FUNs
1175 ;;; Execute the forms in a context with BLOCK-VAR bound to each
1176 ;;; DEBUG-BLOCK in DEBUG-FUN successively. Result is an optional
1177 ;;; form to execute for return values, and DO-DEBUG-FUN-BLOCKS
1178 ;;; returns nil if there is no result form. This signals a
1179 ;;; NO-DEBUG-BLOCKS condition when the DEBUG-FUN lacks
1180 ;;; DEBUG-BLOCK information.
1181 (defmacro do-debug-fun-blocks ((block-var debug-fun &optional result)
1183 (let ((blocks (gensym))
1185 `(let ((,blocks (debug-fun-debug-blocks ,debug-fun)))
1186 (declare (simple-vector ,blocks))
1187 (dotimes (,i (length ,blocks) ,result)
1188 (let ((,block-var (svref ,blocks ,i)))
1191 ;;; Execute body in a context with VAR bound to each DEBUG-VAR in
1192 ;;; DEBUG-FUN. This returns the value of executing result (defaults to
1193 ;;; nil). This may iterate over only some of DEBUG-FUN's variables or
1194 ;;; none depending on debug policy; for example, possibly the
1195 ;;; compilation only preserved argument information.
1196 (defmacro do-debug-fun-vars ((var debug-fun &optional result) &body body)
1197 (let ((vars (gensym))
1199 `(let ((,vars (debug-fun-debug-vars ,debug-fun)))
1200 (declare (type (or null simple-vector) ,vars))
1202 (dotimes (,i (length ,vars) ,result)
1203 (let ((,var (svref ,vars ,i)))
1207 ;;; Return the object of type FUNCTION associated with the DEBUG-FUN,
1208 ;;; or NIL if the function is unavailable or is non-existent as a user
1209 ;;; callable function object.
1210 (defun debug-fun-fun (debug-fun)
1211 (let ((cached-value (debug-fun-%function debug-fun)))
1212 (if (eq cached-value :unparsed)
1213 (setf (debug-fun-%function debug-fun)
1214 (etypecase debug-fun
1217 (compiled-debug-fun-component debug-fun))
1219 (sb!c::compiled-debug-fun-start-pc
1220 (compiled-debug-fun-compiler-debug-fun debug-fun))))
1221 (do ((entry (%code-entry-points component)
1222 (%simple-fun-next entry)))
1225 (sb!c::compiled-debug-fun-start-pc
1226 (compiled-debug-fun-compiler-debug-fun
1227 (fun-debug-fun entry))))
1229 (bogus-debug-fun nil)))
1232 ;;; Return the name of the function represented by DEBUG-FUN. This may
1233 ;;; be a string or a cons; do not assume it is a symbol.
1234 (defun debug-fun-name (debug-fun)
1235 (declare (type debug-fun debug-fun))
1236 (etypecase debug-fun
1238 (sb!c::compiled-debug-fun-name
1239 (compiled-debug-fun-compiler-debug-fun debug-fun)))
1241 (bogus-debug-fun-%name debug-fun))))
1243 ;;; Return a DEBUG-FUN that represents debug information for FUN.
1244 (defun fun-debug-fun (fun)
1245 (declare (type function fun))
1246 (ecase (widetag-of fun)
1247 (#.sb!vm:closure-header-widetag
1248 (fun-debug-fun (%closure-fun fun)))
1249 (#.sb!vm:funcallable-instance-header-widetag
1250 (fun-debug-fun (funcallable-instance-fun fun)))
1251 (#.sb!vm:simple-fun-header-widetag
1252 (let* ((name (%simple-fun-name fun))
1253 (component (fun-code-header fun))
1256 (and (sb!c::compiled-debug-fun-p x)
1257 (eq (sb!c::compiled-debug-fun-name x) name)
1258 (eq (sb!c::compiled-debug-fun-kind x) nil)))
1259 (sb!c::compiled-debug-info-fun-map
1260 (%code-debug-info component)))))
1262 (make-compiled-debug-fun res component)
1263 ;; KLUDGE: comment from CMU CL:
1264 ;; This used to be the non-interpreted branch, but
1265 ;; William wrote it to return the debug-fun of fun's XEP
1266 ;; instead of fun's debug-fun. The above code does this
1267 ;; more correctly, but it doesn't get or eliminate all
1268 ;; appropriate cases. It mostly works, and probably
1269 ;; works for all named functions anyway.
1271 (debug-fun-from-pc component
1272 (* (- (fun-word-offset fun)
1273 (get-header-data component))
1274 sb!vm:n-word-bytes)))))))
1276 ;;; Return the kind of the function, which is one of :OPTIONAL,
1277 ;;; :EXTERNAL, :TOPLEVEL, :CLEANUP, or NIL.
1278 (defun debug-fun-kind (debug-fun)
1279 ;; FIXME: This "is one of" information should become part of the function
1280 ;; declamation, not just a doc string
1281 (etypecase debug-fun
1283 (sb!c::compiled-debug-fun-kind
1284 (compiled-debug-fun-compiler-debug-fun debug-fun)))
1288 ;;; Is there any variable information for DEBUG-FUN?
1289 (defun debug-var-info-available (debug-fun)
1290 (not (not (debug-fun-debug-vars debug-fun))))
1292 ;;; Return a list of DEBUG-VARs in DEBUG-FUN having the same name
1293 ;;; and package as SYMBOL. If SYMBOL is uninterned, then this returns
1294 ;;; a list of DEBUG-VARs without package names and with the same name
1295 ;;; as symbol. The result of this function is limited to the
1296 ;;; availability of variable information in DEBUG-FUN; for
1297 ;;; example, possibly DEBUG-FUN only knows about its arguments.
1298 (defun debug-fun-symbol-vars (debug-fun symbol)
1299 (let ((vars (ambiguous-debug-vars debug-fun (symbol-name symbol)))
1300 (package (and (symbol-package symbol)
1301 (package-name (symbol-package symbol)))))
1302 (delete-if (if (stringp package)
1304 (let ((p (debug-var-package-name var)))
1305 (or (not (stringp p))
1306 (string/= p package))))
1308 (stringp (debug-var-package-name var))))
1311 ;;; Return a list of DEBUG-VARs in DEBUG-FUN whose names contain
1312 ;;; NAME-PREFIX-STRING as an initial substring. The result of this
1313 ;;; function is limited to the availability of variable information in
1314 ;;; debug-fun; for example, possibly debug-fun only knows
1315 ;;; about its arguments.
1316 (defun ambiguous-debug-vars (debug-fun name-prefix-string)
1317 (declare (simple-string name-prefix-string))
1318 (let ((variables (debug-fun-debug-vars debug-fun)))
1319 (declare (type (or null simple-vector) variables))
1321 (let* ((len (length variables))
1322 (prefix-len (length name-prefix-string))
1323 (pos (find-var name-prefix-string variables len))
1326 ;; Find names from pos to variable's len that contain prefix.
1327 (do ((i pos (1+ i)))
1329 (let* ((var (svref variables i))
1330 (name (debug-var-symbol-name var))
1331 (name-len (length name)))
1332 (declare (simple-string name))
1333 (when (/= (or (string/= name-prefix-string name
1334 :end1 prefix-len :end2 name-len)
1339 (setq res (nreverse res)))
1342 ;;; This returns a position in VARIABLES for one containing NAME as an
1343 ;;; initial substring. END is the length of VARIABLES if supplied.
1344 (defun find-var (name variables &optional end)
1345 (declare (simple-vector variables)
1346 (simple-string name))
1347 (let ((name-len (length name)))
1348 (position name variables
1350 (let* ((y (debug-var-symbol-name y))
1352 (declare (simple-string y))
1353 (and (>= y-len name-len)
1354 (string= x y :end1 name-len :end2 name-len))))
1355 :end (or end (length variables)))))
1357 ;;; Return a list representing the lambda-list for DEBUG-FUN. The
1358 ;;; list has the following structure:
1359 ;;; (required-var1 required-var2
1361 ;;; (:optional var3 suppliedp-var4)
1362 ;;; (:optional var5)
1364 ;;; (:rest var6) (:rest var7)
1366 ;;; (:keyword keyword-symbol var8 suppliedp-var9)
1367 ;;; (:keyword keyword-symbol var10)
1370 ;;; Each VARi is a DEBUG-VAR; however it may be the symbol :DELETED if
1371 ;;; it is unreferenced in DEBUG-FUN. This signals a
1372 ;;; LAMBDA-LIST-UNAVAILABLE condition when there is no argument list
1374 (defun debug-fun-lambda-list (debug-fun)
1375 (etypecase debug-fun
1376 (compiled-debug-fun (compiled-debug-fun-lambda-list debug-fun))
1377 (bogus-debug-fun nil)))
1379 ;;; Note: If this has to compute the lambda list, it caches it in DEBUG-FUN.
1380 (defun compiled-debug-fun-lambda-list (debug-fun)
1381 (let ((lambda-list (debug-fun-%lambda-list debug-fun)))
1382 (cond ((eq lambda-list :unparsed)
1383 (multiple-value-bind (args argsp)
1384 (parse-compiled-debug-fun-lambda-list debug-fun)
1385 (setf (debug-fun-%lambda-list debug-fun) args)
1388 (debug-signal 'lambda-list-unavailable
1389 :debug-fun debug-fun))))
1391 ((bogus-debug-fun-p debug-fun)
1393 ((sb!c::compiled-debug-fun-arguments
1394 (compiled-debug-fun-compiler-debug-fun debug-fun))
1395 ;; If the packed information is there (whether empty or not) as
1396 ;; opposed to being nil, then returned our cached value (nil).
1399 ;; Our cached value is nil, and the packed lambda-list information
1400 ;; is nil, so we don't have anything available.
1401 (debug-signal 'lambda-list-unavailable
1402 :debug-fun debug-fun)))))
1404 ;;; COMPILED-DEBUG-FUN-LAMBDA-LIST calls this when a
1405 ;;; COMPILED-DEBUG-FUN has no lambda list information cached. It
1406 ;;; returns the lambda list as the first value and whether there was
1407 ;;; any argument information as the second value. Therefore,
1408 ;;; (VALUES NIL T) means there were no arguments, but (VALUES NIL NIL)
1409 ;;; means there was no argument information.
1410 (defun parse-compiled-debug-fun-lambda-list (debug-fun)
1411 (let ((args (sb!c::compiled-debug-fun-arguments
1412 (compiled-debug-fun-compiler-debug-fun debug-fun))))
1417 (values (coerce (debug-fun-debug-vars debug-fun) 'list)
1420 (let ((vars (debug-fun-debug-vars debug-fun))
1425 (declare (type (or null simple-vector) vars))
1427 (when (>= i len) (return))
1428 (let ((ele (aref args i)))
1433 ;; Deleted required arg at beginning of args array.
1434 (push :deleted res))
1435 (sb!c::optional-args
1438 ;; SUPPLIED-P var immediately following keyword or
1439 ;; optional. Stick the extra var in the result
1440 ;; element representing the keyword or optional,
1441 ;; which is the previous one.
1443 ;; FIXME: NCONC used for side-effect: the effect is defined,
1444 ;; but this is bad style no matter what.
1446 (list (compiled-debug-fun-lambda-list-var
1447 args (incf i) vars))))
1450 (compiled-debug-fun-lambda-list-var
1451 args (incf i) vars))
1454 ;; Just ignore the fact that the next two args are
1455 ;; the &MORE arg context and count, and act like they
1456 ;; are regular arguments.
1460 (push (list :keyword
1462 (compiled-debug-fun-lambda-list-var
1463 args (incf i) vars))
1466 ;; We saw an optional marker, so the following
1467 ;; non-symbols are indexes indicating optional
1469 (push (list :optional (svref vars ele)) res))
1471 ;; Required arg at beginning of args array.
1472 (push (svref vars ele) res))))
1474 (values (nreverse res) t))))))
1476 ;;; This is used in COMPILED-DEBUG-FUN-LAMBDA-LIST.
1477 (defun compiled-debug-fun-lambda-list-var (args i vars)
1478 (declare (type (simple-array * (*)) args)
1479 (simple-vector vars))
1480 (let ((ele (aref args i)))
1481 (cond ((not (symbolp ele)) (svref vars ele))
1482 ((eq ele 'sb!c::deleted) :deleted)
1483 (t (error "malformed arguments description")))))
1485 (defun compiled-debug-fun-debug-info (debug-fun)
1486 (%code-debug-info (compiled-debug-fun-component debug-fun)))
1488 ;;;; unpacking variable and basic block data
1490 (defvar *parsing-buffer*
1491 (make-array 20 :adjustable t :fill-pointer t))
1492 (defvar *other-parsing-buffer*
1493 (make-array 20 :adjustable t :fill-pointer t))
1494 ;;; PARSE-DEBUG-BLOCKS and PARSE-DEBUG-VARS
1495 ;;; use this to unpack binary encoded information. It returns the
1496 ;;; values returned by the last form in body.
1498 ;;; This binds buffer-var to *parsing-buffer*, makes sure it starts at
1499 ;;; element zero, and makes sure if we unwind, we nil out any set
1500 ;;; elements for GC purposes.
1502 ;;; This also binds other-var to *other-parsing-buffer* when it is
1503 ;;; supplied, making sure it starts at element zero and that we nil
1504 ;;; out any elements if we unwind.
1506 ;;; This defines the local macro RESULT that takes a buffer, copies
1507 ;;; its elements to a resulting simple-vector, nil's out elements, and
1508 ;;; restarts the buffer at element zero. RESULT returns the
1510 (eval-when (:compile-toplevel :execute)
1511 (sb!xc:defmacro with-parsing-buffer ((buffer-var &optional other-var)
1513 (let ((len (gensym))
1516 (let ((,buffer-var *parsing-buffer*)
1517 ,@(if other-var `((,other-var *other-parsing-buffer*))))
1518 (setf (fill-pointer ,buffer-var) 0)
1519 ,@(if other-var `((setf (fill-pointer ,other-var) 0)))
1520 (macrolet ((result (buf)
1521 `(let* ((,',len (length ,buf))
1522 (,',res (make-array ,',len)))
1523 (replace ,',res ,buf :end1 ,',len :end2 ,',len)
1524 (fill ,buf nil :end ,',len)
1525 (setf (fill-pointer ,buf) 0)
1528 (fill *parsing-buffer* nil)
1529 ,@(if other-var `((fill *other-parsing-buffer* nil))))))
1532 ;;; The argument is a debug internals structure. This returns the
1533 ;;; DEBUG-BLOCKs for DEBUG-FUN, regardless of whether we have unpacked
1534 ;;; them yet. It signals a NO-DEBUG-BLOCKS condition if it can't
1535 ;;; return the blocks.
1536 (defun debug-fun-debug-blocks (debug-fun)
1537 (let ((blocks (debug-fun-blocks debug-fun)))
1538 (cond ((eq blocks :unparsed)
1539 (setf (debug-fun-blocks debug-fun)
1540 (parse-debug-blocks debug-fun))
1541 (unless (debug-fun-blocks debug-fun)
1542 (debug-signal 'no-debug-blocks
1543 :debug-fun debug-fun))
1544 (debug-fun-blocks debug-fun))
1547 (debug-signal 'no-debug-blocks
1548 :debug-fun debug-fun)))))
1550 ;;; Return a SIMPLE-VECTOR of DEBUG-BLOCKs or NIL. NIL indicates there
1551 ;;; was no basic block information.
1552 (defun parse-debug-blocks (debug-fun)
1553 (etypecase debug-fun
1555 (parse-compiled-debug-blocks debug-fun))
1557 (debug-signal 'no-debug-blocks :debug-fun debug-fun))))
1559 ;;; This does some of the work of PARSE-DEBUG-BLOCKS.
1560 (defun parse-compiled-debug-blocks (debug-fun)
1561 (let* ((var-count (length (debug-fun-debug-vars debug-fun)))
1562 (compiler-debug-fun (compiled-debug-fun-compiler-debug-fun
1564 (blocks (sb!c::compiled-debug-fun-blocks compiler-debug-fun))
1565 ;; KLUDGE: 8 is a hard-wired constant in the compiler for the
1566 ;; element size of the packed binary representation of the
1568 (live-set-len (ceiling var-count 8))
1569 (tlf-number (sb!c::compiled-debug-fun-tlf-number compiler-debug-fun)))
1571 (return-from parse-compiled-debug-blocks nil))
1572 (macrolet ((aref+ (a i) `(prog1 (aref ,a ,i) (incf ,i))))
1573 (with-parsing-buffer (blocks-buffer locations-buffer)
1575 (len (length blocks))
1578 (when (>= i len) (return))
1579 (let ((succ-and-flags (aref+ blocks i))
1581 (declare (type (unsigned-byte 8) succ-and-flags)
1583 (dotimes (k (ldb sb!c::compiled-debug-block-nsucc-byte
1585 (push (sb!c:read-var-integer blocks i) successors))
1587 (dotimes (k (sb!c:read-var-integer blocks i)
1588 (result locations-buffer))
1589 (let ((kind (svref sb!c::*compiled-code-location-kinds*
1592 (sb!c:read-var-integer blocks i)))
1593 (tlf-offset (or tlf-number
1594 (sb!c:read-var-integer blocks i)))
1595 (form-number (sb!c:read-var-integer blocks i))
1596 (live-set (sb!c:read-packed-bit-vector
1597 live-set-len blocks i))
1598 (step-info (sb!c:read-var-string blocks i)))
1599 (vector-push-extend (make-known-code-location
1600 pc debug-fun tlf-offset
1601 form-number live-set kind
1604 (setf last-pc pc))))
1605 (block (make-compiled-debug-block
1606 locations successors
1608 sb!c::compiled-debug-block-elsewhere-p
1609 succ-and-flags))))))
1610 (vector-push-extend block blocks-buffer)
1611 (dotimes (k (length locations))
1612 (setf (code-location-%debug-block (svref locations k))
1614 (let ((res (result blocks-buffer)))
1615 (declare (simple-vector res))
1616 (dotimes (i (length res))
1617 (let* ((block (svref res i))
1619 (dolist (ele (debug-block-successors block))
1620 (push (svref res ele) succs))
1621 (setf (debug-block-successors block) succs)))
1624 ;;; The argument is a debug internals structure. This returns NIL if
1625 ;;; there is no variable information. It returns an empty
1626 ;;; simple-vector if there were no locals in the function. Otherwise
1627 ;;; it returns a SIMPLE-VECTOR of DEBUG-VARs.
1628 (defun debug-fun-debug-vars (debug-fun)
1629 (let ((vars (debug-fun-%debug-vars debug-fun)))
1630 (if (eq vars :unparsed)
1631 (setf (debug-fun-%debug-vars debug-fun)
1632 (etypecase debug-fun
1634 (parse-compiled-debug-vars debug-fun))
1635 (bogus-debug-fun nil)))
1638 ;;; VARS is the parsed variables for a minimal debug function. We need
1639 ;;; to assign names of the form ARG-NNN. We must pad with leading
1640 ;;; zeros, since the arguments must be in alphabetical order.
1641 (defun assign-minimal-var-names (vars)
1642 (declare (simple-vector vars))
1643 (let* ((len (length vars))
1644 (width (length (format nil "~W" (1- len)))))
1646 (without-package-locks
1647 (setf (compiled-debug-var-symbol (svref vars i))
1648 (intern (format nil "ARG-~V,'0D" width i)
1649 ;; KLUDGE: It's somewhat nasty to have a bare
1650 ;; package name string here. It would be
1651 ;; nicer to have #.(FIND-PACKAGE "SB!DEBUG")
1652 ;; instead, since then at least it would transform
1653 ;; correctly under package renaming and stuff.
1654 ;; However, genesis can't handle dumped packages..
1657 ;; FIXME: Maybe this could be fixed by moving the
1658 ;; whole debug-int.lisp file to warm init? (after
1659 ;; which dumping a #.(FIND-PACKAGE ..) expression
1660 ;; would work fine) If this is possible, it would
1661 ;; probably be a good thing, since minimizing the
1662 ;; amount of stuff in cold init is basically good.
1663 (or (find-package "SB-DEBUG")
1664 (find-package "SB!DEBUG"))))))))
1666 ;;; Parse the packed representation of DEBUG-VARs from
1667 ;;; DEBUG-FUN's SB!C::COMPILED-DEBUG-FUN, returning a vector
1668 ;;; of DEBUG-VARs, or NIL if there was no information to parse.
1669 (defun parse-compiled-debug-vars (debug-fun)
1670 (let* ((cdebug-fun (compiled-debug-fun-compiler-debug-fun
1672 (packed-vars (sb!c::compiled-debug-fun-vars cdebug-fun))
1673 (args-minimal (eq (sb!c::compiled-debug-fun-arguments cdebug-fun)
1677 (buffer (make-array 0 :fill-pointer 0 :adjustable t)))
1678 ((>= i (length packed-vars))
1679 (let ((result (coerce buffer 'simple-vector)))
1681 (assign-minimal-var-names result))
1683 (flet ((geti () (prog1 (aref packed-vars i) (incf i))))
1684 (let* ((flags (geti))
1685 (minimal (logtest sb!c::compiled-debug-var-minimal-p flags))
1686 (deleted (logtest sb!c::compiled-debug-var-deleted-p flags))
1687 (live (logtest sb!c::compiled-debug-var-environment-live
1689 (save (logtest sb!c::compiled-debug-var-save-loc-p flags))
1690 (symbol (if minimal nil (geti)))
1691 (id (if (logtest sb!c::compiled-debug-var-id-p flags)
1694 (sc-offset (if deleted 0 (geti)))
1695 (save-sc-offset (if save (geti) nil)))
1696 (aver (not (and args-minimal (not minimal))))
1697 (vector-push-extend (make-compiled-debug-var symbol
1706 ;;; If we're sure of whether code-location is known, return T or NIL.
1707 ;;; If we're :UNSURE, then try to fill in the code-location's slots.
1708 ;;; This determines whether there is any debug-block information, and
1709 ;;; if code-location is known.
1711 ;;; ??? IF this conses closures every time it's called, then break off the
1712 ;;; :UNSURE part to get the HANDLER-CASE into another function.
1713 (defun code-location-unknown-p (basic-code-location)
1714 (ecase (code-location-%unknown-p basic-code-location)
1718 (setf (code-location-%unknown-p basic-code-location)
1719 (handler-case (not (fill-in-code-location basic-code-location))
1720 (no-debug-blocks () t))))))
1722 ;;; Return the DEBUG-BLOCK containing code-location if it is available.
1723 ;;; Some debug policies inhibit debug-block information, and if none
1724 ;;; is available, then this signals a NO-DEBUG-BLOCKS condition.
1725 (defun code-location-debug-block (basic-code-location)
1726 (let ((block (code-location-%debug-block basic-code-location)))
1727 (if (eq block :unparsed)
1728 (etypecase basic-code-location
1729 (compiled-code-location
1730 (compute-compiled-code-location-debug-block basic-code-location))
1731 ;; (There used to be more cases back before sbcl-0.7.0, when
1732 ;; we did special tricks to debug the IR1 interpreter.)
1736 ;;; Store and return BASIC-CODE-LOCATION's debug-block. We determines
1737 ;;; the correct one using the code-location's pc. We use
1738 ;;; DEBUG-FUN-DEBUG-BLOCKS to return the cached block information
1739 ;;; or signal a NO-DEBUG-BLOCKS condition. The blocks are sorted by
1740 ;;; their first code-location's pc, in ascending order. Therefore, as
1741 ;;; soon as we find a block that starts with a pc greater than
1742 ;;; basic-code-location's pc, we know the previous block contains the
1743 ;;; pc. If we get to the last block, then the code-location is either
1744 ;;; in the second to last block or the last block, and we have to be
1745 ;;; careful in determining this since the last block could be code at
1746 ;;; the end of the function. We have to check for the last block being
1747 ;;; code first in order to see how to compare the code-location's pc.
1748 (defun compute-compiled-code-location-debug-block (basic-code-location)
1749 (let* ((pc (compiled-code-location-pc basic-code-location))
1750 (debug-fun (code-location-debug-fun
1751 basic-code-location))
1752 (blocks (debug-fun-debug-blocks debug-fun))
1753 (len (length blocks)))
1754 (declare (simple-vector blocks))
1755 (setf (code-location-%debug-block basic-code-location)
1761 (let ((last (svref blocks end)))
1763 ((debug-block-elsewhere-p last)
1765 (sb!c::compiled-debug-fun-elsewhere-pc
1766 (compiled-debug-fun-compiler-debug-fun
1768 (svref blocks (1- end))
1771 (compiled-code-location-pc
1772 (svref (compiled-debug-block-code-locations last)
1774 (svref blocks (1- end)))
1776 (declare (type index i end))
1778 (compiled-code-location-pc
1779 (svref (compiled-debug-block-code-locations
1782 (return (svref blocks (1- i)))))))))
1784 ;;; Return the CODE-LOCATION's DEBUG-SOURCE.
1785 (defun code-location-debug-source (code-location)
1786 (let ((info (compiled-debug-fun-debug-info
1787 (code-location-debug-fun code-location))))
1788 (or (sb!c::debug-info-source info)
1789 (debug-signal 'no-debug-blocks :debug-fun
1790 (code-location-debug-fun code-location)))))
1792 ;;; Returns the number of top level forms before the one containing
1793 ;;; CODE-LOCATION as seen by the compiler in some compilation unit. (A
1794 ;;; compilation unit is not necessarily a single file, see the section
1795 ;;; on debug-sources.)
1796 (defun code-location-toplevel-form-offset (code-location)
1797 (when (code-location-unknown-p code-location)
1798 (error 'unknown-code-location :code-location code-location))
1799 (let ((tlf-offset (code-location-%tlf-offset code-location)))
1800 (cond ((eq tlf-offset :unparsed)
1801 (etypecase code-location
1802 (compiled-code-location
1803 (unless (fill-in-code-location code-location)
1804 ;; This check should be unnecessary. We're missing
1805 ;; debug info the compiler should have dumped.
1806 (bug "unknown code location"))
1807 (code-location-%tlf-offset code-location))
1808 ;; (There used to be more cases back before sbcl-0.7.0,,
1809 ;; when we did special tricks to debug the IR1
1814 ;;; Return the number of the form corresponding to CODE-LOCATION. The
1815 ;;; form number is derived by a walking the subforms of a top level
1816 ;;; form in depth-first order.
1817 (defun code-location-form-number (code-location)
1818 (when (code-location-unknown-p code-location)
1819 (error 'unknown-code-location :code-location code-location))
1820 (let ((form-num (code-location-%form-number code-location)))
1821 (cond ((eq form-num :unparsed)
1822 (etypecase code-location
1823 (compiled-code-location
1824 (unless (fill-in-code-location code-location)
1825 ;; This check should be unnecessary. We're missing
1826 ;; debug info the compiler should have dumped.
1827 (bug "unknown code location"))
1828 (code-location-%form-number code-location))
1829 ;; (There used to be more cases back before sbcl-0.7.0,,
1830 ;; when we did special tricks to debug the IR1
1835 ;;; Return the kind of CODE-LOCATION, one of:
1836 ;;; :INTERPRETED, :UNKNOWN-RETURN, :KNOWN-RETURN, :INTERNAL-ERROR,
1837 ;;; :NON-LOCAL-EXIT, :BLOCK-START, :CALL-SITE, :SINGLE-VALUE-RETURN,
1838 ;;; :NON-LOCAL-ENTRY
1839 (defun code-location-kind (code-location)
1840 (when (code-location-unknown-p code-location)
1841 (error 'unknown-code-location :code-location code-location))
1842 (etypecase code-location
1843 (compiled-code-location
1844 (let ((kind (compiled-code-location-kind code-location)))
1845 (cond ((not (eq kind :unparsed)) kind)
1846 ((not (fill-in-code-location code-location))
1847 ;; This check should be unnecessary. We're missing
1848 ;; debug info the compiler should have dumped.
1849 (bug "unknown code location"))
1851 (compiled-code-location-kind code-location)))))
1852 ;; (There used to be more cases back before sbcl-0.7.0,,
1853 ;; when we did special tricks to debug the IR1
1857 ;;; This returns CODE-LOCATION's live-set if it is available. If
1858 ;;; there is no debug-block information, this returns NIL.
1859 (defun compiled-code-location-live-set (code-location)
1860 (if (code-location-unknown-p code-location)
1862 (let ((live-set (compiled-code-location-%live-set code-location)))
1863 (cond ((eq live-set :unparsed)
1864 (unless (fill-in-code-location code-location)
1865 ;; This check should be unnecessary. We're missing
1866 ;; debug info the compiler should have dumped.
1868 ;; FIXME: This error and comment happen over and over again.
1869 ;; Make them a shared function.
1870 (bug "unknown code location"))
1871 (compiled-code-location-%live-set code-location))
1874 ;;; true if OBJ1 and OBJ2 are the same place in the code
1875 (defun code-location= (obj1 obj2)
1877 (compiled-code-location
1879 (compiled-code-location
1880 (and (eq (code-location-debug-fun obj1)
1881 (code-location-debug-fun obj2))
1882 (sub-compiled-code-location= obj1 obj2)))
1883 ;; (There used to be more cases back before sbcl-0.7.0,,
1884 ;; when we did special tricks to debug the IR1
1887 ;; (There used to be more cases back before sbcl-0.7.0,,
1888 ;; when we did special tricks to debug IR1-interpreted code.)
1890 (defun sub-compiled-code-location= (obj1 obj2)
1891 (= (compiled-code-location-pc obj1)
1892 (compiled-code-location-pc obj2)))
1894 ;;; Fill in CODE-LOCATION's :UNPARSED slots, returning T or NIL
1895 ;;; depending on whether the code-location was known in its
1896 ;;; DEBUG-FUN's debug-block information. This may signal a
1897 ;;; NO-DEBUG-BLOCKS condition due to DEBUG-FUN-DEBUG-BLOCKS, and
1898 ;;; it assumes the %UNKNOWN-P slot is already set or going to be set.
1899 (defun fill-in-code-location (code-location)
1900 (declare (type compiled-code-location code-location))
1901 (let* ((debug-fun (code-location-debug-fun code-location))
1902 (blocks (debug-fun-debug-blocks debug-fun)))
1903 (declare (simple-vector blocks))
1904 (dotimes (i (length blocks) nil)
1905 (let* ((block (svref blocks i))
1906 (locations (compiled-debug-block-code-locations block)))
1907 (declare (simple-vector locations))
1908 (dotimes (j (length locations))
1909 (let ((loc (svref locations j)))
1910 (when (sub-compiled-code-location= code-location loc)
1911 (setf (code-location-%debug-block code-location) block)
1912 (setf (code-location-%tlf-offset code-location)
1913 (code-location-%tlf-offset loc))
1914 (setf (code-location-%form-number code-location)
1915 (code-location-%form-number loc))
1916 (setf (compiled-code-location-%live-set code-location)
1917 (compiled-code-location-%live-set loc))
1918 (setf (compiled-code-location-kind code-location)
1919 (compiled-code-location-kind loc))
1920 (setf (compiled-code-location-step-info code-location)
1921 (compiled-code-location-step-info loc))
1922 (return-from fill-in-code-location t))))))))
1924 ;;;; operations on DEBUG-BLOCKs
1926 ;;; Execute FORMS in a context with CODE-VAR bound to each
1927 ;;; CODE-LOCATION in DEBUG-BLOCK, and return the value of RESULT.
1928 (defmacro do-debug-block-locations ((code-var debug-block &optional result)
1930 (let ((code-locations (gensym))
1932 `(let ((,code-locations (debug-block-code-locations ,debug-block)))
1933 (declare (simple-vector ,code-locations))
1934 (dotimes (,i (length ,code-locations) ,result)
1935 (let ((,code-var (svref ,code-locations ,i)))
1938 ;;; Return the name of the function represented by DEBUG-FUN.
1939 ;;; This may be a string or a cons; do not assume it is a symbol.
1940 (defun debug-block-fun-name (debug-block)
1941 (etypecase debug-block
1942 (compiled-debug-block
1943 (let ((code-locs (compiled-debug-block-code-locations debug-block)))
1944 (declare (simple-vector code-locs))
1945 (if (zerop (length code-locs))
1946 "??? Can't get name of debug-block's function."
1948 (code-location-debug-fun (svref code-locs 0))))))
1949 ;; (There used to be more cases back before sbcl-0.7.0, when we
1950 ;; did special tricks to debug the IR1 interpreter.)
1953 (defun debug-block-code-locations (debug-block)
1954 (etypecase debug-block
1955 (compiled-debug-block
1956 (compiled-debug-block-code-locations debug-block))
1957 ;; (There used to be more cases back before sbcl-0.7.0, when we
1958 ;; did special tricks to debug the IR1 interpreter.)
1961 ;;;; operations on debug variables
1963 (defun debug-var-symbol-name (debug-var)
1964 (symbol-name (debug-var-symbol debug-var)))
1966 ;;; FIXME: Make sure that this isn't called anywhere that it wouldn't
1967 ;;; be acceptable to have NIL returned, or that it's only called on
1968 ;;; DEBUG-VARs whose symbols have non-NIL packages.
1969 (defun debug-var-package-name (debug-var)
1970 (package-name (symbol-package (debug-var-symbol debug-var))))
1972 ;;; Return the value stored for DEBUG-VAR in frame, or if the value is
1973 ;;; not :VALID, then signal an INVALID-VALUE error.
1974 (defun debug-var-valid-value (debug-var frame)
1975 (unless (eq (debug-var-validity debug-var (frame-code-location frame))
1977 (error 'invalid-value :debug-var debug-var :frame frame))
1978 (debug-var-value debug-var frame))
1980 ;;; Returns the value stored for DEBUG-VAR in frame. The value may be
1981 ;;; invalid. This is SETFable.
1982 (defun debug-var-value (debug-var frame)
1983 (aver (typep frame 'compiled-frame))
1984 (let ((res (access-compiled-debug-var-slot debug-var frame)))
1985 (if (indirect-value-cell-p res)
1986 (value-cell-ref res)
1989 ;;; This returns what is stored for the variable represented by
1990 ;;; DEBUG-VAR relative to the FRAME. This may be an indirect value
1991 ;;; cell if the variable is both closed over and set.
1992 (defun access-compiled-debug-var-slot (debug-var frame)
1993 (declare (optimize (speed 1)))
1994 (let ((escaped (compiled-frame-escaped frame)))
1996 (sub-access-debug-var-slot
1997 (frame-pointer frame)
1998 (compiled-debug-var-sc-offset debug-var)
2000 (sub-access-debug-var-slot
2001 (frame-pointer frame)
2002 (or (compiled-debug-var-save-sc-offset debug-var)
2003 (compiled-debug-var-sc-offset debug-var))))))
2005 ;;; a helper function for working with possibly-invalid values:
2006 ;;; Do (%MAKE-LISP-OBJ VAL) only if the value looks valid.
2008 ;;; (Such values can arise in registers on machines with conservative
2009 ;;; GC, and might also arise in debug variable locations when
2010 ;;; those variables are invalid.)
2011 (defun make-lisp-obj (val &optional (errorp t))
2014 (zerop (logand val sb!vm:fixnum-tag-mask))
2015 ;; immediate single float, 64-bit only
2016 #!+#.(cl:if (cl:= sb!vm::n-machine-word-bits 64) '(and) '(or))
2017 (= (logand val #xff) sb!vm:single-float-widetag)
2019 (and (zerop (logandc2 val #x1fffffff)) ; Top bits zero
2020 (= (logand val #xff) sb!vm:character-widetag)) ; char tag
2022 (= val sb!vm:unbound-marker-widetag)
2025 (not (zerop (valid-lisp-pointer-p (int-sap val))))
2026 ;; FIXME: There is no fundamental reason not to use the above
2027 ;; function on other platforms as well, but I didn't have
2028 ;; others available while doing this. --NS 2007-06-21
2030 (and (logbitp 0 val)
2031 (or (< sb!vm:read-only-space-start val
2032 (* sb!vm:*read-only-space-free-pointer*
2033 sb!vm:n-word-bytes))
2034 (< sb!vm:static-space-start val
2035 (* sb!vm:*static-space-free-pointer*
2036 sb!vm:n-word-bytes))
2037 (< (current-dynamic-space-start) val
2038 (sap-int (dynamic-space-free-pointer))))))
2039 (values (%make-lisp-obj val) t)
2041 (error "~S is not a valid argument to ~S"
2043 (values (make-unprintable-object (format nil "invalid object #x~X" val))
2047 (defun sub-access-debug-var-slot (fp sc-offset &optional escaped)
2048 (macrolet ((with-escaped-value ((var) &body forms)
2050 (let ((,var (sb!vm:context-register
2052 (sb!c:sc-offset-offset sc-offset))))
2054 :invalid-value-for-unescaped-register-storage))
2055 (escaped-float-value (format)
2057 (sb!vm:context-float-register
2059 (sb!c:sc-offset-offset sc-offset)
2061 :invalid-value-for-unescaped-register-storage))
2062 (with-nfp ((var) &body body)
2063 `(let ((,var (if escaped
2065 (sb!vm:context-register escaped
2068 (sb!sys:sap-ref-sap fp (* nfp-save-offset
2069 sb!vm:n-word-bytes))
2071 (sb!vm::make-number-stack-pointer
2072 (sb!sys:sap-ref-32 fp (* nfp-save-offset
2073 sb!vm:n-word-bytes))))))
2075 (ecase (sb!c:sc-offset-scn sc-offset)
2076 ((#.sb!vm:any-reg-sc-number
2077 #.sb!vm:descriptor-reg-sc-number
2078 #!+rt #.sb!vm:word-pointer-reg-sc-number)
2079 (sb!sys:without-gcing
2080 (with-escaped-value (val)
2081 (make-lisp-obj val nil))))
2082 (#.sb!vm:character-reg-sc-number
2083 (with-escaped-value (val)
2085 (#.sb!vm:sap-reg-sc-number
2086 (with-escaped-value (val)
2087 (sb!sys:int-sap val)))
2088 (#.sb!vm:signed-reg-sc-number
2089 (with-escaped-value (val)
2090 (if (logbitp (1- sb!vm:n-word-bits) val)
2091 (logior val (ash -1 sb!vm:n-word-bits))
2093 (#.sb!vm:unsigned-reg-sc-number
2094 (with-escaped-value (val)
2096 (#.sb!vm:non-descriptor-reg-sc-number
2097 (error "Local non-descriptor register access?"))
2098 (#.sb!vm:interior-reg-sc-number
2099 (error "Local interior register access?"))
2100 (#.sb!vm:single-reg-sc-number
2101 (escaped-float-value single-float))
2102 (#.sb!vm:double-reg-sc-number
2103 (escaped-float-value double-float))
2105 (#.sb!vm:long-reg-sc-number
2106 (escaped-float-value long-float))
2107 (#.sb!vm:complex-single-reg-sc-number
2110 (sb!vm:context-float-register
2111 escaped (sb!c:sc-offset-offset sc-offset) 'single-float)
2112 (sb!vm:context-float-register
2113 escaped (1+ (sb!c:sc-offset-offset sc-offset)) 'single-float))
2114 :invalid-value-for-unescaped-register-storage))
2115 (#.sb!vm:complex-double-reg-sc-number
2118 (sb!vm:context-float-register
2119 escaped (sb!c:sc-offset-offset sc-offset) 'double-float)
2120 (sb!vm:context-float-register
2121 escaped (+ (sb!c:sc-offset-offset sc-offset) #!+sparc 2 #!-sparc 1)
2123 :invalid-value-for-unescaped-register-storage))
2125 (#.sb!vm:complex-long-reg-sc-number
2128 (sb!vm:context-float-register
2129 escaped (sb!c:sc-offset-offset sc-offset) 'long-float)
2130 (sb!vm:context-float-register
2131 escaped (+ (sb!c:sc-offset-offset sc-offset) #!+sparc 4)
2133 :invalid-value-for-unescaped-register-storage))
2134 (#.sb!vm:single-stack-sc-number
2136 (sb!sys:sap-ref-single nfp (* (sb!c:sc-offset-offset sc-offset)
2137 sb!vm:n-word-bytes))))
2138 (#.sb!vm:double-stack-sc-number
2140 (sb!sys:sap-ref-double nfp (* (sb!c:sc-offset-offset sc-offset)
2141 sb!vm:n-word-bytes))))
2143 (#.sb!vm:long-stack-sc-number
2145 (sb!sys:sap-ref-long nfp (* (sb!c:sc-offset-offset sc-offset)
2146 sb!vm:n-word-bytes))))
2147 (#.sb!vm:complex-single-stack-sc-number
2150 (sb!sys:sap-ref-single nfp (* (sb!c:sc-offset-offset sc-offset)
2151 sb!vm:n-word-bytes))
2152 (sb!sys:sap-ref-single nfp (* (1+ (sb!c:sc-offset-offset sc-offset))
2153 sb!vm:n-word-bytes)))))
2154 (#.sb!vm:complex-double-stack-sc-number
2157 (sb!sys:sap-ref-double nfp (* (sb!c:sc-offset-offset sc-offset)
2158 sb!vm:n-word-bytes))
2159 (sb!sys:sap-ref-double nfp (* (+ (sb!c:sc-offset-offset sc-offset) 2)
2160 sb!vm:n-word-bytes)))))
2162 (#.sb!vm:complex-long-stack-sc-number
2165 (sb!sys:sap-ref-long nfp (* (sb!c:sc-offset-offset sc-offset)
2166 sb!vm:n-word-bytes))
2167 (sb!sys:sap-ref-long nfp (* (+ (sb!c:sc-offset-offset sc-offset)
2169 sb!vm:n-word-bytes)))))
2170 (#.sb!vm:control-stack-sc-number
2171 (sb!kernel:stack-ref fp (sb!c:sc-offset-offset sc-offset)))
2172 (#.sb!vm:character-stack-sc-number
2174 (code-char (sb!sys:sap-ref-32 nfp (* (sb!c:sc-offset-offset sc-offset)
2175 sb!vm:n-word-bytes)))))
2176 (#.sb!vm:unsigned-stack-sc-number
2178 (sb!sys:sap-ref-32 nfp (* (sb!c:sc-offset-offset sc-offset)
2179 sb!vm:n-word-bytes))))
2180 (#.sb!vm:signed-stack-sc-number
2182 (sb!sys:signed-sap-ref-32 nfp (* (sb!c:sc-offset-offset sc-offset)
2183 sb!vm:n-word-bytes))))
2184 (#.sb!vm:sap-stack-sc-number
2186 (sb!sys:sap-ref-sap nfp (* (sb!c:sc-offset-offset sc-offset)
2187 sb!vm:n-word-bytes)))))))
2190 (defun sub-access-debug-var-slot (fp sc-offset &optional escaped)
2191 (declare (type system-area-pointer fp))
2192 (macrolet ((with-escaped-value ((var) &body forms)
2194 (let ((,var (sb!vm:context-register
2196 (sb!c:sc-offset-offset sc-offset))))
2198 :invalid-value-for-unescaped-register-storage))
2199 (escaped-float-value (format)
2201 (sb!vm:context-float-register
2202 escaped (sb!c:sc-offset-offset sc-offset) ',format)
2203 :invalid-value-for-unescaped-register-storage))
2204 (escaped-complex-float-value (format)
2207 (sb!vm:context-float-register
2208 escaped (sb!c:sc-offset-offset sc-offset) ',format)
2209 (sb!vm:context-float-register
2210 escaped (1+ (sb!c:sc-offset-offset sc-offset)) ',format))
2211 :invalid-value-for-unescaped-register-storage)))
2212 (ecase (sb!c:sc-offset-scn sc-offset)
2213 ((#.sb!vm:any-reg-sc-number #.sb!vm:descriptor-reg-sc-number)
2215 (with-escaped-value (val)
2216 (make-lisp-obj val nil))))
2217 (#.sb!vm:character-reg-sc-number
2218 (with-escaped-value (val)
2220 (#.sb!vm:sap-reg-sc-number
2221 (with-escaped-value (val)
2223 (#.sb!vm:signed-reg-sc-number
2224 (with-escaped-value (val)
2225 (if (logbitp (1- sb!vm:n-word-bits) val)
2226 (logior val (ash -1 sb!vm:n-word-bits))
2228 (#.sb!vm:unsigned-reg-sc-number
2229 (with-escaped-value (val)
2231 (#.sb!vm:single-reg-sc-number
2232 (escaped-float-value single-float))
2233 (#.sb!vm:double-reg-sc-number
2234 (escaped-float-value double-float))
2236 (#.sb!vm:long-reg-sc-number
2237 (escaped-float-value long-float))
2238 (#.sb!vm:complex-single-reg-sc-number
2239 (escaped-complex-float-value single-float))
2240 (#.sb!vm:complex-double-reg-sc-number
2241 (escaped-complex-float-value double-float))
2243 (#.sb!vm:complex-long-reg-sc-number
2244 (escaped-complex-float-value long-float))
2245 (#.sb!vm:single-stack-sc-number
2246 (sap-ref-single fp (- (* (1+ (sb!c:sc-offset-offset sc-offset))
2247 sb!vm:n-word-bytes))))
2248 (#.sb!vm:double-stack-sc-number
2249 (sap-ref-double fp (- (* (+ (sb!c:sc-offset-offset sc-offset) 2)
2250 sb!vm:n-word-bytes))))
2252 (#.sb!vm:long-stack-sc-number
2253 (sap-ref-long fp (- (* (+ (sb!c:sc-offset-offset sc-offset) 3)
2254 sb!vm:n-word-bytes))))
2255 (#.sb!vm:complex-single-stack-sc-number
2257 (sap-ref-single fp (- (* (1+ (sb!c:sc-offset-offset sc-offset))
2258 sb!vm:n-word-bytes)))
2259 (sap-ref-single fp (- (* (+ (sb!c:sc-offset-offset sc-offset) 2)
2260 sb!vm:n-word-bytes)))))
2261 (#.sb!vm:complex-double-stack-sc-number
2263 (sap-ref-double fp (- (* (+ (sb!c:sc-offset-offset sc-offset) 2)
2264 sb!vm:n-word-bytes)))
2265 (sap-ref-double fp (- (* (+ (sb!c:sc-offset-offset sc-offset) 4)
2266 sb!vm:n-word-bytes)))))
2268 (#.sb!vm:complex-long-stack-sc-number
2270 (sap-ref-long fp (- (* (+ (sb!c:sc-offset-offset sc-offset) 3)
2271 sb!vm:n-word-bytes)))
2272 (sap-ref-long fp (- (* (+ (sb!c:sc-offset-offset sc-offset) 6)
2273 sb!vm:n-word-bytes)))))
2274 (#.sb!vm:control-stack-sc-number
2275 (stack-ref fp (sb!c:sc-offset-offset sc-offset)))
2276 (#.sb!vm:character-stack-sc-number
2278 (sap-ref-word fp (- (* (1+ (sb!c:sc-offset-offset sc-offset))
2279 sb!vm:n-word-bytes)))))
2280 (#.sb!vm:unsigned-stack-sc-number
2281 (sap-ref-word fp (- (* (1+ (sb!c:sc-offset-offset sc-offset))
2282 sb!vm:n-word-bytes))))
2283 (#.sb!vm:signed-stack-sc-number
2284 (signed-sap-ref-word fp (- (* (1+ (sb!c:sc-offset-offset sc-offset))
2285 sb!vm:n-word-bytes))))
2286 (#.sb!vm:sap-stack-sc-number
2287 (sap-ref-sap fp (- (* (1+ (sb!c:sc-offset-offset sc-offset))
2288 sb!vm:n-word-bytes)))))))
2290 ;;; This stores value as the value of DEBUG-VAR in FRAME. In the
2291 ;;; COMPILED-DEBUG-VAR case, access the current value to determine if
2292 ;;; it is an indirect value cell. This occurs when the variable is
2293 ;;; both closed over and set.
2294 (defun %set-debug-var-value (debug-var frame new-value)
2295 (aver (typep frame 'compiled-frame))
2296 (let ((old-value (access-compiled-debug-var-slot debug-var frame)))
2297 (if (indirect-value-cell-p old-value)
2298 (value-cell-set old-value new-value)
2299 (set-compiled-debug-var-slot debug-var frame new-value)))
2302 ;;; This stores VALUE for the variable represented by debug-var
2303 ;;; relative to the frame. This assumes the location directly contains
2304 ;;; the variable's value; that is, there is no indirect value cell
2305 ;;; currently there in case the variable is both closed over and set.
2306 (defun set-compiled-debug-var-slot (debug-var frame value)
2307 (let ((escaped (compiled-frame-escaped frame)))
2309 (sub-set-debug-var-slot (frame-pointer frame)
2310 (compiled-debug-var-sc-offset debug-var)
2312 (sub-set-debug-var-slot
2313 (frame-pointer frame)
2314 (or (compiled-debug-var-save-sc-offset debug-var)
2315 (compiled-debug-var-sc-offset debug-var))
2319 (defun sub-set-debug-var-slot (fp sc-offset value &optional escaped)
2320 (macrolet ((set-escaped-value (val)
2322 (setf (sb!vm:context-register
2324 (sb!c:sc-offset-offset sc-offset))
2327 (set-escaped-float-value (format val)
2329 (setf (sb!vm:context-float-register
2331 (sb!c:sc-offset-offset sc-offset)
2335 (with-nfp ((var) &body body)
2336 `(let ((,var (if escaped
2338 (sb!vm:context-register escaped
2343 sb!vm:n-word-bytes))
2345 (sb!vm::make-number-stack-pointer
2348 sb!vm:n-word-bytes))))))
2350 (ecase (sb!c:sc-offset-scn sc-offset)
2351 ((#.sb!vm:any-reg-sc-number
2352 #.sb!vm:descriptor-reg-sc-number
2353 #!+rt #.sb!vm:word-pointer-reg-sc-number)
2356 (get-lisp-obj-address value))))
2357 (#.sb!vm:character-reg-sc-number
2358 (set-escaped-value (char-code value)))
2359 (#.sb!vm:sap-reg-sc-number
2360 (set-escaped-value (sap-int value)))
2361 (#.sb!vm:signed-reg-sc-number
2362 (set-escaped-value (logand value (1- (ash 1 sb!vm:n-word-bits)))))
2363 (#.sb!vm:unsigned-reg-sc-number
2364 (set-escaped-value value))
2365 (#.sb!vm:non-descriptor-reg-sc-number
2366 (error "Local non-descriptor register access?"))
2367 (#.sb!vm:interior-reg-sc-number
2368 (error "Local interior register access?"))
2369 (#.sb!vm:single-reg-sc-number
2370 (set-escaped-float-value single-float value))
2371 (#.sb!vm:double-reg-sc-number
2372 (set-escaped-float-value double-float value))
2374 (#.sb!vm:long-reg-sc-number
2375 (set-escaped-float-value long-float value))
2376 (#.sb!vm:complex-single-reg-sc-number
2378 (setf (sb!vm:context-float-register escaped
2379 (sb!c:sc-offset-offset sc-offset)
2382 (setf (sb!vm:context-float-register
2383 escaped (1+ (sb!c:sc-offset-offset sc-offset))
2387 (#.sb!vm:complex-double-reg-sc-number
2389 (setf (sb!vm:context-float-register
2390 escaped (sb!c:sc-offset-offset sc-offset) 'double-float)
2392 (setf (sb!vm:context-float-register
2394 (+ (sb!c:sc-offset-offset sc-offset) #!+sparc 2 #!-sparc 1)
2399 (#.sb!vm:complex-long-reg-sc-number
2401 (setf (sb!vm:context-float-register
2402 escaped (sb!c:sc-offset-offset sc-offset) 'long-float)
2404 (setf (sb!vm:context-float-register
2406 (+ (sb!c:sc-offset-offset sc-offset) #!+sparc 4)
2410 (#.sb!vm:single-stack-sc-number
2412 (setf (sap-ref-single nfp (* (sb!c:sc-offset-offset sc-offset)
2413 sb!vm:n-word-bytes))
2414 (the single-float value))))
2415 (#.sb!vm:double-stack-sc-number
2417 (setf (sap-ref-double nfp (* (sb!c:sc-offset-offset sc-offset)
2418 sb!vm:n-word-bytes))
2419 (the double-float value))))
2421 (#.sb!vm:long-stack-sc-number
2423 (setf (sap-ref-long nfp (* (sb!c:sc-offset-offset sc-offset)
2424 sb!vm:n-word-bytes))
2425 (the long-float value))))
2426 (#.sb!vm:complex-single-stack-sc-number
2428 (setf (sap-ref-single
2429 nfp (* (sb!c:sc-offset-offset sc-offset) sb!vm:n-word-bytes))
2430 (the single-float (realpart value)))
2431 (setf (sap-ref-single
2432 nfp (* (1+ (sb!c:sc-offset-offset sc-offset))
2433 sb!vm:n-word-bytes))
2434 (the single-float (realpart value)))))
2435 (#.sb!vm:complex-double-stack-sc-number
2437 (setf (sap-ref-double
2438 nfp (* (sb!c:sc-offset-offset sc-offset) sb!vm:n-word-bytes))
2439 (the double-float (realpart value)))
2440 (setf (sap-ref-double
2441 nfp (* (+ (sb!c:sc-offset-offset sc-offset) 2)
2442 sb!vm:n-word-bytes))
2443 (the double-float (realpart value)))))
2445 (#.sb!vm:complex-long-stack-sc-number
2448 nfp (* (sb!c:sc-offset-offset sc-offset) sb!vm:n-word-bytes))
2449 (the long-float (realpart value)))
2451 nfp (* (+ (sb!c:sc-offset-offset sc-offset) #!+sparc 4)
2452 sb!vm:n-word-bytes))
2453 (the long-float (realpart value)))))
2454 (#.sb!vm:control-stack-sc-number
2455 (setf (stack-ref fp (sb!c:sc-offset-offset sc-offset)) value))
2456 (#.sb!vm:character-stack-sc-number
2458 (setf (sap-ref-32 nfp (* (sb!c:sc-offset-offset sc-offset)
2459 sb!vm:n-word-bytes))
2460 (char-code (the character value)))))
2461 (#.sb!vm:unsigned-stack-sc-number
2463 (setf (sap-ref-32 nfp (* (sb!c:sc-offset-offset sc-offset)
2464 sb!vm:n-word-bytes))
2465 (the (unsigned-byte 32) value))))
2466 (#.sb!vm:signed-stack-sc-number
2468 (setf (signed-sap-ref-32 nfp (* (sb!c:sc-offset-offset sc-offset)
2469 sb!vm:n-word-bytes))
2470 (the (signed-byte 32) value))))
2471 (#.sb!vm:sap-stack-sc-number
2473 (setf (sap-ref-sap nfp (* (sb!c:sc-offset-offset sc-offset)
2474 sb!vm:n-word-bytes))
2475 (the system-area-pointer value)))))))
2478 (defun sub-set-debug-var-slot (fp sc-offset value &optional escaped)
2479 (macrolet ((set-escaped-value (val)
2481 (setf (sb!vm:context-register
2483 (sb!c:sc-offset-offset sc-offset))
2486 (ecase (sb!c:sc-offset-scn sc-offset)
2487 ((#.sb!vm:any-reg-sc-number #.sb!vm:descriptor-reg-sc-number)
2490 (get-lisp-obj-address value))))
2491 (#.sb!vm:character-reg-sc-number
2492 (set-escaped-value (char-code value)))
2493 (#.sb!vm:sap-reg-sc-number
2494 (set-escaped-value (sap-int value)))
2495 (#.sb!vm:signed-reg-sc-number
2496 (set-escaped-value (logand value (1- (ash 1 sb!vm:n-word-bits)))))
2497 (#.sb!vm:unsigned-reg-sc-number
2498 (set-escaped-value value))
2499 (#.sb!vm:single-reg-sc-number
2500 #+nil ;; don't have escaped floats.
2501 (set-escaped-float-value single-float value))
2502 (#.sb!vm:double-reg-sc-number
2503 #+nil ;; don't have escaped floats -- still in npx?
2504 (set-escaped-float-value double-float value))
2506 (#.sb!vm:long-reg-sc-number
2507 #+nil ;; don't have escaped floats -- still in npx?
2508 (set-escaped-float-value long-float value))
2509 (#.sb!vm:single-stack-sc-number
2510 (setf (sap-ref-single
2511 fp (- (* (1+ (sb!c:sc-offset-offset sc-offset))
2512 sb!vm:n-word-bytes)))
2513 (the single-float value)))
2514 (#.sb!vm:double-stack-sc-number
2515 (setf (sap-ref-double
2516 fp (- (* (+ (sb!c:sc-offset-offset sc-offset) 2)
2517 sb!vm:n-word-bytes)))
2518 (the double-float value)))
2520 (#.sb!vm:long-stack-sc-number
2522 fp (- (* (+ (sb!c:sc-offset-offset sc-offset) 3)
2523 sb!vm:n-word-bytes)))
2524 (the long-float value)))
2525 (#.sb!vm:complex-single-stack-sc-number
2526 (setf (sap-ref-single
2527 fp (- (* (1+ (sb!c:sc-offset-offset sc-offset))
2528 sb!vm:n-word-bytes)))
2529 (realpart (the (complex single-float) value)))
2530 (setf (sap-ref-single
2531 fp (- (* (+ (sb!c:sc-offset-offset sc-offset) 2)
2532 sb!vm:n-word-bytes)))
2533 (imagpart (the (complex single-float) value))))
2534 (#.sb!vm:complex-double-stack-sc-number
2535 (setf (sap-ref-double
2536 fp (- (* (+ (sb!c:sc-offset-offset sc-offset) 2)
2537 sb!vm:n-word-bytes)))
2538 (realpart (the (complex double-float) value)))
2539 (setf (sap-ref-double
2540 fp (- (* (+ (sb!c:sc-offset-offset sc-offset) 4)
2541 sb!vm:n-word-bytes)))
2542 (imagpart (the (complex double-float) value))))
2544 (#.sb!vm:complex-long-stack-sc-number
2546 fp (- (* (+ (sb!c:sc-offset-offset sc-offset) 3)
2547 sb!vm:n-word-bytes)))
2548 (realpart (the (complex long-float) value)))
2550 fp (- (* (+ (sb!c:sc-offset-offset sc-offset) 6)
2551 sb!vm:n-word-bytes)))
2552 (imagpart (the (complex long-float) value))))
2553 (#.sb!vm:control-stack-sc-number
2554 (setf (stack-ref fp (sb!c:sc-offset-offset sc-offset)) value))
2555 (#.sb!vm:character-stack-sc-number
2556 (setf (sap-ref-word fp (- (* (1+ (sb!c:sc-offset-offset sc-offset))
2557 sb!vm:n-word-bytes)))
2558 (char-code (the character value))))
2559 (#.sb!vm:unsigned-stack-sc-number
2560 (setf (sap-ref-word fp (- (* (1+ (sb!c:sc-offset-offset sc-offset))
2561 sb!vm:n-word-bytes)))
2562 (the sb!vm:word value)))
2563 (#.sb!vm:signed-stack-sc-number
2564 (setf (signed-sap-ref-word
2565 fp (- (* (1+ (sb!c:sc-offset-offset sc-offset))
2566 sb!vm:n-word-bytes)))
2567 (the (signed-byte #.sb!vm:n-word-bits) value)))
2568 (#.sb!vm:sap-stack-sc-number
2569 (setf (sap-ref-sap fp (- (* (1+ (sb!c:sc-offset-offset sc-offset))
2570 sb!vm:n-word-bytes)))
2571 (the system-area-pointer value))))))
2573 ;;; The method for setting and accessing COMPILED-DEBUG-VAR values use
2574 ;;; this to determine if the value stored is the actual value or an
2575 ;;; indirection cell.
2576 (defun indirect-value-cell-p (x)
2577 (and (= (lowtag-of x) sb!vm:other-pointer-lowtag)
2578 (= (widetag-of x) sb!vm:value-cell-header-widetag)))
2580 ;;; Return three values reflecting the validity of DEBUG-VAR's value
2581 ;;; at BASIC-CODE-LOCATION:
2582 ;;; :VALID The value is known to be available.
2583 ;;; :INVALID The value is known to be unavailable.
2584 ;;; :UNKNOWN The value's availability is unknown.
2586 ;;; If the variable is always alive, then it is valid. If the
2587 ;;; code-location is unknown, then the variable's validity is
2588 ;;; :unknown. Once we've called CODE-LOCATION-UNKNOWN-P, we know the
2589 ;;; live-set information has been cached in the code-location.
2590 (defun debug-var-validity (debug-var basic-code-location)
2591 (etypecase debug-var
2593 (compiled-debug-var-validity debug-var basic-code-location))
2594 ;; (There used to be more cases back before sbcl-0.7.0, when
2595 ;; we did special tricks to debug the IR1 interpreter.)
2598 ;;; This is the method for DEBUG-VAR-VALIDITY for COMPILED-DEBUG-VARs.
2599 ;;; For safety, make sure basic-code-location is what we think.
2600 (defun compiled-debug-var-validity (debug-var basic-code-location)
2601 (declare (type compiled-code-location basic-code-location))
2602 (cond ((debug-var-alive-p debug-var)
2603 (let ((debug-fun (code-location-debug-fun basic-code-location)))
2604 (if (>= (compiled-code-location-pc basic-code-location)
2605 (sb!c::compiled-debug-fun-start-pc
2606 (compiled-debug-fun-compiler-debug-fun debug-fun)))
2609 ((code-location-unknown-p basic-code-location) :unknown)
2611 (let ((pos (position debug-var
2612 (debug-fun-debug-vars
2613 (code-location-debug-fun
2614 basic-code-location)))))
2616 (error 'unknown-debug-var
2617 :debug-var debug-var
2619 (code-location-debug-fun basic-code-location)))
2620 ;; There must be live-set info since basic-code-location is known.
2621 (if (zerop (sbit (compiled-code-location-live-set
2622 basic-code-location)
2629 ;;; This code produces and uses what we call source-paths. A
2630 ;;; source-path is a list whose first element is a form number as
2631 ;;; returned by CODE-LOCATION-FORM-NUMBER and whose last element is a
2632 ;;; top level form number as returned by
2633 ;;; CODE-LOCATION-TOPLEVEL-FORM-NUMBER. The elements from the last to
2634 ;;; the first, exclusively, are the numbered subforms into which to
2635 ;;; descend. For example:
2637 ;;; (let ((a (aref x 3)))
2639 ;;; The call to AREF in this example is form number 5. Assuming this
2640 ;;; DEFUN is the 11'th top level form, the source-path for the AREF
2641 ;;; call is as follows:
2643 ;;; Given the DEFUN, 3 gets you the LET, 1 gets you the bindings, 0
2644 ;;; gets the first binding, and 1 gets the AREF form.
2646 ;;; temporary buffer used to build form-number => source-path translation in
2647 ;;; FORM-NUMBER-TRANSLATIONS
2648 (defvar *form-number-temp* (make-array 10 :fill-pointer 0 :adjustable t))
2650 ;;; table used to detect CAR circularities in FORM-NUMBER-TRANSLATIONS
2651 (defvar *form-number-circularity-table* (make-hash-table :test 'eq))
2653 ;;; This returns a table mapping form numbers to source-paths. A
2654 ;;; source-path indicates a descent into the TOPLEVEL-FORM form,
2655 ;;; going directly to the subform corressponding to the form number.
2657 ;;; The vector elements are in the same format as the compiler's
2658 ;;; NODE-SOURCE-PATH; that is, the first element is the form number and
2659 ;;; the last is the TOPLEVEL-FORM number.
2660 (defun form-number-translations (form tlf-number)
2661 (clrhash *form-number-circularity-table*)
2662 (setf (fill-pointer *form-number-temp*) 0)
2663 (sub-translate-form-numbers form (list tlf-number))
2664 (coerce *form-number-temp* 'simple-vector))
2665 (defun sub-translate-form-numbers (form path)
2666 (unless (gethash form *form-number-circularity-table*)
2667 (setf (gethash form *form-number-circularity-table*) t)
2668 (vector-push-extend (cons (fill-pointer *form-number-temp*) path)
2673 (declare (fixnum pos))
2676 (when (atom subform) (return))
2677 (let ((fm (car subform)))
2679 (sub-translate-form-numbers fm (cons pos path)))
2681 (setq subform (cdr subform))
2682 (when (eq subform trail) (return)))))
2686 (setq trail (cdr trail)))))))
2688 ;;; FORM is a top level form, and path is a source-path into it. This
2689 ;;; returns the form indicated by the source-path. Context is the
2690 ;;; number of enclosing forms to return instead of directly returning
2691 ;;; the source-path form. When context is non-zero, the form returned
2692 ;;; contains a marker, #:****HERE****, immediately before the form
2693 ;;; indicated by path.
2694 (defun source-path-context (form path context)
2695 (declare (type unsigned-byte context))
2696 ;; Get to the form indicated by path or the enclosing form indicated
2697 ;; by context and path.
2698 (let ((path (reverse (butlast (cdr path)))))
2699 (dotimes (i (- (length path) context))
2700 (let ((index (first path)))
2701 (unless (and (listp form) (< index (length form)))
2702 (error "Source path no longer exists."))
2703 (setq form (elt form index))
2704 (setq path (rest path))))
2705 ;; Recursively rebuild the source form resulting from the above
2706 ;; descent, copying the beginning of each subform up to the next
2707 ;; subform we descend into according to path. At the bottom of the
2708 ;; recursion, we return the form indicated by path preceded by our
2709 ;; marker, and this gets spliced into the resulting list structure
2710 ;; on the way back up.
2711 (labels ((frob (form path level)
2712 (if (or (zerop level) (null path))
2715 `(#:***here*** ,form))
2716 (let ((n (first path)))
2717 (unless (and (listp form) (< n (length form)))
2718 (error "Source path no longer exists."))
2719 (let ((res (frob (elt form n) (rest path) (1- level))))
2720 (nconc (subseq form 0 n)
2721 (cons res (nthcdr (1+ n) form))))))))
2722 (frob form path context))))
2724 ;;;; PREPROCESS-FOR-EVAL
2726 ;;; Return a function of one argument that evaluates form in the
2727 ;;; lexical context of the BASIC-CODE-LOCATION LOC, or signal a
2728 ;;; NO-DEBUG-VARS condition when the LOC's DEBUG-FUN has no
2729 ;;; DEBUG-VAR information available.
2731 ;;; The returned function takes the frame to get values from as its
2732 ;;; argument, and it returns the values of FORM. The returned function
2733 ;;; can signal the following conditions: INVALID-VALUE,
2734 ;;; AMBIGUOUS-VAR-NAME, and FRAME-FUN-MISMATCH.
2735 (defun preprocess-for-eval (form loc)
2736 (declare (type code-location loc))
2737 (let ((n-frame (gensym))
2738 (fun (code-location-debug-fun loc)))
2739 (unless (debug-var-info-available fun)
2740 (debug-signal 'no-debug-vars :debug-fun fun))
2741 (sb!int:collect ((binds)
2743 (do-debug-fun-vars (var fun)
2744 (let ((validity (debug-var-validity var loc)))
2745 (unless (eq validity :invalid)
2746 (let* ((sym (debug-var-symbol var))
2747 (found (assoc sym (binds))))
2749 (setf (second found) :ambiguous)
2750 (binds (list sym validity var)))))))
2751 (dolist (bind (binds))
2752 (let ((name (first bind))
2754 (ecase (second bind)
2756 (specs `(,name (debug-var-value ',var ,n-frame))))
2758 (specs `(,name (debug-signal 'invalid-value
2762 (specs `(,name (debug-signal 'ambiguous-var-name
2764 :frame ,n-frame)))))))
2765 (let ((res (coerce `(lambda (,n-frame)
2766 (declare (ignorable ,n-frame))
2767 (symbol-macrolet ,(specs) ,form))
2770 ;; This prevents these functions from being used in any
2771 ;; location other than a function return location, so maybe
2772 ;; this should only check whether FRAME's DEBUG-FUN is the
2774 (unless (code-location= (frame-code-location frame) loc)
2775 (debug-signal 'frame-fun-mismatch
2776 :code-location loc :form form :frame frame))
2777 (funcall res frame))))))
2781 ;;;; user-visible interface
2783 ;;; Create and return a breakpoint. When program execution encounters
2784 ;;; the breakpoint, the system calls HOOK-FUN. HOOK-FUN takes the
2785 ;;; current frame for the function in which the program is running and
2786 ;;; the breakpoint object.
2788 ;;; WHAT and KIND determine where in a function the system invokes
2789 ;;; HOOK-FUN. WHAT is either a code-location or a DEBUG-FUN. KIND is
2790 ;;; one of :CODE-LOCATION, :FUN-START, or :FUN-END. Since the starts
2791 ;;; and ends of functions may not have code-locations representing
2792 ;;; them, designate these places by supplying WHAT as a DEBUG-FUN and
2793 ;;; KIND indicating the :FUN-START or :FUN-END. When WHAT is a
2794 ;;; DEBUG-FUN and kind is :FUN-END, then HOOK-FUN must take two
2795 ;;; additional arguments, a list of values returned by the function
2796 ;;; and a FUN-END-COOKIE.
2798 ;;; INFO is information supplied by and used by the user.
2800 ;;; FUN-END-COOKIE is a function. To implement :FUN-END
2801 ;;; breakpoints, the system uses starter breakpoints to establish the
2802 ;;; :FUN-END breakpoint for each invocation of the function. Upon
2803 ;;; each entry, the system creates a unique cookie to identify the
2804 ;;; invocation, and when the user supplies a function for this
2805 ;;; argument, the system invokes it on the frame and the cookie. The
2806 ;;; system later invokes the :FUN-END breakpoint hook on the same
2807 ;;; cookie. The user may save the cookie for comparison in the hook
2810 ;;; Signal an error if WHAT is an unknown code-location.
2811 (defun make-breakpoint (hook-fun what
2812 &key (kind :code-location) info fun-end-cookie)
2815 (when (code-location-unknown-p what)
2816 (error "cannot make a breakpoint at an unknown code location: ~S"
2818 (aver (eq kind :code-location))
2819 (let ((bpt (%make-breakpoint hook-fun what kind info)))
2821 (compiled-code-location
2822 ;; This slot is filled in due to calling CODE-LOCATION-UNKNOWN-P.
2823 (when (eq (compiled-code-location-kind what) :unknown-return)
2824 (let ((other-bpt (%make-breakpoint hook-fun what
2825 :unknown-return-partner
2827 (setf (breakpoint-unknown-return-partner bpt) other-bpt)
2828 (setf (breakpoint-unknown-return-partner other-bpt) bpt))))
2829 ;; (There used to be more cases back before sbcl-0.7.0,,
2830 ;; when we did special tricks to debug the IR1
2837 (%make-breakpoint hook-fun what kind info))
2839 (unless (eq (sb!c::compiled-debug-fun-returns
2840 (compiled-debug-fun-compiler-debug-fun what))
2842 (error ":FUN-END breakpoints are currently unsupported ~
2843 for the known return convention."))
2845 (let* ((bpt (%make-breakpoint hook-fun what kind info))
2846 (starter (compiled-debug-fun-end-starter what)))
2848 (setf starter (%make-breakpoint #'list what :fun-start nil))
2849 (setf (breakpoint-hook-fun starter)
2850 (fun-end-starter-hook starter what))
2851 (setf (compiled-debug-fun-end-starter what) starter))
2852 (setf (breakpoint-start-helper bpt) starter)
2853 (push bpt (breakpoint-%info starter))
2854 (setf (breakpoint-cookie-fun bpt) fun-end-cookie)
2857 ;;; These are unique objects created upon entry into a function by a
2858 ;;; :FUN-END breakpoint's starter hook. These are only created
2859 ;;; when users supply :FUN-END-COOKIE to MAKE-BREAKPOINT. Also,
2860 ;;; the :FUN-END breakpoint's hook is called on the same cookie
2861 ;;; when it is created.
2862 (defstruct (fun-end-cookie
2863 (:print-object (lambda (obj str)
2864 (print-unreadable-object (obj str :type t))))
2865 (:constructor make-fun-end-cookie (bogus-lra debug-fun))
2867 ;; a pointer to the bogus-lra created for :FUN-END breakpoints
2869 ;; the DEBUG-FUN associated with this cookie
2872 ;;; This maps bogus-lra-components to cookies, so that
2873 ;;; HANDLE-FUN-END-BREAKPOINT can find the appropriate cookie for the
2874 ;;; breakpoint hook.
2875 (defvar *fun-end-cookies* (make-hash-table :test 'eq))
2877 ;;; This returns a hook function for the start helper breakpoint
2878 ;;; associated with a :FUN-END breakpoint. The returned function
2879 ;;; makes a fake LRA that all returns go through, and this piece of
2880 ;;; fake code actually breaks. Upon return from the break, the code
2881 ;;; provides the returnee with any values. Since the returned function
2882 ;;; effectively activates FUN-END-BPT on each entry to DEBUG-FUN's
2883 ;;; function, we must establish breakpoint-data about FUN-END-BPT.
2884 (defun fun-end-starter-hook (starter-bpt debug-fun)
2885 (declare (type breakpoint starter-bpt)
2886 (type compiled-debug-fun debug-fun))
2887 (lambda (frame breakpoint)
2888 (declare (ignore breakpoint)
2890 (let ((lra-sc-offset
2891 (sb!c::compiled-debug-fun-return-pc
2892 (compiled-debug-fun-compiler-debug-fun debug-fun))))
2893 (multiple-value-bind (lra component offset)
2895 (get-context-value frame
2898 (setf (get-context-value frame
2902 (let ((end-bpts (breakpoint-%info starter-bpt)))
2903 (let ((data (breakpoint-data component offset)))
2904 (setf (breakpoint-data-breakpoints data) end-bpts)
2905 (dolist (bpt end-bpts)
2906 (setf (breakpoint-internal-data bpt) data)))
2907 (let ((cookie (make-fun-end-cookie lra debug-fun)))
2908 (setf (gethash component *fun-end-cookies*) cookie)
2909 (dolist (bpt end-bpts)
2910 (let ((fun (breakpoint-cookie-fun bpt)))
2911 (when fun (funcall fun frame cookie))))))))))
2913 ;;; This takes a FUN-END-COOKIE and a frame, and it returns
2914 ;;; whether the cookie is still valid. A cookie becomes invalid when
2915 ;;; the frame that established the cookie has exited. Sometimes cookie
2916 ;;; holders are unaware of cookie invalidation because their
2917 ;;; :FUN-END breakpoint hooks didn't run due to THROW'ing.
2919 ;;; This takes a frame as an efficiency hack since the user probably
2920 ;;; has a frame object in hand when using this routine, and it saves
2921 ;;; repeated parsing of the stack and consing when asking whether a
2922 ;;; series of cookies is valid.
2923 (defun fun-end-cookie-valid-p (frame cookie)
2924 (let ((lra (fun-end-cookie-bogus-lra cookie))
2925 (lra-sc-offset (sb!c::compiled-debug-fun-return-pc
2926 (compiled-debug-fun-compiler-debug-fun
2927 (fun-end-cookie-debug-fun cookie)))))
2928 (do ((frame frame (frame-down frame)))
2930 (when (and (compiled-frame-p frame)
2931 (#!-(or x86 x86-64) eq #!+(or x86 x86-64) sap=
2933 (get-context-value frame lra-save-offset lra-sc-offset)))
2936 ;;;; ACTIVATE-BREAKPOINT
2938 ;;; Cause the system to invoke the breakpoint's hook function until
2939 ;;; the next call to DEACTIVATE-BREAKPOINT or DELETE-BREAKPOINT. The
2940 ;;; system invokes breakpoint hook functions in the opposite order
2941 ;;; that you activate them.
2942 (defun activate-breakpoint (breakpoint)
2943 (when (eq (breakpoint-status breakpoint) :deleted)
2944 (error "cannot activate a deleted breakpoint: ~S" breakpoint))
2945 (unless (eq (breakpoint-status breakpoint) :active)
2946 (ecase (breakpoint-kind breakpoint)
2948 (let ((loc (breakpoint-what breakpoint)))
2950 (compiled-code-location
2951 (activate-compiled-code-location-breakpoint breakpoint)
2952 (let ((other (breakpoint-unknown-return-partner breakpoint)))
2954 (activate-compiled-code-location-breakpoint other))))
2955 ;; (There used to be more cases back before sbcl-0.7.0, when
2956 ;; we did special tricks to debug the IR1 interpreter.)
2959 (etypecase (breakpoint-what breakpoint)
2961 (activate-compiled-fun-start-breakpoint breakpoint))
2962 ;; (There used to be more cases back before sbcl-0.7.0, when
2963 ;; we did special tricks to debug the IR1 interpreter.)
2966 (etypecase (breakpoint-what breakpoint)
2968 (let ((starter (breakpoint-start-helper breakpoint)))
2969 (unless (eq (breakpoint-status starter) :active)
2970 ;; may already be active by some other :FUN-END breakpoint
2971 (activate-compiled-fun-start-breakpoint starter)))
2972 (setf (breakpoint-status breakpoint) :active))
2973 ;; (There used to be more cases back before sbcl-0.7.0, when
2974 ;; we did special tricks to debug the IR1 interpreter.)
2978 (defun activate-compiled-code-location-breakpoint (breakpoint)
2979 (declare (type breakpoint breakpoint))
2980 (let ((loc (breakpoint-what breakpoint)))
2981 (declare (type compiled-code-location loc))
2982 (sub-activate-breakpoint
2984 (breakpoint-data (compiled-debug-fun-component
2985 (code-location-debug-fun loc))
2986 (+ (compiled-code-location-pc loc)
2987 (if (or (eq (breakpoint-kind breakpoint)
2988 :unknown-return-partner)
2989 (eq (compiled-code-location-kind loc)
2990 :single-value-return))
2991 sb!vm:single-value-return-byte-offset
2994 (defun activate-compiled-fun-start-breakpoint (breakpoint)
2995 (declare (type breakpoint breakpoint))
2996 (let ((debug-fun (breakpoint-what breakpoint)))
2997 (sub-activate-breakpoint
2999 (breakpoint-data (compiled-debug-fun-component debug-fun)
3000 (sb!c::compiled-debug-fun-start-pc
3001 (compiled-debug-fun-compiler-debug-fun
3004 (defun sub-activate-breakpoint (breakpoint data)
3005 (declare (type breakpoint breakpoint)
3006 (type breakpoint-data data))
3007 (setf (breakpoint-status breakpoint) :active)
3009 (unless (breakpoint-data-breakpoints data)
3010 (setf (breakpoint-data-instruction data)
3012 (breakpoint-install (get-lisp-obj-address
3013 (breakpoint-data-component data))
3014 (breakpoint-data-offset data)))))
3015 (setf (breakpoint-data-breakpoints data)
3016 (append (breakpoint-data-breakpoints data) (list breakpoint)))
3017 (setf (breakpoint-internal-data breakpoint) data)))
3019 ;;;; DEACTIVATE-BREAKPOINT
3021 ;;; Stop the system from invoking the breakpoint's hook function.
3022 (defun deactivate-breakpoint (breakpoint)
3023 (when (eq (breakpoint-status breakpoint) :active)
3025 (let ((loc (breakpoint-what breakpoint)))
3027 ((or compiled-code-location compiled-debug-fun)
3028 (deactivate-compiled-breakpoint breakpoint)
3029 (let ((other (breakpoint-unknown-return-partner breakpoint)))
3031 (deactivate-compiled-breakpoint other))))
3032 ;; (There used to be more cases back before sbcl-0.7.0, when
3033 ;; we did special tricks to debug the IR1 interpreter.)
3037 (defun deactivate-compiled-breakpoint (breakpoint)
3038 (if (eq (breakpoint-kind breakpoint) :fun-end)
3039 (let ((starter (breakpoint-start-helper breakpoint)))
3040 (unless (find-if (lambda (bpt)
3041 (and (not (eq bpt breakpoint))
3042 (eq (breakpoint-status bpt) :active)))
3043 (breakpoint-%info starter))
3044 (deactivate-compiled-breakpoint starter)))
3045 (let* ((data (breakpoint-internal-data breakpoint))
3046 (bpts (delete breakpoint (breakpoint-data-breakpoints data))))
3047 (setf (breakpoint-internal-data breakpoint) nil)
3048 (setf (breakpoint-data-breakpoints data) bpts)
3051 (breakpoint-remove (get-lisp-obj-address
3052 (breakpoint-data-component data))
3053 (breakpoint-data-offset data)
3054 (breakpoint-data-instruction data)))
3055 (delete-breakpoint-data data))))
3056 (setf (breakpoint-status breakpoint) :inactive)
3059 ;;;; BREAKPOINT-INFO
3061 ;;; Return the user-maintained info associated with breakpoint. This
3063 (defun breakpoint-info (breakpoint)
3064 (breakpoint-%info breakpoint))
3065 (defun %set-breakpoint-info (breakpoint value)
3066 (setf (breakpoint-%info breakpoint) value)
3067 (let ((other (breakpoint-unknown-return-partner breakpoint)))
3069 (setf (breakpoint-%info other) value))))
3071 ;;;; BREAKPOINT-ACTIVE-P and DELETE-BREAKPOINT
3073 (defun breakpoint-active-p (breakpoint)
3074 (ecase (breakpoint-status breakpoint)
3076 ((:inactive :deleted) nil)))
3078 ;;; Free system storage and remove computational overhead associated
3079 ;;; with breakpoint. After calling this, breakpoint is completely
3080 ;;; impotent and can never become active again.
3081 (defun delete-breakpoint (breakpoint)
3082 (let ((status (breakpoint-status breakpoint)))
3083 (unless (eq status :deleted)
3084 (when (eq status :active)
3085 (deactivate-breakpoint breakpoint))
3086 (setf (breakpoint-status breakpoint) :deleted)
3087 (let ((other (breakpoint-unknown-return-partner breakpoint)))
3089 (setf (breakpoint-status other) :deleted)))
3090 (when (eq (breakpoint-kind breakpoint) :fun-end)
3091 (let* ((starter (breakpoint-start-helper breakpoint))
3092 (breakpoints (delete breakpoint
3093 (the list (breakpoint-info starter)))))
3094 (setf (breakpoint-info starter) breakpoints)
3096 (delete-breakpoint starter)
3097 (setf (compiled-debug-fun-end-starter
3098 (breakpoint-what breakpoint))
3102 ;;;; C call out stubs
3104 ;;; This actually installs the break instruction in the component. It
3105 ;;; returns the overwritten bits. You must call this in a context in
3106 ;;; which GC is disabled, so that Lisp doesn't move objects around
3107 ;;; that C is pointing to.
3108 (sb!alien:define-alien-routine "breakpoint_install" sb!alien:unsigned-int
3109 (code-obj sb!alien:unsigned-long)
3110 (pc-offset sb!alien:int))
3112 ;;; This removes the break instruction and replaces the original
3113 ;;; instruction. You must call this in a context in which GC is disabled
3114 ;;; so Lisp doesn't move objects around that C is pointing to.
3115 (sb!alien:define-alien-routine "breakpoint_remove" sb!alien:void
3116 (code-obj sb!alien:unsigned-long)
3117 (pc-offset sb!alien:int)
3118 (old-inst sb!alien:unsigned-int))
3120 (sb!alien:define-alien-routine "breakpoint_do_displaced_inst" sb!alien:void
3121 (scp (* os-context-t))
3122 (orig-inst sb!alien:unsigned-int))
3124 ;;;; breakpoint handlers (layer between C and exported interface)
3126 ;;; This maps components to a mapping of offsets to BREAKPOINT-DATAs.
3127 (defvar *component-breakpoint-offsets* (make-hash-table :test 'eq))
3129 ;;; This returns the BREAKPOINT-DATA object associated with component cross
3130 ;;; offset. If none exists, this makes one, installs it, and returns it.
3131 (defun breakpoint-data (component offset &optional (create t))
3132 (flet ((install-breakpoint-data ()
3134 (let ((data (make-breakpoint-data component offset)))
3135 (push (cons offset data)
3136 (gethash component *component-breakpoint-offsets*))
3138 (let ((offsets (gethash component *component-breakpoint-offsets*)))
3140 (let ((data (assoc offset offsets)))
3143 (install-breakpoint-data)))
3144 (install-breakpoint-data)))))
3146 ;;; We use this when there are no longer any active breakpoints
3147 ;;; corresponding to DATA.
3148 (defun delete-breakpoint-data (data)
3149 (let* ((component (breakpoint-data-component data))
3150 (offsets (delete (breakpoint-data-offset data)
3151 (gethash component *component-breakpoint-offsets*)
3154 (setf (gethash component *component-breakpoint-offsets*) offsets)
3155 (remhash component *component-breakpoint-offsets*)))
3158 ;;; The C handler for interrupts calls this when it has a
3159 ;;; debugging-tool break instruction. This does *not* handle all
3160 ;;; breaks; for example, it does not handle breaks for internal
3162 (defun handle-breakpoint (offset component signal-context)
3163 (let ((data (breakpoint-data component offset nil)))
3165 (error "unknown breakpoint in ~S at offset ~S"
3166 (debug-fun-name (debug-fun-from-pc component offset))
3168 (let ((breakpoints (breakpoint-data-breakpoints data)))
3169 (if (or (null breakpoints)
3170 (eq (breakpoint-kind (car breakpoints)) :fun-end))
3171 (handle-fun-end-breakpoint-aux breakpoints data signal-context)
3172 (handle-breakpoint-aux breakpoints data
3173 offset component signal-context)))))
3175 ;;; This holds breakpoint-datas while invoking the breakpoint hooks
3176 ;;; associated with that particular component and location. While they
3177 ;;; are executing, if we hit the location again, we ignore the
3178 ;;; breakpoint to avoid infinite recursion. fun-end breakpoints
3179 ;;; must work differently since the breakpoint-data is unique for each
3181 (defvar *executing-breakpoint-hooks* nil)
3183 ;;; This handles code-location and DEBUG-FUN :FUN-START
3185 (defun handle-breakpoint-aux (breakpoints data offset component signal-context)
3187 (bug "breakpoint that nobody wants"))
3188 (unless (member data *executing-breakpoint-hooks*)
3189 (let ((*executing-breakpoint-hooks* (cons data
3190 *executing-breakpoint-hooks*)))
3191 (invoke-breakpoint-hooks breakpoints signal-context)))
3192 ;; At this point breakpoints may not hold the same list as
3193 ;; BREAKPOINT-DATA-BREAKPOINTS since invoking hooks may have allowed
3194 ;; a breakpoint deactivation. In fact, if all breakpoints were
3195 ;; deactivated then data is invalid since it was deleted and so the
3196 ;; correct one must be looked up if it is to be used. If there are
3197 ;; no more breakpoints active at this location, then the normal
3198 ;; instruction has been put back, and we do not need to
3199 ;; DO-DISPLACED-INST.
3200 (setf data (breakpoint-data component offset nil))
3201 (when (and data (breakpoint-data-breakpoints data))
3202 ;; The breakpoint is still active, so we need to execute the
3203 ;; displaced instruction and leave the breakpoint instruction
3204 ;; behind. The best way to do this is different on each machine,
3205 ;; so we just leave it up to the C code.
3206 (breakpoint-do-displaced-inst signal-context
3207 (breakpoint-data-instruction data))
3208 ;; Some platforms have no usable sigreturn() call. If your
3209 ;; implementation of arch_do_displaced_inst() _does_ sigreturn(),
3210 ;; it's polite to warn here
3211 #!+(and sparc solaris)
3212 (error "BREAKPOINT-DO-DISPLACED-INST returned?")))
3214 (defun invoke-breakpoint-hooks (breakpoints signal-context)
3215 (let* ((frame (signal-context-frame signal-context)))
3216 (dolist (bpt breakpoints)
3217 (funcall (breakpoint-hook-fun bpt)
3219 ;; If this is an :UNKNOWN-RETURN-PARTNER, then pass the
3220 ;; hook function the original breakpoint, so that users
3221 ;; aren't forced to confront the fact that some
3222 ;; breakpoints really are two.
3223 (if (eq (breakpoint-kind bpt) :unknown-return-partner)
3224 (breakpoint-unknown-return-partner bpt)
3227 (defun signal-context-frame (signal-context)
3230 (declare (optimize (inhibit-warnings 3)))
3231 (sb!alien:sap-alien signal-context (* os-context-t))))
3232 (cfp (int-sap (sb!vm:context-register scp sb!vm::cfp-offset))))
3233 (compute-calling-frame cfp
3234 (sb!vm:context-pc scp)
3237 (defun handle-fun-end-breakpoint (offset component context)
3238 (let ((data (breakpoint-data component offset nil)))
3240 (error "unknown breakpoint in ~S at offset ~S"
3241 (debug-fun-name (debug-fun-from-pc component offset))
3243 (let ((breakpoints (breakpoint-data-breakpoints data)))
3245 (aver (eq (breakpoint-kind (car breakpoints)) :fun-end))
3246 (handle-fun-end-breakpoint-aux breakpoints data context)))))
3248 ;;; Either HANDLE-BREAKPOINT calls this for :FUN-END breakpoints
3249 ;;; [old C code] or HANDLE-FUN-END-BREAKPOINT calls this directly
3251 (defun handle-fun-end-breakpoint-aux (breakpoints data signal-context)
3252 (delete-breakpoint-data data)
3255 (declare (optimize (inhibit-warnings 3)))
3256 (sb!alien:sap-alien signal-context (* os-context-t))))
3257 (frame (signal-context-frame signal-context))
3258 (component (breakpoint-data-component data))
3259 (cookie (gethash component *fun-end-cookies*)))
3260 (remhash component *fun-end-cookies*)
3261 (dolist (bpt breakpoints)
3262 (funcall (breakpoint-hook-fun bpt)
3264 (get-fun-end-breakpoint-values scp)
3267 (defun get-fun-end-breakpoint-values (scp)
3268 (let ((ocfp (int-sap (sb!vm:context-register
3270 #!-(or x86 x86-64) sb!vm::ocfp-offset
3271 #!+(or x86 x86-64) sb!vm::ebx-offset)))
3272 (nargs (make-lisp-obj
3273 (sb!vm:context-register scp sb!vm::nargs-offset)))
3274 (reg-arg-offsets '#.sb!vm::*register-arg-offsets*)
3277 (dotimes (arg-num nargs)
3278 (push (if reg-arg-offsets
3280 (sb!vm:context-register scp (pop reg-arg-offsets)))
3281 (stack-ref ocfp arg-num))
3283 (nreverse results)))
3285 ;;;; MAKE-BOGUS-LRA (used for :FUN-END breakpoints)
3287 (defconstant bogus-lra-constants
3288 #!-(or x86 x86-64) 2 #!+(or x86 x86-64) 3)
3289 (defconstant known-return-p-slot
3290 (+ sb!vm:code-constants-offset #!-(or x86 x86-64) 1 #!+(or x86 x86-64) 2))
3292 ;;; Make a bogus LRA object that signals a breakpoint trap when
3293 ;;; returned to. If the breakpoint trap handler returns, REAL-LRA is
3294 ;;; returned to. Three values are returned: the bogus LRA object, the
3295 ;;; code component it is part of, and the PC offset for the trap
3297 (defun make-bogus-lra (real-lra &optional known-return-p)
3299 ;; These are really code labels, not variables: but this way we get
3301 (let* ((src-start (foreign-symbol-sap "fun_end_breakpoint_guts"))
3302 (src-end (foreign-symbol-sap "fun_end_breakpoint_end"))
3303 (trap-loc (foreign-symbol-sap "fun_end_breakpoint_trap"))
3304 (length (sap- src-end src-start))
3306 (%primitive sb!c:allocate-code-object (1+ bogus-lra-constants)
3308 (dst-start (code-instructions code-object)))
3309 (declare (type system-area-pointer
3310 src-start src-end dst-start trap-loc)
3311 (type index length))
3312 (setf (%code-debug-info code-object) :bogus-lra)
3313 (setf (code-header-ref code-object sb!vm:code-trace-table-offset-slot)
3316 (setf (code-header-ref code-object real-lra-slot) real-lra)
3318 (multiple-value-bind (offset code) (compute-lra-data-from-pc real-lra)
3319 (setf (code-header-ref code-object real-lra-slot) code)
3320 (setf (code-header-ref code-object (1+ real-lra-slot)) offset))
3321 (setf (code-header-ref code-object known-return-p-slot)
3323 (system-area-ub8-copy src-start 0 dst-start 0 length)
3324 (sb!vm:sanctify-for-execution code-object)
3326 (values dst-start code-object (sap- trap-loc src-start))
3328 (let ((new-lra (make-lisp-obj (+ (sap-int dst-start)
3329 sb!vm:other-pointer-lowtag))))
3332 (logandc2 (+ sb!vm:code-constants-offset bogus-lra-constants 1)
3334 (sb!vm:sanctify-for-execution code-object)
3335 (values new-lra code-object (sap- trap-loc src-start))))))
3339 ;;; This appears here because it cannot go with the DEBUG-FUN
3340 ;;; interface since DO-DEBUG-BLOCK-LOCATIONS isn't defined until after
3341 ;;; the DEBUG-FUN routines.
3343 ;;; Return a code-location before the body of a function and after all
3344 ;;; the arguments are in place; or if that location can't be
3345 ;;; determined due to a lack of debug information, return NIL.
3346 (defun debug-fun-start-location (debug-fun)
3347 (etypecase debug-fun
3349 (code-location-from-pc debug-fun
3350 (sb!c::compiled-debug-fun-start-pc
3351 (compiled-debug-fun-compiler-debug-fun
3354 ;; (There used to be more cases back before sbcl-0.7.0, when
3355 ;; we did special tricks to debug the IR1 interpreter.)
3359 ;;;; Single-stepping
3361 ;;; The single-stepper works by inserting conditional trap instructions
3362 ;;; into the generated code (see src/compiler/*/call.lisp), currently:
3364 ;;; 1) Before the code generated for a function call that was
3365 ;;; translated to a VOP
3366 ;;; 2) Just before the call instruction for a full call
3368 ;;; In both cases, the trap will only be executed if stepping has been
3369 ;;; enabled, in which case it'll ultimately be handled by
3370 ;;; HANDLE-SINGLE-STEP-TRAP, which will either signal a stepping condition,
3371 ;;; or replace the function that's about to be called with a wrapper
3372 ;;; which will signal the condition.
3374 (defun handle-single-step-trap (kind callee-register-offset)
3375 (let ((context (nth-interrupt-context (1- *free-interrupt-context-index*))))
3376 ;; The following calls must get tail-call eliminated for
3377 ;; *STEP-FRAME* to get set correctly on non-x86.
3378 (if (= kind single-step-before-trap)
3379 (handle-single-step-before-trap context)
3380 (handle-single-step-around-trap context callee-register-offset))))
3382 (defvar *step-frame* nil)
3384 (defun handle-single-step-before-trap (context)
3385 (let ((step-info (single-step-info-from-context context)))
3386 ;; If there was not enough debug information available, there's no
3387 ;; sense in signaling the condition.
3391 (signal-context-frame (sb!alien::alien-sap context))
3393 ;; KLUDGE: Use the first non-foreign frame as the
3394 ;; *STACK-TOP-HINT*. Getting the frame from the signal
3395 ;; context as on x86 would be cleaner, but
3396 ;; SIGNAL-CONTEXT-FRAME doesn't seem seem to work at all
3398 (loop with frame = (frame-down (top-frame))
3400 for dfun = (frame-debug-fun frame)
3401 do (when (typep dfun 'compiled-debug-fun)
3403 do (setf frame (frame-down frame)))))
3404 (sb!impl::step-form step-info
3405 ;; We could theoretically store information in
3406 ;; the debug-info about to determine the
3407 ;; arguments here, but for now let's just pass
3411 ;;; This function will replace the fdefn / function that was in the
3412 ;;; register at CALLEE-REGISTER-OFFSET with a wrapper function. To
3413 ;;; ensure that the full call will use the wrapper instead of the
3414 ;;; original, conditional trap must be emitted before the fdefn /
3415 ;;; function is converted into a raw address.
3416 (defun handle-single-step-around-trap (context callee-register-offset)
3417 ;; Fetch the function / fdefn we're about to call from the
3418 ;; appropriate register.
3419 (let* ((callee (make-lisp-obj
3420 (context-register context callee-register-offset)))
3421 (step-info (single-step-info-from-context context)))
3422 ;; If there was not enough debug information available, there's no
3423 ;; sense in signaling the condition.
3425 (return-from handle-single-step-around-trap))
3426 (let* ((fun (lambda (&rest args)
3428 (apply (typecase callee
3429 (fdefn (fdefn-fun callee))
3432 ;; Signal a step condition
3434 (let ((*step-frame* (frame-down (top-frame))))
3435 (sb!impl::step-form step-info args))))
3436 ;; And proceed based on its return value.
3438 ;; STEP-INTO was selected. Use *STEP-OUT* to
3439 ;; let the stepper know that selecting the
3440 ;; STEP-OUT restart is valid inside this
3441 (let ((sb!impl::*step-out* :maybe))
3442 ;; Pass the return values of the call to
3443 ;; STEP-VALUES, which will signal a
3444 ;; condition with them in the VALUES slot.
3446 (multiple-value-call #'sb!impl::step-values
3449 ;; If the user selected the STEP-OUT
3450 ;; restart during the call, resume
3452 (when (eq sb!impl::*step-out* t)
3453 (sb!impl::enable-stepping))))
3454 ;; STEP-NEXT / CONTINUE / OUT selected:
3455 ;; Disable the stepper for the duration of
3457 (sb!impl::with-stepping-disabled
3459 (new-callee (etypecase callee
3461 (let ((fdefn (make-fdefn (gensym))))
3462 (setf (fdefn-fun fdefn) fun)
3465 ;; And then store the wrapper in the same place.
3466 (setf (context-register context callee-register-offset)
3467 (get-lisp-obj-address new-callee)))))
3469 ;;; Given a signal context, fetch the step-info that's been stored in
3470 ;;; the debug info at the trap point.
3471 (defun single-step-info-from-context (context)
3472 (multiple-value-bind (pc-offset code)
3473 (compute-lra-data-from-pc (context-pc context))
3474 (let* ((debug-fun (debug-fun-from-pc code pc-offset))
3475 (location (code-location-from-pc debug-fun
3480 (fill-in-code-location location)
3481 (code-location-debug-source location)
3482 (compiled-code-location-step-info location))
3486 ;;; Return the frame that triggered a single-step condition. Used to
3487 ;;; provide a *STACK-TOP-HINT*.
3488 (defun find-stepped-frame ()