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