blob: b27954acfbef4c31dccbeedc8c9926c16e139d65 [file] [log] [blame]
Rafael Espindola94c60cd2015-01-07 15:52:51 +00001;;; llvm-mode.el --- Major mode for the LLVM assembler language.
Misha Brukman4fb75da2002-10-09 00:30:20 +00002
Rafael Espindola94c60cd2015-01-07 15:52:51 +00003;; Maintainer: The LLVM team, http://llvm.org/
Rafael Espindola93955d02018-01-29 22:56:41 +00004;; Version: 1.0
Rafael Espindola94c60cd2015-01-07 15:52:51 +00005
6;;; Commentary:
7
8;; Major mode for editing LLVM IR files.
9
10;;; Code:
11
Rafael Espindola7915b9e2015-09-10 13:44:28 +000012(defvar llvm-mode-syntax-table
13 (let ((table (make-syntax-table)))
14 (modify-syntax-entry ?% "_" table)
15 (modify-syntax-entry ?. "_" table)
16 (modify-syntax-entry ?\; "< " table)
17 (modify-syntax-entry ?\n "> " table)
18 table)
Misha Brukman4fb75da2002-10-09 00:30:20 +000019 "Syntax table used while in LLVM mode.")
Rafael Espindola7915b9e2015-09-10 13:44:28 +000020
Misha Brukman4fb75da2002-10-09 00:30:20 +000021(defvar llvm-font-lock-keywords
22 (list
Misha Brukman4fb75da2002-10-09 00:30:20 +000023 ;; Variables
Rafael Espindola93955d02018-01-29 22:56:41 +000024 '("%[-a-zA-Z$._][-a-zA-Z$._0-9]*" . font-lock-variable-name-face)
Misha Brukman4fb75da2002-10-09 00:30:20 +000025 ;; Labels
Rafael Espindola93955d02018-01-29 22:56:41 +000026 '("[-a-zA-Z$._0-9]+:" . font-lock-variable-name-face)
Misha Brukman4fb75da2002-10-09 00:30:20 +000027 ;; Unnamed variable slots
28 '("%[-]?[0-9]+" . font-lock-variable-name-face)
Misha Brukman4fb75da2002-10-09 00:30:20 +000029 ;; Types
Rafael Espindola7915b9e2015-09-10 13:44:28 +000030 `(,(regexp-opt '("void" "i1" "i8" "i16" "i32" "i64" "i128" "float" "double" "type" "label" "opaque") 'symbols) . font-lock-type-face)
Anton Korobeynikovf93fa132007-10-19 16:54:13 +000031 ;; Integer literals
32 '("\\b[-]?[0-9]+\\b" . font-lock-preprocessor-face)
33 ;; Floating point constants
Rafael Espindola93955d02018-01-29 22:56:41 +000034 '("\\b[-+]?[0-9]+.[0-9]*\\([eE][-+]?[0-9]+\\)?\\b" . font-lock-preprocessor-face)
Anton Korobeynikovf93fa132007-10-19 16:54:13 +000035 ;; Hex constants
36 '("\\b0x[0-9A-Fa-f]+\\b" . font-lock-preprocessor-face)
37 ;; Keywords
Misha Brukman81b78992010-09-19 03:44:22 +000038 `(,(regexp-opt '("begin" "end" "true" "false" "zeroinitializer" "declare"
39 "define" "global" "constant" "const" "internal" "linkonce" "linkonce_odr"
40 "weak" "weak_odr" "appending" "uninitialized" "implementation" "..."
41 "null" "undef" "to" "except" "not" "target" "endian" "little" "big"
Ramkumar Ramachandra6d3e8402015-02-09 00:30:03 +000042 "pointersize" "volatile" "fastcc" "coldcc" "cc" "personality") 'symbols) . font-lock-keyword-face)
Misha Brukman4fb75da2002-10-09 00:30:20 +000043 ;; Arithmetic and Logical Operators
Matt Arsenault1cdefcb2013-11-14 02:03:02 +000044 `(,(regexp-opt '("add" "sub" "mul" "sdiv" "udiv" "urem" "srem" "and" "or" "xor"
Rafael Espindola9992d612015-02-06 13:57:58 +000045 "setne" "seteq" "setlt" "setgt" "setle" "setge") 'symbols) . font-lock-keyword-face)
Michael Ilseman640a1262012-12-01 00:42:27 +000046 ;; Floating-point operators
Rafael Espindola9992d612015-02-06 13:57:58 +000047 `(,(regexp-opt '("fadd" "fsub" "fmul" "fdiv" "frem") 'symbols) . font-lock-keyword-face)
Misha Brukman4fb75da2002-10-09 00:30:20 +000048 ;; Special instructions
Rafael Espindola9992d612015-02-06 13:57:58 +000049 `(,(regexp-opt '("phi" "tail" "call" "select" "to" "shl" "lshr" "ashr" "fcmp" "icmp" "va_arg" "landingpad") 'symbols) . font-lock-keyword-face)
Misha Brukman4fb75da2002-10-09 00:30:20 +000050 ;; Control instructions
Rafael Espindola9992d612015-02-06 13:57:58 +000051 `(,(regexp-opt '("ret" "br" "switch" "invoke" "resume" "unwind" "unreachable" "indirectbr") 'symbols) . font-lock-keyword-face)
Misha Brukman4fb75da2002-10-09 00:30:20 +000052 ;; Memory operators
Rafael Espindola9992d612015-02-06 13:57:58 +000053 `(,(regexp-opt '("malloc" "alloca" "free" "load" "store" "getelementptr" "fence" "cmpxchg" "atomicrmw") 'symbols) . font-lock-keyword-face)
Matt Arsenault1cdefcb2013-11-14 02:03:02 +000054 ;; Casts
Rafael Espindola9992d612015-02-06 13:57:58 +000055 `(,(regexp-opt '("bitcast" "inttoptr" "ptrtoint" "trunc" "zext" "sext" "fptrunc" "fpext" "fptoui" "fptosi" "uitofp" "sitofp" "addrspacecast") 'symbols) . font-lock-keyword-face)
Matt Arsenault1cdefcb2013-11-14 02:03:02 +000056 ;; Vector ops
Rafael Espindola9992d612015-02-06 13:57:58 +000057 `(,(regexp-opt '("extractelement" "insertelement" "shufflevector") 'symbols) . font-lock-keyword-face)
Matt Arsenault1cdefcb2013-11-14 02:03:02 +000058 ;; Aggregate ops
Rafael Espindola9992d612015-02-06 13:57:58 +000059 `(,(regexp-opt '("extractvalue" "insertvalue") 'symbols) . font-lock-keyword-face)
Duncan P. N. Exon Smith090a19b2015-01-08 22:38:29 +000060 ;; Metadata types
Rafael Espindola9992d612015-02-06 13:57:58 +000061 `(,(regexp-opt '("distinct") 'symbols) . font-lock-keyword-face)
Duncan P. N. Exon Smith0a448fb2014-08-19 21:30:15 +000062 ;; Use-list order directives
Rafael Espindola7915b9e2015-09-10 13:44:28 +000063 `(,(regexp-opt '("uselistorder" "uselistorder_bb") 'symbols) . font-lock-keyword-face))
64 "Syntax highlighting for LLVM.")
Matt Arsenault1cdefcb2013-11-14 02:03:02 +000065
Rafael Espindola7915b9e2015-09-10 13:44:28 +000066;; Emacs 23 compatibility.
67(defalias 'llvm-mode-prog-mode
68 (if (fboundp 'prog-mode)
69 'prog-mode
70 'fundamental-mode))
Misha Brukman4fb75da2002-10-09 00:30:20 +000071
Rafael Espindola94c60cd2015-01-07 15:52:51 +000072;;;###autoload
Rafael Espindola7915b9e2015-09-10 13:44:28 +000073(define-derived-mode llvm-mode llvm-mode-prog-mode "LLVM"
Misha Brukman4fb75da2002-10-09 00:30:20 +000074 "Major mode for editing LLVM source files.
Rafael Espindola94c60cd2015-01-07 15:52:51 +000075\\{llvm-mode-map}
76 Runs `llvm-mode-hook' on startup."
Rafael Espindola7915b9e2015-09-10 13:44:28 +000077 (setq font-lock-defaults `(llvm-font-lock-keywords))
Rafael Espindola93955d02018-01-29 22:56:41 +000078 (setq-local comment-start ";"))
Misha Brukman4fb75da2002-10-09 00:30:20 +000079
80;; Associate .ll files with llvm-mode
Rafael Espindola94c60cd2015-01-07 15:52:51 +000081;;;###autoload
Rafael Espindola93955d02018-01-29 22:56:41 +000082(add-to-list 'auto-mode-alist (cons "\\.ll\\'" 'llvm-mode))
Misha Brukman4fb75da2002-10-09 00:30:20 +000083
84(provide 'llvm-mode)
Rafael Espindola94c60cd2015-01-07 15:52:51 +000085
86;;; llvm-mode.el ends here