1 ;;; sun-eos-debugger.el --- Implements the XEmacs/SPARCworks interface
3 ;; Copyright (C) 1995 Sun Microsystems, Inc.
5 ;; Maintainer: Eduardo Pelegri-Llopart <eduardo.pelegri-llopart@Eng.Sun.COM>
6 ;; Author: Eduardo Pelegri-Llopart <eduardo.pelegri-llopart@Eng.Sun.COM>
8 ;; Keywords: SPARCworks EOS Era on SPARCworks Debugger dbx
12 ;; Please send feedback to eduardo.pelegri-llopart@eng.sun.com
16 (require 'eos-common "sun-eos-common")
22 (defvar eos::current-hollow-arrow nil)
23 (defvar eos::current-solid-arrow nil)
24 (defvar eos::current-dbx-proc-id nil
25 "TT id for the current dbx")
26 (defvar eos::current-debugger-clique-id nil
27 "Clique_ID for the current debugger/dbx")
31 (defvar eos::currentpc-inst "/* XPM */
32 static char * file[] = {
34 \" s background c #BDBDBDBDBDBD\",
35 \". c #000000000000\",
36 \"X c #0000FFFF0000\",
37 \"o c #000077770000\",
38 \"O c #000044440000\",
51 (defvar eos::currentpc-inst-alt
53 static char * file[] = {
55 \" s background c #BDBDBDBDBDBD\",
56 \". c #000000000000\",
57 \"X c #0000FFFF0000\",
58 \"o c #000077770000\",
59 \"O c #000044440000\",
72 (defvar eos::visitedpc-inst
74 static char * file[] ={
76 \" s background c #BDBDBDBDBDBD\",
77 \". c #000000000000\",
78 \"X c #AFAFAFAFAFAF\",
79 \"o c #7E7E7E7EA9A9\",
80 \"O c #666633339999\",
93 (defvar eos::visitedpc-inst-alt
95 static char * file[] ={
97 \" s background c #BDBDBDBDBDBD\",
98 \". c #000000000000\",
99 \"X c #AFAFAFAFAFAF\",
100 \"o c #7E7E7E7EA9A9\",
101 \"O c #666633339999\",
107 \" .XooooooooooO. \",
114 (defvar eos::breakpoint-inst
116 static char * file[] ={
118 \" s background c #BDBDBDBDBDBD\",
119 \". c #000000000000\",
120 \"X c #FFFF66666666\",
121 \"o c #FFFF00000000\",
122 \"O c #777700000000\",
135 (defvar eos::breakpoint-inst-alt
137 static char * file[] ={
139 \" s background c #BDBDBDBDBDBD\",
140 \". c #000000000000\",
141 \"X c #FFFF66666666\",
142 \"o c #FFFF00000000\",
143 \"O c #777700000000\",
156 ;; The TT protocol does not provide enough information to
157 ;; use the eos::disabledBreakpoint glyph.
159 (defvar eos::disabledBreakpoint-inst
161 static char * file[] ={
163 \" s background c #BDBDBDBDBDBD\",
164 \". c #000000000000\",
179 (defvar eos::disabledBreakpoint-inst-alt
181 static char * file[] ={
183 \" s background c #BDBDBDBDBDBD\",
184 \". c #000000000000\",
199 (defvar eos::dbx-pattern-list nil)
201 (defun eos::debugger-startup ()
202 ;; Actions to do at startup for eos-debugger.el
203 (make-face 'stop-face)
204 (make-face 'solid-arrow-face)
205 (make-face 'hollow-arrow-face)
207 (set-face-foreground 'stop-face eos::stop-color)
208 (set-face-background 'stop-face
209 (face-background (get-face 'default)))
210 (set-face-foreground 'solid-arrow-face eos::solid-arrow-color)
211 (set-face-background 'solid-arrow-face
212 (face-background (get-face 'default)))
213 (set-face-foreground 'hollow-arrow-face eos::hollow-arrow-color)
214 (set-face-background 'hollow-arrow-face
215 (face-background (get-face 'default)))
217 (setq eos::dbx-pattern-list ; list of dbx TT patterns
218 (eos::create-debugger-patterns))
220 ;; should there be only one stop-face, with different properties depending
221 ;; on the frame/device?
223 (eos::annotation-set-inst 'debugger-stop 'x eos::breakpoint-inst [nothing])
224 (eos::annotation-set-inst 'debugger-stop 'tty "[S]" [nothing])
225 (eos::annotation-set-face 'debugger-stop 'x
226 (get-face 'stop-face) (get-face 'stop-face))
227 (eos::annotation-set-face 'debugger-stop 'tty
228 (get-face 'highlight) (get-face 'highlight))
230 (eos::annotation-set-inst 'debugger-hollow-arrow 'x eos::visitedpc-inst [nothing])
231 (eos::annotation-set-inst 'debugger-hollow-arrow 'tty "[]>" [nothing])
232 (eos::annotation-set-face 'debugger-hollow-arrow 'x
233 (get-face 'hollow-arrow-face)
234 (get-face 'hollow-arrow-face))
235 (eos::annotation-set-face 'debugger-hollow-arrow 'tty
236 (get-face 'highlight) (get-face 'highlight))
238 (eos::annotation-set-inst 'debugger-solid-arrow 'x eos::currentpc-inst [nothing])
239 (eos::annotation-set-inst 'debugger-solid-arrow 'tty "=>" [nothing])
240 (eos::annotation-set-face 'debugger-solid-arrow 'x
241 (get-face 'solid-arrow-face)
242 (get-face 'solid-arrow-face))
243 (eos::annotation-set-face 'debugger-solid-arrow 'tty
244 (get-face 'highlight) (get-face 'highlight))
247 ;; Not yet ready for prime time.
249 (defvar eos::fill-stack-buffer nil
250 "when t don't try any stack tracing")
252 (defvar eos::stack-buffer "*Eos Stack*"
253 "name of buffer where to log Stack")
255 (defun eos::empty-stack ()
256 ;; No valid stack data - e.g. resume/run program -
257 (if eos::fill-stack-buffer
259 (set-buffer (get-buffer-create eos::stack-buffer))
260 (toggle-read-only -1)
261 (delete-region (point-min) (point-max))
265 (defun eos::load-stack ()
266 ;; Should send a TT message requesting for the stack information;
267 ;; with the real work done in a callback
268 (if eos::fill-stack-buffer
269 (eos::stack-test 1)))
271 (defun eos::visit-stack (stackpos)
272 (if eos::fill-stack-buffer
278 (defun eos::create-stack-patterns ()
279 ;; returns a list of patterns
281 (make-an-observer "SPRO_SPIDER_FRAMES" 'eos::spro_spider_frames)
284 (defun eos::spro_spider_frames (msg pat)
285 ;; We have received a SPRO_SPIDER_FRAMES notice
286 (let ((count (get-tooltalk-message-attribute msg 'args_count))
288 (set-buffer (get-buffer-create eos::stack-buffer))
289 (toggle-read-only -1)
291 ;; optional leading comment
292 (if (equal (get-tooltalk-message-attribute msg 'arg_type i)
295 (insert (get-tooltalk-message-attribute msg 'arg_val i))
298 (insert (if (equal (get-tooltalk-message-attribute msg 'arg_ival i)
301 (insert (format "[%s] %s%s %s:%s"
303 (get-tooltalk-message-attribute msg 'arg_ival i)
305 (get-tooltalk-message-attribute msg 'arg_val (+ i 1))
307 (get-tooltalk-message-attribute msg 'arg_val (+ i 2))
309 (get-tooltalk-message-attribute msg 'arg_val (+ i 3))
311 (get-tooltalk-message-attribute msg 'arg_val (+ i 4))))
313 (if (equal (get-tooltalk-message-attribute msg 'arg_type i)
316 (insert (get-tooltalk-message-attribute msg 'arg_val i))
320 ;; (return-tooltalk-message msg)
323 (defun eos::spider-stack-callback (msg pat)
324 ;; Callback after processing a spider_stack request
325 (destroy-tooltalk-message msg)
328 (defmacro eos::stack-tt-args (spider-id clique-id hidden verbose quick starting-index count)
333 'handler (, spider-id)
334 'op "SPRO_SPIDER_STACK"
335 'callback 'eos::spider-stack-callback
337 (list 'TT_IN (, clique-id) "Context_ID")
338 (list 'TT_IN (, hidden) "Boolean")
339 (list 'TT_IN (, verbose) "Boolean")
340 (list 'TT_IN (, quick) "Boolean")
341 (list 'TT_IN (, starting-index) "int")
342 (list 'TT_IN (, count) "int"))
345 (defun eos::stack-test (starting-index)
346 (let ((msg (make-tooltalk-message
347 (eos::stack-tt-args eos::current-dbx-proc-id
348 eos::current-debugger-clique-id
355 (send-tooltalk-message msg)
356 ;; (destroy-tooltalk-message msg)
359 ;; (setq eos::fill-stack-buffer t)
360 ;; (setq eos::fill-stack-buffer nil)
361 ;; (setq eos::stack-pattern-list (eos::create-stack-patterns))
362 ;; (mapcar 'register-tooltalk-pattern eos::stack-pattern-list)
363 ;; (mapcar 'unregister-tooltalk-pattern eos::stack-pattern-list)
364 ;; (eos::stack-test 1)
367 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
372 (defun eos::spro_te_eventset (msg pat)
373 ;; thread_id trap_id string string filename lineno string string
375 (get-tooltalk-message-attribute msg 'arg_val 1))
377 (get-tooltalk-message-attribute msg 'arg_val 4))
379 (read (get-tooltalk-message-attribute msg 'arg_ival 5))))
380 (eos::add-annotation 'debugger-stop filename lineno trap-id)
381 ;; (return-tooltalk-message msg)
384 (defun eos::spro_te_eventdel (msg pat)
385 ;; trap_id string string filename lineno string string
387 (get-tooltalk-message-attribute msg 'arg_val 0))
389 (get-tooltalk-message-attribute msg 'arg_val 3))
391 (read (get-tooltalk-message-attribute msg 'arg_ival 4))))
392 (eos::delete-annotation 'debugger-stop filename lineno trap-id)
393 ;; (return-tooltalk-message msg)
396 (defun eos::spro_te_stopped (msg pat)
397 ;; thread_id filename procname lineno filename procname lineno
398 (let* ((filename-hollow
399 (get-tooltalk-message-attribute msg 'arg_val 1))
401 (get-tooltalk-message-attribute msg 'arg_val 2))
403 (read (get-tooltalk-message-attribute msg 'arg_ival 3)))
405 (get-tooltalk-message-attribute msg 'arg_val 4))
407 (read (get-tooltalk-message-attribute msg 'arg_ival 6)))
409 (setq eos::current-solid-arrow
410 (eos::make-annotation-visible eos::current-solid-arrow
413 'debugger-solid-arrow))
414 (if (or (not (equal filename-solid filename-hollow))
415 (not (equal lineno-solid lineno-hollow)))
416 (setq eos::current-hollow-arrow
417 (eos::make-annotation-visible eos::current-hollow-arrow
420 'debugger-hollow-arrow)))
421 ;; (return-tooltalk-message msg)
425 ;; Tracking current id's
428 (defun eos::update-dbx-proc-id (msg)
429 (setq eos::current-dbx-proc-id
430 (get-tooltalk-message-attribute msg 'sender))
431 ;; the following is needed to make toolbar entries be active or not
432 ;; I think it is not needed in 19.13
433 (eos::select-debugger-frame eos::debugger-frame)
436 (defun eos::update-current-debugger-clique-id (msg)
437 (setq eos::current-debugger-clique-id
438 (get-tooltalk-message-attribute msg 'arg_val 0))
446 (defun eos::update-pids (msg)
447 (eos::update-dbx-proc-id msg)
448 (eos::update-current-debugger-clique-id msg))
450 (defun eos::internal-clear-annotations (stack arrows stops &optional clique)
455 (eos::make-annotation-invisible eos::current-hollow-arrow)
456 (eos::make-annotation-invisible eos::current-solid-arrow)))
459 (setq eos::current-debugger-clique-id nil)
460 ;; not needed in 19.13?
461 (eos::select-debugger-frame eos::debugger-frame)))
463 (eos::remove-all-from-annotation-list 'debugger-stop)))
466 (defun eos::clear-arrows (msg pat)
467 (eos::internal-clear-annotations t t nil)
468 ;; (return-tooltalk-message msg)
471 (defun eos::update-clear-stops (msg pat)
472 (eos::update-pids msg)
473 (eos::internal-clear-annotations t nil t)
474 ;; (return-tooltalk-message msg)
477 (defun eos::update-clear-arrows-stops (msg pat)
478 (eos::update-pids msg)
479 (eos::internal-clear-annotations t t t)
480 ;; (return-tooltalk-message msg)
483 (defun eos::clear-arrows-stops (msg pat)
485 (get-tooltalk-message-attribute msg 'sender)))
486 (if (equal eos::current-dbx-proc-id this-proc-id)
488 (eos::internal-clear-annotations t t t)
489 ;; (return-tooltalk-message msg)
496 (defun eos::spro_detach (msg pat)
497 ;; a detach notification has been received. this means dbx/debugger
499 (eos::internal-clear-annotations t t t t)
500 (eos::dismiss-print-frame))
502 (defun eos::spro_te_location (msg pat)
503 ;; thread_id filename procname lineno filename procname lineno
504 (let* ((filename-hollow
505 (get-tooltalk-message-attribute msg 'arg_val 1))
507 (read (get-tooltalk-message-attribute msg 'arg_ival 3)))
509 (get-tooltalk-message-attribute msg 'arg_val 4))
511 (read (get-tooltalk-message-attribute msg 'arg_ival 6)))
513 (setq eos::current-solid-arrow
514 (eos::make-annotation-visible eos::current-solid-arrow
517 'debugger-solid-arrow))
518 (if (or (not (equal filename-solid filename-hollow))
519 (not (equal lineno-solid lineno-hollow)))
520 (setq eos::current-hollow-arrow
521 (eos::make-annotation-visible eos::current-hollow-arrow
524 'debugger-hollow-arrow)))
525 ;; (return-tooltalk-message msg)
528 (defun eos::spro_te_visit (msg pat)
529 ;; thread_id filename procname lineno stackpos
531 (get-tooltalk-message-attribute msg 'arg_val 1))
533 (get-tooltalk-message-attribute msg 'arg_val 2))
535 (read (get-tooltalk-message-attribute msg 'arg_ival 3)))
537 (read (get-tooltalk-message-attribute msg 'arg_ival 4)))
539 (eos::make-annotation-invisible eos::current-hollow-arrow)
540 (if (equal stackpos 1)
542 (eos::make-annotation-invisible eos::current-solid-arrow)
543 (setq eos::current-solid-arrow
544 (eos::make-annotation-visible eos::current-solid-arrow
547 'debugger-solid-arrow))
549 (setq eos::current-hollow-arrow
550 (eos::make-annotation-visible eos::current-hollow-arrow
553 'debugger-hollow-arrow))
555 ;; (return-tooltalk-message msg)
556 (eos::visit-stack stackpos)
559 ;; generate a list of patterns
560 ;; so it can be registered and unregistered.
563 (defun eos::create-debugger-patterns ()
564 ;; returns a list of patterns
566 (make-an-observer "SPRO_TE_STOPPED" 'eos::spro_te_stopped)
567 (make-an-observer "SPRO_SE_STARTED" 'eos::clear-arrows)
568 (make-an-observer "SPRO_TE_STEPPED" 'eos::clear-arrows)
569 (make-an-observer "SPRO_TE_CONTINUED" 'eos::clear-arrows)
570 (make-an-observer "SPRO_SE_DROPPED" 'eos::clear-arrows-stops)
571 (make-an-observer "SPRO_SE_DEBUGGED" 'eos::update-clear-stops)
572 (make-an-observer "SPRO_SE_REVIVED" 'eos::update-clear-arrows-stops)
573 (make-an-observer "SPRO_SE_ATTACHED" 'eos::update-clear-arrows-stops)
574 (make-an-observer "SPRO_SE_GONE" 'eos::clear-arrows)
575 (make-an-observer "SPRO_TE_LOCATION" 'eos::spro_te_location)
576 (make-an-observer "SPRO_TE_VISIT" 'eos::spro_te_visit)
577 (make-an-observer "SPRO_TE_EVENTSET" 'eos::spro_te_eventset)
578 (make-an-observer "SPRO_TE_EVENTDEL" 'eos::spro_te_eventdel)
579 (make-an-observer "SPRO_DETACH" 'eos::spro_detach)
582 (defun eos::register-debugger-patterns ()
583 ;; register all dbx patterns
584 (mapcar 'register-tooltalk-pattern eos::dbx-pattern-list)
585 (eos::register-debugger-extra-patterns))
587 (defun eos::unregister-debugger-patterns ()
588 ;; unregister all dbx patterns
589 (mapcar 'unregister-tooltalk-pattern eos::dbx-pattern-list)
590 (eos::unregister-debugger-extra-patterns))
592 (provide 'eos-debugger)
594 ;;; sun-eos-debugger.el ends here