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
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 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      \ tail
152      \ target
153      \ thread_local
154      \ to
155      \ triple
156      \ unnamed_addr
157      \ unordered
158      \ uselistorder
159      \ uselistorder_bb
160      \ uwtable
161      \ volatile
162      \ weak
163      \ weak_odr
164      \ within
165      \ writeonly
166      \ x86_64_sysvcc
167      \ win64cc
168      \ x86_fastcallcc
169      \ x86_stdcallcc
170      \ x86_thiscallcc
171      \ zeroext
172
173" Obsolete keywords.
174syn keyword llvmError  getresult begin end
175
176" Misc syntax.
177syn match   llvmNoName /[%@!]\d\+\>/
178syn match   llvmNumber /-\?\<\d\+\>/
179syn match   llvmFloat  /-\?\<\d\+\.\d*\(e[+-]\d\+\)\?\>/
180syn match   llvmFloat  /\<0x\x\+\>/
181syn keyword llvmBoolean true false
182syn keyword llvmConstant zeroinitializer undef null none
183syn match   llvmComment /;.*$/
184syn region  llvmString start=/"/ skip=/\\"/ end=/"/
185syn match   llvmLabel /[-a-zA-Z$._][-a-zA-Z$._0-9]*:/
186syn match   llvmIdentifier /[%@][-a-zA-Z$._][-a-zA-Z$._0-9]*/
187
188" Named metadata and specialized metadata keywords.
189syn match   llvmIdentifier /![-a-zA-Z$._][-a-zA-Z$._0-9]*\ze\s*$/
190syn match   llvmIdentifier /![-a-zA-Z$._][-a-zA-Z$._0-9]*\ze\s*[=!]/
191syn match   llvmType /!\zs\a\+\ze\s*(/
192syn match   llvmConstant /\<DW_TAG_[a-z_]\+\>/
193syn match   llvmConstant /\<DW_ATE_[a-zA-Z_]\+\>/
194syn match   llvmConstant /\<DW_OP_[a-zA-Z0-9_]\+\>/
195syn match   llvmConstant /\<DW_LANG_[a-zA-Z0-9_]\+\>/
196syn match   llvmConstant /\<DW_VIRTUALITY_[a-z_]\+\>/
197syn match   llvmConstant /\<DIFlag[A-Za-z]\+\>/
198
199" Syntax-highlight lit test commands and bug numbers.
200syn match  llvmSpecialComment /;\s*PR\d*\s*$/
201syn match  llvmSpecialComment /;\s*REQUIRES:.*$/
202syn match  llvmSpecialComment /;\s*RUN:.*$/
203syn match  llvmSpecialComment /;\s*CHECK:.*$/
204syn match  llvmSpecialComment "\v;\s*CHECK-(NEXT|NOT|DAG|SAME|LABEL):.*$"
205syn match  llvmSpecialComment /;\s*XFAIL:.*$/
206
207if version >= 508 || !exists("did_c_syn_inits")
208  if version < 508
209    let did_c_syn_inits = 1
210    command -nargs=+ HiLink hi link <args>
211  else
212    command -nargs=+ HiLink hi def link <args>
213  endif
214
215  HiLink llvmType Type
216  HiLink llvmStatement Statement
217  HiLink llvmNumber Number
218  HiLink llvmComment Comment
219  HiLink llvmString String
220  HiLink llvmLabel Label
221  HiLink llvmKeyword Keyword
222  HiLink llvmBoolean Boolean
223  HiLink llvmFloat Float
224  HiLink llvmNoName Identifier
225  HiLink llvmConstant Constant
226  HiLink llvmSpecialComment SpecialComment
227  HiLink llvmError Error
228  HiLink llvmIdentifier Identifier
229
230  delcommand HiLink
231endif
232
233let b:current_syntax = "llvm"
234