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
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      \ alwaysinline
48      \ appending
49      \ argmemonly
50      \ arm_aapcscc
51      \ arm_aapcs_vfpcc
52      \ arm_apcscc
53      \ asm
54      \ atomic
55      \ available_externally
56      \ blockaddress
57      \ builtin
58      \ byref
59      \ byval
60      \ c
61      \ catch
62      \ caller
63      \ cc
64      \ ccc
65      \ cleanup
66      \ coldcc
67      \ comdat
68      \ common
69      \ constant
70      \ datalayout
71      \ declare
72      \ default
73      \ define
74      \ deplibs
75      \ dereferenceable
76      \ distinct
77      \ dllexport
78      \ dllimport
79      \ dso_local
80      \ dso_preemptable
81      \ except
82      \ external
83      \ externally_initialized
84      \ extern_weak
85      \ fastcc
86      \ tailcc
87      \ filter
88      \ from
89      \ gc
90      \ global
91      \ hhvmcc
92      \ hhvm_ccc
93      \ hidden
94      \ immarg
95      \ initialexec
96      \ inlinehint
97      \ inreg
98      \ inteldialect
99      \ intel_ocl_bicc
100      \ internal
101      \ linkonce
102      \ linkonce_odr
103      \ localdynamic
104      \ localexec
105      \ local_unnamed_addr
106      \ minsize
107      \ module
108      \ monotonic
109      \ msp430_intrcc
110      \ musttail
111      \ naked
112      \ nest
113      \ noalias
114      \ nobuiltin
115      \ nocapture
116      \ noimplicitfloat
117      \ noinline
118      \ nonlazybind
119      \ nonnull
120      \ norecurse
121      \ noredzone
122      \ noreturn
123      \ noundef
124      \ nounwind
125      \ optnone
126      \ optsize
127      \ personality
128      \ private
129      \ protected
130      \ ptx_device
131      \ ptx_kernel
132      \ readnone
133      \ readonly
134      \ release
135      \ returned
136      \ returns_twice
137      \ sanitize_address
138      \ sanitize_memory
139      \ sanitize_thread
140      \ section
141      \ seq_cst
142      \ sideeffect
143      \ signext
144      \ syncscope
145      \ source_filename
146      \ speculatable
147      \ spir_func
148      \ spir_kernel
149      \ sret
150      \ ssp
151      \ sspreq
152      \ sspstrong
153      \ strictfp
154      \ swiftcc
155      \ swiftself
156      \ tail
157      \ target
158      \ thread_local
159      \ to
160      \ triple
161      \ unnamed_addr
162      \ unordered
163      \ uselistorder
164      \ uselistorder_bb
165      \ uwtable
166      \ volatile
167      \ weak
168      \ weak_odr
169      \ within
170      \ writeonly
171      \ x86_64_sysvcc
172      \ win64cc
173      \ x86_fastcallcc
174      \ x86_stdcallcc
175      \ x86_thiscallcc
176      \ zeroext
177
178" Obsolete keywords.
179syn keyword llvmError  getresult begin end
180
181" Misc syntax.
182syn match   llvmNoName /[%@!]\d\+\>/
183syn match   llvmNumber /-\?\<\d\+\>/
184syn match   llvmFloat  /-\?\<\d\+\.\d*\(e[+-]\d\+\)\?\>/
185syn match   llvmFloat  /\<0x\x\+\>/
186syn keyword llvmBoolean true false
187syn keyword llvmConstant zeroinitializer undef null none
188syn match   llvmComment /;.*$/
189syn region  llvmString start=/"/ skip=/\\"/ end=/"/
190syn match   llvmLabel /[-a-zA-Z$._][-a-zA-Z$._0-9]*:/
191syn match   llvmIdentifier /[%@][-a-zA-Z$._][-a-zA-Z$._0-9]*/
192
193" Named metadata and specialized metadata keywords.
194syn match   llvmIdentifier /![-a-zA-Z$._][-a-zA-Z$._0-9]*\ze\s*$/
195syn match   llvmIdentifier /![-a-zA-Z$._][-a-zA-Z$._0-9]*\ze\s*[=!]/
196syn match   llvmType /!\zs\a\+\ze\s*(/
197syn match   llvmConstant /\<DW_TAG_[a-z_]\+\>/
198syn match   llvmConstant /\<DW_ATE_[a-zA-Z_]\+\>/
199syn match   llvmConstant /\<DW_OP_[a-zA-Z0-9_]\+\>/
200syn match   llvmConstant /\<DW_LANG_[a-zA-Z0-9_]\+\>/
201syn match   llvmConstant /\<DW_VIRTUALITY_[a-z_]\+\>/
202syn match   llvmConstant /\<DIFlag[A-Za-z]\+\>/
203
204" Syntax-highlight lit test commands and bug numbers.
205syn match  llvmSpecialComment /;\s*PR\d*\s*$/
206syn match  llvmSpecialComment /;\s*REQUIRES:.*$/
207syn match  llvmSpecialComment /;\s*RUN:.*$/
208syn match  llvmSpecialComment /;\s*ALLOW_RETRIES:.*$/
209syn match  llvmSpecialComment /;\s*CHECK:.*$/
210syn match  llvmSpecialComment "\v;\s*CHECK-(NEXT|NOT|DAG|SAME|LABEL):.*$"
211syn match  llvmSpecialComment /;\s*XFAIL:.*$/
212
213if version >= 508 || !exists("did_c_syn_inits")
214  if version < 508
215    let did_c_syn_inits = 1
216    command -nargs=+ HiLink hi link <args>
217  else
218    command -nargs=+ HiLink hi def link <args>
219  endif
220
221  HiLink llvmType Type
222  HiLink llvmStatement Statement
223  HiLink llvmNumber Number
224  HiLink llvmComment Comment
225  HiLink llvmString String
226  HiLink llvmLabel Label
227  HiLink llvmKeyword Keyword
228  HiLink llvmBoolean Boolean
229  HiLink llvmFloat Float
230  HiLink llvmNoName Identifier
231  HiLink llvmConstant Constant
232  HiLink llvmSpecialComment SpecialComment
233  HiLink llvmError Error
234  HiLink llvmIdentifier Identifier
235
236  delcommand HiLink
237endif
238
239let b:current_syntax = "llvm"
240