409b55b2694cef1081bec9908dad500ae8ae4a09
[packages] / xemacs-packages / Sun / sun-eos-debugger.el
1 ;;; sun-eos-debugger.el --- Implements the XEmacs/SPARCworks interface
2
3 ;; Copyright (C) 1995 Sun Microsystems, Inc.
4
5 ;; Maintainer:  Eduardo Pelegri-Llopart <eduardo.pelegri-llopart@Eng.Sun.COM>
6 ;; Author:      Eduardo Pelegri-Llopart <eduardo.pelegri-llopart@Eng.Sun.COM>
7
8 ;; Keywords:    SPARCworks EOS Era on SPARCworks Debugger dbx
9
10 ;;; Commentary:
11
12 ;; Please send feedback to eduardo.pelegri-llopart@eng.sun.com
13
14 ;;; Code:
15
16 (require 'eos-common "sun-eos-common")
17
18 ;;; =================
19 ;;; debugger protocol
20 ;;; =================
21
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")
28
29 ;; currentpc.color
30
31 (defvar eos::currentpc-inst   "/* XPM */
32 static char * file[] = {
33 \"16 11 5 1\",
34 \"      s background c #BDBDBDBDBDBD\",
35 \".     c #000000000000\",
36 \"X     c #0000FFFF0000\",
37 \"o     c #000077770000\",
38 \"O     c #000044440000\",
39 \"         .      \",
40 \"         ..     \",
41 \"         .X.    \",
42 \" .........XX.   \",
43 \" .XXXXXXXXXoX.  \",
44 \" .Xooooooooooo. \",
45 \" .oOOOOOOOOoO.  \",
46 \" .........OO.   \",
47 \"         .O.    \",
48 \"         ..     \",
49 \"         .      \"};")
50
51 (defvar eos::currentpc-inst-alt
52    "/* XPM */
53 static char * file[] = {
54 \"16 11 5 1\",
55 \"      s background c #BDBDBDBDBDBD\",
56 \".     c #000000000000\",
57 \"X     c #0000FFFF0000\",
58 \"o     c #000077770000\",
59 \"O     c #000044440000\",
60 \"         .      \",
61 \"         ..     \",
62 \"         .X.    \",
63 \" .........XX.   \",
64 \" .XXXXXXXXXoX.  \",
65 \" .Xooooooooooo. \",
66 \" .oOOOOOOOOoO.  \",
67 \" .........OO.   \",
68 \"         .O.    \",
69 \"         ..   ..\",
70 \"         .    ..\"};")
71
72 (defvar eos::visitedpc-inst
73    "/* XPM */
74 static char * file[] ={
75 \"16 11 5 1\",
76 \"      s background c #BDBDBDBDBDBD\",
77 \".     c #000000000000\",
78 \"X     c #AFAFAFAFAFAF\",
79 \"o     c #7E7E7E7EA9A9\",
80 \"O     c #666633339999\",
81 \"         .      \",
82 \"         ..     \",
83 \"         .X.    \",
84 \" .........XX.   \",
85 \" .XXXXXXXXXoX.  \",
86 \" .XooooooooooO. \",
87 \" .XOOOOOOOOoO.  \",
88 \" .........OO.   \",
89 \"         .O.    \",
90 \"         ..     \",
91 \"         .      \"};")
92
93 (defvar eos::visitedpc-inst-alt
94    "/* XPM */
95 static char * file[] ={
96 \"16 11 5 1\",
97 \"      s background c #BDBDBDBDBDBD\",
98 \".     c #000000000000\",
99 \"X     c #AFAFAFAFAFAF\",
100 \"o     c #7E7E7E7EA9A9\",
101 \"O     c #666633339999\",
102 \"         .      \",
103 \"         ..     \",
104 \"         .X.    \",
105 \" .........XX.   \",
106 \" .XXXXXXXXXoX.  \",
107 \" .XooooooooooO. \",
108 \" .XOOOOOOOOoO.  \",
109 \" .........OO.   \",
110 \"         .O.    \",
111 \"         ..   ..\",
112 \"         .    ..\"};")
113
114 (defvar eos::breakpoint-inst
115    "/* XPM */
116 static char * file[] ={
117 \"11 11 5 1\",
118 \"      s background c #BDBDBDBDBDBD\",
119 \".     c #000000000000\",
120 \"X     c #FFFF66666666\",
121 \"o     c #FFFF00000000\",
122 \"O     c #777700000000\",
123 \"   .....   \",
124 \"  .XXXXX.  \",
125 \" .XXoooXX. \",
126 \".XXoooooXO.\",
127 \".XoooooooO.\",
128 \".XoooooooO.\",
129 \".XoooooooO.\",
130 \".XXoooooOO.\",
131 \" .XXoooOO. \",
132 \"  .OOOOO.  \",
133 \"   .....   \"};")
134
135 (defvar eos::breakpoint-inst-alt
136    "/* XPM */
137 static char * file[] ={
138 \"11 11 5 1\",
139 \"      s background c #BDBDBDBDBDBD\",
140 \".     c #000000000000\",
141 \"X     c #FFFF66666666\",
142 \"o     c #FFFF00000000\",
143 \"O     c #777700000000\",
144 \"   .....   \",
145 \"  .XXXXX.  \",
146 \" .XXoooXX. \",
147 \".XXoooooXO.\",
148 \".XoooooooO.\",
149 \".XoooooooO.\",
150 \".XoooooooO.\",
151 \".XXoooooOO.\",
152 \" .XXoooOO. \",
153 \"  .OOOOO...\",
154 \"   ..... ..\"};")
155
156 ;; The TT protocol does not provide enough information to
157 ;; use the eos::disabledBreakpoint glyph.
158
159 (defvar eos::disabledBreakpoint-inst
160    "/* XPM */
161 static char * file[] ={
162 \"11 11 4 1\",
163 \"      s background c #BDBDBDBDBDBD\",
164 \".     c #000000000000\",
165 \"X     c Grey\",
166 \"O     c Grey80\",
167 \"   .....   \",
168 \"  .XXXXX.  \",
169 \" .XXXXXXX. \",
170 \".XXXXXXXXO.\",
171 \".XXXXXXXXO.\",
172 \".XXXXXXXXO.\",
173 \".XXXXXXXXO.\",
174 \".XXXXXXXOO.\",
175 \" .XXXXXOO. \",
176 \"  .OOOOO.  \",
177 \"   .....   \"};")
178
179 (defvar eos::disabledBreakpoint-inst-alt
180    "/* XPM */
181 static char * file[] ={
182 \"11 11 4 1\",
183 \"      s background c #BDBDBDBDBDBD\",
184 \".     c #000000000000\",
185 \"X     c Grey\",
186 \"O     c Grey80\",
187 \"   .....   \",
188 \"  .XXXXX.  \",
189 \" .XXXXXXX. \",
190 \".XXXXXXXXO.\",
191 \".XXXXXXXXO.\",
192 \".XXXXXXXXO.\",
193 \".XXXXXXXXO.\",
194 \".XXXXXXXOO.\",
195 \" .XXXXXOO. \",
196 \"  .OOOOO...\",
197 \"   ..... ..\"};")
198
199 (defvar eos::dbx-pattern-list nil)
200
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)
206   
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)))
216
217   (setq eos::dbx-pattern-list           ; list of dbx TT patterns
218         (eos::create-debugger-patterns))
219
220 ;; should there be only one stop-face, with different properties depending
221 ;; on the frame/device?
222
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))
229
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))
237
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))
245 )
246
247 ;; Not yet ready for prime time.
248
249 (defvar eos::fill-stack-buffer nil
250   "when t don't try any stack tracing")
251
252 (defvar eos::stack-buffer "*Eos Stack*"
253   "name of buffer where to log Stack")
254
255 (defun eos::empty-stack ()
256   ;; No valid stack data - e.g. resume/run program -
257   (if eos::fill-stack-buffer
258       (progn
259         (set-buffer (get-buffer-create eos::stack-buffer))
260         (toggle-read-only -1)
261         (delete-region (point-min) (point-max))
262         (toggle-read-only 1)
263         )))
264
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)))
270
271 (defun eos::visit-stack (stackpos)
272   (if eos::fill-stack-buffer
273       (progn
274         (eos::empty-stack)
275         (eos::stack-test 1)
276         )))
277
278 (defun eos::create-stack-patterns ()
279   ;; returns a list of patterns
280   (list
281    (make-an-observer "SPRO_SPIDER_FRAMES" 'eos::spro_spider_frames)
282    ))
283
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))
287         (i 1))
288     (set-buffer (get-buffer-create eos::stack-buffer))
289     (toggle-read-only -1)
290     (while (< i count)
291       ;; optional leading comment
292       (if (equal (get-tooltalk-message-attribute msg 'arg_type i)
293                  "Stack_Info1")
294           (progn
295             (insert (get-tooltalk-message-attribute msg 'arg_val i))
296             (setq i (1+ i))))
297       ;; current frame?
298       (insert (if (equal (get-tooltalk-message-attribute msg 'arg_ival i)
299                          "0") "  " "> "))
300       (setq i (1+ i))
301       (insert (format "[%s] %s%s %s:%s"
302                       ;; frameno
303                       (get-tooltalk-message-attribute msg 'arg_ival i)
304                       ;; funcname
305                       (get-tooltalk-message-attribute msg 'arg_val (+ i 1))
306                       ;; funcargs
307                       (get-tooltalk-message-attribute msg 'arg_val (+ i 2))
308                       ;; source
309                       (get-tooltalk-message-attribute msg 'arg_val (+ i 3))
310                       ;; line
311                       (get-tooltalk-message-attribute msg 'arg_val (+ i 4))))
312       (setq i (+ i 5))
313       (if (equal (get-tooltalk-message-attribute msg 'arg_type i)
314                  "Stack_Info2")
315           (progn
316             (insert (get-tooltalk-message-attribute msg 'arg_val i))
317             (setq i (1+ i))))
318       (insert "\n"))
319     (toggle-read-only 1)
320 ;;    (return-tooltalk-message msg)
321     ))
322
323 (defun eos::spider-stack-callback (msg pat)
324   ;; Callback after processing a spider_stack request
325   (destroy-tooltalk-message msg)
326   )
327
328 (defmacro eos::stack-tt-args (spider-id clique-id hidden verbose quick starting-index count)
329   (` (list
330       'class TT_REQUEST
331       'address TT_HANDLER
332       'scope TT_SESSION
333       'handler (, spider-id)
334       'op "SPRO_SPIDER_STACK"
335       'callback 'eos::spider-stack-callback
336       'args (list
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"))
343       )))
344
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
349                                   0     ; hidden
350                                   1     ; verbose
351                                   0     ; quick
352                                   starting-index
353                                   4     ; count
354                                   ))))
355     (send-tooltalk-message msg)
356 ;;    (destroy-tooltalk-message msg)
357     ))
358
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)
365
366
367 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
368
369
370 ;;
371
372 (defun eos::spro_te_eventset (msg pat)
373   ;; thread_id trap_id string string filename lineno string string
374   (let* ((trap-id
375           (get-tooltalk-message-attribute msg 'arg_val 1))
376          (filename
377           (get-tooltalk-message-attribute msg 'arg_val 4))
378          (lineno
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)
382     ))
383
384 (defun eos::spro_te_eventdel (msg pat)
385   ;; trap_id string string filename lineno string string
386   (let* ((trap-id
387           (get-tooltalk-message-attribute msg 'arg_val 0))
388          (filename
389           (get-tooltalk-message-attribute msg 'arg_val 3))
390          (lineno
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)
394     ))
395
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))
400          (procname-hollow
401           (get-tooltalk-message-attribute msg 'arg_val 2))
402          (lineno-hollow
403           (read (get-tooltalk-message-attribute msg 'arg_ival 3)))
404          (filename-solid
405           (get-tooltalk-message-attribute msg 'arg_val 4))
406          (lineno-solid
407           (read (get-tooltalk-message-attribute msg 'arg_ival 6)))
408          )
409     (setq eos::current-solid-arrow
410           (eos::make-annotation-visible eos::current-solid-arrow
411                                         filename-solid
412                                         lineno-solid
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
418                                  filename-hollow
419                                  lineno-hollow
420                                  'debugger-hollow-arrow)))
421 ;;    (return-tooltalk-message msg)
422     (eos::load-stack)
423     ))
424
425 ;; Tracking current id's
426 ;;
427
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)
434   )
435
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))
439   )
440
441 ;;
442 ;; Updating arrows
443 ;;
444
445
446 (defun eos::update-pids (msg)
447   (eos::update-dbx-proc-id msg)
448   (eos::update-current-debugger-clique-id msg))
449
450 (defun eos::internal-clear-annotations (stack arrows stops &optional clique)
451   (if stack
452       (eos::empty-stack))
453   (if arrows
454       (progn
455         (eos::make-annotation-invisible eos::current-hollow-arrow)
456         (eos::make-annotation-invisible eos::current-solid-arrow)))
457   (if clique
458       (progn
459         (setq eos::current-debugger-clique-id nil)
460         ;; not needed in 19.13?
461         (eos::select-debugger-frame eos::debugger-frame)))
462   (if stops
463       (eos::remove-all-from-annotation-list 'debugger-stop)))
464
465
466 (defun eos::clear-arrows (msg pat)
467   (eos::internal-clear-annotations t t nil)
468 ;;  (return-tooltalk-message msg)
469   )
470
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)
475   )
476
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)
481   )
482
483 (defun eos::clear-arrows-stops (msg pat)
484   (let ((this-proc-id
485          (get-tooltalk-message-attribute msg 'sender)))
486     (if (equal eos::current-dbx-proc-id this-proc-id)
487         (progn
488           (eos::internal-clear-annotations t t t)
489           ;;  (return-tooltalk-message msg)
490           ))))
491
492 ;;
493
494 ;;
495
496 (defun eos::spro_detach (msg pat)
497   ;; a detach notification has been received. this means dbx/debugger
498   ;; is exiting
499   (eos::internal-clear-annotations t t t t)
500   (eos::dismiss-print-frame))
501
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))
506          (lineno-hollow
507           (read (get-tooltalk-message-attribute msg 'arg_ival 3)))
508          (filename-solid
509           (get-tooltalk-message-attribute msg 'arg_val 4))
510          (lineno-solid
511           (read (get-tooltalk-message-attribute msg 'arg_ival 6)))
512          )
513     (setq eos::current-solid-arrow
514           (eos::make-annotation-visible eos::current-solid-arrow
515                              filename-solid
516                              lineno-solid
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
522                                  filename-hollow
523                                  lineno-hollow
524                                  'debugger-hollow-arrow)))
525 ;;    (return-tooltalk-message msg)
526     ))
527
528 (defun eos::spro_te_visit (msg pat)
529   ;; thread_id filename procname lineno stackpos
530   (let* ((filename
531           (get-tooltalk-message-attribute msg 'arg_val 1))
532          (procname
533           (get-tooltalk-message-attribute msg 'arg_val 2))
534          (lineno
535           (read (get-tooltalk-message-attribute msg 'arg_ival 3)))
536          (stackpos
537           (read (get-tooltalk-message-attribute msg 'arg_ival 4)))
538          )
539     (eos::make-annotation-invisible eos::current-hollow-arrow)
540     (if (equal stackpos 1)
541         (progn
542           (eos::make-annotation-invisible eos::current-solid-arrow)
543           (setq eos::current-solid-arrow
544                 (eos::make-annotation-visible eos::current-solid-arrow
545                                               filename
546                                               lineno
547                                               'debugger-solid-arrow))
548           )
549       (setq eos::current-hollow-arrow
550             (eos::make-annotation-visible eos::current-hollow-arrow
551                                           filename
552                                           lineno
553                                           'debugger-hollow-arrow))
554       )
555 ;;    (return-tooltalk-message msg)
556     (eos::visit-stack stackpos)
557     ))
558
559 ;; generate a list of patterns
560 ;; so it can be registered and unregistered.
561
562
563 (defun eos::create-debugger-patterns ()
564   ;; returns a list of patterns
565   (list
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)
580    ))
581
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))
586
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))
591
592 (provide 'eos-debugger)
593
594 ;;; sun-eos-debugger.el ends here