Grovel timeval and timespec struct definitions rather than hard-coding.
[sbcl.git] / src / code / debug-int.lisp
1 ;;;; the implementation of the programmer's interface to writing
2 ;;;; debugging tools
3
4 ;;;; This software is part of the SBCL system. See the README file for
5 ;;;; more information.
6 ;;;;
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.
12
13 (in-package "SB!DI")
14
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?
17 \f
18 ;;;; conditions
19
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.
34 ;;;;
35 ;;;; Use DEBUG-SIGNAL to signal these conditions.
36
37 (define-condition debug-condition (serious-condition)
38   ()
39   #!+sb-doc
40   (:documentation
41    "All DEBUG-CONDITIONs inherit from this type. These are serious conditions
42     that must be handled, but they are not programmer errors."))
43
44 (define-condition no-debug-fun-returns (debug-condition)
45   ((debug-fun :reader no-debug-fun-returns-debug-fun
46               :initarg :debug-fun))
47   #!+sb-doc
48   (:documentation
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))))
54                (format stream
55                        "~&Cannot return values from ~:[frame~;~:*~S~] since ~
56                         the debug information lacks details about returning ~
57                         values here."
58                        fun)))))
59
60 (define-condition no-debug-blocks (debug-condition)
61   ((debug-fun :reader no-debug-blocks-debug-fun
62               :initarg :debug-fun))
63   #!+sb-doc
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)))))
68
69 (define-condition no-debug-vars (debug-condition)
70   ((debug-fun :reader no-debug-vars-debug-fun
71               :initarg :debug-fun))
72   #!+sb-doc
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)))))
77
78 (define-condition lambda-list-unavailable (debug-condition)
79   ((debug-fun :reader lambda-list-unavailable-debug-fun
80               :initarg :debug-fun))
81   #!+sb-doc
82   (:documentation
83    "The DEBUG-FUN has no lambda list since argument DEBUG-VARs are
84     unavailable.")
85   (:report (lambda (condition stream)
86              (format stream "~&~S has no lambda-list information available."
87                      (lambda-list-unavailable-debug-fun condition)))))
88
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)))))
96
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)))))
104 \f
105 ;;;; errors and DEBUG-SIGNAL
106
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
110 ;;; come up.
111 ;;;
112 ;;; While under development, this code also signals errors in code
113 ;;; branches that remain unimplemented.
114
115 (define-condition debug-error (error) ()
116   #!+sb-doc
117   (:documentation
118    "All programmer errors from using the interface for building debugging
119     tools inherit from this type."))
120
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)))))
126
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)))))
133
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)))))
142
143 (define-condition invalid-control-stack-pointer (debug-error)
144   ()
145   (:report (lambda (condition stream)
146              (declare (ignore condition))
147              (fresh-line stream)
148              (write-string "invalid control stack pointer" stream))))
149
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)
156              (format
157               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)))))
162
163 ;;; This signals debug-conditions. If they go unhandled, then signal
164 ;;; an UNHANDLED-DEBUG-CONDITION error.
165 ;;;
166 ;;; ??? Get SIGNAL in the right package!
167 (defmacro debug-signal (datum &rest arguments)
168   `(let ((condition (make-condition ,datum ,@arguments)))
169      (signal condition)
170      (error 'unhandled-debug-condition :condition condition)))
171 \f
172 ;;;; structures
173 ;;;;
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.
179
180 ;;;; DEBUG-VARs
181
182 ;;; These exist for caching data stored in packed binary form in
183 ;;; compiler DEBUG-FUNs.
184 (defstruct (debug-var (:constructor nil)
185                       (:copier 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
189   ;; symbol
190   (id 0 :type index)
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)
195     (format stream
196             "~S ~W"
197             (debug-var-symbol debug-var)
198             (debug-var-id debug-var))))
199
200 #!+sb-doc
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.")
204
205 (defstruct (compiled-debug-var
206             (:include debug-var)
207             (:constructor make-compiled-debug-var
208                 (symbol id alive-p sc-offset save-sc-offset info))
209             (:copier nil))
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))
214   (info nil))
215
216 ;;;; frames
217
218 ;;; These represent call frames on the stack.
219 (defstruct (frame (:constructor nil)
220                   (:copier nil))
221   ;; the next frame up, or NIL when top frame
222   (up nil :type (or frame null))
223   ;; the previous frame down, or NIL when the bottom frame. Before
224   ;; computing the next frame down, this slot holds the frame pointer
225   ;; to the control stack for the given frame. This lets us get the
226   ;; next frame down and the return-pc for that frame.
227   (%down :unparsed :type (or frame (member nil :unparsed)))
228   ;; the DEBUG-FUN for the function whose call this frame represents
229   (debug-fun nil :type debug-fun)
230   ;; the CODE-LOCATION where the frame's DEBUG-FUN will continue
231   ;; running when program execution returns to this frame. If someone
232   ;; interrupted this frame, the result could be an unknown
233   ;; CODE-LOCATION.
234   (code-location nil :type code-location)
235   ;; an a-list of catch-tags to code-locations
236   (%catches :unparsed :type (or list (member :unparsed)))
237   ;; pointer to frame on control stack (unexported)
238   pointer
239   ;; This is the frame's number for prompt printing. Top is zero.
240   (number 0 :type index))
241
242 (defstruct (compiled-frame
243             (:include frame)
244             (:constructor make-compiled-frame
245                           (pointer up debug-fun code-location number
246                                    &optional escaped))
247             (:copier nil))
248   ;; This indicates whether someone interrupted the frame.
249   ;; (unexported). If escaped, this is a pointer to the state that was
250   ;; saved when we were interrupted, an os_context_t, i.e. the third
251   ;; argument to an SA_SIGACTION-style signal handler.
252   escaped)
253 (def!method print-object ((obj compiled-frame) str)
254   (print-unreadable-object (obj str :type t)
255     (format str
256             "~S~:[~;, interrupted~]"
257             (debug-fun-name (frame-debug-fun obj))
258             (compiled-frame-escaped obj))))
259 \f
260 ;;;; DEBUG-FUNs
261
262 ;;; These exist for caching data stored in packed binary form in
263 ;;; compiler DEBUG-FUNs. *COMPILED-DEBUG-FUNS* maps a SB!C::DEBUG-FUN
264 ;;; to a DEBUG-FUN. There should only be one DEBUG-FUN in existence
265 ;;; for any function; that is, all CODE-LOCATIONs and other objects
266 ;;; that reference DEBUG-FUNs point to unique objects. This is
267 ;;; due to the overhead in cached information.
268 (defstruct (debug-fun (:constructor nil)
269                       (:copier nil))
270   ;; some representation of the function arguments. See
271   ;; DEBUG-FUN-LAMBDA-LIST.
272   ;; NOTE: must parse vars before parsing arg list stuff.
273   (%lambda-list :unparsed)
274   ;; cached DEBUG-VARS information (unexported).
275   ;; These are sorted by their name.
276   (%debug-vars :unparsed :type (or simple-vector null (member :unparsed)))
277   ;; cached debug-block information. This is NIL when we have tried to
278   ;; parse the packed binary info, but none is available.
279   (blocks :unparsed :type (or simple-vector null (member :unparsed)))
280   ;; the actual function if available
281   (%function :unparsed :type (or null function (member :unparsed))))
282 (def!method print-object ((obj debug-fun) stream)
283   (print-unreadable-object (obj stream :type t)
284     (prin1 (debug-fun-name obj) stream)))
285
286 (defstruct (compiled-debug-fun
287             (:include debug-fun)
288             (:constructor %make-compiled-debug-fun
289                           (compiler-debug-fun component))
290             (:copier nil))
291   ;; compiler's dumped DEBUG-FUN information (unexported)
292   (compiler-debug-fun nil :type sb!c::compiled-debug-fun)
293   ;; code object (unexported).
294   component
295   ;; the :FUN-START breakpoint (if any) used to facilitate
296   ;; function end breakpoints
297   (end-starter nil :type (or null breakpoint)))
298
299 ;;; This maps SB!C::COMPILED-DEBUG-FUNs to
300 ;;; COMPILED-DEBUG-FUNs, so we can get at cached stuff and not
301 ;;; duplicate COMPILED-DEBUG-FUN structures.
302 (defvar *compiled-debug-funs* (make-hash-table :test 'eq :weakness :key))
303
304 ;;; Make a COMPILED-DEBUG-FUN for a SB!C::COMPILER-DEBUG-FUN and its
305 ;;; component. This maps the latter to the former in
306 ;;; *COMPILED-DEBUG-FUNS*. If there already is a COMPILED-DEBUG-FUN,
307 ;;; then this returns it from *COMPILED-DEBUG-FUNS*.
308 ;;;
309 ;;; FIXME: It seems this table can potentially grow without bounds,
310 ;;; and retains roots to functions that might otherwise be collected.
311 (defun make-compiled-debug-fun (compiler-debug-fun component)
312   (let ((table *compiled-debug-funs*))
313     (with-locked-system-table (table)
314       (or (gethash compiler-debug-fun table)
315           (setf (gethash compiler-debug-fun table)
316                 (%make-compiled-debug-fun compiler-debug-fun component))))))
317
318 (defstruct (bogus-debug-fun
319             (:include debug-fun)
320             (:constructor make-bogus-debug-fun
321                           (%name &aux
322                                  (%lambda-list nil)
323                                  (%debug-vars nil)
324                                  (blocks nil)
325                                  (%function nil)))
326             (:copier nil))
327   %name)
328 \f
329 ;;;; DEBUG-BLOCKs
330
331 ;;; These exist for caching data stored in packed binary form in compiler
332 ;;; DEBUG-BLOCKs.
333 (defstruct (debug-block (:constructor nil)
334                         (:copier nil))
335   ;; Code-locations where execution continues after this block.
336   (successors nil :type list)
337   ;; This indicates whether the block is a special glob of code shared
338   ;; by various functions and tucked away elsewhere in a component.
339   ;; This kind of block has no start code-location. This slot is in
340   ;; all debug-blocks since it is an exported interface.
341   (elsewhere-p nil :type boolean))
342 (def!method print-object ((obj debug-block) str)
343   (print-unreadable-object (obj str :type t)
344     (prin1 (debug-block-fun-name obj) str)))
345
346 #!+sb-doc
347 (setf (fdocumentation 'debug-block-successors 'function)
348   "Return the list of possible code-locations where execution may continue
349    when the basic-block represented by debug-block completes its execution.")
350
351 #!+sb-doc
352 (setf (fdocumentation 'debug-block-elsewhere-p 'function)
353   "Return whether debug-block represents elsewhere code.")
354
355 (defstruct (compiled-debug-block (:include debug-block)
356                                  (:constructor
357                                   make-compiled-debug-block
358                                   (code-locations successors elsewhere-p))
359                                  (:copier nil))
360   ;; code-location information for the block
361   (code-locations nil :type simple-vector))
362 \f
363 ;;;; breakpoints
364
365 ;;; This is an internal structure that manages information about a
366 ;;; breakpoint locations. See *COMPONENT-BREAKPOINT-OFFSETS*.
367 (defstruct (breakpoint-data (:constructor make-breakpoint-data
368                                           (component offset))
369                             (:copier nil))
370   ;; This is the component in which the breakpoint lies.
371   component
372   ;; This is the byte offset into the component.
373   (offset nil :type index)
374   ;; The original instruction replaced by the breakpoint.
375   (instruction nil :type (or null sb!vm::word))
376   ;; A list of user breakpoints at this location.
377   (breakpoints nil :type list))
378 (def!method print-object ((obj breakpoint-data) str)
379   (print-unreadable-object (obj str :type t)
380     (format str "~S at ~S"
381             (debug-fun-name
382              (debug-fun-from-pc (breakpoint-data-component obj)
383                                 (breakpoint-data-offset obj)))
384             (breakpoint-data-offset obj))))
385
386 (defstruct (breakpoint (:constructor %make-breakpoint
387                                      (hook-fun what kind %info))
388                        (:copier nil))
389   ;; This is the function invoked when execution encounters the
390   ;; breakpoint. It takes a frame, the breakpoint, and optionally a
391   ;; list of values. Values are supplied for :FUN-END breakpoints as
392   ;; values to return for the function containing the breakpoint.
393   ;; :FUN-END breakpoint hook functions also take a cookie argument.
394   ;; See the COOKIE-FUN slot.
395   (hook-fun (required-arg) :type function)
396   ;; CODE-LOCATION or DEBUG-FUN
397   (what nil :type (or code-location debug-fun))
398   ;; :CODE-LOCATION, :FUN-START, or :FUN-END for that kind
399   ;; of breakpoint. :UNKNOWN-RETURN-PARTNER if this is the partner of
400   ;; a :code-location breakpoint at an :UNKNOWN-RETURN code-location.
401   (kind nil :type (member :code-location :fun-start :fun-end
402                           :unknown-return-partner))
403   ;; Status helps the user and the implementation.
404   (status :inactive :type (member :active :inactive :deleted))
405   ;; This is a backpointer to a breakpoint-data.
406   (internal-data nil :type (or null breakpoint-data))
407   ;; With code-locations whose type is :UNKNOWN-RETURN, there are
408   ;; really two breakpoints: one at the multiple-value entry point,
409   ;; and one at the single-value entry point. This slot holds the
410   ;; breakpoint for the other one, or NIL if this isn't at an
411   ;; :UNKNOWN-RETURN code location.
412   (unknown-return-partner nil :type (or null breakpoint))
413   ;; :FUN-END breakpoints use a breakpoint at the :FUN-START
414   ;; to establish the end breakpoint upon function entry. We do this
415   ;; by frobbing the LRA to jump to a special piece of code that
416   ;; breaks and provides the return values for the returnee. This slot
417   ;; points to the start breakpoint, so we can activate, deactivate,
418   ;; and delete it.
419   (start-helper nil :type (or null breakpoint))
420   ;; This is a hook users supply to get a dynamically unique cookie
421   ;; for identifying :FUN-END breakpoint executions. That is, if
422   ;; there is one :FUN-END breakpoint, but there may be multiple
423   ;; pending calls of its function on the stack. This function takes
424   ;; the cookie, and the hook function takes the cookie too.
425   (cookie-fun nil :type (or null function))
426   ;; This slot users can set with whatever information they find useful.
427   %info)
428 (def!method print-object ((obj breakpoint) str)
429   (let ((what (breakpoint-what obj)))
430     (print-unreadable-object (obj str :type t)
431       (format str
432               "~S~:[~;~:*~S~]"
433               (etypecase what
434                 (code-location what)
435                 (debug-fun (debug-fun-name what)))
436               (etypecase what
437                 (code-location nil)
438                 (debug-fun (breakpoint-kind obj)))))))
439 \f
440 ;;;; CODE-LOCATIONs
441
442 (defstruct (code-location (:constructor nil)
443                           (:copier nil))
444   ;; the DEBUG-FUN containing this CODE-LOCATION
445   (debug-fun nil :type debug-fun)
446   ;; This is initially :UNSURE. Upon first trying to access an
447   ;; :UNPARSED slot, if the data is unavailable, then this becomes T,
448   ;; and the code-location is unknown. If the data is available, this
449   ;; becomes NIL, a known location. We can't use a separate type
450   ;; code-location for this since we must return code-locations before
451   ;; we can tell whether they're known or unknown. For example, when
452   ;; parsing the stack, we don't want to unpack all the variables and
453   ;; blocks just to make frames.
454   (%unknown-p :unsure :type (member t nil :unsure))
455   ;; the DEBUG-BLOCK containing CODE-LOCATION. XXX Possibly toss this
456   ;; out and just find it in the blocks cache in DEBUG-FUN.
457   (%debug-block :unparsed :type (or debug-block (member :unparsed)))
458   ;; This is the number of forms processed by the compiler or loader
459   ;; before the top level form containing this code-location.
460   (%tlf-offset :unparsed :type (or index (member :unparsed)))
461   ;; This is the depth-first number of the node that begins
462   ;; code-location within its top level form.
463   (%form-number :unparsed :type (or index (member :unparsed))))
464 (def!method print-object ((obj code-location) str)
465   (print-unreadable-object (obj str :type t)
466     (prin1 (debug-fun-name (code-location-debug-fun obj))
467            str)))
468
469 (defstruct (compiled-code-location
470              (:include code-location)
471              (:constructor make-known-code-location
472                            (pc debug-fun %tlf-offset %form-number
473                                %live-set kind step-info &aux (%unknown-p nil)))
474              (:constructor make-compiled-code-location (pc debug-fun))
475              (:copier nil))
476   ;; an index into DEBUG-FUN's component slot
477   (pc nil :type index)
478   ;; a bit-vector indexed by a variable's position in
479   ;; DEBUG-FUN-DEBUG-VARS indicating whether the variable has a
480   ;; valid value at this code-location. (unexported).
481   (%live-set :unparsed :type (or simple-bit-vector (member :unparsed)))
482   ;; (unexported) To see SB!C::LOCATION-KIND, do
483   ;; (SB!KERNEL:TYPEXPAND 'SB!C::LOCATION-KIND).
484   (kind :unparsed :type (or (member :unparsed) sb!c::location-kind))
485   (step-info :unparsed :type (or (member :unparsed :foo) simple-string)))
486 \f
487 ;;;; DEBUG-SOURCEs
488
489 ;;; Return the number of top level forms processed by the compiler
490 ;;; before compiling this source. If this source is uncompiled, this
491 ;;; is zero. This may be zero even if the source is compiled since the
492 ;;; first form in the first file compiled in one compilation, for
493 ;;; example, must have a root number of zero -- the compiler saw no
494 ;;; other top level forms before it.
495 (defun debug-source-root-number (debug-source)
496   (sb!c::debug-source-source-root debug-source))
497 \f
498 ;;;; frames
499
500 ;;; This is used in FIND-ESCAPED-FRAME and with the bogus components
501 ;;; and LRAs used for :FUN-END breakpoints. When a component's
502 ;;; debug-info slot is :BOGUS-LRA, then the REAL-LRA-SLOT contains the
503 ;;; real component to continue executing, as opposed to the bogus
504 ;;; component which appeared in some frame's LRA location.
505 (defconstant real-lra-slot sb!vm:code-constants-offset)
506
507 ;;; These are magically converted by the compiler.
508 (defun current-sp () (current-sp))
509 (defun current-fp () (current-fp))
510 (defun stack-ref (s n) (stack-ref s n))
511 (defun %set-stack-ref (s n value) (%set-stack-ref s n value))
512 (defun fun-code-header (fun) (fun-code-header fun))
513 (defun lra-code-header (lra) (lra-code-header lra))
514 (defun %make-lisp-obj (value) (%make-lisp-obj value))
515 (defun get-lisp-obj-address (thing) (get-lisp-obj-address thing))
516 (defun fun-word-offset (fun) (fun-word-offset fun))
517
518 #!-sb-fluid (declaim (inline control-stack-pointer-valid-p))
519 (defun control-stack-pointer-valid-p (x &optional (aligned t))
520   (declare (type system-area-pointer x))
521   (let* (#!-stack-grows-downward-not-upward
522          (control-stack-start
523           (descriptor-sap *control-stack-start*))
524          #!+stack-grows-downward-not-upward
525          (control-stack-end
526           (descriptor-sap *control-stack-end*)))
527     #!-stack-grows-downward-not-upward
528     (and (sap< x (current-sp))
529          (sap<= control-stack-start x)
530          (or (not aligned) (zerop (logand (sap-int x)
531                                           (1- (ash 1 sb!vm:word-shift))))))
532     #!+stack-grows-downward-not-upward
533     (and (sap>= x (current-sp))
534          (sap> control-stack-end x)
535          (or (not aligned) (zerop (logand (sap-int x)
536                                           (1- (ash 1 sb!vm:word-shift))))))))
537
538 (declaim (inline component-ptr-from-pc))
539 (sb!alien:define-alien-routine component-ptr-from-pc (system-area-pointer)
540   (pc system-area-pointer))
541
542 (declaim (inline valid-lisp-pointer-p))
543 (sb!alien:define-alien-routine valid-lisp-pointer-p sb!alien:int
544   (pointer system-area-pointer))
545
546 (declaim (inline component-from-component-ptr))
547 (defun component-from-component-ptr (component-ptr)
548   (declare (type system-area-pointer component-ptr))
549   (make-lisp-obj (logior (sap-int component-ptr)
550                          sb!vm:other-pointer-lowtag)))
551
552 ;;;; (OR X86 X86-64) support
553
554 (defun compute-lra-data-from-pc (pc)
555   (declare (type system-area-pointer pc))
556   (let ((component-ptr (component-ptr-from-pc pc)))
557     (unless (sap= component-ptr (int-sap #x0))
558        (let* ((code (component-from-component-ptr component-ptr))
559               (code-header-len (* (get-header-data code) sb!vm:n-word-bytes))
560               (pc-offset (- (sap-int pc)
561                             (- (get-lisp-obj-address code)
562                                sb!vm:other-pointer-lowtag)
563                             code-header-len)))
564          ;;(format t "c-lra-fpc ~A ~A ~A~%" pc code pc-offset)
565          (values pc-offset code)))))
566
567 #!+(or x86 x86-64)
568 (progn
569
570 (defconstant sb!vm::nargs-offset #.sb!vm::ecx-offset)
571
572 ;;; Check for a valid return address - it could be any valid C/Lisp
573 ;;; address.
574 ;;;
575 ;;; XXX Could be a little smarter.
576 #!-sb-fluid (declaim (inline ra-pointer-valid-p))
577 (defun ra-pointer-valid-p (ra)
578   (declare (type system-area-pointer ra))
579   (and
580    ;; not the first page (which is unmapped)
581    ;;
582    ;; FIXME: Where is this documented? Is it really true of every CPU
583    ;; architecture? Is it even necessarily true in current SBCL?
584    (>= (sap-int ra) 4096)
585    ;; not a Lisp stack pointer
586    (not (control-stack-pointer-valid-p ra))))
587
588 ;;; Try to find a valid previous stack. This is complex on the x86 as
589 ;;; it can jump between C and Lisp frames. To help find a valid frame
590 ;;; it searches backwards.
591 ;;;
592 ;;; XXX Should probably check whether it has reached the bottom of the
593 ;;; stack.
594 ;;;
595 ;;; XXX Should handle interrupted frames, both Lisp and C. At present
596 ;;; it manages to find a fp trail, see linux hack below.
597 (declaim (maybe-inline x86-call-context))
598 (defun x86-call-context (fp)
599   (declare (type system-area-pointer fp))
600   (let ((ocfp (sap-ref-sap fp (sb!vm::frame-byte-offset ocfp-save-offset)))
601         (ra (sap-ref-sap fp (sb!vm::frame-byte-offset return-pc-save-offset))))
602     (if (and (control-stack-pointer-valid-p fp)
603              (sap> ocfp fp)
604              (control-stack-pointer-valid-p ocfp)
605              (ra-pointer-valid-p ra))
606         (values t ra ocfp)
607         (values nil (int-sap 0) (int-sap 0)))))
608
609 ) ; #+x86 PROGN
610 \f
611 ;;; Convert the descriptor into a SAP. The bits all stay the same, we just
612 ;;; change our notion of what we think they are.
613 #!-sb-fluid (declaim (inline descriptor-sap))
614 (defun descriptor-sap (x)
615   (int-sap (get-lisp-obj-address x)))
616
617 ;;; Return the top frame of the control stack as it was before calling
618 ;;; this function.
619 (defun top-frame ()
620   (/noshow0 "entering TOP-FRAME")
621   (compute-calling-frame (descriptor-sap (%caller-frame))
622                          (%caller-pc)
623                          nil))
624
625 ;;; Flush all of the frames above FRAME, and renumber all the frames
626 ;;; below FRAME.
627 (defun flush-frames-above (frame)
628   (setf (frame-up frame) nil)
629   (do ((number 0 (1+ number))
630        (frame frame (frame-%down frame)))
631       ((not (frame-p frame)))
632     (setf (frame-number frame) number)))
633
634 (defun find-saved-frame-down (fp up-frame)
635   (multiple-value-bind (saved-fp saved-pc)
636       (sb!alien-internals:find-saved-fp-and-pc fp)
637     (when saved-fp
638       (compute-calling-frame (descriptor-sap saved-fp)
639                              (descriptor-sap saved-pc)
640                              up-frame
641                              t))))
642
643 ;;; Return the frame immediately below FRAME on the stack; or when
644 ;;; FRAME is the bottom of the stack, return NIL.
645 (defun frame-down (frame)
646   (/noshow0 "entering FRAME-DOWN")
647   ;; We have to access the old-fp and return-pc out of frame and pass
648   ;; them to COMPUTE-CALLING-FRAME.
649   (let ((down (frame-%down frame)))
650     (if (eq down :unparsed)
651         (let ((debug-fun (frame-debug-fun frame)))
652           (/noshow0 "in DOWN :UNPARSED case")
653           (setf (frame-%down frame)
654                 (etypecase debug-fun
655                   (compiled-debug-fun
656                    (let ((c-d-f (compiled-debug-fun-compiler-debug-fun
657                                  debug-fun)))
658                      (compute-calling-frame
659                       (descriptor-sap
660                        (get-context-value
661                         frame ocfp-save-offset
662                         (sb!c::compiled-debug-fun-old-fp c-d-f)))
663                       (get-context-value
664                        frame lra-save-offset
665                        (sb!c::compiled-debug-fun-return-pc c-d-f))
666                       frame)))
667                   (bogus-debug-fun
668                    (let ((fp (frame-pointer frame)))
669                      (when (control-stack-pointer-valid-p fp)
670                        #!+(or x86 x86-64)
671                        (multiple-value-bind (ok ra ofp) (x86-call-context fp)
672                          (if ok
673                              (compute-calling-frame ofp ra frame)
674                              (find-saved-frame-down fp frame)))
675                        #!-(or x86 x86-64)
676                        (compute-calling-frame
677                         #!-alpha
678                         (sap-ref-sap fp (* ocfp-save-offset
679                                            sb!vm:n-word-bytes))
680                         #!+alpha
681                         (int-sap
682                          (sap-ref-32 fp (* ocfp-save-offset
683                                            sb!vm:n-word-bytes)))
684
685                         (stack-ref fp lra-save-offset)
686
687                         frame)))))))
688         down)))
689
690 ;;; Get the old FP or return PC out of FRAME. STACK-SLOT is the
691 ;;; standard save location offset on the stack. LOC is the saved
692 ;;; SC-OFFSET describing the main location.
693 (defun get-context-value (frame stack-slot loc)
694   (declare (type compiled-frame frame) (type unsigned-byte stack-slot)
695            (type sb!c:sc-offset loc))
696   (let ((pointer (frame-pointer frame))
697         (escaped (compiled-frame-escaped frame)))
698     (if escaped
699         (sub-access-debug-var-slot pointer loc escaped)
700         #!-(or x86 x86-64)
701         (stack-ref pointer stack-slot)
702         #!+(or x86 x86-64)
703         (ecase stack-slot
704           (#.ocfp-save-offset
705            (stack-ref pointer stack-slot))
706           (#.lra-save-offset
707            (sap-ref-sap pointer (sb!vm::frame-byte-offset stack-slot)))))))
708
709 (defun (setf get-context-value) (value frame stack-slot loc)
710   (declare (type compiled-frame frame) (type unsigned-byte stack-slot)
711            (type sb!c:sc-offset loc))
712   (let ((pointer (frame-pointer frame))
713         (escaped (compiled-frame-escaped frame)))
714     (if escaped
715         (sub-set-debug-var-slot pointer loc value escaped)
716         #!-(or x86 x86-64)
717         (setf (stack-ref pointer stack-slot) value)
718         #!+(or x86 x86-64)
719         (ecase stack-slot
720           (#.ocfp-save-offset
721            (setf (stack-ref pointer stack-slot) value))
722           (#.lra-save-offset
723            (setf (sap-ref-sap pointer (sb!vm::frame-byte-offset stack-slot))
724                  value))))))
725
726 (defun foreign-function-backtrace-name (sap)
727   (let ((name (sap-foreign-symbol sap)))
728     (if name
729         (format nil "foreign function: ~A" name)
730         (format nil "foreign function: #x~X" (sap-int sap)))))
731
732 ;;; This returns a frame for the one existing in time immediately
733 ;;; prior to the frame referenced by current-fp. This is current-fp's
734 ;;; caller or the next frame down the control stack. If there is no
735 ;;; down frame, this returns NIL for the bottom of the stack. UP-FRAME
736 ;;; is the up link for the resulting frame object, and it is null when
737 ;;; we call this to get the top of the stack.
738 ;;;
739 ;;; The current frame contains the pointer to the temporally previous
740 ;;; frame we want, and the current frame contains the pc at which we
741 ;;; will continue executing upon returning to that previous frame.
742 ;;;
743 ;;; Note: Sometimes LRA is actually a fixnum. This happens when lisp
744 ;;; calls into C. In this case, the code object is stored on the stack
745 ;;; after the LRA, and the LRA is the word offset.
746 #!-(or x86 x86-64)
747 (defun compute-calling-frame (caller lra up-frame)
748   (declare (type system-area-pointer caller))
749   (/noshow0 "entering COMPUTE-CALLING-FRAME")
750   (when (control-stack-pointer-valid-p caller)
751     (/noshow0 "in WHEN")
752     (multiple-value-bind (code pc-offset escaped)
753         (if lra
754             (multiple-value-bind (word-offset code)
755                 (if (fixnump lra)
756                     (let ((fp (frame-pointer up-frame)))
757                       (values lra
758                               (stack-ref fp (1+ lra-save-offset))))
759                     (values (get-header-data lra)
760                             (lra-code-header lra)))
761               (if code
762                   (values code
763                           (* (1+ (- word-offset (get-header-data code)))
764                              sb!vm:n-word-bytes)
765                           nil)
766                   (values :foreign-function
767                           0
768                           nil)))
769             (find-escaped-frame caller))
770       (if (and (code-component-p code)
771                (eq (%code-debug-info code) :bogus-lra))
772           (let ((real-lra (code-header-ref code real-lra-slot)))
773             (compute-calling-frame caller real-lra up-frame))
774           (let ((d-fun (case code
775                          (:undefined-function
776                           (make-bogus-debug-fun
777                            "undefined function"))
778                          (:foreign-function
779                           (make-bogus-debug-fun
780                            (foreign-function-backtrace-name
781                             (int-sap (get-lisp-obj-address lra)))))
782                          ((nil)
783                           (make-bogus-debug-fun
784                            "bogus stack frame"))
785                          (t
786                           (debug-fun-from-pc code pc-offset)))))
787             (/noshow0 "returning MAKE-COMPILED-FRAME from COMPUTE-CALLING-FRAME")
788             (make-compiled-frame caller up-frame d-fun
789                                  (code-location-from-pc d-fun pc-offset
790                                                         escaped)
791                                  (if up-frame (1+ (frame-number up-frame)) 0)
792                                  escaped))))))
793
794 #!+(or x86 x86-64)
795 (defun compute-calling-frame (caller ra up-frame &optional savedp)
796   (declare (type system-area-pointer caller ra))
797   (/noshow0 "entering COMPUTE-CALLING-FRAME")
798   (when (control-stack-pointer-valid-p caller)
799     (/noshow0 "in WHEN")
800     ;; First check for an escaped frame.
801     (multiple-value-bind (code pc-offset escaped off-stack)
802         (find-escaped-frame caller)
803       (/noshow0 "at COND")
804       (cond (code
805              ;; If it's escaped it may be a function end breakpoint trap.
806              (when (and (code-component-p code)
807                         (eq (%code-debug-info code) :bogus-lra))
808                ;; If :bogus-lra grab the real lra.
809                (setq pc-offset (code-header-ref
810                                 code (1+ real-lra-slot)))
811                (setq code (code-header-ref code real-lra-slot))
812                (aver code)))
813             ((not escaped)
814              (multiple-value-setq (pc-offset code)
815                (compute-lra-data-from-pc ra))
816              (unless code
817                (setf code :foreign-function
818                      pc-offset 0))))
819       (let ((d-fun (case code
820                      (:undefined-function
821                       (make-bogus-debug-fun
822                        "undefined function"))
823                      (:foreign-function
824                       (make-bogus-debug-fun
825                        (foreign-function-backtrace-name ra)))
826                      ((nil)
827                       (make-bogus-debug-fun
828                        "bogus stack frame"))
829                      (t
830                       (debug-fun-from-pc code pc-offset)))))
831         (/noshow0 "returning MAKE-COMPILED-FRAME from COMPUTE-CALLING-FRAME")
832         (make-compiled-frame caller up-frame d-fun
833                              (code-location-from-pc d-fun pc-offset
834                                                     escaped)
835                              (if up-frame (1+ (frame-number up-frame)) 0)
836                              ;; If we have an interrupt-context that's not on
837                              ;; our stack at all, and we're computing the
838                              ;; from from a saved FP, we're probably looking
839                              ;; at an interrupted syscall.
840                              (or escaped (and savedp off-stack)))))))
841
842 (defun nth-interrupt-context (n)
843   (declare (type (unsigned-byte 32) n)
844            (optimize (speed 3) (safety 0)))
845   (sb!alien:sap-alien (sb!vm::current-thread-offset-sap
846                        (+ sb!vm::thread-interrupt-contexts-offset
847                           #!-alpha n
848                           #!+alpha (* 2 n)))
849                       (* os-context-t)))
850
851 ;;;; Perform the lookup which FOREIGN-SYMBOL-ADDRESS would do if the
852 ;;;; linkage table were disabled, i.e. always return the actual symbol
853 ;;;; address, not the linkage table trampoline, even if the symbol would
854 ;;;; ordinarily go through the linkage table.  Important when
855 ;;;; SB-DYNAMIC-CORE is enabled and our caller assumes `name' to be a
856 ;;;; "static" symbol; a concept which doesn't exist in such builds.
857 (defun true-foreign-symbol-address (name)
858   #!+linkage-table  ;we have dlsym -- let's use it.
859   (find-dynamic-foreign-symbol-address name)
860   #!-linkage-table  ;possibly no dlsym, but hence no indirection anyway.
861   (foreign-symbol-address))
862
863 ;;;; See above.
864 (defun true-foreign-symbol-sap (name)
865   (int-sap (true-foreign-symbol-address name)))
866
867 #!+(or x86 x86-64)
868 (defun find-escaped-frame (frame-pointer)
869   (declare (type system-area-pointer frame-pointer))
870   (/noshow0 "entering FIND-ESCAPED-FRAME")
871   (dotimes (index *free-interrupt-context-index* (values nil 0 nil))
872     (let* ((context (nth-interrupt-context index))
873            (cfp (int-sap (sb!vm:context-register context sb!vm::cfp-offset))))
874       (/noshow0 "got CONTEXT")
875       (unless (control-stack-pointer-valid-p cfp)
876         (return (values nil nil nil t)))
877       (when (sap= frame-pointer cfp)
878         (without-gcing
879           (/noshow0 "in WITHOUT-GCING")
880           (let* ((component-ptr (component-ptr-from-pc
881                                  (sb!vm:context-pc context)))
882                  (code (unless (sap= component-ptr (int-sap #x0))
883                          (component-from-component-ptr component-ptr))))
884             (/noshow0 "got CODE")
885             (when (null code)
886               ;; KLUDGE: Detect undefined functions by a range-check
887               ;; against the trampoline address and the following
888               ;; function in the runtime.
889               (if (< (true-foreign-symbol-address "undefined_tramp")
890                      (sap-int (sb!vm:context-pc context))
891                      (true-foreign-symbol-address #!+x86 "closure_tramp"
892                                                     #!+x86-64 "alloc_tramp"))
893                   (return (values :undefined-function 0 context))
894                   (return (values code 0 context))))
895             (let* ((code-header-len (* (get-header-data code)
896                                        sb!vm:n-word-bytes))
897                    (pc-offset
898                      (- (sap-int (sb!vm:context-pc context))
899                         (- (get-lisp-obj-address code)
900                            sb!vm:other-pointer-lowtag)
901                         code-header-len)))
902               (/noshow "got PC-OFFSET")
903               (unless (<= 0 pc-offset
904                           (* (code-header-ref code sb!vm:code-code-size-slot)
905                              sb!vm:n-word-bytes))
906                 ;; We were in an assembly routine. Therefore, use the
907                 ;; LRA as the pc.
908                 ;;
909                 ;; FIXME: Should this be WARN or ERROR or what?
910                 (format t "** pc-offset ~S not in code obj ~S?~%"
911                         pc-offset code))
912               (/noshow0 "returning from FIND-ESCAPED-FRAME")
913               (return
914                 (values code pc-offset context)))))))))
915
916 #!-(or x86 x86-64)
917 (defun find-escaped-frame (frame-pointer)
918   (declare (type system-area-pointer frame-pointer))
919   (/noshow0 "entering FIND-ESCAPED-FRAME")
920   (dotimes (index *free-interrupt-context-index* (values nil 0 nil))
921     (let ((scp (nth-interrupt-context index)))
922       (/noshow0 "got SCP")
923       (when (= (sap-int frame-pointer)
924                (sb!vm:context-register scp sb!vm::cfp-offset))
925         (without-gcing
926           (/noshow0 "in WITHOUT-GCING")
927           (let ((code (code-object-from-bits
928                        (sb!vm:context-register scp sb!vm::code-offset))))
929             (/noshow0 "got CODE")
930             (when (symbolp code)
931               (return (values code 0 scp)))
932             (let* ((code-header-len (* (get-header-data code)
933                                        sb!vm:n-word-bytes))
934                    (pc-offset
935                      (- (sap-int (sb!vm:context-pc scp))
936                         (- (get-lisp-obj-address code)
937                            sb!vm:other-pointer-lowtag)
938                         code-header-len)))
939               (let ((code-size (* (code-header-ref code
940                                                    sb!vm:code-code-size-slot)
941                                   sb!vm:n-word-bytes)))
942                 (unless (<= 0 pc-offset code-size)
943                   ;; We were in an assembly routine.
944                   (multiple-value-bind (new-pc-offset computed-return)
945                       (find-pc-from-assembly-fun code scp)
946                     (setf pc-offset new-pc-offset)
947                     (unless (<= 0 pc-offset code-size)
948                       (cerror
949                        "Set PC-OFFSET to zero and continue backtrace."
950                        'bug
951                        :format-control
952                        "~@<PC-OFFSET (~D) not in code object. Frame details:~
953                        ~2I~:@_PC: #X~X~:@_CODE: ~S~:@_CODE FUN: ~S~:@_LRA: ~
954                        #X~X~:@_COMPUTED RETURN: #X~X.~:>"
955                        :format-arguments
956                        (list pc-offset
957                              (sap-int (sb!vm:context-pc scp))
958                              code
959                              (%code-entry-points code)
960                              (sb!vm:context-register scp sb!vm::lra-offset)
961                              computed-return))
962                       ;; We failed to pinpoint where PC is, but set
963                       ;; pc-offset to 0 to keep the backtrace from
964                       ;; exploding.
965                       (setf pc-offset 0)))))
966               (/noshow0 "returning from FIND-ESCAPED-FRAME")
967               (return
968                 (if (eq (%code-debug-info code) :bogus-lra)
969                     (let ((real-lra (code-header-ref code
970                                                      real-lra-slot)))
971                       (values (lra-code-header real-lra)
972                               (get-header-data real-lra)
973                               nil))
974                     (values code pc-offset scp))))))))))
975
976 #!-(or x86 x86-64)
977 (defun find-pc-from-assembly-fun (code scp)
978   "Finds the PC for the return from an assembly routine properly.
979 For some architectures (such as PPC) this will not be the $LRA
980 register."
981   (let ((return-machine-address (sb!vm::return-machine-address scp))
982         (code-header-len (* (get-header-data code) sb!vm:n-word-bytes)))
983     (values (- return-machine-address
984                (- (get-lisp-obj-address code)
985                   sb!vm:other-pointer-lowtag)
986                code-header-len)
987             return-machine-address)))
988
989 ;;; Find the code object corresponding to the object represented by
990 ;;; bits and return it. We assume bogus functions correspond to the
991 ;;; undefined-function.
992 #!-(or x86 x86-64)
993 (defun code-object-from-bits (bits)
994   (declare (type (unsigned-byte 32) bits))
995   (let ((object (make-lisp-obj bits nil)))
996     (if (functionp object)
997         (or (fun-code-header object)
998             :undefined-function)
999         (let ((lowtag (lowtag-of object)))
1000           (when (= lowtag sb!vm:other-pointer-lowtag)
1001             (let ((widetag (widetag-of object)))
1002               (cond ((= widetag sb!vm:code-header-widetag)
1003                      object)
1004                     ((= widetag sb!vm:return-pc-header-widetag)
1005                      (lra-code-header object))
1006                     (t
1007                      nil))))))))
1008 \f
1009 ;;;; frame utilities
1010
1011 ;;; This returns a COMPILED-DEBUG-FUN for COMPONENT and PC. We fetch the
1012 ;;; SB!C::DEBUG-INFO and run down its FUN-MAP to get a
1013 ;;; SB!C::COMPILED-DEBUG-FUN from the PC. The result only needs to
1014 ;;; reference the COMPONENT, for function constants, and the
1015 ;;; SB!C::COMPILED-DEBUG-FUN.
1016 (defun debug-fun-from-pc (component pc)
1017   (let ((info (%code-debug-info component)))
1018     (cond
1019       ((not info)
1020        ;; FIXME: It seems that most of these (at least on x86) are
1021        ;; actually assembler routines, and could be named by looking
1022        ;; at the sb-fasl:*assembler-routines*.
1023        (make-bogus-debug-fun "no debug information for frame"))
1024      ((eq info :bogus-lra)
1025       (make-bogus-debug-fun "function end breakpoint"))
1026      (t
1027       (let* ((fun-map (sb!c::compiled-debug-info-fun-map info))
1028              (len (length fun-map)))
1029         (declare (type simple-vector fun-map))
1030         (if (= len 1)
1031             (make-compiled-debug-fun (svref fun-map 0) component)
1032             (let ((i 1)
1033                   (elsewhere-p
1034                    (>= pc (sb!c::compiled-debug-fun-elsewhere-pc
1035                            (svref fun-map 0)))))
1036               (declare (type sb!int:index i))
1037               (loop
1038                 (when (or (= i len)
1039                           (< pc (if elsewhere-p
1040                                     (sb!c::compiled-debug-fun-elsewhere-pc
1041                                      (svref fun-map (1+ i)))
1042                                     (svref fun-map i))))
1043                   (return (make-compiled-debug-fun
1044                            (svref fun-map (1- i))
1045                            component)))
1046                 (incf i 2)))))))))
1047
1048 ;;; This returns a code-location for the COMPILED-DEBUG-FUN,
1049 ;;; DEBUG-FUN, and the pc into its code vector. If we stopped at a
1050 ;;; breakpoint, find the CODE-LOCATION for that breakpoint. Otherwise,
1051 ;;; make an :UNSURE code location, so it can be filled in when we
1052 ;;; figure out what is going on.
1053 (defun code-location-from-pc (debug-fun pc escaped)
1054   (or (and (compiled-debug-fun-p debug-fun)
1055            escaped
1056            (let ((data (breakpoint-data
1057                         (compiled-debug-fun-component debug-fun)
1058                         pc nil)))
1059              (when (and data (breakpoint-data-breakpoints data))
1060                (let ((what (breakpoint-what
1061                             (first (breakpoint-data-breakpoints data)))))
1062                  (when (compiled-code-location-p what)
1063                    what)))))
1064       (make-compiled-code-location pc debug-fun)))
1065
1066 ;;; Return an alist mapping catch tags to CODE-LOCATIONs. These are
1067 ;;; CODE-LOCATIONs at which execution would continue with frame as the
1068 ;;; top frame if someone threw to the corresponding tag.
1069 (defun frame-catches (frame)
1070   (let ((catch (descriptor-sap sb!vm:*current-catch-block*))
1071         (reversed-result nil)
1072         (fp (frame-pointer frame)))
1073     (loop until (zerop (sap-int catch))
1074           finally (return (nreverse reversed-result))
1075           do
1076           (when (sap= fp
1077                       #!-alpha
1078                       (sap-ref-sap catch
1079                                    (* sb!vm:catch-block-current-cont-slot
1080                                       sb!vm:n-word-bytes))
1081                       #!+alpha
1082                       (int-sap
1083                        (sap-ref-32 catch
1084                                    (* sb!vm:catch-block-current-cont-slot
1085                                       sb!vm:n-word-bytes))))
1086             (let* (#!-(or x86 x86-64)
1087                    (lra (stack-ref catch sb!vm:catch-block-entry-pc-slot))
1088                    #!+(or x86 x86-64)
1089                    (ra (sap-ref-sap
1090                         catch (* sb!vm:catch-block-entry-pc-slot
1091                                  sb!vm:n-word-bytes)))
1092                    #!-(or x86 x86-64)
1093                    (component
1094                     (stack-ref catch sb!vm:catch-block-current-code-slot))
1095                    #!+(or x86 x86-64)
1096                    (component (component-from-component-ptr
1097                                (component-ptr-from-pc ra)))
1098                    (offset
1099                     #!-(or x86 x86-64)
1100                     (* (- (1+ (get-header-data lra))
1101                           (get-header-data component))
1102                        sb!vm:n-word-bytes)
1103                     #!+(or x86 x86-64)
1104                     (- (sap-int ra)
1105                        (- (get-lisp-obj-address component)
1106                           sb!vm:other-pointer-lowtag)
1107                        (* (get-header-data component) sb!vm:n-word-bytes))))
1108               (push (cons #!-(or x86 x86-64)
1109                           (stack-ref catch sb!vm:catch-block-tag-slot)
1110                           #!+(or x86 x86-64)
1111                           (make-lisp-obj
1112                            (sap-ref-word catch (* sb!vm:catch-block-tag-slot
1113                                                   sb!vm:n-word-bytes)))
1114                           (make-compiled-code-location
1115                            offset (frame-debug-fun frame)))
1116                     reversed-result)))
1117           (setf catch
1118                 #!-alpha
1119                 (sap-ref-sap catch
1120                              (* sb!vm:catch-block-previous-catch-slot
1121                                 sb!vm:n-word-bytes))
1122                 #!+alpha
1123                 (int-sap
1124                  (sap-ref-32 catch
1125                              (* sb!vm:catch-block-previous-catch-slot
1126                                 sb!vm:n-word-bytes)))))))
1127
1128 ;;; Modify the value of the OLD-TAG catches in FRAME to NEW-TAG
1129 (defun replace-frame-catch-tag (frame old-tag new-tag)
1130   (let ((catch (descriptor-sap sb!vm:*current-catch-block*))
1131         (fp (frame-pointer frame)))
1132     (loop until (zerop (sap-int catch))
1133           do (when (sap= fp
1134                          #!-alpha
1135                          (sap-ref-sap catch
1136                                       (* sb!vm:catch-block-current-cont-slot
1137                                          sb!vm:n-word-bytes))
1138                          #!+alpha
1139                          (int-sap
1140                           (sap-ref-32 catch
1141                                       (* sb!vm:catch-block-current-cont-slot
1142                                          sb!vm:n-word-bytes))))
1143                (let ((current-tag
1144                       #!-(or x86 x86-64)
1145                       (stack-ref catch sb!vm:catch-block-tag-slot)
1146                       #!+(or x86 x86-64)
1147                       (make-lisp-obj
1148                        (sap-ref-word catch (* sb!vm:catch-block-tag-slot
1149                                               sb!vm:n-word-bytes)))))
1150                  (when (eq current-tag old-tag)
1151                    #!-(or x86 x86-64)
1152                    (setf (stack-ref catch sb!vm:catch-block-tag-slot) new-tag)
1153                    #!+(or x86 x86-64)
1154                    (setf (sap-ref-word catch (* sb!vm:catch-block-tag-slot
1155                                                 sb!vm:n-word-bytes))
1156                          (get-lisp-obj-address new-tag)))))
1157           do (setf catch
1158                    #!-alpha
1159                    (sap-ref-sap catch
1160                                 (* sb!vm:catch-block-previous-catch-slot
1161                                    sb!vm:n-word-bytes))
1162                    #!+alpha
1163                    (int-sap
1164                     (sap-ref-32 catch
1165                                 (* sb!vm:catch-block-previous-catch-slot
1166                                    sb!vm:n-word-bytes)))))))
1167
1168
1169 \f
1170 ;;;; operations on DEBUG-FUNs
1171
1172 ;;; Execute the forms in a context with BLOCK-VAR bound to each
1173 ;;; DEBUG-BLOCK in DEBUG-FUN successively. Result is an optional
1174 ;;; form to execute for return values, and DO-DEBUG-FUN-BLOCKS
1175 ;;; returns nil if there is no result form. This signals a
1176 ;;; NO-DEBUG-BLOCKS condition when the DEBUG-FUN lacks
1177 ;;; DEBUG-BLOCK information.
1178 (defmacro do-debug-fun-blocks ((block-var debug-fun &optional result)
1179                                &body body)
1180   (let ((blocks (gensym))
1181         (i (gensym)))
1182     `(let ((,blocks (debug-fun-debug-blocks ,debug-fun)))
1183        (declare (simple-vector ,blocks))
1184        (dotimes (,i (length ,blocks) ,result)
1185          (let ((,block-var (svref ,blocks ,i)))
1186            ,@body)))))
1187
1188 ;;; Execute body in a context with VAR bound to each DEBUG-VAR in
1189 ;;; DEBUG-FUN. This returns the value of executing result (defaults to
1190 ;;; nil). This may iterate over only some of DEBUG-FUN's variables or
1191 ;;; none depending on debug policy; for example, possibly the
1192 ;;; compilation only preserved argument information.
1193 (defmacro do-debug-fun-vars ((var debug-fun &optional result) &body body)
1194   (let ((vars (gensym))
1195         (i (gensym)))
1196     `(let ((,vars (debug-fun-debug-vars ,debug-fun)))
1197        (declare (type (or null simple-vector) ,vars))
1198        (if ,vars
1199            (dotimes (,i (length ,vars) ,result)
1200              (let ((,var (svref ,vars ,i)))
1201                ,@body))
1202            ,result))))
1203
1204 ;;; Return the object of type FUNCTION associated with the DEBUG-FUN,
1205 ;;; or NIL if the function is unavailable or is non-existent as a user
1206 ;;; callable function object.
1207 (defun debug-fun-fun (debug-fun)
1208   (let ((cached-value (debug-fun-%function debug-fun)))
1209     (if (eq cached-value :unparsed)
1210         (setf (debug-fun-%function debug-fun)
1211               (etypecase debug-fun
1212                 (compiled-debug-fun
1213                  (let ((component
1214                         (compiled-debug-fun-component debug-fun))
1215                        (start-pc
1216                         (sb!c::compiled-debug-fun-start-pc
1217                          (compiled-debug-fun-compiler-debug-fun debug-fun))))
1218                    (do ((entry (%code-entry-points component)
1219                                (%simple-fun-next entry)))
1220                        ((null entry) nil)
1221                      (when (= start-pc
1222                               (sb!c::compiled-debug-fun-start-pc
1223                                (compiled-debug-fun-compiler-debug-fun
1224                                 (fun-debug-fun entry))))
1225                        (return entry)))))
1226                 (bogus-debug-fun nil)))
1227         cached-value)))
1228
1229 ;;; Return the name of the function represented by DEBUG-FUN. This may
1230 ;;; be a string or a cons; do not assume it is a symbol.
1231 (defun debug-fun-name (debug-fun)
1232   (declare (type debug-fun debug-fun))
1233   (etypecase debug-fun
1234     (compiled-debug-fun
1235      (sb!c::compiled-debug-fun-name
1236       (compiled-debug-fun-compiler-debug-fun debug-fun)))
1237     (bogus-debug-fun
1238      (bogus-debug-fun-%name debug-fun))))
1239
1240 ;;; Return a DEBUG-FUN that represents debug information for FUN.
1241 (defun fun-debug-fun (fun)
1242   (declare (type function fun))
1243   (let ((simple-fun (%fun-fun fun)))
1244     (let* ((name (%simple-fun-name simple-fun))
1245            (component (fun-code-header simple-fun))
1246            (res (find-if
1247                  (lambda (x)
1248                    (and (sb!c::compiled-debug-fun-p x)
1249                         (eq (sb!c::compiled-debug-fun-name x) name)
1250                         (eq (sb!c::compiled-debug-fun-kind x) nil)))
1251                  (sb!c::compiled-debug-info-fun-map
1252                   (%code-debug-info component)))))
1253       (if res
1254           (make-compiled-debug-fun res component)
1255           ;; KLUDGE: comment from CMU CL:
1256           ;;   This used to be the non-interpreted branch, but
1257           ;;   William wrote it to return the debug-fun of fun's XEP
1258           ;;   instead of fun's debug-fun. The above code does this
1259           ;;   more correctly, but it doesn't get or eliminate all
1260           ;;   appropriate cases. It mostly works, and probably
1261           ;;   works for all named functions anyway.
1262           ;; -- WHN 20000120
1263           (debug-fun-from-pc component
1264                              (* (- (fun-word-offset simple-fun)
1265                                    (get-header-data component))
1266                                 sb!vm:n-word-bytes))))))
1267
1268 ;;; Return the kind of the function, which is one of :OPTIONAL,
1269 ;;; :EXTERNAL, :TOPLEVEL, :CLEANUP, or NIL.
1270 (defun debug-fun-kind (debug-fun)
1271   ;; FIXME: This "is one of" information should become part of the function
1272   ;; declamation, not just a doc string
1273   (etypecase debug-fun
1274     (compiled-debug-fun
1275      (sb!c::compiled-debug-fun-kind
1276       (compiled-debug-fun-compiler-debug-fun debug-fun)))
1277     (bogus-debug-fun
1278      nil)))
1279
1280 ;;; Is there any variable information for DEBUG-FUN?
1281 (defun debug-var-info-available (debug-fun)
1282   (not (not (debug-fun-debug-vars debug-fun))))
1283
1284 ;;; Return a list of DEBUG-VARs in DEBUG-FUN having the same name
1285 ;;; and package as SYMBOL. If SYMBOL is uninterned, then this returns
1286 ;;; a list of DEBUG-VARs without package names and with the same name
1287 ;;; as symbol. The result of this function is limited to the
1288 ;;; availability of variable information in DEBUG-FUN; for
1289 ;;; example, possibly DEBUG-FUN only knows about its arguments.
1290 (defun debug-fun-symbol-vars (debug-fun symbol)
1291   (let ((vars (ambiguous-debug-vars debug-fun (symbol-name symbol)))
1292         (package (and (symbol-package symbol)
1293                       (package-name (symbol-package symbol)))))
1294     (delete-if (if (stringp package)
1295                    (lambda (var)
1296                      (let ((p (debug-var-package-name var)))
1297                        (or (not (stringp p))
1298                            (string/= p package))))
1299                    (lambda (var)
1300                      (stringp (debug-var-package-name var))))
1301                vars)))
1302
1303 ;;; Return a list of DEBUG-VARs in DEBUG-FUN whose names contain
1304 ;;; NAME-PREFIX-STRING as an initial substring. The result of this
1305 ;;; function is limited to the availability of variable information in
1306 ;;; debug-fun; for example, possibly debug-fun only knows
1307 ;;; about its arguments.
1308 (defun ambiguous-debug-vars (debug-fun name-prefix-string)
1309   (declare (simple-string name-prefix-string))
1310   (let ((variables (debug-fun-debug-vars debug-fun)))
1311     (declare (type (or null simple-vector) variables))
1312     (if variables
1313         (let* ((len (length variables))
1314                (prefix-len (length name-prefix-string))
1315                (pos (find-var name-prefix-string variables len))
1316                (res nil))
1317           (when pos
1318             ;; Find names from pos to variable's len that contain prefix.
1319             (do ((i pos (1+ i)))
1320                 ((= i len))
1321               (let* ((var (svref variables i))
1322                      (name (debug-var-symbol-name var))
1323                      (name-len (length name)))
1324                 (declare (simple-string name))
1325                 (when (/= (or (string/= name-prefix-string name
1326                                         :end1 prefix-len :end2 name-len)
1327                               prefix-len)
1328                           prefix-len)
1329                   (return))
1330                 (push var res)))
1331             (setq res (nreverse res)))
1332           res))))
1333
1334 ;;; This returns a position in VARIABLES for one containing NAME as an
1335 ;;; initial substring. END is the length of VARIABLES if supplied.
1336 (defun find-var (name variables &optional end)
1337   (declare (simple-vector variables)
1338            (simple-string name))
1339   (let ((name-len (length name)))
1340     (position name variables
1341               :test (lambda (x y)
1342                       (let* ((y (debug-var-symbol-name y))
1343                              (y-len (length y)))
1344                         (declare (simple-string y))
1345                         (and (>= y-len name-len)
1346                              (string= x y :end1 name-len :end2 name-len))))
1347               :end (or end (length variables)))))
1348
1349 ;;; Return a list representing the lambda-list for DEBUG-FUN. The
1350 ;;; list has the following structure:
1351 ;;;   (required-var1 required-var2
1352 ;;;    ...
1353 ;;;    (:optional var3 suppliedp-var4)
1354 ;;;    (:optional var5)
1355 ;;;    ...
1356 ;;;    (:rest var6) (:rest var7)
1357 ;;;    ...
1358 ;;;    (:keyword keyword-symbol var8 suppliedp-var9)
1359 ;;;    (:keyword keyword-symbol var10)
1360 ;;;    ...
1361 ;;;   )
1362 ;;; Each VARi is a DEBUG-VAR; however it may be the symbol :DELETED if
1363 ;;; it is unreferenced in DEBUG-FUN. This signals a
1364 ;;; LAMBDA-LIST-UNAVAILABLE condition when there is no argument list
1365 ;;; information.
1366 (defun debug-fun-lambda-list (debug-fun)
1367   (etypecase debug-fun
1368     (compiled-debug-fun (compiled-debug-fun-lambda-list debug-fun))
1369     (bogus-debug-fun nil)))
1370
1371 ;;; Note: If this has to compute the lambda list, it caches it in DEBUG-FUN.
1372 (defun compiled-debug-fun-lambda-list (debug-fun)
1373   (let ((lambda-list (debug-fun-%lambda-list debug-fun)))
1374     (cond ((eq lambda-list :unparsed)
1375            (multiple-value-bind (args argsp)
1376                (parse-compiled-debug-fun-lambda-list debug-fun)
1377              (setf (debug-fun-%lambda-list debug-fun) args)
1378              (if argsp
1379                  args
1380                  (debug-signal 'lambda-list-unavailable
1381                                :debug-fun debug-fun))))
1382           (lambda-list)
1383           ((bogus-debug-fun-p debug-fun)
1384            nil)
1385           ((sb!c::compiled-debug-fun-arguments
1386             (compiled-debug-fun-compiler-debug-fun debug-fun))
1387            ;; If the packed information is there (whether empty or not) as
1388            ;; opposed to being nil, then returned our cached value (nil).
1389            nil)
1390           (t
1391            ;; Our cached value is nil, and the packed lambda-list information
1392            ;; is nil, so we don't have anything available.
1393            (debug-signal 'lambda-list-unavailable
1394                          :debug-fun debug-fun)))))
1395
1396 ;;; COMPILED-DEBUG-FUN-LAMBDA-LIST calls this when a
1397 ;;; COMPILED-DEBUG-FUN has no lambda list information cached. It
1398 ;;; returns the lambda list as the first value and whether there was
1399 ;;; any argument information as the second value. Therefore,
1400 ;;; (VALUES NIL T) means there were no arguments, but (VALUES NIL NIL)
1401 ;;; means there was no argument information.
1402 (defun parse-compiled-debug-fun-lambda-list (debug-fun)
1403   (let ((args (sb!c::compiled-debug-fun-arguments
1404                (compiled-debug-fun-compiler-debug-fun debug-fun))))
1405     (cond
1406      ((not args)
1407       (values nil nil))
1408      ((eq args :minimal)
1409       (values (coerce (debug-fun-debug-vars debug-fun) 'list)
1410               t))
1411      (t
1412       (let ((vars (debug-fun-debug-vars debug-fun))
1413             (i 0)
1414             (len (length args))
1415             (res nil)
1416             (optionalp nil))
1417         (declare (type (or null simple-vector) vars))
1418         (loop
1419           (when (>= i len) (return))
1420           (let ((ele (aref args i)))
1421             (cond
1422              ((symbolp ele)
1423               (case ele
1424                 (sb!c::deleted
1425                  ;; Deleted required arg at beginning of args array.
1426                  (push :deleted res))
1427                 (sb!c::optional-args
1428                  (setf optionalp t))
1429                 (sb!c::supplied-p
1430                  ;; SUPPLIED-P var immediately following keyword or
1431                  ;; optional. Stick the extra var in the result
1432                  ;; element representing the keyword or optional,
1433                  ;; which is the previous one.
1434                  ;;
1435                  ;; FIXME: NCONC used for side-effect: the effect is defined,
1436                  ;; but this is bad style no matter what.
1437                  (nconc (car res)
1438                         (list (compiled-debug-fun-lambda-list-var
1439                                args (incf i) vars))))
1440                 (sb!c::rest-arg
1441                  (push (list :rest
1442                              (compiled-debug-fun-lambda-list-var
1443                               args (incf i) vars))
1444                        res))
1445                 (sb!c::more-arg
1446                  ;; The next two args are the &MORE arg context and count.
1447                  (push (list :more
1448                              (compiled-debug-fun-lambda-list-var
1449                               args (incf i) vars)
1450                              (compiled-debug-fun-lambda-list-var
1451                               args (incf i) vars))
1452                        res))
1453                 (t
1454                  ;; &KEY arg
1455                  (push (list :keyword
1456                              ele
1457                              (compiled-debug-fun-lambda-list-var
1458                               args (incf i) vars))
1459                        res))))
1460              (optionalp
1461               ;; We saw an optional marker, so the following
1462               ;; non-symbols are indexes indicating optional
1463               ;; variables.
1464               (push (list :optional (svref vars ele)) res))
1465              (t
1466               ;; Required arg at beginning of args array.
1467               (push (svref vars ele) res))))
1468           (incf i))
1469         (values (nreverse res) t))))))
1470
1471 ;;; This is used in COMPILED-DEBUG-FUN-LAMBDA-LIST.
1472 (defun compiled-debug-fun-lambda-list-var (args i vars)
1473   (declare (type (simple-array * (*)) args)
1474            (simple-vector vars))
1475   (let ((ele (aref args i)))
1476     (cond ((not (symbolp ele)) (svref vars ele))
1477           ((eq ele 'sb!c::deleted) :deleted)
1478           (t (error "malformed arguments description")))))
1479
1480 (defun compiled-debug-fun-debug-info (debug-fun)
1481   (%code-debug-info (compiled-debug-fun-component debug-fun)))
1482 \f
1483 ;;;; unpacking variable and basic block data
1484
1485 (defvar *parsing-buffer*
1486   (make-array 20 :adjustable t :fill-pointer t))
1487 (defvar *other-parsing-buffer*
1488   (make-array 20 :adjustable t :fill-pointer t))
1489 ;;; PARSE-DEBUG-BLOCKS and PARSE-DEBUG-VARS
1490 ;;; use this to unpack binary encoded information. It returns the
1491 ;;; values returned by the last form in body.
1492 ;;;
1493 ;;; This binds buffer-var to *parsing-buffer*, makes sure it starts at
1494 ;;; element zero, and makes sure if we unwind, we nil out any set
1495 ;;; elements for GC purposes.
1496 ;;;
1497 ;;; This also binds other-var to *other-parsing-buffer* when it is
1498 ;;; supplied, making sure it starts at element zero and that we nil
1499 ;;; out any elements if we unwind.
1500 ;;;
1501 ;;; This defines the local macro RESULT that takes a buffer, copies
1502 ;;; its elements to a resulting simple-vector, nil's out elements, and
1503 ;;; restarts the buffer at element zero. RESULT returns the
1504 ;;; simple-vector.
1505 (eval-when (:compile-toplevel :execute)
1506 (sb!xc:defmacro with-parsing-buffer ((buffer-var &optional other-var)
1507                                      &body body)
1508   (let ((len (gensym))
1509         (res (gensym)))
1510     `(unwind-protect
1511          (let ((,buffer-var *parsing-buffer*)
1512                ,@(if other-var `((,other-var *other-parsing-buffer*))))
1513            (setf (fill-pointer ,buffer-var) 0)
1514            ,@(if other-var `((setf (fill-pointer ,other-var) 0)))
1515            (macrolet ((result (buf)
1516                         `(let* ((,',len (length ,buf))
1517                                 (,',res (make-array ,',len)))
1518                            (replace ,',res ,buf :end1 ,',len :end2 ,',len)
1519                            (fill ,buf nil :end ,',len)
1520                            (setf (fill-pointer ,buf) 0)
1521                            ,',res)))
1522              ,@body))
1523      (fill *parsing-buffer* nil)
1524      ,@(if other-var `((fill *other-parsing-buffer* nil))))))
1525 ) ; EVAL-WHEN
1526
1527 ;;; The argument is a debug internals structure. This returns the
1528 ;;; DEBUG-BLOCKs for DEBUG-FUN, regardless of whether we have unpacked
1529 ;;; them yet. It signals a NO-DEBUG-BLOCKS condition if it can't
1530 ;;; return the blocks.
1531 (defun debug-fun-debug-blocks (debug-fun)
1532   (let ((blocks (debug-fun-blocks debug-fun)))
1533     (cond ((eq blocks :unparsed)
1534            (setf (debug-fun-blocks debug-fun)
1535                  (parse-debug-blocks debug-fun))
1536            (unless (debug-fun-blocks debug-fun)
1537              (debug-signal 'no-debug-blocks
1538                            :debug-fun debug-fun))
1539            (debug-fun-blocks debug-fun))
1540           (blocks)
1541           (t
1542            (debug-signal 'no-debug-blocks
1543                          :debug-fun debug-fun)))))
1544
1545 ;;; Return a SIMPLE-VECTOR of DEBUG-BLOCKs or NIL. NIL indicates there
1546 ;;; was no basic block information.
1547 (defun parse-debug-blocks (debug-fun)
1548   (etypecase debug-fun
1549     (compiled-debug-fun
1550      (parse-compiled-debug-blocks debug-fun))
1551     (bogus-debug-fun
1552      (debug-signal 'no-debug-blocks :debug-fun debug-fun))))
1553
1554 ;;; This does some of the work of PARSE-DEBUG-BLOCKS.
1555 (defun parse-compiled-debug-blocks (debug-fun)
1556   (let* ((var-count (length (debug-fun-debug-vars debug-fun)))
1557          (compiler-debug-fun (compiled-debug-fun-compiler-debug-fun
1558                               debug-fun))
1559          (blocks (sb!c::compiled-debug-fun-blocks compiler-debug-fun))
1560          ;; KLUDGE: 8 is a hard-wired constant in the compiler for the
1561          ;; element size of the packed binary representation of the
1562          ;; blocks data.
1563          (live-set-len (ceiling var-count 8))
1564          (tlf-number (sb!c::compiled-debug-fun-tlf-number compiler-debug-fun)))
1565     (unless blocks
1566       (return-from parse-compiled-debug-blocks nil))
1567     (macrolet ((aref+ (a i) `(prog1 (aref ,a ,i) (incf ,i))))
1568       (with-parsing-buffer (blocks-buffer locations-buffer)
1569         (let ((i 0)
1570               (len (length blocks))
1571               (last-pc 0))
1572           (loop
1573             (when (>= i len) (return))
1574             (let ((succ-and-flags (aref+ blocks i))
1575                   (successors nil))
1576               (declare (type (unsigned-byte 8) succ-and-flags)
1577                        (list successors))
1578               (dotimes (k (ldb sb!c::compiled-debug-block-nsucc-byte
1579                                succ-and-flags))
1580                 (push (sb!c:read-var-integer blocks i) successors))
1581               (let* ((locations
1582                       (dotimes (k (sb!c:read-var-integer blocks i)
1583                                   (result locations-buffer))
1584                         (let ((kind (svref sb!c::*compiled-code-location-kinds*
1585                                            (aref+ blocks i)))
1586                               (pc (+ last-pc
1587                                      (sb!c:read-var-integer blocks i)))
1588                               (tlf-offset (or tlf-number
1589                                               (sb!c:read-var-integer blocks i)))
1590                               (form-number (sb!c:read-var-integer blocks i))
1591                               (live-set (sb!c:read-packed-bit-vector
1592                                          live-set-len blocks i))
1593                               (step-info (sb!c:read-var-string blocks i)))
1594                           (vector-push-extend (make-known-code-location
1595                                                pc debug-fun tlf-offset
1596                                                form-number live-set kind
1597                                                step-info)
1598                                               locations-buffer)
1599                           (setf last-pc pc))))
1600                      (block (make-compiled-debug-block
1601                              locations successors
1602                              (not (zerop (logand
1603                                           sb!c::compiled-debug-block-elsewhere-p
1604                                           succ-and-flags))))))
1605                 (vector-push-extend block blocks-buffer)
1606                 (dotimes (k (length locations))
1607                   (setf (code-location-%debug-block (svref locations k))
1608                         block))))))
1609         (let ((res (result blocks-buffer)))
1610           (declare (simple-vector res))
1611           (dotimes (i (length res))
1612             (let* ((block (svref res i))
1613                    (succs nil))
1614               (dolist (ele (debug-block-successors block))
1615                 (push (svref res ele) succs))
1616               (setf (debug-block-successors block) succs)))
1617           res)))))
1618
1619 ;;; The argument is a debug internals structure. This returns NIL if
1620 ;;; there is no variable information. It returns an empty
1621 ;;; simple-vector if there were no locals in the function. Otherwise
1622 ;;; it returns a SIMPLE-VECTOR of DEBUG-VARs.
1623 (defun debug-fun-debug-vars (debug-fun)
1624   (let ((vars (debug-fun-%debug-vars debug-fun)))
1625     (if (eq vars :unparsed)
1626         (setf (debug-fun-%debug-vars debug-fun)
1627               (etypecase debug-fun
1628                 (compiled-debug-fun
1629                  (parse-compiled-debug-vars debug-fun))
1630                 (bogus-debug-fun nil)))
1631         vars)))
1632
1633 ;;; VARS is the parsed variables for a minimal debug function. We need
1634 ;;; to assign names of the form ARG-NNN. We must pad with leading
1635 ;;; zeros, since the arguments must be in alphabetical order.
1636 (defun assign-minimal-var-names (vars)
1637   (declare (simple-vector vars))
1638   (let* ((len (length vars))
1639          (width (length (format nil "~W" (1- len)))))
1640     (dotimes (i len)
1641       (without-package-locks
1642         (setf (compiled-debug-var-symbol (svref vars i))
1643               (intern (format nil "ARG-~V,'0D" width i)
1644                       ;; The cross-compiler won't dump literal package
1645                       ;; references because the target package objects
1646                       ;; aren't created until partway through
1647                       ;; cold-init. In lieu of adding smarts to the
1648                       ;; build framework to handle this, we use an
1649                       ;; explicit load-time-value form.
1650                       (load-time-value (find-package "SB!DEBUG"))))))))
1651
1652 ;;; Parse the packed representation of DEBUG-VARs from
1653 ;;; DEBUG-FUN's SB!C::COMPILED-DEBUG-FUN, returning a vector
1654 ;;; of DEBUG-VARs, or NIL if there was no information to parse.
1655 (defun parse-compiled-debug-vars (debug-fun)
1656   (let* ((cdebug-fun (compiled-debug-fun-compiler-debug-fun
1657                       debug-fun))
1658          (packed-vars (sb!c::compiled-debug-fun-vars cdebug-fun))
1659          (args-minimal (eq (sb!c::compiled-debug-fun-arguments cdebug-fun)
1660                            :minimal)))
1661     (when packed-vars
1662       (do ((i 0)
1663            (buffer (make-array 0 :fill-pointer 0 :adjustable t)))
1664           ((>= i (length packed-vars))
1665            (let ((result (coerce buffer 'simple-vector)))
1666              (when args-minimal
1667                (assign-minimal-var-names result))
1668              result))
1669         (flet ((geti () (prog1 (aref packed-vars i) (incf i))))
1670           (let* ((flags (geti))
1671                  (minimal (logtest sb!c::compiled-debug-var-minimal-p flags))
1672                  (deleted (logtest sb!c::compiled-debug-var-deleted-p flags))
1673                  (more-context-p (logtest sb!c::compiled-debug-var-more-context-p flags))
1674                  (more-count-p (logtest sb!c::compiled-debug-var-more-count-p flags))
1675                  (live (logtest sb!c::compiled-debug-var-environment-live
1676                                 flags))
1677                  (save (logtest sb!c::compiled-debug-var-save-loc-p flags))
1678                  (symbol (if minimal nil (geti)))
1679                  (id (if (logtest sb!c::compiled-debug-var-id-p flags)
1680                          (geti)
1681                          0))
1682                  (sc-offset (if deleted 0 (geti)))
1683                  (save-sc-offset (if save (geti) nil)))
1684             (aver (not (and args-minimal (not minimal))))
1685             (vector-push-extend (make-compiled-debug-var symbol
1686                                                          id
1687                                                          live
1688                                                          sc-offset
1689                                                          save-sc-offset
1690                                                          (cond (more-context-p :more-context)
1691                                                                (more-count-p :more-count)))
1692                                 buffer)))))))
1693 \f
1694 ;;;; CODE-LOCATIONs
1695
1696 ;;; If we're sure of whether code-location is known, return T or NIL.
1697 ;;; If we're :UNSURE, then try to fill in the code-location's slots.
1698 ;;; This determines whether there is any debug-block information, and
1699 ;;; if code-location is known.
1700 ;;;
1701 ;;; ??? IF this conses closures every time it's called, then break off the
1702 ;;; :UNSURE part to get the HANDLER-CASE into another function.
1703 (defun code-location-unknown-p (basic-code-location)
1704   (ecase (code-location-%unknown-p basic-code-location)
1705     ((t) t)
1706     ((nil) nil)
1707     (:unsure
1708      (setf (code-location-%unknown-p basic-code-location)
1709            (handler-case (not (fill-in-code-location basic-code-location))
1710              (no-debug-blocks () t))))))
1711
1712 ;;; Return the DEBUG-BLOCK containing code-location if it is available.
1713 ;;; Some debug policies inhibit debug-block information, and if none
1714 ;;; is available, then this signals a NO-DEBUG-BLOCKS condition.
1715 (defun code-location-debug-block (basic-code-location)
1716   (let ((block (code-location-%debug-block basic-code-location)))
1717     (if (eq block :unparsed)
1718         (etypecase basic-code-location
1719           (compiled-code-location
1720            (compute-compiled-code-location-debug-block basic-code-location))
1721           ;; (There used to be more cases back before sbcl-0.7.0, when
1722           ;; we did special tricks to debug the IR1 interpreter.)
1723           )
1724         block)))
1725
1726 ;;; Store and return BASIC-CODE-LOCATION's debug-block. We determines
1727 ;;; the correct one using the code-location's pc. We use
1728 ;;; DEBUG-FUN-DEBUG-BLOCKS to return the cached block information
1729 ;;; or signal a NO-DEBUG-BLOCKS condition. The blocks are sorted by
1730 ;;; their first code-location's pc, in ascending order. Therefore, as
1731 ;;; soon as we find a block that starts with a pc greater than
1732 ;;; basic-code-location's pc, we know the previous block contains the
1733 ;;; pc. If we get to the last block, then the code-location is either
1734 ;;; in the second to last block or the last block, and we have to be
1735 ;;; careful in determining this since the last block could be code at
1736 ;;; the end of the function. We have to check for the last block being
1737 ;;; code first in order to see how to compare the code-location's pc.
1738 (defun compute-compiled-code-location-debug-block (basic-code-location)
1739   (let* ((pc (compiled-code-location-pc basic-code-location))
1740          (debug-fun (code-location-debug-fun
1741                           basic-code-location))
1742          (blocks (debug-fun-debug-blocks debug-fun))
1743          (len (length blocks)))
1744     (declare (simple-vector blocks))
1745     (setf (code-location-%debug-block basic-code-location)
1746           (if (= len 1)
1747               (svref blocks 0)
1748               (do ((i 1 (1+ i))
1749                    (end (1- len)))
1750                   ((= i end)
1751                    (let ((last (svref blocks end)))
1752                      (cond
1753                       ((debug-block-elsewhere-p last)
1754                        (if (< pc
1755                               (sb!c::compiled-debug-fun-elsewhere-pc
1756                                (compiled-debug-fun-compiler-debug-fun
1757                                 debug-fun)))
1758                            (svref blocks (1- end))
1759                            last))
1760                       ((< pc
1761                           (compiled-code-location-pc
1762                            (svref (compiled-debug-block-code-locations last)
1763                                   0)))
1764                        (svref blocks (1- end)))
1765                       (t last))))
1766                 (declare (type index i end))
1767                 (when (< pc
1768                          (compiled-code-location-pc
1769                           (svref (compiled-debug-block-code-locations
1770                                   (svref blocks i))
1771                                  0)))
1772                   (return (svref blocks (1- i)))))))))
1773
1774 ;;; Return the CODE-LOCATION's DEBUG-SOURCE.
1775 (defun code-location-debug-source (code-location)
1776   (let ((info (compiled-debug-fun-debug-info
1777                (code-location-debug-fun code-location))))
1778     (or (sb!c::debug-info-source info)
1779         (debug-signal 'no-debug-blocks :debug-fun
1780                       (code-location-debug-fun code-location)))))
1781
1782 ;;; Returns the number of top level forms before the one containing
1783 ;;; CODE-LOCATION as seen by the compiler in some compilation unit. (A
1784 ;;; compilation unit is not necessarily a single file, see the section
1785 ;;; on debug-sources.)
1786 (defun code-location-toplevel-form-offset (code-location)
1787   (when (code-location-unknown-p code-location)
1788     (error 'unknown-code-location :code-location code-location))
1789   (let ((tlf-offset (code-location-%tlf-offset code-location)))
1790     (cond ((eq tlf-offset :unparsed)
1791            (etypecase code-location
1792              (compiled-code-location
1793               (unless (fill-in-code-location code-location)
1794                 ;; This check should be unnecessary. We're missing
1795                 ;; debug info the compiler should have dumped.
1796                 (bug "unknown code location"))
1797               (code-location-%tlf-offset code-location))
1798              ;; (There used to be more cases back before sbcl-0.7.0,,
1799              ;; when we did special tricks to debug the IR1
1800              ;; interpreter.)
1801              ))
1802           (t tlf-offset))))
1803
1804 ;;; Return the number of the form corresponding to CODE-LOCATION. The
1805 ;;; form number is derived by a walking the subforms of a top level
1806 ;;; form in depth-first order.
1807 (defun code-location-form-number (code-location)
1808   (when (code-location-unknown-p code-location)
1809     (error 'unknown-code-location :code-location code-location))
1810   (let ((form-num (code-location-%form-number code-location)))
1811     (cond ((eq form-num :unparsed)
1812            (etypecase code-location
1813              (compiled-code-location
1814               (unless (fill-in-code-location code-location)
1815                 ;; This check should be unnecessary. We're missing
1816                 ;; debug info the compiler should have dumped.
1817                 (bug "unknown code location"))
1818               (code-location-%form-number code-location))
1819              ;; (There used to be more cases back before sbcl-0.7.0,,
1820              ;; when we did special tricks to debug the IR1
1821              ;; interpreter.)
1822              ))
1823           (t form-num))))
1824
1825 ;;; Return the kind of CODE-LOCATION, one of:
1826 ;;;  :INTERPRETED, :UNKNOWN-RETURN, :KNOWN-RETURN, :INTERNAL-ERROR,
1827 ;;;  :NON-LOCAL-EXIT, :BLOCK-START, :CALL-SITE, :SINGLE-VALUE-RETURN,
1828 ;;;  :NON-LOCAL-ENTRY
1829 (defun code-location-kind (code-location)
1830   (when (code-location-unknown-p code-location)
1831     (error 'unknown-code-location :code-location code-location))
1832   (etypecase code-location
1833     (compiled-code-location
1834      (let ((kind (compiled-code-location-kind code-location)))
1835        (cond ((not (eq kind :unparsed)) kind)
1836              ((not (fill-in-code-location code-location))
1837               ;; This check should be unnecessary. We're missing
1838               ;; debug info the compiler should have dumped.
1839               (bug "unknown code location"))
1840              (t
1841               (compiled-code-location-kind code-location)))))
1842     ;; (There used to be more cases back before sbcl-0.7.0,,
1843     ;; when we did special tricks to debug the IR1
1844     ;; interpreter.)
1845     ))
1846
1847 ;;; This returns CODE-LOCATION's live-set if it is available. If
1848 ;;; there is no debug-block information, this returns NIL.
1849 (defun compiled-code-location-live-set (code-location)
1850   (if (code-location-unknown-p code-location)
1851       nil
1852       (let ((live-set (compiled-code-location-%live-set code-location)))
1853         (cond ((eq live-set :unparsed)
1854                (unless (fill-in-code-location code-location)
1855                  ;; This check should be unnecessary. We're missing
1856                  ;; debug info the compiler should have dumped.
1857                  ;;
1858                  ;; FIXME: This error and comment happen over and over again.
1859                  ;; Make them a shared function.
1860                  (bug "unknown code location"))
1861                (compiled-code-location-%live-set code-location))
1862               (t live-set)))))
1863
1864 ;;; true if OBJ1 and OBJ2 are the same place in the code
1865 (defun code-location= (obj1 obj2)
1866   (etypecase obj1
1867     (compiled-code-location
1868      (etypecase obj2
1869        (compiled-code-location
1870         (and (eq (code-location-debug-fun obj1)
1871                  (code-location-debug-fun obj2))
1872              (sub-compiled-code-location= obj1 obj2)))
1873        ;; (There used to be more cases back before sbcl-0.7.0,,
1874        ;; when we did special tricks to debug the IR1
1875        ;; interpreter.)
1876        ))
1877     ;; (There used to be more cases back before sbcl-0.7.0,,
1878     ;; when we did special tricks to debug IR1-interpreted code.)
1879     ))
1880 (defun sub-compiled-code-location= (obj1 obj2)
1881   (= (compiled-code-location-pc obj1)
1882      (compiled-code-location-pc obj2)))
1883
1884 ;;; Fill in CODE-LOCATION's :UNPARSED slots, returning T or NIL
1885 ;;; depending on whether the code-location was known in its
1886 ;;; DEBUG-FUN's debug-block information. This may signal a
1887 ;;; NO-DEBUG-BLOCKS condition due to DEBUG-FUN-DEBUG-BLOCKS, and
1888 ;;; it assumes the %UNKNOWN-P slot is already set or going to be set.
1889 (defun fill-in-code-location (code-location)
1890   (declare (type compiled-code-location code-location))
1891   (let* ((debug-fun (code-location-debug-fun code-location))
1892          (blocks (debug-fun-debug-blocks debug-fun)))
1893     (declare (simple-vector blocks))
1894     (dotimes (i (length blocks) nil)
1895       (let* ((block (svref blocks i))
1896              (locations (compiled-debug-block-code-locations block)))
1897         (declare (simple-vector locations))
1898         (dotimes (j (length locations))
1899           (let ((loc (svref locations j)))
1900             (when (sub-compiled-code-location= code-location loc)
1901               (setf (code-location-%debug-block code-location) block)
1902               (setf (code-location-%tlf-offset code-location)
1903                     (code-location-%tlf-offset loc))
1904               (setf (code-location-%form-number code-location)
1905                     (code-location-%form-number loc))
1906               (setf (compiled-code-location-%live-set code-location)
1907                     (compiled-code-location-%live-set loc))
1908               (setf (compiled-code-location-kind code-location)
1909                     (compiled-code-location-kind loc))
1910               (setf (compiled-code-location-step-info code-location)
1911                     (compiled-code-location-step-info loc))
1912               (return-from fill-in-code-location t))))))))
1913 \f
1914 ;;;; operations on DEBUG-BLOCKs
1915
1916 ;;; Execute FORMS in a context with CODE-VAR bound to each
1917 ;;; CODE-LOCATION in DEBUG-BLOCK, and return the value of RESULT.
1918 (defmacro do-debug-block-locations ((code-var debug-block &optional result)
1919                                     &body body)
1920   (let ((code-locations (gensym))
1921         (i (gensym)))
1922     `(let ((,code-locations (debug-block-code-locations ,debug-block)))
1923        (declare (simple-vector ,code-locations))
1924        (dotimes (,i (length ,code-locations) ,result)
1925          (let ((,code-var (svref ,code-locations ,i)))
1926            ,@body)))))
1927
1928 ;;; Return the name of the function represented by DEBUG-FUN.
1929 ;;; This may be a string or a cons; do not assume it is a symbol.
1930 (defun debug-block-fun-name (debug-block)
1931   (etypecase debug-block
1932     (compiled-debug-block
1933      (let ((code-locs (compiled-debug-block-code-locations debug-block)))
1934        (declare (simple-vector code-locs))
1935        (if (zerop (length code-locs))
1936            "??? Can't get name of debug-block's function."
1937            (debug-fun-name
1938             (code-location-debug-fun (svref code-locs 0))))))
1939     ;; (There used to be more cases back before sbcl-0.7.0, when we
1940     ;; did special tricks to debug the IR1 interpreter.)
1941     ))
1942
1943 (defun debug-block-code-locations (debug-block)
1944   (etypecase debug-block
1945     (compiled-debug-block
1946      (compiled-debug-block-code-locations debug-block))
1947     ;; (There used to be more cases back before sbcl-0.7.0, when we
1948     ;; did special tricks to debug the IR1 interpreter.)
1949     ))
1950 \f
1951 ;;;; operations on debug variables
1952
1953 (defun debug-var-symbol-name (debug-var)
1954   (symbol-name (debug-var-symbol debug-var)))
1955
1956 ;;; FIXME: Make sure that this isn't called anywhere that it wouldn't
1957 ;;; be acceptable to have NIL returned, or that it's only called on
1958 ;;; DEBUG-VARs whose symbols have non-NIL packages.
1959 (defun debug-var-package-name (debug-var)
1960   (package-name (symbol-package (debug-var-symbol debug-var))))
1961
1962 ;;; Return the value stored for DEBUG-VAR in frame, or if the value is
1963 ;;; not :VALID, then signal an INVALID-VALUE error.
1964 (defun debug-var-valid-value (debug-var frame)
1965   (unless (eq (debug-var-validity debug-var (frame-code-location frame))
1966               :valid)
1967     (error 'invalid-value :debug-var debug-var :frame frame))
1968   (debug-var-value debug-var frame))
1969
1970 ;;; Returns the value stored for DEBUG-VAR in frame. The value may be
1971 ;;; invalid. This is SETFable.
1972 (defun debug-var-value (debug-var frame)
1973   (aver (typep frame 'compiled-frame))
1974   (let ((res (access-compiled-debug-var-slot debug-var frame)))
1975     (if (indirect-value-cell-p res)
1976         (value-cell-ref res)
1977         res)))
1978
1979 ;;; This returns what is stored for the variable represented by
1980 ;;; DEBUG-VAR relative to the FRAME. This may be an indirect value
1981 ;;; cell if the variable is both closed over and set.
1982 (defun access-compiled-debug-var-slot (debug-var frame)
1983   (declare (optimize (speed 1)))
1984   (let ((escaped (compiled-frame-escaped frame)))
1985     (if escaped
1986         (sub-access-debug-var-slot
1987          (frame-pointer frame)
1988          (compiled-debug-var-sc-offset debug-var)
1989          escaped)
1990       (sub-access-debug-var-slot
1991        (frame-pointer frame)
1992        (or (compiled-debug-var-save-sc-offset debug-var)
1993            (compiled-debug-var-sc-offset debug-var))))))
1994
1995 ;;; a helper function for working with possibly-invalid values:
1996 ;;; Do (%MAKE-LISP-OBJ VAL) only if the value looks valid.
1997 ;;;
1998 ;;; (Such values can arise in registers on machines with conservative
1999 ;;; GC, and might also arise in debug variable locations when
2000 ;;; those variables are invalid.)
2001 ;;;
2002 ;;; NOTE: this function is not GC-safe in the slightest when creating
2003 ;;; a pointer to an object in dynamic space.  If a GC occurs between
2004 ;;; the start of the call to VALID-LISP-POINTER-P and the end of
2005 ;;; %MAKE-LISP-OBJ then the object could move before the boxed pointer
2006 ;;; is constructed.  This can happen on CHENEYGC if an asynchronous
2007 ;;; interrupt occurs within the window.  This can happen on GENCGC
2008 ;;; under the same circumstances, but is more likely due to all GENCGC
2009 ;;; platforms supporting threaded operation.  This is somewhat
2010 ;;; mitigated on x86oids due to the conservative stack and interrupt
2011 ;;; context "scavenging" on such platforms, but there still may be a
2012 ;;; vulnerable window.
2013 (defun make-lisp-obj (val &optional (errorp t))
2014   (if (or
2015        ;; fixnum
2016        (zerop (logand val sb!vm:fixnum-tag-mask))
2017        ;; immediate single float, 64-bit only
2018        #!+#.(cl:if (cl:= sb!vm::n-machine-word-bits 64) '(and) '(or))
2019        (= (logand val #xff) sb!vm:single-float-widetag)
2020        ;; character
2021        (and (zerop (logandc2 val #x1fffffff)) ; Top bits zero
2022             (= (logand val #xff) sb!vm:character-widetag)) ; char tag
2023        ;; unbound marker
2024        (= val sb!vm:unbound-marker-widetag)
2025        ;; undefined_tramp doesn't validate properly as a pointer, and
2026        ;; the actual value can vary by backend (x86oids need not
2027        ;; apply)
2028        #!+(or alpha hppa mips ppc)
2029        (= val (+ (- (foreign-symbol-address "undefined_tramp")
2030                     (* sb!vm:n-word-bytes sb!vm:simple-fun-code-offset))
2031                  sb!vm:fun-pointer-lowtag))
2032        #!+sparc
2033        (= val (foreign-symbol-address "undefined_tramp"))
2034        ;; pointer
2035        (not (zerop (valid-lisp-pointer-p (int-sap val)))))
2036       (values (%make-lisp-obj val) t)
2037       (if errorp
2038           (error "~S is not a valid argument to ~S"
2039                  val 'make-lisp-obj)
2040           (values (make-unprintable-object (format nil "invalid object #x~X" val))
2041                   nil))))
2042
2043 (defun sub-access-debug-var-slot (fp sc-offset &optional escaped)
2044   ;; NOTE: The long-float support in here is obviously decayed.  When
2045   ;; the x86oid and non-x86oid versions of this function were unified,
2046   ;; the behavior of long-floats was preserved, which only served to
2047   ;; highlight its brokenness.
2048   (macrolet ((with-escaped-value ((var) &body forms)
2049                `(if escaped
2050                     (let ((,var (sb!vm:context-register
2051                                  escaped
2052                                  (sb!c:sc-offset-offset sc-offset))))
2053                       ,@forms)
2054                     :invalid-value-for-unescaped-register-storage))
2055              (escaped-float-value (format)
2056                `(if escaped
2057                     (sb!vm:context-float-register
2058                      escaped
2059                      (sb!c:sc-offset-offset sc-offset)
2060                      ',format)
2061                     :invalid-value-for-unescaped-register-storage))
2062              (escaped-complex-float-value (format offset)
2063                `(if escaped
2064                     (complex
2065                      (sb!vm:context-float-register
2066                       escaped (sb!c:sc-offset-offset sc-offset) ',format)
2067                      (sb!vm:context-float-register
2068                       escaped (+ (sb!c:sc-offset-offset sc-offset) ,offset) ',format))
2069                     :invalid-value-for-unescaped-register-storage))
2070              (with-nfp ((var) &body body)
2071                ;; x86oids have no separate number stack, so dummy it
2072                ;; up for them.
2073                #!+(or x86 x86-64)
2074                `(let ((,var fp))
2075                   ,@body)
2076                #!-(or x86 x86-64)
2077                `(let ((,var (if escaped
2078                                 (sb!sys:int-sap
2079                                  (sb!vm:context-register escaped
2080                                                          sb!vm::nfp-offset))
2081                                 #!-alpha
2082                                 (sb!sys:sap-ref-sap fp (* nfp-save-offset
2083                                                           sb!vm:n-word-bytes))
2084                                 #!+alpha
2085                                 (sb!vm::make-number-stack-pointer
2086                                  (sb!sys:sap-ref-32 fp (* nfp-save-offset
2087                                                           sb!vm:n-word-bytes))))))
2088                   ,@body))
2089              (stack-frame-offset (data-width offset)
2090                #!+(or x86 x86-64)
2091                `(sb!vm::frame-byte-offset (+ (sb!c:sc-offset-offset sc-offset)
2092                                            (1- ,data-width)
2093                                            ,offset))
2094                #!-(or x86 x86-64)
2095                (declare (ignore data-width))
2096                #!-(or x86 x86-64)
2097                `(* (+ (sb!c:sc-offset-offset sc-offset) ,offset)
2098                    sb!vm:n-word-bytes)))
2099     (ecase (sb!c:sc-offset-scn sc-offset)
2100       ((#.sb!vm:any-reg-sc-number
2101         #.sb!vm:descriptor-reg-sc-number
2102         #!+rt #.sb!vm:word-pointer-reg-sc-number)
2103        (without-gcing
2104         (with-escaped-value (val)
2105           (make-lisp-obj val nil))))
2106       (#.sb!vm:character-reg-sc-number
2107        (with-escaped-value (val)
2108          (code-char val)))
2109       (#.sb!vm:sap-reg-sc-number
2110        (with-escaped-value (val)
2111          (sb!sys:int-sap val)))
2112       (#.sb!vm:signed-reg-sc-number
2113        (with-escaped-value (val)
2114          (if (logbitp (1- sb!vm:n-word-bits) val)
2115              (logior val (ash -1 sb!vm:n-word-bits))
2116              val)))
2117       (#.sb!vm:unsigned-reg-sc-number
2118        (with-escaped-value (val)
2119          val))
2120       #!-(or x86 x86-64)
2121       (#.sb!vm:non-descriptor-reg-sc-number
2122        (error "Local non-descriptor register access?"))
2123       #!-(or x86 x86-64)
2124       (#.sb!vm:interior-reg-sc-number
2125        (error "Local interior register access?"))
2126       (#.sb!vm:single-reg-sc-number
2127        (escaped-float-value single-float))
2128       (#.sb!vm:double-reg-sc-number
2129        (escaped-float-value double-float))
2130       #!+long-float
2131       (#.sb!vm:long-reg-sc-number
2132        (escaped-float-value long-float))
2133       (#.sb!vm:complex-single-reg-sc-number
2134        (escaped-complex-float-value single-float 1))
2135       (#.sb!vm:complex-double-reg-sc-number
2136        (escaped-complex-float-value double-float #!+sparc 2 #!-sparc 1))
2137       #!+long-float
2138       (#.sb!vm:complex-long-reg-sc-number
2139        (escaped-complex-float-value long-float
2140                                     #!+sparc 4 #!+(or x86 x86-64) 1
2141                                     #!-(or sparc x86 x86-64) 0))
2142       (#.sb!vm:single-stack-sc-number
2143        (with-nfp (nfp)
2144          (sb!sys:sap-ref-single nfp (stack-frame-offset 1 0))))
2145       (#.sb!vm:double-stack-sc-number
2146        (with-nfp (nfp)
2147          (sb!sys:sap-ref-double nfp (stack-frame-offset 2 0))))
2148       #!+long-float
2149       (#.sb!vm:long-stack-sc-number
2150        (with-nfp (nfp)
2151          (sb!sys:sap-ref-long nfp (stack-frame-offset 3 0))))
2152       (#.sb!vm:complex-single-stack-sc-number
2153        (with-nfp (nfp)
2154          (complex
2155           (sb!sys:sap-ref-single nfp (stack-frame-offset 1 0))
2156           (sb!sys:sap-ref-single nfp (stack-frame-offset 1 1)))))
2157       (#.sb!vm:complex-double-stack-sc-number
2158        (with-nfp (nfp)
2159          (complex
2160           (sb!sys:sap-ref-double nfp (stack-frame-offset 2 0))
2161           (sb!sys:sap-ref-double nfp (stack-frame-offset 2 2)))))
2162       #!+long-float
2163       (#.sb!vm:complex-long-stack-sc-number
2164        (with-nfp (nfp)
2165          (complex
2166           (sb!sys:sap-ref-long nfp (stack-frame-offset 3 0))
2167           (sb!sys:sap-ref-long nfp
2168                                (stack-frame-offset 3 #!+sparc 4
2169                                                    #!+(or x86 x86-64) 3
2170                                                    #!-(or sparc x86 x86-64) 0)))))
2171       (#.sb!vm:control-stack-sc-number
2172        (stack-ref fp (sb!c:sc-offset-offset sc-offset)))
2173       (#.sb!vm:character-stack-sc-number
2174        (with-nfp (nfp)
2175          (code-char (sb!sys:sap-ref-word nfp (stack-frame-offset 1 0)))))
2176       (#.sb!vm:unsigned-stack-sc-number
2177        (with-nfp (nfp)
2178          (sb!sys:sap-ref-word nfp (stack-frame-offset 1 0))))
2179       (#.sb!vm:signed-stack-sc-number
2180        (with-nfp (nfp)
2181          (sb!sys:signed-sap-ref-word nfp (stack-frame-offset 1 0))))
2182       (#.sb!vm:sap-stack-sc-number
2183        (with-nfp (nfp)
2184          (sb!sys:sap-ref-sap nfp (stack-frame-offset 1 0)))))))
2185
2186 ;;; This stores value as the value of DEBUG-VAR in FRAME. In the
2187 ;;; COMPILED-DEBUG-VAR case, access the current value to determine if
2188 ;;; it is an indirect value cell. This occurs when the variable is
2189 ;;; both closed over and set.
2190 (defun %set-debug-var-value (debug-var frame new-value)
2191   (aver (typep frame 'compiled-frame))
2192   (let ((old-value (access-compiled-debug-var-slot debug-var frame)))
2193     (if (indirect-value-cell-p old-value)
2194         (value-cell-set old-value new-value)
2195         (set-compiled-debug-var-slot debug-var frame new-value)))
2196   new-value)
2197
2198 ;;; This stores VALUE for the variable represented by debug-var
2199 ;;; relative to the frame. This assumes the location directly contains
2200 ;;; the variable's value; that is, there is no indirect value cell
2201 ;;; currently there in case the variable is both closed over and set.
2202 (defun set-compiled-debug-var-slot (debug-var frame value)
2203   (let ((escaped (compiled-frame-escaped frame)))
2204     (if escaped
2205         (sub-set-debug-var-slot (frame-pointer frame)
2206                                 (compiled-debug-var-sc-offset debug-var)
2207                                 value escaped)
2208         (sub-set-debug-var-slot
2209          (frame-pointer frame)
2210          (or (compiled-debug-var-save-sc-offset debug-var)
2211              (compiled-debug-var-sc-offset debug-var))
2212          value))))
2213
2214 (defun sub-set-debug-var-slot (fp sc-offset value &optional escaped)
2215   ;; Like sub-access-debug-var-slot, this is the unification of two
2216   ;; divergent copy-pasted functions.  The astute reviewer will notice
2217   ;; that long-floats are messed up here as well, that x86oids
2218   ;; apparently don't support accessing float values that are in
2219   ;; registers, and that non-x86oids store the real part of a float
2220   ;; for both the real and imaginary parts of a complex on the stack
2221   ;; (but not in registers, oddly enough).  Some research has
2222   ;; indicated that the different forms of THE used for validating the
2223   ;; type of complex float components between x86oid and non-x86oid
2224   ;; systems are only significant in the case of using a non-complex
2225   ;; number as input (as the non-x86oid case effectively converts
2226   ;; non-complex numbers to complex ones and the x86oid case will
2227   ;; error out).  That said, the error message from entering a value
2228   ;; of the wrong type will be slightly easier to understand on x86oid
2229   ;; systems.
2230   (macrolet ((set-escaped-value (val)
2231                `(if escaped
2232                     (setf (sb!vm:context-register
2233                            escaped
2234                            (sb!c:sc-offset-offset sc-offset))
2235                           ,val)
2236                     value))
2237              (set-escaped-float-value (format val)
2238                `(if escaped
2239                     (setf (sb!vm:context-float-register
2240                            escaped
2241                            (sb!c:sc-offset-offset sc-offset)
2242                            ',format)
2243                           ,val)
2244                     value))
2245              (set-escaped-complex-float-value (format offset val)
2246                `(progn
2247                   (when escaped
2248                     (setf (sb!vm:context-float-register
2249                            escaped (sb!c:sc-offset-offset sc-offset) ',format)
2250                           (realpart value))
2251                     (setf (sb!vm:context-float-register
2252                            escaped (+ (sb!c:sc-offset-offset sc-offset) ,offset)
2253                            ',format)
2254                           (imagpart value)))
2255                   ,val))
2256              (with-nfp ((var) &body body)
2257                ;; x86oids have no separate number stack, so dummy it
2258                ;; up for them.
2259                #!+(or x86 x86-64)
2260                `(let ((,var fp))
2261                   ,@body)
2262                #!-(or x86 x86-64)
2263                `(let ((,var (if escaped
2264                                 (int-sap
2265                                  (sb!vm:context-register escaped
2266                                                          sb!vm::nfp-offset))
2267                                 #!-alpha
2268                                 (sap-ref-sap fp
2269                                              (* nfp-save-offset
2270                                                 sb!vm:n-word-bytes))
2271                                 #!+alpha
2272                                 (sb!vm::make-number-stack-pointer
2273                                  (sap-ref-32 fp
2274                                              (* nfp-save-offset
2275                                                 sb!vm:n-word-bytes))))))
2276                   ,@body))
2277              (stack-frame-offset (data-width offset)
2278                #!+(or x86 x86-64)
2279                `(sb!vm::frame-byte-offset (+ (sb!c:sc-offset-offset sc-offset)
2280                                            (1- ,data-width)
2281                                            ,offset))
2282                #!-(or x86 x86-64)
2283                (declare (ignore data-width))
2284                #!-(or x86 x86-64)
2285                `(* (+ (sb!c:sc-offset-offset sc-offset) ,offset)
2286                    sb!vm:n-word-bytes)))
2287     (ecase (sb!c:sc-offset-scn sc-offset)
2288       ((#.sb!vm:any-reg-sc-number
2289         #.sb!vm:descriptor-reg-sc-number
2290         #!+rt #.sb!vm:word-pointer-reg-sc-number)
2291        (without-gcing
2292         (set-escaped-value
2293           (get-lisp-obj-address value))))
2294       (#.sb!vm:character-reg-sc-number
2295        (set-escaped-value (char-code value)))
2296       (#.sb!vm:sap-reg-sc-number
2297        (set-escaped-value (sap-int value)))
2298       (#.sb!vm:signed-reg-sc-number
2299        (set-escaped-value (logand value (1- (ash 1 sb!vm:n-word-bits)))))
2300       (#.sb!vm:unsigned-reg-sc-number
2301        (set-escaped-value value))
2302       #!-(or x86 x86-64)
2303       (#.sb!vm:non-descriptor-reg-sc-number
2304        (error "Local non-descriptor register access?"))
2305       #!-(or x86 x86-64)
2306       (#.sb!vm:interior-reg-sc-number
2307        (error "Local interior register access?"))
2308       (#.sb!vm:single-reg-sc-number
2309        #!-(or x86 x86-64) ;; don't have escaped floats.
2310        (set-escaped-float-value single-float value))
2311       (#.sb!vm:double-reg-sc-number
2312        #!-(or x86 x86-64) ;; don't have escaped floats -- still in npx?
2313        (set-escaped-float-value double-float value))
2314       #!+long-float
2315       (#.sb!vm:long-reg-sc-number
2316        #!-(or x86 x86-64) ;; don't have escaped floats -- still in npx?
2317        (set-escaped-float-value long-float value))
2318       #!-(or x86 x86-64)
2319       (#.sb!vm:complex-single-reg-sc-number
2320        (set-escaped-complex-float-value single-float 1 value))
2321       #!-(or x86 x86-64)
2322       (#.sb!vm:complex-double-reg-sc-number
2323        (set-escaped-complex-float-value double-float #!+sparc 2 #!-sparc 1 value))
2324       #!+(and long-float (not (or x86 x86-64)))
2325       (#.sb!vm:complex-long-reg-sc-number
2326        (set-escaped-complex-float-value long-float #!+sparc 4 #!-sparc 0 value))
2327       (#.sb!vm:single-stack-sc-number
2328        (with-nfp (nfp)
2329          (setf (sap-ref-single nfp (stack-frame-offset 1 0))
2330                (the single-float value))))
2331       (#.sb!vm:double-stack-sc-number
2332        (with-nfp (nfp)
2333          (setf (sap-ref-double nfp (stack-frame-offset 2 0))
2334                (the double-float value))))
2335       #!+long-float
2336       (#.sb!vm:long-stack-sc-number
2337        (with-nfp (nfp)
2338          (setf (sap-ref-long nfp (stack-frame-offset 3 0))
2339                (the long-float value))))
2340       (#.sb!vm:complex-single-stack-sc-number
2341        (with-nfp (nfp)
2342          (setf (sap-ref-single
2343                 nfp (stack-frame-offset 1 0))
2344                #!+(or x86 x86-64)
2345                (realpart (the (complex single-float) value))
2346                #!-(or x86 x86-64)
2347                (the single-float (realpart value)))
2348          (setf (sap-ref-single
2349                 nfp (stack-frame-offset 1 1))
2350                #!+(or x86 x86-64)
2351                (imagpart (the (complex single-float) value))
2352                #!-(or x86 x86-64)
2353                (the single-float (realpart value)))))
2354       (#.sb!vm:complex-double-stack-sc-number
2355        (with-nfp (nfp)
2356          (setf (sap-ref-double
2357                 nfp (stack-frame-offset 2 0))
2358                #!+(or x86 x86-64)
2359                (realpart (the (complex double-float) value))
2360                #!-(or x86 x86-64)
2361                (the double-float (realpart value)))
2362          (setf (sap-ref-double
2363                 nfp (stack-frame-offset 2 2))
2364                #!+(or x86 x86-64)
2365                (imagpart (the (complex double-float) value))
2366                #!-(or x86 x86-64)
2367                (the double-float (realpart value)))))
2368       #!+long-float
2369       (#.sb!vm:complex-long-stack-sc-number
2370        (with-nfp (nfp)
2371          (setf (sap-ref-long
2372                 nfp (stack-frame-offset 3 0))
2373                #!+(or x86 x86-64)
2374                (realpart (the (complex long-float) value))
2375                #!-(or x86 x86-64)
2376                (the long-float (realpart value)))
2377          (setf (sap-ref-long
2378                 nfp (stack-frame-offset 3 #!+sparc 4
2379                                         #!+(or x86 x86-64) 3
2380                                         #!-(or sparc x86 x86-64) 0))
2381                #!+(or x86 x86-64)
2382                (imagpart (the (complex long-float) value))
2383                #!-(or x86 x86-64)
2384                (the long-float (realpart value)))))
2385       (#.sb!vm:control-stack-sc-number
2386        (setf (stack-ref fp (sb!c:sc-offset-offset sc-offset)) value))
2387       (#.sb!vm:character-stack-sc-number
2388        (with-nfp (nfp)
2389          (setf (sap-ref-word nfp (stack-frame-offset 1 0))
2390                (char-code (the character value)))))
2391       (#.sb!vm:unsigned-stack-sc-number
2392        (with-nfp (nfp)
2393          (setf (sap-ref-word nfp (stack-frame-offset 1 0))
2394                (the (unsigned-byte 32) value))))
2395       (#.sb!vm:signed-stack-sc-number
2396        (with-nfp (nfp)
2397          (setf (signed-sap-ref-word nfp (stack-frame-offset 1 0))
2398                (the (signed-byte 32) value))))
2399       (#.sb!vm:sap-stack-sc-number
2400        (with-nfp (nfp)
2401          (setf (sap-ref-sap nfp (stack-frame-offset 1 0))
2402                (the system-area-pointer value)))))))
2403
2404 ;;; The method for setting and accessing COMPILED-DEBUG-VAR values use
2405 ;;; this to determine if the value stored is the actual value or an
2406 ;;; indirection cell.
2407 (defun indirect-value-cell-p (x)
2408   (and (= (lowtag-of x) sb!vm:other-pointer-lowtag)
2409        (= (widetag-of x) sb!vm:value-cell-header-widetag)))
2410
2411 ;;; Return three values reflecting the validity of DEBUG-VAR's value
2412 ;;; at BASIC-CODE-LOCATION:
2413 ;;;   :VALID    The value is known to be available.
2414 ;;;   :INVALID  The value is known to be unavailable.
2415 ;;;   :UNKNOWN  The value's availability is unknown.
2416 ;;;
2417 ;;; If the variable is always alive, then it is valid. If the
2418 ;;; code-location is unknown, then the variable's validity is
2419 ;;; :unknown. Once we've called CODE-LOCATION-UNKNOWN-P, we know the
2420 ;;; live-set information has been cached in the code-location.
2421 (defun debug-var-validity (debug-var basic-code-location)
2422   (compiled-debug-var-validity debug-var basic-code-location))
2423
2424 (defun debug-var-info (debug-var)
2425   (compiled-debug-var-info debug-var))
2426
2427 ;;; This is the method for DEBUG-VAR-VALIDITY for COMPILED-DEBUG-VARs.
2428 ;;; For safety, make sure basic-code-location is what we think.
2429 (defun compiled-debug-var-validity (debug-var basic-code-location)
2430   (declare (type compiled-code-location basic-code-location))
2431   (cond ((debug-var-alive-p debug-var)
2432          (let ((debug-fun (code-location-debug-fun basic-code-location)))
2433            (if (>= (compiled-code-location-pc basic-code-location)
2434                    (sb!c::compiled-debug-fun-start-pc
2435                     (compiled-debug-fun-compiler-debug-fun debug-fun)))
2436                :valid
2437                :invalid)))
2438         ((code-location-unknown-p basic-code-location) :unknown)
2439         (t
2440          (let ((pos (position debug-var
2441                               (debug-fun-debug-vars
2442                                (code-location-debug-fun
2443                                 basic-code-location)))))
2444            (unless pos
2445              (error 'unknown-debug-var
2446                     :debug-var debug-var
2447                     :debug-fun
2448                     (code-location-debug-fun basic-code-location)))
2449            ;; There must be live-set info since basic-code-location is known.
2450            (if (zerop (sbit (compiled-code-location-live-set
2451                              basic-code-location)
2452                             pos))
2453                :invalid
2454                :valid)))))
2455 \f
2456 ;;;; sources
2457
2458 ;;; This code produces and uses what we call source-paths. A
2459 ;;; source-path is a list whose first element is a form number as
2460 ;;; returned by CODE-LOCATION-FORM-NUMBER and whose last element is a
2461 ;;; top level form number as returned by
2462 ;;; CODE-LOCATION-TOPLEVEL-FORM-NUMBER. The elements from the last to
2463 ;;; the first, exclusively, are the numbered subforms into which to
2464 ;;; descend. For example:
2465 ;;;    (defun foo (x)
2466 ;;;      (let ((a (aref x 3)))
2467 ;;;     (cons a 3)))
2468 ;;; The call to AREF in this example is form number 5. Assuming this
2469 ;;; DEFUN is the 11'th top level form, the source-path for the AREF
2470 ;;; call is as follows:
2471 ;;;    (5 1 0 1 3 11)
2472 ;;; Given the DEFUN, 3 gets you the LET, 1 gets you the bindings, 0
2473 ;;; gets the first binding, and 1 gets the AREF form.
2474
2475 ;;; This returns a table mapping form numbers to source-paths. A
2476 ;;; source-path indicates a descent into the TOPLEVEL-FORM form,
2477 ;;; going directly to the subform corressponding to the form number.
2478 ;;;
2479 ;;; The vector elements are in the same format as the compiler's
2480 ;;; NODE-SOURCE-PATH; that is, the first element is the form number and
2481 ;;; the last is the TOPLEVEL-FORM number.
2482 (defun form-number-translations (form tlf-number)
2483   (let ((seen nil)
2484         (translations (make-array 12 :fill-pointer 0 :adjustable t)))
2485     (labels ((translate1 (form path)
2486                (unless (member form seen)
2487                  (push form seen)
2488                  (vector-push-extend (cons (fill-pointer translations) path)
2489                                      translations)
2490                  (let ((pos 0)
2491                        (subform form)
2492                        (trail form))
2493                    (declare (fixnum pos))
2494                    (macrolet ((frob ()
2495                                 '(progn
2496                                   (when (atom subform) (return))
2497                                   (let ((fm (car subform)))
2498                                     (when (consp fm)
2499                                       (translate1 fm (cons pos path)))
2500                                     (incf pos))
2501                                   (setq subform (cdr subform))
2502                                   (when (eq subform trail) (return)))))
2503                      (loop
2504                        (frob)
2505                        (frob)
2506                        (setq trail (cdr trail))))))))
2507       (translate1 form (list tlf-number)))
2508     (coerce translations 'simple-vector)))
2509
2510 ;;; FORM is a top level form, and path is a source-path into it. This
2511 ;;; returns the form indicated by the source-path. Context is the
2512 ;;; number of enclosing forms to return instead of directly returning
2513 ;;; the source-path form. When context is non-zero, the form returned
2514 ;;; contains a marker, #:****HERE****, immediately before the form
2515 ;;; indicated by path.
2516 (defun source-path-context (form path context)
2517   (declare (type unsigned-byte context))
2518   ;; Get to the form indicated by path or the enclosing form indicated
2519   ;; by context and path.
2520   (let ((path (reverse (butlast (cdr path)))))
2521     (dotimes (i (- (length path) context))
2522       (let ((index (first path)))
2523         (unless (and (listp form) (< index (length form)))
2524           (error "Source path no longer exists."))
2525         (setq form (elt form index))
2526         (setq path (rest path))))
2527     ;; Recursively rebuild the source form resulting from the above
2528     ;; descent, copying the beginning of each subform up to the next
2529     ;; subform we descend into according to path. At the bottom of the
2530     ;; recursion, we return the form indicated by path preceded by our
2531     ;; marker, and this gets spliced into the resulting list structure
2532     ;; on the way back up.
2533     (labels ((frob (form path level)
2534                (if (or (zerop level) (null path))
2535                    (if (zerop context)
2536                        form
2537                        `(#:***here*** ,form))
2538                    (let ((n (first path)))
2539                      (unless (and (listp form) (< n (length form)))
2540                        (error "Source path no longer exists."))
2541                      (let ((res (frob (elt form n) (rest path) (1- level))))
2542                        (nconc (subseq form 0 n)
2543                               (cons res (nthcdr (1+ n) form))))))))
2544       (frob form path context))))
2545
2546 ;;; Given a code location, return the associated form-number
2547 ;;; translations and the actual top level form.
2548 (defun get-toplevel-form (location)
2549   (let ((d-source (code-location-debug-source location)))
2550     (let* ((offset (code-location-toplevel-form-offset location))
2551            (res
2552              (cond ((debug-source-form d-source)
2553                     (debug-source-form d-source))
2554                    ((debug-source-namestring d-source)
2555                     (get-file-toplevel-form location))
2556                    (t (bug "Don't know how to use a DEBUG-SOURCE without ~
2557                                a namestring or a form.")))))
2558       (values (form-number-translations res offset) res))))
2559
2560 ;;; To suppress the read-time evaluation #. macro during source read,
2561 ;;; *READTABLE* is modified.
2562 ;;;
2563 ;;; FIXME: This breaks #+#.(cl:if ...) Maybe we need a SAFE-READ-EVAL, which
2564 ;;; this code can use for side- effect free #. calls?
2565 ;;;
2566 ;;; FIXME: This also knows nothing of custom readtables. The assumption
2567 ;;; is that the current readtable is a decent approximation for what
2568 ;;; we want, but that's lossy.
2569 (defun safe-readtable ()
2570   (let ((rt (copy-readtable)))
2571     (set-dispatch-macro-character
2572      #\# #\. (lambda (stream sub-char &rest rest)
2573                (declare (ignore rest sub-char))
2574                (let ((token (read stream t nil t)))
2575                  (format nil "#.~S" token)))
2576      rt)
2577     rt))
2578
2579 ;;; Locate the source file (if it still exists) and grab the top level
2580 ;;; form. If the file is modified, we use the top level form offset
2581 ;;; instead of the recorded character offset.
2582 (defun get-file-toplevel-form (location)
2583   (let* ((d-source (code-location-debug-source location))
2584          (tlf-offset (code-location-toplevel-form-offset location))
2585          (local-tlf-offset (- tlf-offset
2586                               (debug-source-root-number d-source)))
2587          (char-offset
2588           (aref (or (sb!di:debug-source-start-positions d-source)
2589                     (error "no start positions map"))
2590                 local-tlf-offset))
2591          (namestring (debug-source-namestring d-source)))
2592     ;; FIXME: External format?
2593     (with-open-file (f namestring :if-does-not-exist nil)
2594       (unless f
2595         (error "The source file no longer exists:~%  ~A" namestring))
2596       (format *debug-io* "~%; file: ~A~%" namestring)
2597       (let ((*readtable* (safe-readtable)))
2598         (cond ((eql (debug-source-created d-source) (file-write-date f))
2599                (file-position f char-offset))
2600               (t
2601                (format *debug-io*
2602                        "~%; File has been modified since compilation:~%;   ~A~@
2603                           ; Using form offset instead of character position.~%"
2604                        namestring)
2605                (let ((*read-suppress* t))
2606                  (loop repeat local-tlf-offset
2607                        do (read f)))))
2608         (read f)))))
2609 \f
2610 ;;;; PREPROCESS-FOR-EVAL
2611
2612 ;;; Return a function of one argument that evaluates form in the
2613 ;;; lexical context of the BASIC-CODE-LOCATION LOC, or signal a
2614 ;;; NO-DEBUG-VARS condition when the LOC's DEBUG-FUN has no
2615 ;;; DEBUG-VAR information available.
2616 ;;;
2617 ;;; The returned function takes the frame to get values from as its
2618 ;;; argument, and it returns the values of FORM. The returned function
2619 ;;; can signal the following conditions: INVALID-VALUE,
2620 ;;; AMBIGUOUS-VAR-NAME, and FRAME-FUN-MISMATCH.
2621 (defun preprocess-for-eval (form loc)
2622   (declare (type code-location loc))
2623   (let ((n-frame (gensym))
2624         (fun (code-location-debug-fun loc))
2625         (more-context nil)
2626         (more-count nil))
2627     (unless (debug-var-info-available fun)
2628       (debug-signal 'no-debug-vars :debug-fun fun))
2629     (sb!int:collect ((binds)
2630                      (specs))
2631       (do-debug-fun-vars (var fun)
2632         (let ((validity (debug-var-validity var loc)))
2633           (unless (eq validity :invalid)
2634             (case (debug-var-info var)
2635               (:more-context
2636                (setf more-context var))
2637               (:more-count
2638                (setf more-count var)))
2639             (let* ((sym (debug-var-symbol var))
2640                    (found (assoc sym (binds))))
2641               (if found
2642                   (setf (second found) :ambiguous)
2643                   (binds (list sym validity var)))))))
2644       (when (and more-context more-count)
2645         (let ((more (assoc 'sb!debug::more (binds))))
2646           (if more
2647               (setf (second more) :ambiguous)
2648               (binds (list 'sb!debug::more :more more-context more-count)))))
2649       (dolist (bind (binds))
2650         (let ((name (first bind))
2651               (var (third bind)))
2652           (ecase (second bind)
2653             (:valid
2654              (specs `(,name (debug-var-value ',var ,n-frame))))
2655             (:more
2656              (let ((count-var (fourth bind)))
2657                (specs `(,name (multiple-value-list
2658                                (sb!c:%more-arg-values (debug-var-value ',var ,n-frame)
2659                                                       0
2660                                                       (debug-var-value ',count-var ,n-frame)))))))
2661             (:unknown
2662              (specs `(,name (debug-signal 'invalid-value
2663                                           :debug-var ',var
2664                                           :frame ,n-frame))))
2665             (:ambiguous
2666              (specs `(,name (debug-signal 'ambiguous-var-name
2667                                           :name ',name
2668                                           :frame ,n-frame)))))))
2669       (let ((res (coerce `(lambda (,n-frame)
2670                             (declare (ignorable ,n-frame))
2671                             (symbol-macrolet ,(specs) ,form))
2672                          'function)))
2673         (lambda (frame)
2674           ;; This prevents these functions from being used in any
2675           ;; location other than a function return location, so maybe
2676           ;; this should only check whether FRAME's DEBUG-FUN is the
2677           ;; same as LOC's.
2678           (unless (code-location= (frame-code-location frame) loc)
2679             (debug-signal 'frame-fun-mismatch
2680                           :code-location loc :form form :frame frame))
2681           (funcall res frame))))))
2682
2683 ;;; EVAL-IN-FRAME
2684
2685 (defun eval-in-frame (frame form)
2686   (declare (type frame frame))
2687   #!+sb-doc
2688   "Evaluate FORM in the lexical context of FRAME's current code location,
2689    returning the results of the evaluation."
2690   (funcall (preprocess-for-eval form (frame-code-location frame)) frame))
2691 \f
2692 ;;;; breakpoints
2693
2694 ;;;; user-visible interface
2695
2696 ;;; Create and return a breakpoint. When program execution encounters
2697 ;;; the breakpoint, the system calls HOOK-FUN. HOOK-FUN takes the
2698 ;;; current frame for the function in which the program is running and
2699 ;;; the breakpoint object.
2700 ;;;
2701 ;;; WHAT and KIND determine where in a function the system invokes
2702 ;;; HOOK-FUN. WHAT is either a code-location or a DEBUG-FUN. KIND is
2703 ;;; one of :CODE-LOCATION, :FUN-START, or :FUN-END. Since the starts
2704 ;;; and ends of functions may not have code-locations representing
2705 ;;; them, designate these places by supplying WHAT as a DEBUG-FUN and
2706 ;;; KIND indicating the :FUN-START or :FUN-END. When WHAT is a
2707 ;;; DEBUG-FUN and kind is :FUN-END, then HOOK-FUN must take two
2708 ;;; additional arguments, a list of values returned by the function
2709 ;;; and a FUN-END-COOKIE.
2710 ;;;
2711 ;;; INFO is information supplied by and used by the user.
2712 ;;;
2713 ;;; FUN-END-COOKIE is a function. To implement :FUN-END
2714 ;;; breakpoints, the system uses starter breakpoints to establish the
2715 ;;; :FUN-END breakpoint for each invocation of the function. Upon
2716 ;;; each entry, the system creates a unique cookie to identify the
2717 ;;; invocation, and when the user supplies a function for this
2718 ;;; argument, the system invokes it on the frame and the cookie. The
2719 ;;; system later invokes the :FUN-END breakpoint hook on the same
2720 ;;; cookie. The user may save the cookie for comparison in the hook
2721 ;;; function.
2722 ;;;
2723 ;;; Signal an error if WHAT is an unknown code-location.
2724 (defun make-breakpoint (hook-fun what
2725                         &key (kind :code-location) info fun-end-cookie)
2726   (etypecase what
2727     (code-location
2728      (when (code-location-unknown-p what)
2729        (error "cannot make a breakpoint at an unknown code location: ~S"
2730               what))
2731      (aver (eq kind :code-location))
2732      (let ((bpt (%make-breakpoint hook-fun what kind info)))
2733        (etypecase what
2734          (compiled-code-location
2735           ;; This slot is filled in due to calling CODE-LOCATION-UNKNOWN-P.
2736           (when (eq (compiled-code-location-kind what) :unknown-return)
2737             (let ((other-bpt (%make-breakpoint hook-fun what
2738                                                :unknown-return-partner
2739                                                info)))
2740               (setf (breakpoint-unknown-return-partner bpt) other-bpt)
2741               (setf (breakpoint-unknown-return-partner other-bpt) bpt))))
2742          ;; (There used to be more cases back before sbcl-0.7.0,,
2743          ;; when we did special tricks to debug the IR1
2744          ;; interpreter.)
2745          )
2746        bpt))
2747     (compiled-debug-fun
2748      (ecase kind
2749        (:fun-start
2750         (%make-breakpoint hook-fun what kind info))
2751        (:fun-end
2752         (unless (eq (sb!c::compiled-debug-fun-returns
2753                      (compiled-debug-fun-compiler-debug-fun what))
2754                     :standard)
2755           (error ":FUN-END breakpoints are currently unsupported ~
2756                   for the known return convention."))
2757
2758         (let* ((bpt (%make-breakpoint hook-fun what kind info))
2759                (starter (compiled-debug-fun-end-starter what)))
2760           (unless starter
2761             (setf starter (%make-breakpoint #'list what :fun-start nil))
2762             (setf (breakpoint-hook-fun starter)
2763                   (fun-end-starter-hook starter what))
2764             (setf (compiled-debug-fun-end-starter what) starter))
2765           (setf (breakpoint-start-helper bpt) starter)
2766           (push bpt (breakpoint-%info starter))
2767           (setf (breakpoint-cookie-fun bpt) fun-end-cookie)
2768           bpt))))))
2769
2770 ;;; These are unique objects created upon entry into a function by a
2771 ;;; :FUN-END breakpoint's starter hook. These are only created
2772 ;;; when users supply :FUN-END-COOKIE to MAKE-BREAKPOINT. Also,
2773 ;;; the :FUN-END breakpoint's hook is called on the same cookie
2774 ;;; when it is created.
2775 (defstruct (fun-end-cookie
2776             (:print-object (lambda (obj str)
2777                              (print-unreadable-object (obj str :type t))))
2778             (:constructor make-fun-end-cookie (bogus-lra debug-fun))
2779             (:copier nil))
2780   ;; a pointer to the bogus-lra created for :FUN-END breakpoints
2781   bogus-lra
2782   ;; the DEBUG-FUN associated with this cookie
2783   debug-fun)
2784
2785 ;;; This maps bogus-lra-components to cookies, so that
2786 ;;; HANDLE-FUN-END-BREAKPOINT can find the appropriate cookie for the
2787 ;;; breakpoint hook.
2788 (defvar *fun-end-cookies* (make-hash-table :test 'eq :synchronized t))
2789
2790 ;;; This returns a hook function for the start helper breakpoint
2791 ;;; associated with a :FUN-END breakpoint. The returned function
2792 ;;; makes a fake LRA that all returns go through, and this piece of
2793 ;;; fake code actually breaks. Upon return from the break, the code
2794 ;;; provides the returnee with any values. Since the returned function
2795 ;;; effectively activates FUN-END-BPT on each entry to DEBUG-FUN's
2796 ;;; function, we must establish breakpoint-data about FUN-END-BPT.
2797 (defun fun-end-starter-hook (starter-bpt debug-fun)
2798   (declare (type breakpoint starter-bpt)
2799            (type compiled-debug-fun debug-fun))
2800   (lambda (frame breakpoint)
2801     (declare (ignore breakpoint)
2802              (type frame frame))
2803     (let ((lra-sc-offset
2804            (sb!c::compiled-debug-fun-return-pc
2805             (compiled-debug-fun-compiler-debug-fun debug-fun))))
2806       (multiple-value-bind (lra component offset)
2807           (make-bogus-lra
2808            (get-context-value frame
2809                               lra-save-offset
2810                               lra-sc-offset))
2811         (setf (get-context-value frame
2812                                  lra-save-offset
2813                                  lra-sc-offset)
2814               lra)
2815         (let ((end-bpts (breakpoint-%info starter-bpt)))
2816           (let ((data (breakpoint-data component offset)))
2817             (setf (breakpoint-data-breakpoints data) end-bpts)
2818             (dolist (bpt end-bpts)
2819               (setf (breakpoint-internal-data bpt) data)))
2820           (let ((cookie (make-fun-end-cookie lra debug-fun)))
2821             (setf (gethash component *fun-end-cookies*) cookie)
2822             (dolist (bpt end-bpts)
2823               (let ((fun (breakpoint-cookie-fun bpt)))
2824                 (when fun (funcall fun frame cookie))))))))))
2825
2826 ;;; This takes a FUN-END-COOKIE and a frame, and it returns
2827 ;;; whether the cookie is still valid. A cookie becomes invalid when
2828 ;;; the frame that established the cookie has exited. Sometimes cookie
2829 ;;; holders are unaware of cookie invalidation because their
2830 ;;; :FUN-END breakpoint hooks didn't run due to THROW'ing.
2831 ;;;
2832 ;;; This takes a frame as an efficiency hack since the user probably
2833 ;;; has a frame object in hand when using this routine, and it saves
2834 ;;; repeated parsing of the stack and consing when asking whether a
2835 ;;; series of cookies is valid.
2836 (defun fun-end-cookie-valid-p (frame cookie)
2837   (let ((lra (fun-end-cookie-bogus-lra cookie))
2838         (lra-sc-offset (sb!c::compiled-debug-fun-return-pc
2839                         (compiled-debug-fun-compiler-debug-fun
2840                          (fun-end-cookie-debug-fun cookie)))))
2841     (do ((frame frame (frame-down frame)))
2842         ((not frame) nil)
2843       (when (and (compiled-frame-p frame)
2844                  (#!-(or x86 x86-64) eq #!+(or x86 x86-64) sap=
2845                   lra
2846                   (get-context-value frame lra-save-offset lra-sc-offset)))
2847         (return t)))))
2848 \f
2849 ;;;; ACTIVATE-BREAKPOINT
2850
2851 ;;; Cause the system to invoke the breakpoint's hook function until
2852 ;;; the next call to DEACTIVATE-BREAKPOINT or DELETE-BREAKPOINT. The
2853 ;;; system invokes breakpoint hook functions in the opposite order
2854 ;;; that you activate them.
2855 (defun activate-breakpoint (breakpoint)
2856   (when (eq (breakpoint-status breakpoint) :deleted)
2857     (error "cannot activate a deleted breakpoint: ~S" breakpoint))
2858   (unless (eq (breakpoint-status breakpoint) :active)
2859     (ecase (breakpoint-kind breakpoint)
2860       (:code-location
2861        (let ((loc (breakpoint-what breakpoint)))
2862          (etypecase loc
2863            (compiled-code-location
2864             (activate-compiled-code-location-breakpoint breakpoint)
2865             (let ((other (breakpoint-unknown-return-partner breakpoint)))
2866               (when other
2867                 (activate-compiled-code-location-breakpoint other))))
2868            ;; (There used to be more cases back before sbcl-0.7.0, when
2869            ;; we did special tricks to debug the IR1 interpreter.)
2870            )))
2871       (:fun-start
2872        (etypecase (breakpoint-what breakpoint)
2873          (compiled-debug-fun
2874           (activate-compiled-fun-start-breakpoint breakpoint))
2875          ;; (There used to be more cases back before sbcl-0.7.0, when
2876          ;; we did special tricks to debug the IR1 interpreter.)
2877          ))
2878       (:fun-end
2879        (etypecase (breakpoint-what breakpoint)
2880          (compiled-debug-fun
2881           (let ((starter (breakpoint-start-helper breakpoint)))
2882             (unless (eq (breakpoint-status starter) :active)
2883               ;; may already be active by some other :FUN-END breakpoint
2884               (activate-compiled-fun-start-breakpoint starter)))
2885           (setf (breakpoint-status breakpoint) :active))
2886          ;; (There used to be more cases back before sbcl-0.7.0, when
2887          ;; we did special tricks to debug the IR1 interpreter.)
2888          ))))
2889   breakpoint)
2890
2891 (defun activate-compiled-code-location-breakpoint (breakpoint)
2892   (declare (type breakpoint breakpoint))
2893   (let ((loc (breakpoint-what breakpoint)))
2894     (declare (type compiled-code-location loc))
2895     (sub-activate-breakpoint
2896      breakpoint
2897      (breakpoint-data (compiled-debug-fun-component
2898                        (code-location-debug-fun loc))
2899                       (+ (compiled-code-location-pc loc)
2900                          (if (or (eq (breakpoint-kind breakpoint)
2901                                      :unknown-return-partner)
2902                                  (eq (compiled-code-location-kind loc)
2903                                      :single-value-return))
2904                              sb!vm:single-value-return-byte-offset
2905                              0))))))
2906
2907 (defun activate-compiled-fun-start-breakpoint (breakpoint)
2908   (declare (type breakpoint breakpoint))
2909   (let ((debug-fun (breakpoint-what breakpoint)))
2910     (sub-activate-breakpoint
2911      breakpoint
2912      (breakpoint-data (compiled-debug-fun-component debug-fun)
2913                       (sb!c::compiled-debug-fun-start-pc
2914                        (compiled-debug-fun-compiler-debug-fun
2915                         debug-fun))))))
2916
2917 (defun sub-activate-breakpoint (breakpoint data)
2918   (declare (type breakpoint breakpoint)
2919            (type breakpoint-data data))
2920   (setf (breakpoint-status breakpoint) :active)
2921   (without-interrupts
2922    (unless (breakpoint-data-breakpoints data)
2923      (setf (breakpoint-data-instruction data)
2924            (without-gcing
2925             (breakpoint-install (get-lisp-obj-address
2926                                  (breakpoint-data-component data))
2927                                 (breakpoint-data-offset data)))))
2928    (setf (breakpoint-data-breakpoints data)
2929          (append (breakpoint-data-breakpoints data) (list breakpoint)))
2930    (setf (breakpoint-internal-data breakpoint) data)))
2931 \f
2932 ;;;; DEACTIVATE-BREAKPOINT
2933
2934 ;;; Stop the system from invoking the breakpoint's hook function.
2935 (defun deactivate-breakpoint (breakpoint)
2936   (when (eq (breakpoint-status breakpoint) :active)
2937     (without-interrupts
2938      (let ((loc (breakpoint-what breakpoint)))
2939        (etypecase loc
2940          ((or compiled-code-location compiled-debug-fun)
2941           (deactivate-compiled-breakpoint breakpoint)
2942           (let ((other (breakpoint-unknown-return-partner breakpoint)))
2943             (when other
2944               (deactivate-compiled-breakpoint other))))
2945          ;; (There used to be more cases back before sbcl-0.7.0, when
2946          ;; we did special tricks to debug the IR1 interpreter.)
2947          ))))
2948   breakpoint)
2949
2950 (defun deactivate-compiled-breakpoint (breakpoint)
2951   (if (eq (breakpoint-kind breakpoint) :fun-end)
2952       (let ((starter (breakpoint-start-helper breakpoint)))
2953         (unless (find-if (lambda (bpt)
2954                            (and (not (eq bpt breakpoint))
2955                                 (eq (breakpoint-status bpt) :active)))
2956                          (breakpoint-%info starter))
2957           (deactivate-compiled-breakpoint starter)))
2958       (let* ((data (breakpoint-internal-data breakpoint))
2959              (bpts (delete breakpoint (breakpoint-data-breakpoints data))))
2960         (setf (breakpoint-internal-data breakpoint) nil)
2961         (setf (breakpoint-data-breakpoints data) bpts)
2962         (unless bpts
2963           (without-gcing
2964            (breakpoint-remove (get-lisp-obj-address
2965                                (breakpoint-data-component data))
2966                               (breakpoint-data-offset data)
2967                               (breakpoint-data-instruction data)))
2968           (delete-breakpoint-data data))))
2969   (setf (breakpoint-status breakpoint) :inactive)
2970   breakpoint)
2971 \f
2972 ;;;; BREAKPOINT-INFO
2973
2974 ;;; Return the user-maintained info associated with breakpoint. This
2975 ;;; is SETF'able.
2976 (defun breakpoint-info (breakpoint)
2977   (breakpoint-%info breakpoint))
2978 (defun %set-breakpoint-info (breakpoint value)
2979   (setf (breakpoint-%info breakpoint) value)
2980   (let ((other (breakpoint-unknown-return-partner breakpoint)))
2981     (when other
2982       (setf (breakpoint-%info other) value))))
2983 \f
2984 ;;;; BREAKPOINT-ACTIVE-P and DELETE-BREAKPOINT
2985
2986 (defun breakpoint-active-p (breakpoint)
2987   (ecase (breakpoint-status breakpoint)
2988     (:active t)
2989     ((:inactive :deleted) nil)))
2990
2991 ;;; Free system storage and remove computational overhead associated
2992 ;;; with breakpoint. After calling this, breakpoint is completely
2993 ;;; impotent and can never become active again.
2994 (defun delete-breakpoint (breakpoint)
2995   (let ((status (breakpoint-status breakpoint)))
2996     (unless (eq status :deleted)
2997       (when (eq status :active)
2998         (deactivate-breakpoint breakpoint))
2999       (setf (breakpoint-status breakpoint) :deleted)
3000       (let ((other (breakpoint-unknown-return-partner breakpoint)))
3001         (when other
3002           (setf (breakpoint-status other) :deleted)))
3003       (when (eq (breakpoint-kind breakpoint) :fun-end)
3004         (let* ((starter (breakpoint-start-helper breakpoint))
3005                (breakpoints (delete breakpoint
3006                                     (the list (breakpoint-info starter)))))
3007           (setf (breakpoint-info starter) breakpoints)
3008           (unless breakpoints
3009             (delete-breakpoint starter)
3010             (setf (compiled-debug-fun-end-starter
3011                    (breakpoint-what breakpoint))
3012                   nil))))))
3013   breakpoint)
3014 \f
3015 ;;;; C call out stubs
3016
3017 ;;; This actually installs the break instruction in the component. It
3018 ;;; returns the overwritten bits. You must call this in a context in
3019 ;;; which GC is disabled, so that Lisp doesn't move objects around
3020 ;;; that C is pointing to.
3021 (sb!alien:define-alien-routine "breakpoint_install" sb!alien:unsigned-int
3022   (code-obj sb!alien:unsigned)
3023   (pc-offset sb!alien:int))
3024
3025 ;;; This removes the break instruction and replaces the original
3026 ;;; instruction. You must call this in a context in which GC is disabled
3027 ;;; so Lisp doesn't move objects around that C is pointing to.
3028 (sb!alien:define-alien-routine "breakpoint_remove" sb!alien:void
3029   (code-obj sb!alien:unsigned)
3030   (pc-offset sb!alien:int)
3031   (old-inst sb!alien:unsigned-int))
3032
3033 (sb!alien:define-alien-routine "breakpoint_do_displaced_inst" sb!alien:void
3034   (scp (* os-context-t))
3035   (orig-inst sb!alien:unsigned-int))
3036
3037 ;;;; breakpoint handlers (layer between C and exported interface)
3038
3039 ;;; This maps components to a mapping of offsets to BREAKPOINT-DATAs.
3040 (defvar *component-breakpoint-offsets* (make-hash-table :test 'eq :synchronized t))
3041
3042 ;;; This returns the BREAKPOINT-DATA object associated with component cross
3043 ;;; offset. If none exists, this makes one, installs it, and returns it.
3044 (defun breakpoint-data (component offset &optional (create t))
3045   (flet ((install-breakpoint-data ()
3046            (when create
3047              (let ((data (make-breakpoint-data component offset)))
3048                (push (cons offset data)
3049                      (gethash component *component-breakpoint-offsets*))
3050                data))))
3051     (let ((offsets (gethash component *component-breakpoint-offsets*)))
3052       (if offsets
3053           (let ((data (assoc offset offsets)))
3054             (if data
3055                 (cdr data)
3056                 (install-breakpoint-data)))
3057           (install-breakpoint-data)))))
3058
3059 ;;; We use this when there are no longer any active breakpoints
3060 ;;; corresponding to DATA.
3061 (defun delete-breakpoint-data (data)
3062   ;; Again, this looks brittle. Is there no danger of being interrupted
3063   ;; here?
3064   (let* ((component (breakpoint-data-component data))
3065          (offsets (delete (breakpoint-data-offset data)
3066                           (gethash component *component-breakpoint-offsets*)
3067                           :key #'car)))
3068     (if offsets
3069         (setf (gethash component *component-breakpoint-offsets*) offsets)
3070         (remhash component *component-breakpoint-offsets*)))
3071   (values))
3072
3073 ;;; The C handler for interrupts calls this when it has a
3074 ;;; debugging-tool break instruction. This does *not* handle all
3075 ;;; breaks; for example, it does not handle breaks for internal
3076 ;;; errors.
3077 (defun handle-breakpoint (offset component signal-context)
3078   (let ((data (breakpoint-data component offset nil)))
3079     (unless data
3080       (error "unknown breakpoint in ~S at offset ~S"
3081               (debug-fun-name (debug-fun-from-pc component offset))
3082               offset))
3083     (let ((breakpoints (breakpoint-data-breakpoints data)))
3084       (if (or (null breakpoints)
3085               (eq (breakpoint-kind (car breakpoints)) :fun-end))
3086           (handle-fun-end-breakpoint-aux breakpoints data signal-context)
3087           (handle-breakpoint-aux breakpoints data
3088                                  offset component signal-context)))))
3089
3090 ;;; This holds breakpoint-datas while invoking the breakpoint hooks
3091 ;;; associated with that particular component and location. While they
3092 ;;; are executing, if we hit the location again, we ignore the
3093 ;;; breakpoint to avoid infinite recursion. fun-end breakpoints
3094 ;;; must work differently since the breakpoint-data is unique for each
3095 ;;; invocation.
3096 (defvar *executing-breakpoint-hooks* nil)
3097
3098 ;;; This handles code-location and DEBUG-FUN :FUN-START
3099 ;;; breakpoints.
3100 (defun handle-breakpoint-aux (breakpoints data offset component signal-context)
3101   (unless breakpoints
3102     (bug "breakpoint that nobody wants"))
3103   (unless (member data *executing-breakpoint-hooks*)
3104     (let ((*executing-breakpoint-hooks* (cons data
3105                                               *executing-breakpoint-hooks*)))
3106       (invoke-breakpoint-hooks breakpoints signal-context)))
3107   ;; At this point breakpoints may not hold the same list as
3108   ;; BREAKPOINT-DATA-BREAKPOINTS since invoking hooks may have allowed
3109   ;; a breakpoint deactivation. In fact, if all breakpoints were
3110   ;; deactivated then data is invalid since it was deleted and so the
3111   ;; correct one must be looked up if it is to be used. If there are
3112   ;; no more breakpoints active at this location, then the normal
3113   ;; instruction has been put back, and we do not need to
3114   ;; DO-DISPLACED-INST.
3115   (setf data (breakpoint-data component offset nil))
3116   (when (and data (breakpoint-data-breakpoints data))
3117     ;; The breakpoint is still active, so we need to execute the
3118     ;; displaced instruction and leave the breakpoint instruction
3119     ;; behind. The best way to do this is different on each machine,
3120     ;; so we just leave it up to the C code.
3121     (breakpoint-do-displaced-inst signal-context
3122                                   (breakpoint-data-instruction data))
3123     ;; Some platforms have no usable sigreturn() call.  If your
3124     ;; implementation of arch_do_displaced_inst() _does_ sigreturn(),
3125     ;; it's polite to warn here
3126     #!+(and sparc solaris)
3127     (error "BREAKPOINT-DO-DISPLACED-INST returned?")))
3128
3129 (defun invoke-breakpoint-hooks (breakpoints signal-context)
3130   (let* ((frame (signal-context-frame signal-context)))
3131     (dolist (bpt breakpoints)
3132       (funcall (breakpoint-hook-fun bpt)
3133                frame
3134                ;; If this is an :UNKNOWN-RETURN-PARTNER, then pass the
3135                ;; hook function the original breakpoint, so that users
3136                ;; aren't forced to confront the fact that some
3137                ;; breakpoints really are two.
3138                (if (eq (breakpoint-kind bpt) :unknown-return-partner)
3139                    (breakpoint-unknown-return-partner bpt)
3140                    bpt)))))
3141
3142 (defun signal-context-frame (signal-context)
3143   (let* ((scp
3144           (locally
3145             (declare (optimize (inhibit-warnings 3)))
3146             (sb!alien:sap-alien signal-context (* os-context-t))))
3147          (cfp (int-sap (sb!vm:context-register scp sb!vm::cfp-offset))))
3148     (compute-calling-frame cfp
3149                            ;; KLUDGE: This argument is ignored on
3150                            ;; x86oids in this scenario, but is
3151                            ;; declared to be a SAP.
3152                            #!+(or x86 x86-64) (sb!vm:context-pc scp)
3153                            #!-(or x86 x86-64) nil
3154                            nil)))
3155
3156 (defun handle-fun-end-breakpoint (offset component context)
3157   (let ((data (breakpoint-data component offset nil)))
3158     (unless data
3159       (error "unknown breakpoint in ~S at offset ~S"
3160               (debug-fun-name (debug-fun-from-pc component offset))
3161               offset))
3162     (let ((breakpoints (breakpoint-data-breakpoints data)))
3163       (when breakpoints
3164         (aver (eq (breakpoint-kind (car breakpoints)) :fun-end))
3165         (handle-fun-end-breakpoint-aux breakpoints data context)))))
3166
3167 ;;; Either HANDLE-BREAKPOINT calls this for :FUN-END breakpoints
3168 ;;; [old C code] or HANDLE-FUN-END-BREAKPOINT calls this directly
3169 ;;; [new C code].
3170 (defun handle-fun-end-breakpoint-aux (breakpoints data signal-context)
3171   ;; FIXME: This looks brittle: what if we are interrupted somewhere
3172   ;; here? ...or do we have interrupts disabled here?
3173   (delete-breakpoint-data data)
3174   (let* ((scp
3175           (locally
3176             (declare (optimize (inhibit-warnings 3)))
3177             (sb!alien:sap-alien signal-context (* os-context-t))))
3178          (frame (signal-context-frame signal-context))
3179          (component (breakpoint-data-component data))
3180          (cookie (gethash component *fun-end-cookies*)))
3181     (remhash component *fun-end-cookies*)
3182     (dolist (bpt breakpoints)
3183       (funcall (breakpoint-hook-fun bpt)
3184                frame bpt
3185                (get-fun-end-breakpoint-values scp)
3186                cookie))))
3187
3188 (defun get-fun-end-breakpoint-values (scp)
3189   (let ((ocfp (int-sap (sb!vm:context-register
3190                         scp
3191                         #!-(or x86 x86-64) sb!vm::ocfp-offset
3192                         #!+(or x86 x86-64) sb!vm::ebx-offset)))
3193         (nargs (make-lisp-obj
3194                 (sb!vm:context-register scp sb!vm::nargs-offset)))
3195         (reg-arg-offsets '#.sb!vm::*register-arg-offsets*)
3196         (results nil))
3197     (without-gcing
3198      (dotimes (arg-num nargs)
3199        (push (if reg-arg-offsets
3200                  (make-lisp-obj
3201                   (sb!vm:context-register scp (pop reg-arg-offsets)))
3202                (stack-ref ocfp arg-num))
3203              results)))
3204     (nreverse results)))
3205 \f
3206 ;;;; MAKE-BOGUS-LRA (used for :FUN-END breakpoints)
3207
3208 (defconstant bogus-lra-constants
3209   #!-(or x86 x86-64) 2 #!+(or x86 x86-64) 3)
3210 (defconstant known-return-p-slot
3211   (+ sb!vm:code-constants-offset #!-(or x86 x86-64) 1 #!+(or x86 x86-64) 2))
3212
3213 ;;; Make a bogus LRA object that signals a breakpoint trap when
3214 ;;; returned to. If the breakpoint trap handler returns, REAL-LRA is
3215 ;;; returned to. Three values are returned: the bogus LRA object, the
3216 ;;; code component it is part of, and the PC offset for the trap
3217 ;;; instruction.
3218 (defun make-bogus-lra (real-lra &optional known-return-p)
3219   (without-gcing
3220    ;; These are really code labels, not variables: but this way we get
3221    ;; their addresses.
3222    (let* ((src-start (true-foreign-symbol-sap "fun_end_breakpoint_guts"))
3223           (src-end (true-foreign-symbol-sap "fun_end_breakpoint_end"))
3224           (trap-loc (true-foreign-symbol-sap "fun_end_breakpoint_trap"))
3225           (length (sap- src-end src-start))
3226           (code-object
3227            (sb!c:allocate-code-object (1+ bogus-lra-constants) length))
3228           (dst-start (code-instructions code-object)))
3229      (declare (type system-area-pointer
3230                     src-start src-end dst-start trap-loc)
3231               (type index length))
3232      (setf (%code-debug-info code-object) :bogus-lra)
3233      (setf (code-header-ref code-object sb!vm:code-trace-table-offset-slot)
3234            length)
3235      #!-(or x86 x86-64)
3236      (setf (code-header-ref code-object real-lra-slot) real-lra)
3237      #!+(or x86 x86-64)
3238      (multiple-value-bind (offset code) (compute-lra-data-from-pc real-lra)
3239        (setf (code-header-ref code-object real-lra-slot) code)
3240        (setf (code-header-ref code-object (1+ real-lra-slot)) offset))
3241      (setf (code-header-ref code-object known-return-p-slot)
3242            known-return-p)
3243      (system-area-ub8-copy src-start 0 dst-start 0 length)
3244      (sb!vm:sanctify-for-execution code-object)
3245      #!+(or x86 x86-64)
3246      (values dst-start code-object (sap- trap-loc src-start))
3247      #!-(or x86 x86-64)
3248      (let ((new-lra (make-lisp-obj (+ (sap-int dst-start)
3249                                       sb!vm:other-pointer-lowtag))))
3250        ;; We used to set the header value of the LRA here to the
3251        ;; offset from the enclosing component to the LRA header, but
3252        ;; MAKE-LISP-OBJ actually checks the value before we get a
3253        ;; chance to set it, so it's now done in arch-assem.S.
3254        (values new-lra code-object (sap- trap-loc src-start))))))
3255 \f
3256 ;;;; miscellaneous
3257
3258 ;;; This appears here because it cannot go with the DEBUG-FUN
3259 ;;; interface since DO-DEBUG-BLOCK-LOCATIONS isn't defined until after
3260 ;;; the DEBUG-FUN routines.
3261
3262 ;;; Return a code-location before the body of a function and after all
3263 ;;; the arguments are in place; or if that location can't be
3264 ;;; determined due to a lack of debug information, return NIL.
3265 (defun debug-fun-start-location (debug-fun)
3266   (etypecase debug-fun
3267     (compiled-debug-fun
3268      (code-location-from-pc debug-fun
3269                             (sb!c::compiled-debug-fun-start-pc
3270                              (compiled-debug-fun-compiler-debug-fun
3271                               debug-fun))
3272                             nil))
3273     ;; (There used to be more cases back before sbcl-0.7.0, when
3274     ;; we did special tricks to debug the IR1 interpreter.)
3275     ))
3276
3277 \f
3278 ;;;; Single-stepping
3279
3280 ;;; The single-stepper works by inserting conditional trap instructions
3281 ;;; into the generated code (see src/compiler/*/call.lisp), currently:
3282 ;;;
3283 ;;;   1) Before the code generated for a function call that was
3284 ;;;      translated to a VOP
3285 ;;;   2) Just before the call instruction for a full call
3286 ;;;
3287 ;;; In both cases, the trap will only be executed if stepping has been
3288 ;;; enabled, in which case it'll ultimately be handled by
3289 ;;; HANDLE-SINGLE-STEP-TRAP, which will either signal a stepping condition,
3290 ;;; or replace the function that's about to be called with a wrapper
3291 ;;; which will signal the condition.
3292
3293 (defun handle-single-step-trap (kind callee-register-offset)
3294   (let ((context (nth-interrupt-context (1- *free-interrupt-context-index*))))
3295     ;; The following calls must get tail-call eliminated for
3296     ;; *STEP-FRAME* to get set correctly on non-x86.
3297     (if (= kind single-step-before-trap)
3298         (handle-single-step-before-trap context)
3299         (handle-single-step-around-trap context callee-register-offset))))
3300
3301 (defvar *step-frame* nil)
3302
3303 (defun handle-single-step-before-trap (context)
3304   (let ((step-info (single-step-info-from-context context)))
3305     ;; If there was not enough debug information available, there's no
3306     ;; sense in signaling the condition.
3307     (when step-info
3308       (let ((*step-frame*
3309              #!+(or x86 x86-64)
3310              (signal-context-frame (sb!alien::alien-sap context))
3311              #!-(or x86 x86-64)
3312              ;; KLUDGE: Use the first non-foreign frame as the
3313              ;; *STACK-TOP-HINT*. Getting the frame from the signal
3314              ;; context as on x86 would be cleaner, but
3315              ;; SIGNAL-CONTEXT-FRAME doesn't seem seem to work at all
3316              ;; on non-x86.
3317              (loop with frame = (frame-down (top-frame))
3318                    while frame
3319                    for dfun = (frame-debug-fun frame)
3320                    do (when (typep dfun 'compiled-debug-fun)
3321                         (return frame))
3322                    do (setf frame (frame-down frame)))))
3323         (sb!impl::step-form step-info
3324                             ;; We could theoretically store information in
3325                             ;; the debug-info about to determine the
3326                             ;; arguments here, but for now let's just pass
3327                             ;; on it.
3328                             :unknown)))))
3329
3330 ;;; This function will replace the fdefn / function that was in the
3331 ;;; register at CALLEE-REGISTER-OFFSET with a wrapper function. To
3332 ;;; ensure that the full call will use the wrapper instead of the
3333 ;;; original, conditional trap must be emitted before the fdefn /
3334 ;;; function is converted into a raw address.
3335 (defun handle-single-step-around-trap (context callee-register-offset)
3336   ;; Fetch the function / fdefn we're about to call from the
3337   ;; appropriate register.
3338   (let* ((callee (make-lisp-obj
3339                   (context-register context callee-register-offset)))
3340          (step-info (single-step-info-from-context context)))
3341     ;; If there was not enough debug information available, there's no
3342     ;; sense in signaling the condition.
3343     (unless step-info
3344       (return-from handle-single-step-around-trap))
3345     (let* ((fun (lambda (&rest args)
3346                   (flet ((call ()
3347                            (apply (typecase callee
3348                                     (fdefn (fdefn-fun callee))
3349                                     (function callee))
3350                                   args)))
3351                     ;; Signal a step condition
3352                     (let* ((step-in
3353                             (let ((*step-frame* (frame-down (top-frame))))
3354                               (sb!impl::step-form step-info args))))
3355                       ;; And proceed based on its return value.
3356                       (if step-in
3357                           ;; STEP-INTO was selected. Use *STEP-OUT* to
3358                           ;; let the stepper know that selecting the
3359                           ;; STEP-OUT restart is valid inside this
3360                           (let ((sb!impl::*step-out* :maybe))
3361                             ;; Pass the return values of the call to
3362                             ;; STEP-VALUES, which will signal a
3363                             ;; condition with them in the VALUES slot.
3364                             (unwind-protect
3365                                  (multiple-value-call #'sb!impl::step-values
3366                                    step-info
3367                                    (call))
3368                               ;; If the user selected the STEP-OUT
3369                               ;; restart during the call, resume
3370                               ;; stepping
3371                               (when (eq sb!impl::*step-out* t)
3372                                 (sb!impl::enable-stepping))))
3373                           ;; STEP-NEXT / CONTINUE / OUT selected:
3374                           ;; Disable the stepper for the duration of
3375                           ;; the call.
3376                           (sb!impl::with-stepping-disabled
3377                             (call)))))))
3378            (new-callee (etypecase callee
3379                          (fdefn
3380                           (let ((fdefn (make-fdefn (gensym))))
3381                             (setf (fdefn-fun fdefn) fun)
3382                             fdefn))
3383                          (function fun))))
3384       ;; And then store the wrapper in the same place.
3385       (setf (context-register context callee-register-offset)
3386             (get-lisp-obj-address new-callee)))))
3387
3388 ;;; Given a signal context, fetch the step-info that's been stored in
3389 ;;; the debug info at the trap point.
3390 (defun single-step-info-from-context (context)
3391   (multiple-value-bind (pc-offset code)
3392       (compute-lra-data-from-pc (context-pc context))
3393     (let* ((debug-fun (debug-fun-from-pc code pc-offset))
3394            (location (code-location-from-pc debug-fun
3395                                             pc-offset
3396                                             nil)))
3397       (handler-case
3398           (progn
3399             (fill-in-code-location location)
3400             (code-location-debug-source location)
3401             (compiled-code-location-step-info location))
3402         (debug-condition ()
3403           nil)))))
3404
3405 ;;; Return the frame that triggered a single-step condition. Used to
3406 ;;; provide a *STACK-TOP-HINT*.
3407 (defun find-stepped-frame ()
3408   (or *step-frame*
3409       (top-frame)))