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 ptr
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 fneg fpext
29syn keyword llvmStatement fptosi fptoui fptrunc free freeze frem fsub
30syn keyword llvmStatement getelementptr icmp inbounds indirectbr insertelement
31syn keyword llvmStatement insertvalue inttoptr invoke landingpad load lshr
32syn keyword llvmStatement malloc max min mul nand ne ninf nnan nsw nsz nuw oeq
33syn keyword llvmStatement oge ogt ole olt one or ord phi ptrtoint resume ret
34syn keyword llvmStatement sdiv select sext sge sgt shl shufflevector sitofp
35syn keyword llvmStatement sle slt srem store sub switch trunc udiv ueq uge ugt
36syn keyword llvmStatement uitofp ule ult umax umin une uno unreachable unwind
37syn keyword llvmStatement urem va_arg 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      \ no_cfi
128      \ noduplicate
129      \ nofree
130      \ noimplicitfloat
131      \ noinline
132      \ nomerge
133      \ nonlazybind
134      \ nonnull
135      \ noprofile
136      \ norecurse
137      \ noredzone
138      \ noreturn
139      \ nosync
140      \ noundef
141      \ nounwind
142      \ nosanitize_bounds
143      \ nosanitize_coverage
144      \ null_pointer_is_valid
145      \ optforfuzzing
146      \ optnone
147      \ optsize
148      \ personality
149      \ preallocated
150      \ private
151      \ protected
152      \ ptx_device
153      \ ptx_kernel
154      \ readnone
155      \ readonly
156      \ release
157      \ returned
158      \ returns_twice
159      \ safestack
160      \ sanitize_address
161      \ sanitize_hwaddress
162      \ sanitize_memory
163      \ sanitize_memtag
164      \ sanitize_thread
165      \ section
166      \ seq_cst
167      \ shadowcallstack
168      \ sideeffect
169      \ signext
170      \ source_filename
171      \ speculatable
172      \ speculative_load_hardening
173      \ spir_func
174      \ spir_kernel
175      \ sret
176      \ ssp
177      \ sspreq
178      \ sspstrong
179      \ strictfp
180      \ swiftcc
181      \ swifterror
182      \ swifttailcc
183      \ swiftself
184      \ syncscope
185      \ tail
186      \ tailcc
187      \ target
188      \ thread_local
189      \ to
190      \ triple
191      \ unnamed_addr
192      \ unordered
193      \ uselistorder
194      \ uselistorder_bb
195      \ uwtable
196      \ volatile
197      \ weak
198      \ weak_odr
199      \ willreturn
200      \ win64cc
201      \ within
202      \ writeonly
203      \ x86_64_sysvcc
204      \ x86_fastcallcc
205      \ x86_stdcallcc
206      \ x86_thiscallcc
207      \ zeroext
208
209" Obsolete keywords.
210syn keyword llvmError  getresult begin end
211
212" Misc syntax.
213syn match   llvmNoName /[%@!]\d\+\>/
214syn match   llvmNumber /-\?\<\d\+\>/
215syn match   llvmFloat  /-\?\<\d\+\.\d*\(e[+-]\d\+\)\?\>/
216syn match   llvmFloat  /\<0x\x\+\>/
217syn keyword llvmBoolean true false
218syn keyword llvmConstant zeroinitializer undef null none poison vscale
219syn match   llvmComment /;.*$/
220syn region  llvmString start=/"/ skip=/\\"/ end=/"/
221syn match   llvmLabel /[-a-zA-Z$._][-a-zA-Z$._0-9]*:/
222syn match   llvmIdentifier /[%@][-a-zA-Z$._][-a-zA-Z$._0-9]*/
223
224" Named metadata and specialized metadata keywords.
225syn match   llvmIdentifier /![-a-zA-Z$._][-a-zA-Z$._0-9]*\ze\s*$/
226syn match   llvmIdentifier /![-a-zA-Z$._][-a-zA-Z$._0-9]*\ze\s*[=!]/
227syn match   llvmType /!\zs\a\+\ze\s*(/
228syn match   llvmConstant /\<DW_TAG_[a-z_]\+\>/
229syn match   llvmConstant /\<DW_ATE_[a-zA-Z_]\+\>/
230syn match   llvmConstant /\<DW_OP_[a-zA-Z0-9_]\+\>/
231syn match   llvmConstant /\<DW_LANG_[a-zA-Z0-9_]\+\>/
232syn match   llvmConstant /\<DW_VIRTUALITY_[a-z_]\+\>/
233syn match   llvmConstant /\<DIFlag[A-Za-z]\+\>/
234
235" Syntax-highlight lit test commands and bug numbers.
236syn match  llvmSpecialComment /;\s*PR\d*\s*$/
237syn match  llvmSpecialComment /;\s*REQUIRES:.*$/
238syn match  llvmSpecialComment /;\s*RUN:.*$/
239syn match  llvmSpecialComment /;\s*ALLOW_RETRIES:.*$/
240syn match  llvmSpecialComment /;\s*CHECK:.*$/
241syn match  llvmSpecialComment /;\s*CHECK-EMPTY:\s*$/
242syn match  llvmSpecialComment /\v;\s*CHECK-(NEXT|NOT|DAG|SAME|LABEL|COUNT-\d+):.*$/
243syn match  llvmSpecialComment /;\s*XFAIL:.*$/
244
245if version >= 508 || !exists("did_c_syn_inits")
246  if version < 508
247    let did_c_syn_inits = 1
248    command -nargs=+ HiLink hi link <args>
249  else
250    command -nargs=+ HiLink hi def link <args>
251  endif
252
253  HiLink llvmType Type
254  HiLink llvmStatement Statement
255  HiLink llvmNumber Number
256  HiLink llvmComment Comment
257  HiLink llvmString String
258  HiLink llvmLabel Label
259  HiLink llvmKeyword Keyword
260  HiLink llvmBoolean Boolean
261  HiLink llvmFloat Float
262  HiLink llvmNoName Identifier
263  HiLink llvmConstant Constant
264  HiLink llvmSpecialComment SpecialComment
265  HiLink llvmError Error
266  HiLink llvmIdentifier Identifier
267
268  delcommand HiLink
269endif
270
271let b:current_syntax = "llvm"
272