From 4ff7150ef3b52079689929125562115bd39e671d Mon Sep 17 00:00:00 2001 From: Benson Chu Date: Wed, 25 Jan 2023 16:18:18 -0600 Subject: [PATCH] SCREW THE WORLD --- lisp/llvm-lib/llvm-jump-to-tablegen.el | 66 ++++++++++++++++++-------- lisp/llvm-lib/llvm-lib.el | 1 + lisp/ti-config/work-config.el | 4 ++ 3 files changed, 50 insertions(+), 21 deletions(-) diff --git a/lisp/llvm-lib/llvm-jump-to-tablegen.el b/lisp/llvm-lib/llvm-jump-to-tablegen.el index 45357b0..14207db 100644 --- a/lisp/llvm-lib/llvm-jump-to-tablegen.el +++ b/lisp/llvm-lib/llvm-jump-to-tablegen.el @@ -28,11 +28,14 @@ (defconst ll/def-keywords (rx (or "class" "multiclass" "def" "defm" - "defvar") + "defvar" + (seq "defset" + (+ (or space "\n")) + (+ (or alphanumeric ">" "<" "_")))) (+ (or space "\n")) (group (+ (or alphanumeric "_"))) - (+ (or space "\n")) - (or "{" "<" ":"))) ;; defset is special + (* (+ (or space "\n"))) + (or "{" "<" ":" "="))) ;; defset is special (defvar ll/def-class-hash (make-hash-table :test #'equal)) @@ -41,29 +44,50 @@ (remhash target ll/def-class-hash)) (or (gethash target ll/def-class-hash) - (let ((l (make-hash-table :test #'equal))) - (--> - (lls/get-llvm-root-dir) - (expand-file-name "llvm/lib/Target/" it) - (expand-file-name target it) - (dolist (file (directory-files it t ".*\\.td$")) - (with-current-buffer (find-file-noselect file) - (save-excursion - (goto-char (point-min)) - (while (re-search-forward ll/def-keywords nil t) - (let ((str (match-string 1))) - (set-text-properties 0 (length str) nil str) - (puthash str (point-marker) l))))))) + (let* ((l (make-hash-table)) + (td-regexp (rx (+ anything) ".td" line-end)) + (target-dir + (--> + (lls/get-llvm-root-dir) + (expand-file-name "llvm/lib/Target/" it) + (expand-file-name target it) + (directory-files it t td-regexp))) + (gen-dir + (--> + (lls/get-llvm-root-dir) + (expand-file-name "llvm/include/llvm/Target" it) + (directory-files it t td-regexp)))) + + (dolist (file (append gen-dir target-dir)) + (with-current-buffer (find-file-noselect file) + (save-excursion + (goto-char (point-min)) + (while (re-search-forward ll/def-keywords nil t) + (goto-char (match-beginning 1)) + (puthash (intern (match-string 1)) (point-marker) l))))) (puthash target l ll/def-class-hash) l))) +(defun ll/read-tablegen-target () + (if (string-match (rx "llvm/lib/Target/" (group (+ alphanumeric)) "/") default-directory) + (match-string 1 default-directory) + (completing-read "Target? " + (ll/get-codegen-targets)))) + +(defun ll/read-tablegen-symbol (target arg) + (let ((map (ll/get-defs-and-classes target arg)) + (cur (symbol-at-point))) + (or (gethash cur map) + (--> + (completing-read "Symbol? " (hash-table-keys map) nil t) + (intern it) + (gethash it map))))) + (defun ll/jump-to-tablegen (arg) (interactive "P") - (let* ((target (completing-read "Target? " - (ll/get-codegen-targets))) - (p (ll/get-defs-and-classes target arg)) - (symbol (completing-read "Symbol? " (hash-table-keys p))) - (marker (gethash symbol p))) + (let* ((target (ll/read-tablegen-target)) + (marker (ll/read-tablegen-symbol target arg))) + (xref--push-markers) (display-buffer-same-window (marker-buffer marker) nil) (goto-char (marker-position marker)) (recenter))) diff --git a/lisp/llvm-lib/llvm-lib.el b/lisp/llvm-lib/llvm-lib.el index 45a2d25..7498d7d 100644 --- a/lisp/llvm-lib/llvm-lib.el +++ b/lisp/llvm-lib/llvm-lib.el @@ -27,6 +27,7 @@ (require 'llvm-build-tool) (require 'llvm-gdb-command) (require 'llvm-show-instr-info) +(require 'llvm-jump-to-tablegen) (define-prefix-command '*llvm-map*) ;; (define-key *root-map* (kbd "C-w") '*llvm-map*) diff --git a/lisp/ti-config/work-config.el b/lisp/ti-config/work-config.el index e90eadd..e305d74 100644 --- a/lisp/ti-config/work-config.el +++ b/lisp/ti-config/work-config.el @@ -144,5 +144,9 @@ (insert comment-end) (indent-for-comment)))) +(require 'llvm-jump-to-tablegen) + +(define-key tablegen-mode-map (kbd "M-.") #'ll/jump-to-tablegen) + (provide 'work-config) ;;; work-config.el ends here