diff lisp/eos/sun-eos-debugger.el @ 0:376386a54a3c r19-14

Import from CVS: tag r19-14
author cvs
date Mon, 13 Aug 2007 08:45:50 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/eos/sun-eos-debugger.el	Mon Aug 13 08:45:50 2007 +0200
@@ -0,0 +1,594 @@
+;;; sun-eos-debugger.el --- Implements the XEmacs/SPARCworks interface
+
+;; Copyright (C) 1995 Sun Microsystems, Inc.
+
+;; Maintainer:	Eduardo Pelegri-Llopart <eduardo.pelegri-llopart@Eng.Sun.COM>
+;; Author:      Eduardo Pelegri-Llopart <eduardo.pelegri-llopart@Eng.Sun.COM>
+
+;; Keywords:	SPARCworks EOS Era on SPARCworks Debugger dbx
+
+;;; Commentary:
+
+;; Please send feedback to eduardo.pelegri-llopart@eng.sun.com
+
+;;; Code:
+
+(require 'eos-common "sun-eos-common")
+
+;;; =================
+;;; debugger protocol
+;;; =================
+
+(defvar eos::current-hollow-arrow nil)
+(defvar eos::current-solid-arrow nil)
+(defvar eos::current-dbx-proc-id nil
+  "TT id for the current dbx")
+(defvar eos::current-debugger-clique-id nil
+  "Clique_ID for the current debugger/dbx")
+
+;; currentpc.color
+
+(defvar eos::currentpc-inst   "/* XPM */
+static char * file[] = {
+\"16 11 5 1\",
+\" 	s background c #BDBDBDBDBDBD\",
+\".	c #000000000000\",
+\"X	c #0000FFFF0000\",
+\"o	c #000077770000\",
+\"O	c #000044440000\",
+\"         .      \",
+\"         ..     \",
+\"         .X.    \",
+\" .........XX.   \",
+\" .XXXXXXXXXoX.  \",
+\" .Xooooooooooo. \",
+\" .oOOOOOOOOoO.  \",
+\" .........OO.   \",
+\"         .O.    \",
+\"         ..     \",
+\"         .      \"};")
+
+(defvar eos::currentpc-inst-alt
+   "/* XPM */
+static char * file[] = {
+\"16 11 5 1\",
+\" 	s background c #BDBDBDBDBDBD\",
+\".	c #000000000000\",
+\"X	c #0000FFFF0000\",
+\"o	c #000077770000\",
+\"O	c #000044440000\",
+\"         .      \",
+\"         ..     \",
+\"         .X.    \",
+\" .........XX.   \",
+\" .XXXXXXXXXoX.  \",
+\" .Xooooooooooo. \",
+\" .oOOOOOOOOoO.  \",
+\" .........OO.   \",
+\"         .O.    \",
+\"         ..   ..\",
+\"         .    ..\"};")
+
+(defvar eos::visitedpc-inst
+   "/* XPM */
+static char * file[] ={
+\"16 11 5 1\",
+\" 	s background c #BDBDBDBDBDBD\",
+\".	c #000000000000\",
+\"X	c #AFAFAFAFAFAF\",
+\"o	c #7E7E7E7EA9A9\",
+\"O	c #666633339999\",
+\"         .      \",
+\"         ..     \",
+\"         .X.    \",
+\" .........XX.   \",
+\" .XXXXXXXXXoX.  \",
+\" .XooooooooooO. \",
+\" .XOOOOOOOOoO.  \",
+\" .........OO.   \",
+\"         .O.    \",
+\"         ..     \",
+\"         .      \"};")
+
+(defvar eos::visitedpc-inst-alt
+   "/* XPM */
+static char * file[] ={
+\"16 11 5 1\",
+\" 	s background c #BDBDBDBDBDBD\",
+\".	c #000000000000\",
+\"X	c #AFAFAFAFAFAF\",
+\"o	c #7E7E7E7EA9A9\",
+\"O	c #666633339999\",
+\"         .      \",
+\"         ..     \",
+\"         .X.    \",
+\" .........XX.   \",
+\" .XXXXXXXXXoX.  \",
+\" .XooooooooooO. \",
+\" .XOOOOOOOOoO.  \",
+\" .........OO.   \",
+\"         .O.    \",
+\"         ..   ..\",
+\"         .    ..\"};")
+
+(defvar eos::breakpoint-inst
+   "/* XPM */
+static char * file[] ={
+\"11 11 5 1\",
+\" 	s background c #BDBDBDBDBDBD\",
+\".	c #000000000000\",
+\"X	c #FFFF66666666\",
+\"o	c #FFFF00000000\",
+\"O	c #777700000000\",
+\"   .....   \",
+\"  .XXXXX.  \",
+\" .XXoooXX. \",
+\".XXoooooXO.\",
+\".XoooooooO.\",
+\".XoooooooO.\",
+\".XoooooooO.\",
+\".XXoooooOO.\",
+\" .XXoooOO. \",
+\"  .OOOOO.  \",
+\"   .....   \"};")
+
+(defvar eos::breakpoint-inst-alt
+   "/* XPM */
+static char * file[] ={
+\"11 11 5 1\",
+\" 	s background c #BDBDBDBDBDBD\",
+\".	c #000000000000\",
+\"X	c #FFFF66666666\",
+\"o	c #FFFF00000000\",
+\"O	c #777700000000\",
+\"   .....   \",
+\"  .XXXXX.  \",
+\" .XXoooXX. \",
+\".XXoooooXO.\",
+\".XoooooooO.\",
+\".XoooooooO.\",
+\".XoooooooO.\",
+\".XXoooooOO.\",
+\" .XXoooOO. \",
+\"  .OOOOO...\",
+\"   ..... ..\"};")
+
+;; The TT protocol does not provide enough information to
+;; use the eos::disabledBreakpoint glyph.
+
+(defvar eos::disabledBreakpoint-inst
+   "/* XPM */
+static char * file[] ={
+\"11 11 4 1\",
+\" 	s background c #BDBDBDBDBDBD\",
+\".	c #000000000000\",
+\"X	c Grey\",
+\"O	c Grey80\",
+\"   .....   \",
+\"  .XXXXX.  \",
+\" .XXXXXXX. \",
+\".XXXXXXXXO.\",
+\".XXXXXXXXO.\",
+\".XXXXXXXXO.\",
+\".XXXXXXXXO.\",
+\".XXXXXXXOO.\",
+\" .XXXXXOO. \",
+\"  .OOOOO.  \",
+\"   .....   \"};")
+
+(defvar eos::disabledBreakpoint-inst-alt
+   "/* XPM */
+static char * file[] ={
+\"11 11 4 1\",
+\" 	s background c #BDBDBDBDBDBD\",
+\".	c #000000000000\",
+\"X	c Grey\",
+\"O	c Grey80\",
+\"   .....   \",
+\"  .XXXXX.  \",
+\" .XXXXXXX. \",
+\".XXXXXXXXO.\",
+\".XXXXXXXXO.\",
+\".XXXXXXXXO.\",
+\".XXXXXXXXO.\",
+\".XXXXXXXOO.\",
+\" .XXXXXOO. \",
+\"  .OOOOO...\",
+\"   ..... ..\"};")
+
+(defvar eos::dbx-pattern-list nil)
+
+(defun eos::debugger-startup ()
+  ;; Actions to do at startup for eos-debugger.el
+  (make-face 'stop-face)
+  (make-face 'solid-arrow-face)
+  (make-face 'hollow-arrow-face)
+  
+  (set-face-foreground 'stop-face eos::stop-color)
+  (set-face-background 'stop-face 
+		       (face-background (get-face 'default)))
+  (set-face-foreground 'solid-arrow-face eos::solid-arrow-color)
+  (set-face-background 'solid-arrow-face 
+		       (face-background (get-face 'default)))
+  (set-face-foreground 'hollow-arrow-face eos::hollow-arrow-color)
+  (set-face-background 'hollow-arrow-face 
+		       (face-background (get-face 'default)))
+
+  (setq eos::dbx-pattern-list		; list of dbx TT patterns
+	(eos::create-debugger-patterns))
+
+;; should there be only one stop-face, with different properties depending
+;; on the frame/device?
+
+  (eos::annotation-set-inst 'debugger-stop 'x eos::breakpoint-inst [nothing])
+  (eos::annotation-set-inst 'debugger-stop 'tty "[S]" [nothing])
+  (eos::annotation-set-face 'debugger-stop 'x
+			    (get-face 'stop-face) (get-face 'stop-face))
+  (eos::annotation-set-face 'debugger-stop 'tty
+			    (get-face 'highlight) (get-face 'highlight))
+
+  (eos::annotation-set-inst 'debugger-hollow-arrow 'x eos::visitedpc-inst [nothing])
+  (eos::annotation-set-inst 'debugger-hollow-arrow 'tty "[]>" [nothing])
+  (eos::annotation-set-face 'debugger-hollow-arrow 'x
+			    (get-face 'hollow-arrow-face)
+			    (get-face 'hollow-arrow-face))
+  (eos::annotation-set-face 'debugger-hollow-arrow 'tty
+			    (get-face 'highlight) (get-face 'highlight))
+
+  (eos::annotation-set-inst 'debugger-solid-arrow 'x eos::currentpc-inst [nothing])
+  (eos::annotation-set-inst 'debugger-solid-arrow 'tty "=>" [nothing])
+  (eos::annotation-set-face 'debugger-solid-arrow 'x
+			    (get-face 'solid-arrow-face)
+			    (get-face 'solid-arrow-face))
+  (eos::annotation-set-face 'debugger-solid-arrow 'tty
+			    (get-face 'highlight) (get-face 'highlight))
+)
+
+;; Not yet ready for prime time.
+
+(defvar eos::fill-stack-buffer nil
+  "when t don't try any stack tracing")
+
+(defvar eos::stack-buffer "*Eos Stack*"
+  "name of buffer where to log Stack")
+
+(defun eos::empty-stack ()
+  ;; No valid stack data - e.g. resume/run program -
+  (if eos::fill-stack-buffer
+      (progn
+	(set-buffer (get-buffer-create eos::stack-buffer))
+	(toggle-read-only -1)
+	(delete-region (point-min) (point-max))
+	(toggle-read-only 1)
+	)))
+
+(defun eos::load-stack ()
+  ;; Should send a TT message requesting for the stack information;
+  ;; with the real work done in a callback
+  (if eos::fill-stack-buffer
+      (eos::stack-test 1)))
+
+(defun eos::visit-stack (stackpos)
+  (if eos::fill-stack-buffer
+      (progn
+	(eos::empty-stack)
+	(eos::stack-test 1)
+	)))
+
+(defun eos::create-stack-patterns ()
+  ;; returns a list of patterns
+  (list
+   (make-an-observer "SPRO_SPIDER_FRAMES" 'eos::spro_spider_frames)
+   ))
+
+(defun eos::spro_spider_frames (msg pat)
+  ;; We have received a SPRO_SPIDER_FRAMES notice
+  (let ((count (get-tooltalk-message-attribute msg 'args_count))
+	(i 1))
+    (set-buffer (get-buffer-create eos::stack-buffer))
+    (toggle-read-only -1)
+    (while (< i count)
+      ;; optional leading comment
+      (if (equal (get-tooltalk-message-attribute msg 'arg_type i)
+		 "Stack_Info1")
+	  (progn
+	    (insert (get-tooltalk-message-attribute msg 'arg_val i))
+	    (setq i (1+ i))))
+      ;; current frame?
+      (insert (if (equal (get-tooltalk-message-attribute msg 'arg_ival i)
+			 "0") "  " "> "))
+      (setq i (1+ i))
+      (insert (format "[%s] %s%s %s:%s"
+		      ;; frameno
+		      (get-tooltalk-message-attribute msg 'arg_ival i)
+		      ;; funcname
+		      (get-tooltalk-message-attribute msg 'arg_val (+ i 1))
+		      ;; funcargs
+		      (get-tooltalk-message-attribute msg 'arg_val (+ i 2))
+      		      ;; source
+		      (get-tooltalk-message-attribute msg 'arg_val (+ i 3))
+		      ;; line
+		      (get-tooltalk-message-attribute msg 'arg_val (+ i 4))))
+      (setq i (+ i 5))
+      (if (equal (get-tooltalk-message-attribute msg 'arg_type i)
+		 "Stack_Info2")
+	  (progn
+	    (insert (get-tooltalk-message-attribute msg 'arg_val i))
+	    (setq i (1+ i))))
+      (insert "\n"))
+    (toggle-read-only 1)
+;;    (return-tooltalk-message msg)
+    ))
+
+(defun eos::spider-stack-callback (msg pat)
+  ;; Callback after processing a spider_stack request
+  (destroy-tooltalk-message msg)
+  )
+
+(defmacro eos::stack-tt-args (spider-id clique-id hidden verbose quick starting-index count)
+  (` (list
+      'class TT_REQUEST
+      'address TT_HANDLER
+      'scope TT_SESSION
+      'handler (, spider-id)
+      'op "SPRO_SPIDER_STACK"
+      'callback 'eos::spider-stack-callback
+      'args (list
+	     (list 'TT_IN (, clique-id) "Context_ID")
+	     (list 'TT_IN (, hidden) "Boolean")
+	     (list 'TT_IN (, verbose) "Boolean")
+	     (list 'TT_IN (, quick) "Boolean")
+	     (list 'TT_IN (, starting-index) "int")
+	     (list 'TT_IN (, count) "int"))
+      )))
+
+(defun eos::stack-test (starting-index)
+  (let ((msg (make-tooltalk-message
+	      (eos::stack-tt-args eos::current-dbx-proc-id
+				  eos::current-debugger-clique-id
+				  0	; hidden
+				  1	; verbose
+				  0	; quick
+				  starting-index
+				  4	; count
+				  ))))
+    (send-tooltalk-message msg)
+;;    (destroy-tooltalk-message msg)
+    ))
+
+;; (setq eos::fill-stack-buffer t)
+;; (setq eos::fill-stack-buffer nil)
+;; (setq eos::stack-pattern-list (eos::create-stack-patterns))
+;; (mapcar 'register-tooltalk-pattern eos::stack-pattern-list)
+;; (mapcar 'unregister-tooltalk-pattern eos::stack-pattern-list)
+;; (eos::stack-test 1)
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+
+;;
+
+(defun eos::spro_te_eventset (msg pat)
+  ;; thread_id trap_id string string filename lineno string string
+  (let* ((trap-id
+	  (get-tooltalk-message-attribute msg 'arg_val 1))
+	 (filename
+	  (get-tooltalk-message-attribute msg 'arg_val 4))
+	 (lineno
+	  (read (get-tooltalk-message-attribute msg 'arg_ival 5))))
+    (eos::add-annotation 'debugger-stop filename lineno trap-id)
+;;    (return-tooltalk-message msg)
+    ))
+
+(defun eos::spro_te_eventdel (msg pat)
+  ;; trap_id string string filename lineno string string
+  (let* ((trap-id
+	  (get-tooltalk-message-attribute msg 'arg_val 0))
+	 (filename
+	  (get-tooltalk-message-attribute msg 'arg_val 3))
+	 (lineno
+	  (read (get-tooltalk-message-attribute msg 'arg_ival 4))))
+    (eos::delete-annotation 'debugger-stop filename lineno trap-id)
+;;    (return-tooltalk-message msg)
+    ))
+
+(defun eos::spro_te_stopped (msg pat)
+  ;; thread_id filename procname lineno filename procname lineno
+  (let* ((filename-hollow
+	  (get-tooltalk-message-attribute msg 'arg_val 1))
+	 (procname-hollow
+	  (get-tooltalk-message-attribute msg 'arg_val 2))
+	 (lineno-hollow
+	  (read (get-tooltalk-message-attribute msg 'arg_ival 3)))
+	 (filename-solid
+	  (get-tooltalk-message-attribute msg 'arg_val 4))
+	 (lineno-solid
+	  (read (get-tooltalk-message-attribute msg 'arg_ival 6)))
+	 )
+    (setq eos::current-solid-arrow
+	  (eos::make-annotation-visible eos::current-solid-arrow
+					filename-solid
+					lineno-solid
+					'debugger-solid-arrow))
+    (if (or (not (equal filename-solid filename-hollow))
+	    (not (equal lineno-solid lineno-hollow)))
+	(setq eos::current-hollow-arrow
+	      (eos::make-annotation-visible eos::current-hollow-arrow
+				 filename-hollow
+				 lineno-hollow
+				 'debugger-hollow-arrow)))
+;;    (return-tooltalk-message msg)
+    (eos::load-stack)
+    ))
+
+;; Tracking current id's
+;;
+
+(defun eos::update-dbx-proc-id (msg)
+  (setq eos::current-dbx-proc-id
+	(get-tooltalk-message-attribute msg 'sender))
+  ;; the following is needed to make toolbar entries be active or not
+  ;; I think it is not needed in 19.13
+  (eos::select-debugger-frame eos::debugger-frame)
+  )
+
+(defun eos::update-current-debugger-clique-id (msg)
+  (setq eos::current-debugger-clique-id
+	(get-tooltalk-message-attribute msg 'arg_val 0))
+  )
+
+;;
+;; Updating arrows
+;;
+
+
+(defun eos::update-pids (msg)
+  (eos::update-dbx-proc-id msg)
+  (eos::update-current-debugger-clique-id msg))
+
+(defun eos::internal-clear-annotations (stack arrows stops &optional clique)
+  (if stack
+      (eos::empty-stack))
+  (if arrows
+      (progn
+	(eos::make-annotation-invisible eos::current-hollow-arrow)
+	(eos::make-annotation-invisible eos::current-solid-arrow)))
+  (if clique
+      (progn
+	(setq eos::current-debugger-clique-id nil)
+	;; not needed in 19.13?
+	(eos::select-debugger-frame eos::debugger-frame)))
+  (if stops
+      (eos::remove-all-from-annotation-list 'debugger-stop)))
+
+
+(defun eos::clear-arrows (msg pat)
+  (eos::internal-clear-annotations t t nil)
+;;  (return-tooltalk-message msg)
+  )
+
+(defun eos::update-clear-stops (msg pat)
+  (eos::update-pids msg)
+  (eos::internal-clear-annotations t nil t)
+;;  (return-tooltalk-message msg)
+  )
+
+(defun eos::update-clear-arrows-stops (msg pat)
+  (eos::update-pids msg)
+  (eos::internal-clear-annotations t t t)
+;;  (return-tooltalk-message msg)
+  )
+
+(defun eos::clear-arrows-stops (msg pat)
+  (let ((this-proc-id
+	 (get-tooltalk-message-attribute msg 'sender)))
+    (if (equal eos::current-dbx-proc-id this-proc-id)
+	(progn
+	  (eos::internal-clear-annotations t t t)
+	  ;;  (return-tooltalk-message msg)
+	  ))))
+
+;;
+
+;;
+
+(defun eos::spro_detach (msg pat)
+  ;; a detach notification has been received. this means dbx/debugger
+  ;; is exiting
+  (eos::internal-clear-annotations t t t t)
+  (eos::dismiss-print-frame))
+
+(defun eos::spro_te_location (msg pat)
+  ;; thread_id filename procname lineno filename procname lineno
+  (let* ((filename-hollow
+	  (get-tooltalk-message-attribute msg 'arg_val 1))
+	 (lineno-hollow
+	  (read (get-tooltalk-message-attribute msg 'arg_ival 3)))
+	 (filename-solid
+	  (get-tooltalk-message-attribute msg 'arg_val 4))
+	 (lineno-solid
+	  (read (get-tooltalk-message-attribute msg 'arg_ival 6)))
+	 )
+    (setq eos::current-solid-arrow
+	  (eos::make-annotation-visible eos::current-solid-arrow
+			     filename-solid
+			     lineno-solid
+			     'debugger-solid-arrow))
+    (if (or (not (equal filename-solid filename-hollow))
+	    (not (equal lineno-solid lineno-hollow)))
+	(setq eos::current-hollow-arrow
+	      (eos::make-annotation-visible eos::current-hollow-arrow
+				 filename-hollow
+				 lineno-hollow
+				 'debugger-hollow-arrow)))
+;;    (return-tooltalk-message msg)
+    ))
+
+(defun eos::spro_te_visit (msg pat)
+  ;; thread_id filename procname lineno stackpos
+  (let* ((filename
+	  (get-tooltalk-message-attribute msg 'arg_val 1))
+	 (procname
+	  (get-tooltalk-message-attribute msg 'arg_val 2))
+	 (lineno
+	  (read (get-tooltalk-message-attribute msg 'arg_ival 3)))
+	 (stackpos
+	  (read (get-tooltalk-message-attribute msg 'arg_ival 4)))
+	 )
+    (eos::make-annotation-invisible eos::current-hollow-arrow)
+    (if (equal stackpos 1)
+	(progn
+	  (eos::make-annotation-invisible eos::current-solid-arrow)
+	  (setq eos::current-solid-arrow
+		(eos::make-annotation-visible eos::current-solid-arrow
+					      filename
+					      lineno
+					      'debugger-solid-arrow))
+	  )
+      (setq eos::current-hollow-arrow
+	    (eos::make-annotation-visible eos::current-hollow-arrow
+					  filename
+					  lineno
+					  'debugger-hollow-arrow))
+      )
+;;    (return-tooltalk-message msg)
+    (eos::visit-stack stackpos)
+    ))
+
+;; generate a list of patterns
+;; so it can be registered and unregistered.
+
+
+(defun eos::create-debugger-patterns ()
+  ;; returns a list of patterns
+  (list
+   (make-an-observer "SPRO_TE_STOPPED" 'eos::spro_te_stopped)
+   (make-an-observer "SPRO_SE_STARTED" 'eos::clear-arrows)
+   (make-an-observer "SPRO_TE_STEPPED" 'eos::clear-arrows)
+   (make-an-observer "SPRO_TE_CONTINUED" 'eos::clear-arrows)
+   (make-an-observer "SPRO_SE_DROPPED" 'eos::clear-arrows-stops)
+   (make-an-observer "SPRO_SE_DEBUGGED" 'eos::update-clear-stops)
+   (make-an-observer "SPRO_SE_REVIVED" 'eos::update-clear-arrows-stops)
+   (make-an-observer "SPRO_SE_ATTACHED" 'eos::update-clear-arrows-stops)
+   (make-an-observer "SPRO_SE_GONE" 'eos::clear-arrows)
+   (make-an-observer "SPRO_TE_LOCATION" 'eos::spro_te_location)
+   (make-an-observer "SPRO_TE_VISIT" 'eos::spro_te_visit)
+   (make-an-observer "SPRO_TE_EVENTSET" 'eos::spro_te_eventset)
+   (make-an-observer "SPRO_TE_EVENTDEL" 'eos::spro_te_eventdel)
+   (make-an-observer "SPRO_DETACH" 'eos::spro_detach)
+   ))
+
+(defun eos::register-debugger-patterns ()
+  ;; register all dbx patterns
+  (mapcar 'register-tooltalk-pattern eos::dbx-pattern-list)
+  (eos::register-debugger-extra-patterns))
+
+(defun eos::unregister-debugger-patterns ()
+  ;; unregister all dbx patterns
+  (mapcar 'unregister-tooltalk-pattern eos::dbx-pattern-list)
+  (eos::unregister-debugger-extra-patterns))
+
+(provide 'eos-debugger)
+
+;;; sun-eos-debugger.el ends here