From 12174bc39e1819308d206f55a79ed5c7d85b2cd5 Mon Sep 17 00:00:00 2001 From: Nick Roberts Date: Wed, 21 May 2003 00:49:46 +0000 Subject: [PATCH] (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. --- lisp/gdb-ui.el | 128 +++++++++++++++++++++++++++++++++---------------- 1 file changed, 86 insertions(+), 42 deletions(-) diff --git a/lisp/gdb-ui.el b/lisp/gdb-ui.el index 9a7b250582f..55c59e747ee 100644 --- a/lisp/gdb-ui.el +++ b/lisp/gdb-ui.el @@ -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) -- 2.39.2