(gdb-view-source, gdb-selected-view): New variables.

(gdba): Inhibit DOS window in MS Windows.
(gdb-inferior-io-mode): Use hexl instead of cat.
(gdb-info-breakpoints-custom, gdb-assembler-custom, gdb-reset):
Use text in margin for MS Windows as there is no image support.
(gdb-restore-windows, gdb-setup-windows): Restore/start with
assembler view if appropriate.
(gdb-assembler-custom): Assembler code should display at point.
Parse address correctly.
(gdb-frame-handler): Accommodate selection of display of source
or assembler.
Add radio buttons to select display of source or assembler.
This commit is contained in:
Nick Roberts 2003-05-21 00:49:46 +00:00
parent 3d50b19811
commit 12174bc39e

View file

@ -41,8 +41,9 @@
;; developing the mode itself, then see the Annotations section in the GDB
;; info manual.
;;
;; Known Bugs: Does not auto-display arrays of structures or structures
;; containing arrays.
;; Known Bugs:
;; Does not auto-display arrays of structures or structures containing arrays.
;; On MS Windows, GDB from MINGW does not flush the output from the inferior.
;;; Code:
@ -62,6 +63,8 @@
(defvar gdb-previous-address nil)
(defvar gdb-display-in-progress nil)
(defvar gdb-dive nil)
(defvar gdb-view-source t "Non-nil means that source code can be viewed")
(defvar gdb-selected-view 'source "Code type that user wishes to view")
(defvar gdb-buffer-type nil)
(defvar gdb-variables '()
"A list of variables that are local to the GUD buffer.")
@ -158,12 +161,16 @@ The following interactive lisp functions help control operation :
(setq gdb-previous-address nil)
(setq gdb-display-in-progress nil)
(setq gdb-dive nil)
(setq gdb-view-source t)
(setq gdb-selected-view 'source)
;;
(mapc 'make-local-variable gdb-variables)
(setq gdb-buffer-type 'gdba)
;;
(gdb-clear-inferior-io)
;;
(if (eq window-system 'w32)
(gdb-enqueue-input (list "set set new-console off\n" 'ignore)))
(gdb-enqueue-input (list "set height 0\n" 'ignore))
;; find source file and compilation directory here
(gdb-enqueue-input (list "server list\n" 'ignore))
@ -381,7 +388,7 @@ The key should be one of the cars in `gdb-buffer-rules-assoc'."
;; a dummy one.
(make-comint-in-buffer
(substring (buffer-name) 1 (- (length (buffer-name)) 1))
(current-buffer) "cat")
(current-buffer) "hexl")
(setq comint-input-sender 'gdb-inferior-io-sender))
(defun gdb-inferior-io-sender (proc string)
@ -561,6 +568,7 @@ This filter may simply queue output for a later time."
(match-string 1 args)
(string-to-int (match-string 2 args))))
(setq gdb-current-address (match-string 3 args))
(setq gdb-view-source t)
;;update with new frame for machine code if necessary
(gdb-invalidate-assembler))
@ -1328,7 +1336,7 @@ static char *magick[] = {
(with-current-buffer buffer
(if (and (eq gud-minor-mode 'gdba)
(not (string-match "^\*" (buffer-name))))
(if (display-graphic-p)
(if (eq window-system 'x)
(remove-images (point-min) (point-max))
(gdb-remove-strings (point-min) (point-max))))))
(with-current-buffer (gdb-get-buffer 'gdb-breakpoints-buffer)
@ -1369,7 +1377,7 @@ static char *magick[] = {
(let ((start (progn (beginning-of-line)
(- (point) 1)))
(end (progn (end-of-line) (+ (point) 1))))
(if (display-graphic-p)
(if (eq window-system 'x)
(progn
(remove-images start end)
(if (eq ?y flag)
@ -1382,8 +1390,8 @@ static char *magick[] = {
'left-margin)))
(gdb-remove-strings start end)
(if (eq ?y flag)
(put-string "B" (point))
(put-string "b" (point))))))))))))
(gdb-put-string "B" (point))
(gdb-put-string "b" (point))))))))))))
(end-of-line))))))
(defun gdb-breakpoints-buffer-name ()
@ -1973,7 +1981,8 @@ the source buffer."
(switch-to-buffer-other-frame
(gdb-get-create-buffer 'gdba)))
(let ((menu (make-sparse-keymap "GDB-Frames")))
(let ((menu (make-sparse-keymap "GDB-Frames"))
(submenu (make-sparse-keymap "View")))
(define-key gud-menu-map [frames]
`(menu-item "GDB-Frames" ,menu :visible (eq gud-minor-mode 'gdba)))
(define-key menu [gdb] '("Gdb" . gdb-frame-gdb-buffer))
@ -1983,7 +1992,39 @@ the source buffer."
(define-key menu [breakpoints] '("Breakpoints" . gdb-frame-breakpoints-buffer))
(define-key menu [display] '("Display" . gdb-frame-display-buffer))
(define-key menu [threads] '("Threads" . gdb-frame-threads-buffer))
(define-key menu [assembler] '("Assembler" . gdb-frame-assembler-buffer)))
(define-key menu [view] `(menu-item "View" ,submenu))
(define-key submenu [source]
'(menu-item "Source" gdb-view-source
:help "Display source only"
:button (:radio . (eq gdb-selected-view 'source))))
(define-key submenu [assembler]
'(menu-item "Assembler" gdb-view-assembler
:help "Display assembler only"
:button (:radio . (eq gdb-selected-view 'assembler))))
; (define-key submenu [both]
; '(menu-item "Both" gdb-view-both
; :help "Display both source and assembler"
; :button (:radio . (eq gdb-selected-view 'both))))
)
(defun gdb-view-source()
(interactive)
(if gdb-view-source
(if gud-last-last-frame
(set-window-buffer gdb-source-window
(gud-find-file (car gud-last-last-frame)))
(set-window-buffer gdb-source-window (gud-find-file gdb-main-file))))
(setq gdb-selected-view 'source))
(defun gdb-view-assembler()
(interactive)
(set-window-buffer gdb-source-window
(gdb-get-create-buffer 'gdb-assembler-buffer))
(setq gdb-selected-view 'assembler))
;(defun gdb-view-both()
;(interactive)
;(setq gdb-selected-view 'both))
(defvar gdb-main-file nil "Source file from which program execution begins.")
@ -2001,10 +2042,12 @@ the source buffer."
(other-window 1)
(switch-to-buffer (gdb-locals-buffer-name))
(other-window 1)
(switch-to-buffer
(if gud-last-last-frame
(gud-find-file (car gud-last-last-frame))
(gud-find-file gdb-main-file)))
(if gdb-view-source
(switch-to-buffer
(if gud-last-last-frame
(gud-find-file (car gud-last-last-frame))
(gud-find-file gdb-main-file)))
(switch-to-buffer (gdb-get-create-buffer 'gdb-assembler-buffer)))
(setq gdb-source-window (get-buffer-window (current-buffer)))
(split-window-horizontally)
(other-window 1)
@ -2035,10 +2078,12 @@ This arrangement depends on the value of `gdb-many-windows'."
(delete-other-windows)
(split-window)
(other-window 1)
(switch-to-buffer
(if gud-last-last-frame
(gud-find-file (car gud-last-last-frame))
(gud-find-file gdb-main-file)))
(if gdb-view-source
(switch-to-buffer
(if gud-last-last-frame
(gud-find-file (car gud-last-last-frame))
(gud-find-file gdb-main-file)))
(switch-to-buffer (gdb-get-create-buffer 'gdb-assembler-buffer)))
(other-window 1)))
(defun gdb-reset ()
@ -2051,7 +2096,7 @@ This arrangement depends on the value of `gdb-many-windows'."
(if (eq gud-minor-mode 'gdba)
(if (string-match "^\*.+*$" (buffer-name))
(kill-buffer nil)
(if (display-graphic-p)
(if (eq window-system 'x)
(remove-images (point-min) (point-max))
(gdb-remove-strings (point-min) (point-max)))
(setq left-margin-width 0)
@ -2201,17 +2246,14 @@ BUFFER nil or omitted means use the current buffer."
(if (not (equal gdb-current-address "main"))
(progn
(gdb-remove-arrow)
(save-selected-window
(select-window gdb-source-window)
(goto-char (point-min))
(if (re-search-forward gdb-current-address nil t)
(gdb-put-arrow "=>" (point))))))
(goto-char (point-min))
(if (re-search-forward gdb-current-address nil t)
(gdb-put-arrow "=>" (point)))))
;; remove all breakpoint-icons in assembler buffer before updating.
(save-excursion
(if (display-graphic-p)
(remove-images (point-min) (point-max))
(gdb-remove-strings (point-min) (point-max))))
(set-buffer (gdb-get-buffer 'gdb-breakpoints-buffer))
(if (eq window-system 'x)
(remove-images (point-min) (point-max))
(gdb-remove-strings (point-min) (point-max))))
(with-current-buffer (gdb-get-buffer 'gdb-breakpoints-buffer)
(goto-char (point-min))
(while (< (point) (- (point-max) 1))
(forward-line 1)
@ -2220,18 +2262,16 @@ BUFFER nil or omitted means use the current buffer."
(looking-at
"[0-9]*\\s-*\\S-*\\s-*\\S-*\\s-*\\(.\\)\\s-*0x\\(\\S-*\\)")
(setq flag (char-after (match-beginning 1)))
(let ((number (match-string 2)))
;; remove leading 0s from output of info break.
(if (string-match "0x0+\\(.*\\)" number)
(setq address (concat "0x" (match-string 1 address)))
(setq address number)))
(setq address (match-string 2))
;; remove leading 0s from output of info break.
(if (string-match "0+\\(.*\\)" address)
(setq address (match-string 1 address)))
(with-current-buffer buffer
(save-excursion
(goto-char (point-min))
(if (re-search-forward address nil t)
(let ((start (progn (beginning-of-line) (- (point) 1)))
(end (progn (end-of-line) (+ (point) 1))))
(if (display-graphic-p)
(if (eq window-system 'x)
(progn
(remove-images start end)
(if (eq ?y flag)
@ -2243,8 +2283,8 @@ BUFFER nil or omitted means use the current buffer."
'left-margin)))
(gdb-remove-strings start end)
(if (eq ?y flag)
(put-string "B" (point))
(put-string "b" (point))))))))))))))
(gdb-put-string "B" (point))
(gdb-put-string "b" (point)))))))))))))
(defvar gdb-assembler-mode-map
(let ((map (make-sparse-keymap)))
@ -2320,14 +2360,18 @@ BUFFER nil or omitted means use the current buffer."
(let ((address (match-string 1)))
;; remove leading 0s from output of frame command.
(if (string-match "0x0+\\(.*\\)" address)
(setq gdb-current-address (concat "0x" (match-string 1 address)))
(setq gdb-current-address
(concat "0x" (match-string 1 address)))
(setq gdb-current-address address)))
(if (not (looking-at ".*) at "))
(if (or (if (not (looking-at ".*) at "))
(progn (setq gdb-view-source nil) t))
(eq gdb-selected-view 'assembler))
(progn
(set-window-buffer gdb-source-window
(gdb-get-create-buffer 'gdb-assembler-buffer))
(set-window-buffer
gdb-source-window
(gdb-get-create-buffer 'gdb-assembler-buffer))
(gdb-invalidate-assembler))))
(if (looking-at "^#[0-9]*\\s-*\\(\\S-*\\)")
(if (looking-at "^#0\\s-*\\(\\S-*\\)")
(setq gdb-current-frame (match-string 1))))))
(provide 'gdb-ui)