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