comparison lisp/progmodes/gdb-ui.el @ 67364:7736e7015779

(gdb-find-file-unhook): Delete variable. (gdb-set-gud-minor-mode, gdb-set-gud-minor-mode): Delete functions. (gdb-set-gud-minor-mode-existing-buffers, gdb-init-2): Use GDB command "info sources". Move calls to GDB command "list". (gdb-find-file-hook): Just use gdb-source-file-list. (gdb-source-file-regexp): Use regexp for pre-GDB 6.4. (gdb-source-file-regexp-1): New regexp for GDB 6.4+ only. (gdb-set-gud-minor-mode-existing-buffers-1): Use it. (gdb-data-list-register-values-handler): Use correct trigger name.
author Nick Roberts <nickrob@snap.net.nz>
date Wed, 07 Dec 2005 23:05:47 +0000
parents 568e3be4fb8c
children e81d8f1aa8fe 37d0562504bf
comparison
equal deleted inserted replaced
67363:87de4735ecc9 67364:7736e7015779
108 (defvar gdb-overlay-arrow-position nil) 108 (defvar gdb-overlay-arrow-position nil)
109 (defvar gdb-server-prefix nil) 109 (defvar gdb-server-prefix nil)
110 (defvar gdb-flush-pending-output nil) 110 (defvar gdb-flush-pending-output nil)
111 (defvar gdb-location-alist nil 111 (defvar gdb-location-alist nil
112 "Alist of breakpoint numbers and full filenames.") 112 "Alist of breakpoint numbers and full filenames.")
113 (defvar gdb-find-file-unhook nil)
114 (defvar gdb-active-process nil "GUD tooltips display variable values when t, \ 113 (defvar gdb-active-process nil "GUD tooltips display variable values when t, \
115 and #define directives otherwise.") 114 and #define directives otherwise.")
116 (defvar gdb-error "Non-nil when GDB is reporting an error.") 115 (defvar gdb-error "Non-nil when GDB is reporting an error.")
117 (defvar gdb-macro-info nil 116 (defvar gdb-macro-info nil
118 "Non-nil if GDB knows that the inferior includes preprocessor macro info.") 117 "Non-nil if GDB knows that the inferior includes preprocessor macro info.")
158 handlers.") 157 handlers.")
159 158
160 (defvar gdb-first-post-prompt nil) 159 (defvar gdb-first-post-prompt nil)
161 (defvar gdb-version nil) 160 (defvar gdb-version nil)
162 (defvar gdb-locals-font-lock-keywords nil) 161 (defvar gdb-locals-font-lock-keywords nil)
162 (defvar gdb-source-file-list nil
163 "List of source files for the current executable")
163 (defconst gdb-error-regexp "\\^error,msg=\"\\(.+\\)\"") 164 (defconst gdb-error-regexp "\\^error,msg=\"\\(.+\\)\"")
164 165
165 (defvar gdb-locals-font-lock-keywords-1 166 (defvar gdb-locals-font-lock-keywords-1
166 '( 167 '(
167 ;; var = (struct struct_tag) value 168 ;; var = (struct struct_tag) value
188 ) 189 )
189 "Font lock keywords used in `gdb-local-mode'.") 190 "Font lock keywords used in `gdb-local-mode'.")
190 191
191 ;; Variables for GDB 6.4+ 192 ;; Variables for GDB 6.4+
192 193
193 (defvar gdb-source-file-list nil
194 "List of source files for the current executable")
195 (defvar gdb-register-names nil "List of register names.") 194 (defvar gdb-register-names nil "List of register names.")
196 (defvar gdb-changed-registers nil 195 (defvar gdb-changed-registers nil
197 "List of changed register numbers (strings).") 196 "List of changed register numbers (strings).")
198 197
199 ;;;###autoload 198 ;;;###autoload
349 (unless (looking-at "\\S-+.*(.*).*") 348 (unless (looking-at "\\S-+.*(.*).*")
350 (gdb-enqueue-input 349 (gdb-enqueue-input
351 (list (concat gdb-server-prefix "print " expr "\n") 350 (list (concat gdb-server-prefix "print " expr "\n")
352 'gdb-tooltip-print)))))) 351 'gdb-tooltip-print))))))
353 352
354 (defun gdb-set-gud-minor-mode (buffer) 353 (defconst gdb-source-file-regexp "\\(.+?\\), \\|\\([^, \n].*$\\)")
355 "Set `gud-minor-mode' from find-file if appropriate." 354
355 (defun gdb-set-gud-minor-mode-existing-buffers ()
356 "Create list of source files for current GDB session."
356 (goto-char (point-min)) 357 (goto-char (point-min))
357 (unless (search-forward "No source file named " nil t) 358 (when (search-forward "read in on demand:" nil t)
358 (condition-case nil 359 (while (re-search-forward gdb-source-file-regexp nil t)
359 (gdb-enqueue-input 360 (push (or (match-string 1) (match-string 2)) gdb-source-file-list))
360 (list (concat gdb-server-prefix "info source\n") 361 (dolist (buffer (buffer-list))
361 `(lambda () (gdb-set-gud-minor-mode-1 ,buffer)))) 362 (with-current-buffer buffer
362 (error (setq gdb-find-file-unhook t))))) 363 (when (and buffer-file-name
363 364 (member (file-name-nondirectory buffer-file-name)
364 (defun gdb-set-gud-minor-mode-1 (buffer) 365 gdb-source-file-list))
365 (goto-char (point-min)) 366 (set (make-local-variable 'gud-minor-mode) 'gdba)
366 (when (and (search-forward "Located in " nil t) 367 (set (make-local-variable 'tool-bar-map) gud-tool-bar-map)
367 (looking-at "\\S-+") 368 (when gud-tooltip-mode
368 (string-equal (buffer-file-name buffer) 369 (make-local-variable 'gdb-define-alist)
369 (match-string 0))) 370 (gdb-create-define-alist)
370 (with-current-buffer buffer 371 (add-hook 'after-save-hook 'gdb-create-define-alist nil t)))))))
371 (set (make-local-variable 'gud-minor-mode) 'gdba)
372 (set (make-local-variable 'tool-bar-map) gud-tool-bar-map)
373 (when gud-tooltip-mode
374 (make-local-variable 'gdb-define-alist)
375 (gdb-create-define-alist)
376 (add-hook 'after-save-hook 'gdb-create-define-alist nil t)))))
377
378 (defun gdb-set-gud-minor-mode-existing-buffers ()
379 (dolist (buffer (buffer-list))
380 (let ((file (buffer-file-name buffer)))
381 (if file
382 (progn
383 (gdb-enqueue-input
384 (list (concat gdb-server-prefix "list "
385 (file-name-nondirectory file) ":1\n")
386 `(lambda () (gdb-set-gud-minor-mode ,buffer)))))))))
387 372
388 (defun gdb-find-watch-expression () 373 (defun gdb-find-watch-expression ()
389 (let* ((var (nth (- (line-number-at-pos (point)) 2) gdb-var-list)) 374 (let* ((var (nth (- (line-number-at-pos (point)) 2) gdb-var-list))
390 (varno (nth 1 var)) (expr)) 375 (varno (nth 1 var)) (expr))
391 (string-match "\\(var[0-9]+\\)\\.\\(.*\\)" varno) 376 (string-match "\\(var[0-9]+\\)\\.\\(.*\\)" varno)
469 gdb-pending-triggers nil 454 gdb-pending-triggers nil
470 gdb-output-sink 'user 455 gdb-output-sink 'user
471 gdb-server-prefix "server " 456 gdb-server-prefix "server "
472 gdb-flush-pending-output nil 457 gdb-flush-pending-output nil
473 gdb-location-alist nil 458 gdb-location-alist nil
474 gdb-find-file-unhook nil
475 gdb-source-file-list nil 459 gdb-source-file-list nil
476 gdb-error nil 460 gdb-error nil
477 gdb-macro-info nil 461 gdb-macro-info nil
478 gdb-buffer-fringe-width (car (window-fringes))) 462 gdb-buffer-fringe-width (car (window-fringes)))
479 463
489 (defun gdb-init-2 () 473 (defun gdb-init-2 ()
490 (if (eq window-system 'w32) 474 (if (eq window-system 'w32)
491 (gdb-enqueue-input (list "set new-console off\n" 'ignore))) 475 (gdb-enqueue-input (list "set new-console off\n" 'ignore)))
492 (gdb-enqueue-input (list "set height 0\n" 'ignore)) 476 (gdb-enqueue-input (list "set height 0\n" 'ignore))
493 (gdb-enqueue-input (list "set width 0\n" 'ignore)) 477 (gdb-enqueue-input (list "set width 0\n" 'ignore))
494 ;; find source file and compilation directory here
495 (gdb-enqueue-input (list "server list main\n" 'ignore)) ; C program
496 (gdb-enqueue-input (list "server list MAIN__\n" 'ignore)) ; Fortran program
497 (gdb-enqueue-input (list "server info source\n" 'gdb-source-info))
498 478
499 (if (string-equal gdb-version "pre-6.4") 479 (if (string-equal gdb-version "pre-6.4")
500 (progn 480 (progn
501 (gdb-set-gud-minor-mode-existing-buffers) 481 (gdb-enqueue-input (list (concat gdb-server-prefix "info sources\n")
482 'gdb-set-gud-minor-mode-existing-buffers))
502 (setq gdb-locals-font-lock-keywords gdb-locals-font-lock-keywords-1)) 483 (setq gdb-locals-font-lock-keywords gdb-locals-font-lock-keywords-1))
503 (gdb-enqueue-input 484 (gdb-enqueue-input
504 (list "server interpreter mi -data-list-register-names\n" 485 (list "server interpreter mi -data-list-register-names\n"
505 'gdb-get-register-names)) 486 'gdb-get-register-names))
506 ; Needs GDB 6.2 onwards. 487 ; Needs GDB 6.2 onwards.
507 (gdb-enqueue-input 488 (gdb-enqueue-input
508 (list "server interpreter mi \"-file-list-exec-source-files\"\n" 489 (list "server interpreter mi \"-file-list-exec-source-files\"\n"
509 'gdb-set-gud-minor-mode-existing-buffers-1)) 490 'gdb-set-gud-minor-mode-existing-buffers-1))
510 (setq gdb-locals-font-lock-keywords gdb-locals-font-lock-keywords-2)) 491 (setq gdb-locals-font-lock-keywords gdb-locals-font-lock-keywords-2))
492
493 ;; find source file and compilation directory here
494 (gdb-enqueue-input (list "server list main\n" 'ignore)) ; C program
495 (gdb-enqueue-input (list "server list MAIN__\n" 'ignore)) ; Fortran program
496 (gdb-enqueue-input (list "server info source\n" 'gdb-source-info))
511 497
512 (run-hooks 'gdba-mode-hook)) 498 (run-hooks 'gdba-mode-hook))
513 499
514 (defun gdb-get-version () 500 (defun gdb-get-version ()
515 (goto-char (point-min)) 501 (goto-char (point-min))
2687 (if (and (buffer-name gud-comint-buffer) 2673 (if (and (buffer-name gud-comint-buffer)
2688 ;; in case gud or gdb-ui is just loaded 2674 ;; in case gud or gdb-ui is just loaded
2689 gud-comint-buffer 2675 gud-comint-buffer
2690 (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) 2676 (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer)
2691 'gdba)) 2677 'gdba))
2692 (if (string-equal gdb-version "pre-6.4") 2678 (if (member buffer-file-name gdb-source-file-list)
2693 (condition-case nil 2679 (with-current-buffer (find-buffer-visiting buffer-file-name)
2694 (gdb-enqueue-input 2680 (set (make-local-variable 'gud-minor-mode) 'gdba)
2695 (list (concat gdb-server-prefix "list " 2681 (set (make-local-variable 'tool-bar-map) gud-tool-bar-map)))))
2696 (file-name-nondirectory buffer-file-name)
2697 ":1\n")
2698 `(lambda () (gdb-set-gud-minor-mode ,(current-buffer)))))
2699 (error (setq gdb-find-file-unhook t)))
2700 (if (member buffer-file-name gdb-source-file-list)
2701 (with-current-buffer (find-buffer-visiting buffer-file-name)
2702 (set (make-local-variable 'gud-minor-mode) 'gdba)
2703 (set (make-local-variable 'tool-bar-map) gud-tool-bar-map))))))
2704 2682
2705 ;;from put-image 2683 ;;from put-image
2706 (defun gdb-put-string (putstring pos &optional dprop &rest sprops) 2684 (defun gdb-put-string (putstring pos &optional dprop &rest sprops)
2707 "Put string PUTSTRING in front of POS in the current buffer. 2685 "Put string PUTSTRING in front of POS in the current buffer.
2708 PUTSTRING is displayed by putting an overlay into the current buffer with a 2686 PUTSTRING is displayed by putting an overlay into the current buffer with a
2976 (setq gdb-frame-address (match-string 1)))) 2954 (setq gdb-frame-address (match-string 1))))
2977 (goto-char (point-min)) 2955 (goto-char (point-min))
2978 (if (re-search-forward " source language \\(\\S-*\\)\." nil t) 2956 (if (re-search-forward " source language \\(\\S-*\\)\." nil t)
2979 (setq gdb-current-language (match-string 1))) 2957 (setq gdb-current-language (match-string 1)))
2980 (gdb-invalidate-assembler)) 2958 (gdb-invalidate-assembler))
2959
2981 2960
2982 ;; Code specific to GDB 6.4 2961 ;; Code specific to GDB 6.4
2983 2962 (defconst gdb-source-file-regexp-1 "fullname=\"\\(.*?\\)\"")
2984 (defconst gdb-source-file-regexp "fullname=\"\\(.*?\\)\"")
2985 2963
2986 (defun gdb-set-gud-minor-mode-existing-buffers-1 () 2964 (defun gdb-set-gud-minor-mode-existing-buffers-1 ()
2987 "Create list of source files for current GDB session." 2965 "Create list of source files for current GDB session."
2988 (goto-char (point-min)) 2966 (goto-char (point-min))
2989 (while (re-search-forward gdb-source-file-regexp nil t) 2967 (while (re-search-forward gdb-source-file-regexp-1 nil t)
2990 (push (match-string 1) gdb-source-file-list)) 2968 (push (match-string 1) gdb-source-file-list))
2991 (dolist (buffer (buffer-list)) 2969 (dolist (buffer (buffer-list))
2992 (with-current-buffer buffer 2970 (with-current-buffer buffer
2993 (when (member buffer-file-name gdb-source-file-list) 2971 (when (member buffer-file-name gdb-source-file-list)
2994 (set (make-local-variable 'gud-minor-mode) 'gdba) 2972 (set (make-local-variable 'gud-minor-mode) 'gdba)
3087 3065
3088 (defconst gdb-data-list-register-values-regexp 3066 (defconst gdb-data-list-register-values-regexp
3089 "number=\"\\(.*?\\)\",value=\"\\(.*?\\)\"") 3067 "number=\"\\(.*?\\)\",value=\"\\(.*?\\)\"")
3090 3068
3091 (defun gdb-data-list-register-values-handler () 3069 (defun gdb-data-list-register-values-handler ()
3092 (setq gdb-pending-triggers (delq 'gdb-invalidate-registers 3070 (setq gdb-pending-triggers (delq 'gdb-invalidate-registers-1
3093 gdb-pending-triggers)) 3071 gdb-pending-triggers))
3094 (goto-char (point-min)) 3072 (goto-char (point-min))
3095 (if (re-search-forward gdb-error-regexp nil t) 3073 (if (re-search-forward gdb-error-regexp nil t)
3096 (with-current-buffer (gdb-get-buffer 'gdb-registers-buffer) 3074 (with-current-buffer (gdb-get-buffer 'gdb-registers-buffer)
3097 (let ((buffer-read-only nil)) 3075 (let ((buffer-read-only nil))