[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/beardbolt 65a1ac7b6e 054/323: Add support for demanglin
From: |
ELPA Syncer |
Subject: |
[elpa] externals/beardbolt 65a1ac7b6e 054/323: Add support for demangling |
Date: |
Thu, 9 Mar 2023 10:58:15 -0500 (EST) |
branch: externals/beardbolt
commit 65a1ac7b6eba896fba0fdec601f0933cc2daee5a
Author: Jay Kamat <jaygkamat@gmail.com>
Commit: Jay Kamat <jaygkamat@gmail.com>
Add support for demangling
---
README.org | 2 ++
rmsbolt.el | 58 +++++++++++++++++++++++++++++++++++++++-------------
test/rmsbolt-test.el | 47 +++++++++++++++++++++++++++++++++++++++++-
3 files changed, 92 insertions(+), 15 deletions(-)
diff --git a/README.org b/README.org
index 2a9207b33f..68c5b5186b 100644
--- a/README.org
+++ b/README.org
@@ -25,6 +25,8 @@ versa.
* Installation
+rmsbolt will almost certainly not work on windows.
+
rmsbolt is not on melpa yet. If you find it useful, please let me know and I
may
add it..
diff --git a/rmsbolt.el b/rmsbolt.el
index b406699822..d4182dc3a2 100644
--- a/rmsbolt.el
+++ b/rmsbolt.el
@@ -86,6 +86,11 @@
:type 'boolean
:safe 'booleanp
:group 'rmsbolt)
+(defcustom rmsbolt-demangle t
+ "Whether to attempt to demangle the resulting assembly."
+ :type 'boolean
+ :safe 'booleanp
+ :group 'rmsbolt)
;;;; Faces
@@ -215,8 +220,12 @@ Outputs assembly file if ASM."
:documentation "If we support assembly directly. If nil, we must
disassemble.")
(objdumper
'objdump
- :type symbol
+ :type 'symbol
:documentation "The object dumper to use if disassembling binary.")
+ (demangler
+ "c++filt"
+ :type 'string
+ :documentation "The command of the demangler to use for this source code.")
(starter-file-name
nil
:type 'string
@@ -253,7 +262,7 @@ Outputs assembly file if ASM."
(cl-defun rmsbolt--ocaml-compile-cmd (&key src-buffer)
"Process a compile command for gcc/clang.
- Needed as ocaml cannot output asm to a
non-hardcoded file"
+ Needed as ocaml cannot output asm to a non-hardcoded file"
(let* ((diss (buffer-local-value 'rmsbolt-disassemble src-buffer))
(output-filename (rmsbolt-output-filename src-buffer))
(predicted-asm-filename (concat (file-name-sans-extension
(buffer-file-name)) ".s"))
@@ -373,6 +382,7 @@ Outputs assembly file if ASM."
:compile-cmd "ocamlopt"
:supports-asm t
:supports-disass t
+ :demangler nil
:starter-file-name "rmsbolt.ml"
:compile-cmd-function #'rmsbolt--ocaml-compile-cmd
:disass-hidden-funcs rmsbolt--hidden-func-ocaml))
@@ -382,6 +392,7 @@ Outputs assembly file if ASM."
:supports-asm t
:supports-disass nil
:objdumper 'cat
+ :demangler nil
:starter-file-name "rmsbolt.lisp"
:compile-cmd-function #'rmsbolt--lisp-compile-cmd
:disass-hidden-funcs nil))
@@ -391,6 +402,7 @@ Outputs assembly file if ASM."
:supports-asm t
:supports-disass nil
:objdumper 'objdump
+ :demangler "rustfilt"
:starter-file-name "rmsbolt.rs"
:compile-cmd-function #'rmsbolt--rust-compile-cmd
:disass-hidden-funcs nil))
@@ -701,6 +713,23 @@ Outputs assembly file if ASM."
(setq-local rmsbolt-disassemble nil))
src-buffer))
+(defun rmsbolt--demangle-command (existing-cmd lang src-buffer)
+ "Append a demangler routine to EXISTING-CMD with LANG and SRC-BUFFER and
return it."
+ (if-let ((to-demangle (buffer-local-value 'rmsbolt-demangle src-buffer))
+ (demangler (rmsbolt-l-demangler lang))
+ (demangler-exists (executable-find demangler)))
+ (concat existing-cmd " "
+ (mapconcat
+ 'identity
+ (list "&&" demangler
+ "<" (rmsbolt-output-filename src-buffer t)
+ ">" (expand-file-name "tmp.s" rmsbolt-temp-dir)
+ "&&" "mv"
+ (expand-file-name "tmp.s" rmsbolt-temp-dir)
+ (rmsbolt-output-filename src-buffer t))
+ " "))
+ existing-cmd))
+
;;;;; UI Functions
(defun rmsbolt-compile ()
"Compile the current rmsbolt buffer."
@@ -713,7 +742,10 @@ Outputs assembly file if ASM."
(let* ((src-buffer (current-buffer))
(lang (rmsbolt--get-lang))
(func (rmsbolt-l-compile-cmd-function lang))
- (cmd (funcall func :src-buffer src-buffer)))
+ ;; Generate command
+ (cmd (funcall func :src-buffer src-buffer))
+ ;; Convert to demangle if we need to
+ (cmd (rmsbolt--demangle-command cmd lang src-buffer)))
(when (buffer-local-value 'rmsbolt-disassemble src-buffer)
(pcase
@@ -822,7 +854,6 @@ Outputs assembly file if ASM."
(defun rmsbolt-move-overlays ()
"Function for moving overlays for rmsbolt."
-
(when rmsbolt-mode
(if-let* ((should-run rmsbolt-use-overlays)
(src-buffer
@@ -843,6 +874,7 @@ Outputs assembly file if ASM."
(cl-values (c-point 'bol) (c-point 'bonl))))))
(let ((line-visible (not rmsbolt-goto-match))
(src-buffer-selected (eq (current-buffer) src-buffer)))
+ ;; Clear out overlays in case they are used
(mapc #'delete-overlay rmsbolt-overlays)
(setq rmsbolt-overlays nil)
(push (rmsbolt--setup-overlay (cl-first src-pts) (cl-second src-pts)
src-buffer)
@@ -872,22 +904,20 @@ Outputs assembly file if ASM."
rmsbolt-overlays)))))
(unless line-visible
;; Scroll buffer to first line
- (when-let
- ((scroll-buffer (if src-buffer-selected
- output-buffer
- src-buffer))
- (line-scroll (if src-buffer-selected
- (car-safe
- (cl-first asm-lines))
- src-current-line))
- (window (get-buffer-window scroll-buffer)))
+ (when-let ((scroll-buffer (if src-buffer-selected
+ output-buffer
+ src-buffer))
+ (line-scroll (if src-buffer-selected
+ (car-safe
+ (cl-first asm-lines))
+ src-current-line))
+ (window (get-buffer-window scroll-buffer)))
(with-selected-window window
(rmsbolt--goto-line line-scroll)
;; If we scrolled, recenter
(recenter))))))
(mapc #'delete-overlay rmsbolt-overlays)
(setq rmsbolt-overlays nil))
-
;; If not in rmsbolt-mode, don't do anything
))
diff --git a/test/rmsbolt-test.el b/test/rmsbolt-test.el
index 6f1f5224b8..261a50141c 100644
--- a/test/rmsbolt-test.el
+++ b/test/rmsbolt-test.el
@@ -27,6 +27,8 @@
(string-trim
(buffer-string))))))
+;;;; Filtration tests
+
(ert-deftest filter-tests-all-c ()
"Test if assembly filteration in c is working."
(with-temp-buffer
@@ -60,6 +62,49 @@
(setq-local rmsbolt-filter-labels t)
(test-asm-preprocessor "test/rmsbolt-c-pre2.s" "test/rmsbolt-c-post4.s")))
-;;;; Filtration tests
+;;;; Demangler tests
+
+(ert-deftest demangler-test-disabled ()
+ (with-temp-buffer
+ (setq-local rmsbolt-demangle nil)
+ (should
+ (string-empty-p
+ (rmsbolt--demangle-command
+ ""
+ (make-rmsbolt-lang :demangler nil)
+ (current-buffer))))))
+
+(ert-deftest demangler-test-invalid-demangler ()
+ (with-temp-buffer
+ (setq-local rmsbolt-demangle t)
+ (should
+ (string-empty-p
+ (rmsbolt--demangle-command
+ ""
+ (make-rmsbolt-lang :demangler nil)
+ (current-buffer))))))
+
+(ert-deftest demangler-test-not-path ()
+ (with-temp-buffer
+ (setq-local rmsbolt-demangle t)
+ (should
+ (string-empty-p
+ (rmsbolt--demangle-command
+ ""
+ (make-rmsbolt-lang :demangler "nonsense-binary-name-not-on-path")
+ (current-buffer))))))
+
+(ert-deftest demangler-test-valid-demangler ()
+ ;; Assumes test is on the path!
+ (with-temp-buffer
+ (setq-local rmsbolt-demangle t)
+ (should
+ (string-match-p
+ (regexp-opt '("test"))
+ (rmsbolt--demangle-command
+ ""
+ (make-rmsbolt-lang :demangler "test")
+ (current-buffer))))))
+
;;; rmsbolt-test.el ends here
- [elpa] externals/beardbolt a638324882 039/323: Add OCaml demo, (continued)
- [elpa] externals/beardbolt a638324882 039/323: Add OCaml demo, ELPA Syncer, 2023/03/09
- [elpa] externals/beardbolt e0d917206e 038/323: Improve quality of default matching faces, ELPA Syncer, 2023/03/09
- [elpa] externals/beardbolt a950515dfc 043/323: Fix spelling mistake, ELPA Syncer, 2023/03/09
- [elpa] externals/beardbolt 4213316f23 037/323: Fix recentering when not needed, ELPA Syncer, 2023/03/09
- [elpa] externals/beardbolt 545a366472 049/323: Add more tests, ELPA Syncer, 2023/03/09
- [elpa] externals/beardbolt 2e6163c95a 047/323: Add testing framework, ELPA Syncer, 2023/03/09
- [elpa] externals/beardbolt 5efa347027 046/323: Update readme, ELPA Syncer, 2023/03/09
- [elpa] externals/beardbolt 082cbc7b1c 048/323: Add new tests, ELPA Syncer, 2023/03/09
- [elpa] externals/beardbolt ff6f376d87 053/323: Update README.org, ELPA Syncer, 2023/03/09
- [elpa] externals/beardbolt 3ca3f35cdb 050/323: Add very basic support for rust, ELPA Syncer, 2023/03/09
- [elpa] externals/beardbolt 65a1ac7b6e 054/323: Add support for demangling,
ELPA Syncer <=
- [elpa] externals/beardbolt bb64352f8d 034/323: Store and use ranges to view highlighted regions, ELPA Syncer, 2023/03/09
- [elpa] externals/beardbolt 1419a90465 040/323: Add C/C++ demo, ELPA Syncer, 2023/03/09
- [elpa] externals/beardbolt 39f1e05667 009/323: Add filter for commentOnly, ELPA Syncer, 2023/03/09
- [elpa] externals/beardbolt 4a35528d7d 021/323: Configure all variables with buffer-local values, ELPA Syncer, 2023/03/09
- [elpa] externals/beardbolt 3bfc7ed2e3 012/323: Allow custom functions to parse arguments, ELPA Syncer, 2023/03/09
- [elpa] externals/beardbolt 98cea6e8e0 023/323: Simplify creation of new starters with a macro, ELPA Syncer, 2023/03/09
- [elpa] externals/beardbolt 547a47e58f 022/323: Fix default commands, ELPA Syncer, 2023/03/09
- [elpa] externals/beardbolt 2530003c71 020/323: Remove rmsbolt-options, ELPA Syncer, 2023/03/09
- [elpa] externals/beardbolt cf7d2787bc 027/323: Implement line number parsing, ELPA Syncer, 2023/03/09
- [elpa] externals/beardbolt 8fc36eacd8 044/323: Add option to force assembling, ELPA Syncer, 2023/03/09