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