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