branch: externals/beardbolt
commit 15455318490511835138b40f7dfafbd5dfcf584b
Author: Jay Kamat <[email protected]>
Commit: Jay Kamat <[email protected]>
Add initial implementation of filter
---
README.org | 9 +++----
rmsbolt.el | 80 +++++++++++++++++++++++++++++++++++++++++++++-----------------
2 files changed, 64 insertions(+), 25 deletions(-)
diff --git a/README.org b/README.org
index e041f7da80..aa72b10163 100644
--- a/README.org
+++ b/README.org
@@ -1,13 +1,14 @@
* RMSbolt
-A basic implementation of the
[[https://github.com/mattgodbolt/compiler-explorer][godbolt compiler-exporter]]
in emacs.
+A basic implementation of the
[[https://github.com/mattgodbolt/compiler-explorer][godbolt compiler-exporter]]
for Emacs.
* Why RMSbolt over godbolt?
- No sending your code to a third party server
- Compilation runs entirely on your machine
-- Faster results
+- Better turnaround time from writing code to seeing disassembly
- Infinitely hackable!
-- Write your code in your preferred editing environment
-- Runs entirely with 0 js
+- Write, compile, and view dissasembly entirely in Emacs
+- Runs entirely without node, npm, or js.
+ - No dependencies other than emacs 25 and your compiler ~:)~
diff --git a/rmsbolt.el b/rmsbolt.el
index 3221f38044..dbeaacd673 100644
--- a/rmsbolt.el
+++ b/rmsbolt.el
@@ -73,12 +73,13 @@
(defvar rmsbolt-defines-function (rx bol (0+ space) ".type"
(0+ any) "," (0+ space) (any "@%")
"function" eol))
-
(defvar rmsbolt-data-defn (rx bol (0+ space) "."
(group (or "string" "asciz" "ascii"
(and
(optional (any "1248")) "byte")
"short" "word" "long" "quad" "value"
"zero"))))
+(defvar rmsbolt-directive (rx bol (0+ space) "." (0+ any) eol))
+(defvar rmsbolt-endblock (rx "." (or "cfi_endproc" "data" "text" "section")))
;;;; Classes
@@ -102,14 +103,14 @@
:documentation "The mode to activate this language in."))
(defvar rmsbolt-languages
- `((c-mode .
- ,(make-rmsbolt-lang :mode 'c
- :options (make-rmsbolt-options
- :compile-cmd "gcc -g -O0")) )
- (c++-mode .
- ,(make-rmsbolt-lang :mode 'c++-mode
- :options (make-rmsbolt-options
- :compile-cmd "g++ -g -O0")) )
+ `((c-mode
+ . ,(make-rmsbolt-lang :mode 'c
+ :options (make-rmsbolt-options
+ :compile-cmd "gcc -g -O0")) )
+ (c++-mode
+ . ,(make-rmsbolt-lang :mode 'c++-mode
+ :options (make-rmsbolt-options
+ :compile-cmd "g++ -g -O0")) )
))
@@ -125,6 +126,8 @@
;;;; Functions
+;; Functions to parse and lint assembly were lifted almost directly from the
compiler-exporter
+
(defun rmsbolt-re-seq (regexp string)
"Get list of all REGEXP match in STRING."
(save-match-data
@@ -162,7 +165,9 @@
(match-string 1 line)))
(when match
(setq current-label match))
- (when (string-match-p rmsbolt-defines-global line)
+ (setq match (and (string-match rmsbolt-defines-global line)
+ (match-string 1 line)))
+ (when match
(cl-pushnew match labels-used :test #'equal))
;; When we have no line or a period started line, skip
(unless (or (= 0 (length line))
@@ -205,18 +210,51 @@
(defun rmsbolt--process-asm-lines (asm-lines)
"Process and filter a set of asm lines."
- (when rmsbot-filter-unused-labels
- (let* ((used-labels (rmsbolt--find-used-labels asm-lines)))
-
+ (when rmsbolt-filter-unused-labels
+ (let ((used-labels (rmsbolt--find-used-labels asm-lines))
+ (result nil)
+ (prev-label nil))
+ (dolist (line asm-lines)
+ (let* ((raw-match (or (string-match rmsbolt-label-def line)
+ (string-match rmsbolt-assignment-def line)))
+ (match (when raw-match
+ (match-string 1 line)))
+ (used-label (cl-find match used-labels :test #'equal)))
+ (cl-tagbody
+ ;; End block, reset prev-label and source
+ (when (string-match-p rmsbolt-endblock line)
+ (setq prev-label nil))
+
+ ;; continue means we don't add to the ouptut
+ (when match
+ (if (not used-label)
+ ;; Unused label
+ (when rmsbolt-filter-unused-labels
+ (go continue))
+ ;; Real label, set prev-label
+ (setq prev-label raw-match)))
+ (when (and rmsbolt-filter-asm-directives
+ (not match))
+ (if (and (string-match-p rmsbolt-data-defn line)
+ prev-label)
+ ;; data is being used
+ nil
+ (when (string-match-p rmsbolt-directive line)
+ (go continue))))
+ (push line result)
+ continue)))
+
+ (mapconcat 'identity
+ (nreverse result)
+ "\n")
))
- (when rmsbolt-filter-asm-directives
- (setq asm-lines
- (cl-remove-if
- (apply-partially #'string-match-p +rmsbolt-assembler-pattern+)
- asm-lines)))
- (mapconcat 'identity
- asm-lines
- "\n"))
+
+ ;; (when rmsbolt-filter-asm-directives
+ ;; (setq asm-lines
+ ;; (cl-remove-if
+ ;; (apply-partially #'string-match-p +rmsbolt-assembler-pattern+)
+ ;; asm-lines)))
+ )
(defun rmsbolt--handle-finish-compile (buffer _str)
"Finish hook for compilations."