From: "Gerd Möllmann" <gerd.moellmann@gmail.com>
To: 66575@debbugs.gnu.org
Subject: bug#66575: [PATCH] Gud lldb support
Date: Mon, 16 Oct 2023 14:00:07 +0200 [thread overview]
Message-ID: <m2il76wzeg.fsf@Mini.fritz.box> (raw)
[-- Attachment #1: Type: text/plain, Size: 223 bytes --]
Tags: patch
The attached patch implements LLDB support in Gud, based on gud-gdb.
No MI support, because lldb-mi is no longer part of LLVM.
It's probably not needless to emphasize that this is entirely my work
alone :-).
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Gud-lldb-support.patch --]
[-- Type: text/patch, Size: 6217 bytes --]
From b1a721304fb285eae30405ab7d03c9b9fe200c8a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Gerd=20M=C3=B6llmann?= <gerd.moellmann@gmail.com>
Date: Mon, 16 Oct 2023 13:54:02 +0200
Subject: [PATCH] Gud lldb support
* lisp/progmodes/gud.el (lldb): New function.
---
lisp/progmodes/gud.el | 143 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 143 insertions(+)
diff --git a/lisp/progmodes/gud.el b/lisp/progmodes/gud.el
index d4b954a7203..e33c7942933 100644
--- a/lisp/progmodes/gud.el
+++ b/lisp/progmodes/gud.el
@@ -40,6 +40,7 @@
;;; Code:
(require 'comint)
+(eval-when-compile (require 'rx))
(defvar gdb-active-process)
(defvar gdb-define-alist)
@@ -973,6 +974,7 @@ gud-gdb-fetch-lines-filter
(setq gud-gdb-fetch-lines-string string)
"")))
+\f
;; gdb speedbar functions
;; Part of the macro expansion of dframe-with-attached-buffer.
@@ -3840,6 +3842,147 @@ gud-tooltip-tips
(gud-basic-call cmd))
expr))))))))
+\f
+;; 'gud-lldb-history' and 'gud-gud-lldb-command-name' are required
+;; because gud-symbol uses their values if they are present. Tehir
+;; names are deducded from the minor-mode name.
+(defvar gud-lldb-history nil)
+
+(defcustom gud-gud-lldb-command-name "lldb"
+ "Default command to run an executable under LLDB in text command mode."
+ :type 'string)
+
+(defun gud-lldb-marker-filter (string)
+ "Deduce interesting stuff from output STRING."
+ (cond (;; Process 72668 stopped
+ ;; * thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
+ ;; frame #0: ...) at emacs.c:1310:9 [opt]
+ (string-match (rx (and line-start (0+ blank) "frame"
+ (0+ not-newline) " at "
+ (group (1+ (not (any ":"))))
+ ":"
+ (group (1+ digit))))
+ string)
+ (setq gud-last-frame
+ (cons (match-string 1 string)
+ (string-to-number (match-string 2 string)))))
+ (;; Process 72874 exited with status = 9 (0x00000009) killed
+ (string-match (rx "Process " (1+ digit) " exited with status")
+ string)
+ (setq gud-last-last-frame nil)
+ (setq gud-overlay-arrow-position nil)))
+ string)
+
+;;;###autoload
+(defun lldb (command-line)
+ "Run lldb passing it COMMAND-LINE as arguments.
+If COMMAND-LINE names a program FILE to debug, lldb will run in
+a buffer named *gud-FILE*, and the directory containing FILE
+becomes the initial working directory and source-file directory
+for your debugger. If you don't want `default-directory' to
+change to the directory of FILE, specify FILE without leading
+directories, in which case FILE should reside either in the
+directory of the buffer from which this command is invoked, or
+it can be found by searching PATH.
+
+If COMMAND-LINE requests that lldb attaches to a process PID, lldb
+will run in *gud-PID*, otherwise it will run in *gud*; in these
+cases the initial working directory is the `default-directory' of
+the buffer in which this command was invoked."
+ (interactive (list (gud-query-cmdline 'lldb)))
+
+ (when (and gud-comint-buffer
+ (buffer-name gud-comint-buffer)
+ (get-buffer-process gud-comint-buffer)
+ (with-current-buffer gud-comint-buffer (eq gud-minor-mode 'gud-lldb)))
+ (gdb-restore-windows)
+ ;; FIXME: Copied from gud-gdb, but what does that even say?
+ (error "Multiple debugging requires restarting in text command mode"))
+
+ (gud-common-init command-line nil 'gud-lldb-marker-filter)
+ (setq-local gud-minor-mode 'lldb)
+
+ (gud-def gud-break
+ "breakpoint set -joint-specifier %f:%l"
+ "\C-b"
+ "Set breakpoint at current line.")
+ (gud-def gud-tbreak
+ "_regexp-break %f:%l"
+ "\C-t"
+ "Set temporary breakpoint at current line.")
+ (gud-def gud-remove
+ "breakpoint clear --line %l --file %f"
+ "\C-d"
+ "Remove breakpoint at current line")
+ (gud-def gud-step "thread step-in --count %p"
+ "\C-s"
+ "Step one source line with display.")
+ (gud-def gud-stepi
+ "thread step-inst --count %p"
+ "\C-i"
+ "Step one instruction with display.")
+ (gud-def gud-next
+ "thread step-over --count %p"
+ "\C-n"
+ "Step one line (skip functions).")
+ (gud-def gud-nexti
+ "thread step-inst-over --count %p"
+ nil
+ "Step one instruction (skip functions).")
+ (gud-def gud-cont
+ "process continue --ignore-count %p"
+ "\C-r"
+ "Continue with display.")
+ (gud-def gud-finish
+ "thread step-out"
+ "\C-f"
+ "Finish executing current function.")
+ (gud-def gud-jump
+ (progn
+ (gud-call "_regexp-break %f:%l" arg)
+ (gud-call "_regexp-jump %f:%l"))
+ "\C-j"
+ "Set execution address to current line.")
+ (gud-def gud-up
+ "_regexp-up up %p"
+ "<"
+ "Up N stack frames (numeric arg).")
+ (gud-def gud-down
+ "_regexp-down %p"
+ ">"
+ "Down N stack frames (numeric arg).")
+ (gud-def gud-print
+ "dwim-print %e"
+ "\C-p"
+ "Evaluate C expression at point.")
+ (gud-def gud-pstar
+ "dwim-print *%e"
+ nil
+ "Evaluate C dereferenced pointer expression at point.")
+
+ ;; For debugging Emacs only.
+ (gud-def gud-pv
+ "xprint %e"
+ "\C-v"
+ "Print the value of the lisp variable.")
+
+ (gud-def gud-until
+ "thread until %l"
+ "\C-u"
+ "Continue to current line.")
+ (gud-def gud-run
+ ;; Extension for process launch --tty?
+ "process launch -X true"
+ nil
+ "Run the program.")
+
+ (gud-set-repeat-map-property 'gud-gdb-repeat-map)
+ (setq comint-prompt-regexp "^(lldb) *")
+ (setq paragraph-start comint-prompt-regexp)
+ (setq gud-running nil)
+ (setq gud-filter-pending-text nil)
+ (run-hooks 'gud-lldb-mode-hook))
+
(provide 'gud)
;;; gud.el ends here
--
2.42.0
next reply other threads:[~2023-10-16 12:00 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-10-16 12:00 Gerd Möllmann [this message]
2023-10-16 13:30 ` bug#66575: [PATCH] Gud lldb support Mattias Engdegård
2023-10-16 13:57 ` Mattias Engdegård
2023-10-16 14:46 ` Mattias Engdegård
2023-10-17 8:15 ` Gerd Möllmann
2023-10-16 14:09 ` Gerd Möllmann
2023-10-17 9:00 ` Mattias Engdegård
2023-10-17 10:03 ` Gerd Möllmann
2023-10-17 11:21 ` Mattias Engdegård
2023-10-17 12:30 ` Gerd Möllmann
2023-10-17 16:18 ` Mattias Engdegård
2023-10-17 16:55 ` Gerd Möllmann
2023-10-17 17:18 ` Gerd Möllmann
2023-10-17 15:40 ` Gerd Möllmann
2023-10-17 16:27 ` Mattias Engdegård
2023-10-17 17:01 ` Gerd Möllmann
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=m2il76wzeg.fsf@Mini.fritz.box \
--to=gerd.moellmann@gmail.com \
--cc=66575@debbugs.gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).