1" Vim syntax file
2" Language:   llvm
3" Maintainer: The LLVM team, http://llvm.org/
4" Version:      $Revision$
5
6if version < 600
7  syntax clear
8elseif exists("b:current_syntax")
9  finish
10endif
11
12syn case match
13
14" Types.
15" Types also include struct, array, vector, etc. but these don't
16" benefit as much from having dedicated highlighting rules.
17syn keyword llvmType void half bfloat float double x86_fp80 fp128 ppc_fp128
18syn keyword llvmType label metadata x86_mmx x86_amx
19syn keyword llvmType type label opaque token
20syn match   llvmType /\<i\d\+\>/
21
22" Instructions.
23" The true and false tokens can be used for comparison opcodes, but it's
24" much more common for these tokens to be used for boolean constants.
25syn keyword llvmStatement add addrspacecast alloca and arcp ashr atomicrmw
26syn keyword llvmStatement bitcast br catchpad catchswitch catchret call callbr
27syn keyword llvmStatement cleanuppad cleanupret cmpxchg eq exact extractelement
28syn keyword llvmStatement extractvalue fadd fast fcmp fdiv fence fmul fpext
29syn keyword llvmStatement fptosi fptoui fptrunc free frem fsub fneg getelementptr
30syn keyword llvmStatement icmp inbounds indirectbr insertelement insertvalue
31syn keyword llvmStatement inttoptr invoke landingpad load lshr malloc max min
32syn keyword llvmStatement mul nand ne ninf nnan nsw nsz nuw oeq oge ogt ole
33syn keyword llvmStatement olt one or ord phi ptrtoint resume ret sdiv select
34syn keyword llvmStatement sext sge sgt shl shufflevector sitofp sle slt srem
35syn keyword llvmStatement store sub switch trunc udiv ueq uge ugt uitofp ule ult
36syn keyword llvmStatement umax umin une uno unreachable unwind urem va_arg
37syn keyword llvmStatement xchg xor zext
38
39" Keywords.
40syn keyword llvmKeyword
41      \ acq_rel
42      \ acquire
43      \ addrspace
44      \ alias
45      \ align
46      \ alignstack
47      \ allocsize
48      \ alwaysinline
49      \ appending
50      \ argmemonly
51      \ arm_aapcs_vfpcc
52      \ arm_aapcscc
53      \ arm_apcscc
54      \ asm
55      \ atomic
56      \ available_externally
57      \ blockaddress
58      \ builtin
59      \ byref
60      \ byval
61      \ c
62      \ caller
63      \ catch
64      \ cc
65      \ ccc
66      \ cleanup
67      \ cold
68      \ coldcc
69      \ comdat
70      \ common
71      \ constant
72      \ convergent
73      \ datalayout
74      \ declare
75      \ default
76      \ define
77      \ deplibs
78      \ dereferenceable
79      \ dereferenceable_or_null
80      \ distinct
81      \ dllexport
82      \ dllimport
83      \ dso_local
84      \ dso_preemptable
85      \ except
86      \ extern_weak
87      \ external
88      \ externally_initialized
89      \ fastcc
90      \ filter
91      \ from
92      \ gc
93      \ global
94      \ hhvm_ccc
95      \ hhvmcc
96      \ hidden
97      \ hot
98      \ immarg
99      \ inaccessiblemem_or_argmemonly
100      \ inaccessiblememonly
101      \ inalloca
102      \ initialexec
103      \ inlinehint
104      \ inreg
105      \ intel_ocl_bicc
106      \ inteldialect
107      \ internal
108      \ jumptable
109      \ linkonce
110      \ linkonce_odr
111      \ local_unnamed_addr
112      \ localdynamic
113      \ localexec
114      \ minsize
115      \ module
116      \ monotonic
117      \ msp430_intrcc
118      \ mustprogress
119      \ musttail
120      \ naked
121      \ nest
122      \ noalias
123      \ nobuiltin
124      \ nocallback
125      \ nocapture
126      \ nocf_check
127      \ noduplicate
128      \ nofree
129      \ noimplicitfloat
130      \ noinline
131      \ nomerge
132      \ nonlazybind
133      \ nonnull
134      \ noprofile
135      \ norecurse
136      \ noredzone
137      \ noreturn
138      \ nosync
139      \ noundef
140      \ nounwind
141      \ null_pointer_is_valid
142      \ optforfuzzing
143      \ optnone
144      \ optsize
145      \ personality
146      \ preallocated
147      \ private
148      \ protected
149      \ ptx_device
150      \ ptx_kernel
151      \ readnone
152      \ readonly
153      \ release
154      \ returned
155      \ returns_twice
156      \ safestack
157      \ sanitize_address
158      \ sanitize_hwaddress
159      \ sanitize_memory
160      \ sanitize_memtag
161      \ sanitize_thread
162      \ section
163      \ seq_cst
164      \ shadowcallstack
165      \ sideeffect
166      \ signext
167      \ source_filename
168      \ speculatable
169      \ speculative_load_hardening
170      \ spir_func
171      \ spir_kernel
172      \ sret
173      \ ssp
174      \ sspreq
175      \ sspstrong
176      \ strictfp
177      \ swiftcc
178      \ swifterror
179      \ swiftself
180      \ syncscope
181      \ tail
182      \ tailcc
183      \ target
184      \ thread_local
185      \ to
186      \ triple
187      \ unnamed_addr
188      \ unordered
189      \ uselistorder
190      \ uselistorder_bb
191      \ uwtable
192      \ volatile
193      \ weak
194      \ weak_odr
195      \ willreturn
196      \ win64cc
197      \ within
198      \ writeonly
199      \ x86_64_sysvcc
200      \ x86_fastcallcc
201      \ x86_stdcallcc
202      \ x86_thiscallcc
203      \ zeroext
204
205" Obsolete keywords.
206syn keyword llvmError  getresult begin end
207
208" Misc syntax.
209syn match   llvmNoName /[%@!]\d\+\>/
210syn match   llvmNumber /-\?\<\d\+\>/
211syn match   llvmFloat  /-\?\<\d\+\.\d*\(e[+-]\d\+\)\?\>/
212syn match   llvmFloat  /\<0x\x\+\>/
213syn keyword llvmBoolean true false
214syn keyword llvmConstant zeroinitializer undef null none poison
215syn match   llvmComment /;.*$/
216syn region  llvmString start=/"/ skip=/\\"/ end=/"/
217syn match   llvmLabel /[-a-zA-Z$._][-a-zA-Z$._0-9]*:/
218syn match   llvmIdentifier /[%@][-a-zA-Z$._][-a-zA-Z$._0-9]*/
219
220" Named metadata and specialized metadata keywords.
221syn match   llvmIdentifier /![-a-zA-Z$._][-a-zA-Z$._0-9]*\ze\s*$/
222syn match   llvmIdentifier /![-a-zA-Z$._][-a-zA-Z$._0-9]*\ze\s*[=!]/
223syn match   llvmType /!\zs\a\+\ze\s*(/
224syn match   llvmConstant /\<DW_TAG_[a-z_]\+\>/
225syn match   llvmConstant /\<DW_ATE_[a-zA-Z_]\+\>/
226syn match   llvmConstant /\<DW_OP_[a-zA-Z0-9_]\+\>/
227syn match   llvmConstant /\<DW_LANG_[a-zA-Z0-9_]\+\>/
228syn match   llvmConstant /\<DW_VIRTUALITY_[a-z_]\+\>/
229syn match   llvmConstant /\<DIFlag[A-Za-z]\+\>/
230
231" Syntax-highlight lit test commands and bug numbers.
232syn match  llvmSpecialComment /;\s*PR\d*\s*$/
233syn match  llvmSpecialComment /;\s*REQUIRES:.*$/
234syn match  llvmSpecialComment /;\s*RUN:.*$/
235syn match  llvmSpecialComment /;\s*ALLOW_RETRIES:.*$/
236syn match  llvmSpecialComment /;\s*CHECK:.*$/
237syn match  llvmSpecialComment "\v;\s*CHECK-(NEXT|NOT|DAG|SAME|LABEL):.*$"
238syn match  llvmSpecialComment /;\s*XFAIL:.*$/
239
240if version >= 508 || !exists("did_c_syn_inits")
241  if version < 508
242    let did_c_syn_inits = 1
243    command -nargs=+ HiLink hi link <args>
244  else
245    command -nargs=+ HiLink hi def link <args>
246  endif
247
248  HiLink llvmType Type
249  HiLink llvmStatement Statement
250  HiLink llvmNumber Number
251  HiLink llvmComment Comment
252  HiLink llvmString String
253  HiLink llvmLabel Label
254  HiLink llvmKeyword Keyword
255  HiLink llvmBoolean Boolean
256  HiLink llvmFloat Float
257  HiLink llvmNoName Identifier
258  HiLink llvmConstant Constant
259  HiLink llvmSpecialComment SpecialComment
260  HiLink llvmError Error
261  HiLink llvmIdentifier Identifier
262
263  delcommand HiLink
264endif
265
266let b:current_syntax = "llvm"
267