1 module llvm.constants;
2 
3 import llvm.config;
4 import llvm.types;
5 
6 /+ Analysis +/
7 
8 enum : LLVMVerifierFailureAction
9 {
10 	LLVMAbortProcessAction,
11 	LLVMPrintMessageAction,
12 	LLVMReturnStatusAction
13 }
14 
15 /+ Core +/
16 
17 /++ Types and Enumerations ++/
18 
19 static if (LLVM_Version < asVersion(4, 0, 0))
20 {
21 	enum : LLVMAttribute
22 	{
23 		LLVMZExtAttribute = 1<<0,
24 		LLVMSExtAttribute = 1<<1,
25 		LLVMNoReturnAttribute = 1<<2,
26 		LLVMInRegAttribute = 1<<3,
27 		LLVMStructRetAttribute = 1<<4,
28 		LLVMNoUnwindAttribute = 1<<5,
29 		LLVMNoAliasAttribute = 1<<6,
30 		LLVMByValAttribute = 1<<7,
31 		LLVMNestAttribute = 1<<8,
32 		LLVMReadNoneAttribute = 1<<9,
33 		LLVMReadOnlyAttribute = 1<<10,
34 		LLVMNoInlineAttribute = 1<<11,
35 		LLVMAlwaysInlineAttribute = 1<<12,
36 		LLVMOptimizeForSizeAttribute = 1<<13,
37 		LLVMStackProtectAttribute = 1<<14,
38 		LLVMStackProtectReqAttribute = 1<<15,
39 		LLVMAlignment = 31<<16,
40 		LLVMNoCaptureAttribute = 1<<21,
41 		LLVMNoRedZoneAttribute = 1<<22,
42 		LLVMNoImplicitFloatAttribute = 1<<23,
43 		LLVMNakedAttribute = 1<<24,
44 		LLVMInlineHintAttribute = 1<<25,
45 		LLVMStackAlignment = 7<<26,
46 		LLVMReturnsTwice = 1<<29,
47 		LLVMUWTable = 1<<30,
48 		LLVMNonLazyBind = 1<<31
49 	}
50 }
51 
52 enum : LLVMOpcode
53 {
54 	LLVMRet            = 1,
55 	LLVMBr             = 2,
56 	LLVMSwitch         = 3,
57 	LLVMIndirectBr     = 4,
58 	LLVMInvoke         = 5,
59 	LLVMUnreachable    = 7,
60 	LLVMAdd            = 8,
61 	LLVMFAdd           = 9,
62 	LLVMSub            = 10,
63 	LLVMFSub           = 11,
64 	LLVMMul            = 12,
65 	LLVMFMul           = 13,
66 	LLVMUDiv           = 14,
67 	LLVMSDiv           = 15,
68 	LLVMFDiv           = 16,
69 	LLVMURem           = 17,
70 	LLVMSRem           = 18,
71 	LLVMFRem           = 19,
72 	LLVMShl            = 20,
73 	LLVMLShr           = 21,
74 	LLVMAShr           = 22,
75 	LLVMAnd            = 23,
76 	LLVMOr             = 24,
77 	LLVMXor            = 25,
78 	LLVMAlloca         = 26,
79 	LLVMLoad           = 27,
80 	LLVMStore          = 28,
81 	LLVMGetElementPtr  = 29,
82 	LLVMTrunc          = 30,
83 	LLVMZExt           = 31,
84 	LLVMSExt           = 32,
85 	LLVMFPToUI         = 33,
86 	LLVMFPToSI         = 34,
87 	LLVMUIToFP         = 35,
88 	LLVMSIToFP         = 36,
89 	LLVMFPTrunc        = 37,
90 	LLVMFPExt          = 38,
91 	LLVMPtrToInt       = 39,
92 	LLVMIntToPtr       = 40,
93 	LLVMBitCast        = 41,
94 	LLVMICmp           = 42,
95 	LLVMFCmp           = 43,
96 	LLVMPHI            = 44,
97 	LLVMCall           = 45,
98 	LLVMSelect         = 46,
99 	LLVMUserOp1        = 47,
100 	LLVMUserOp2        = 48,
101 	LLVMVAArg          = 49,
102 	LLVMExtractElement = 50,
103 	LLVMInsertElement  = 51,
104 	LLVMShuffleVector  = 52,
105 	LLVMExtractValue   = 53,
106 	LLVMInsertValue    = 54,
107 	LLVMFence          = 55,
108 	LLVMAtomicCmpXchg  = 56,
109 	LLVMAtomicRMW      = 57,
110 	LLVMResume         = 58,
111 	LLVMLandingPad     = 59,
112 }
113 static if (LLVM_Version >= asVersion(3, 4, 0))
114 {
115 	enum : LLVMOpcode
116 	{
117 		LLVMAddrSpaceCast  = 60
118 	}
119 }
120 static if (LLVM_Version >= asVersion(3, 8, 0))
121 {
122 	enum : LLVMOpcode
123 	{
124 		LLVMCleanupRet     = 61,
125 		LLVMCatchRet       = 62,
126 		LLVMCatchPad       = 63,
127 		LLVMCleanupPad     = 64,
128 		LLVMCatchSwitch    = 65
129 	}
130 }
131 static if (LLVM_Version >= asVersion(8, 0, 0))
132 {
133 	enum : LLVMOpcode
134 	{
135 		LLVMFNeg  = 66
136 	}
137 }
138 static if (LLVM_Version >= asVersion(9, 0, 0))
139 {
140 	enum : LLVMOpcode
141 	{
142 		LLVMCallBr  = 67
143 	}
144 }
145 static if (LLVM_Version >= asVersion(10, 0, 0))
146 {
147 	enum : LLVMOpcode
148 	{
149 		LLVMFreeze  = 68
150 	}
151 }
152 
153 static if (LLVM_Version >= asVersion(3, 9, 0))
154 {
155 	enum : LLVMValueKind
156 	{
157 		LLVMArgumentValueKind,
158 		LLVMBasicBlockValueKind,
159 		LLVMMemoryUseValueKind,
160 		LLVMMemoryDefValueKind,
161 		LLVMMemoryPhiValueKind,
162 		LLVMFunctionValueKind,
163 		LLVMGlobalAliasValueKind,
164 		LLVMGlobalIFuncValueKind,
165 		LLVMGlobalVariableValueKind,
166 		LLVMBlockAddressValueKind,
167 		LLVMConstantExprValueKind,
168 		LLVMConstantArrayValueKind,
169 		LLVMConstantStructValueKind,
170 		LLVMConstantVectorValueKind,
171 		LLVMUndefValueValueKind,
172 		LLVMConstantAggregateZeroValueKind,
173 		LLVMConstantDataArrayValueKind,
174 		LLVMConstantDataVectorValueKind,
175 		LLVMConstantIntValueKind,
176 		LLVMConstantFPValueKind,
177 		LLVMConstantPointerNullValueKind,
178 		LLVMConstantTokenNoneValueKind,
179 		LLVMMetadataAsValueValueKind,
180 		LLVMInlineAsmValueKind,
181 		LLVMInstructionValueKind,
182 	}
183 
184 	enum : LLVMAttributeIndex
185 	{
186 		LLVMAttributeReturnIndex = 0U,
187 		LLVMAttributeFunctionIndex = -1,
188 	}
189 }
190 
191 static if (LLVM_Version >= asVersion(3, 8, 0)) {
192 	enum : LLVMTypeKind
193 	{
194 		LLVMVoidTypeKind,
195 		LLVMHalfTypeKind,
196 		LLVMFloatTypeKind,
197 		LLVMDoubleTypeKind,
198 		LLVMX86_FP80TypeKind,
199 		LLVMFP128TypeKind,
200 		LLVMPPC_FP128TypeKind,
201 		LLVMLabelTypeKind,
202 		LLVMIntegerTypeKind,
203 		LLVMFunctionTypeKind,
204 		LLVMStructTypeKind,
205 		LLVMArrayTypeKind,
206 		LLVMPointerTypeKind,
207 		LLVMVectorTypeKind,
208 		LLVMMetadataTypeKind,
209 		LLVMX86_MMXTypeKind,
210 		LLVMTokenTypeKind
211 	}
212 } else {
213 	enum : LLVMTypeKind
214 	{
215 		LLVMVoidTypeKind,
216 		LLVMHalfTypeKind,
217 		LLVMFloatTypeKind,
218 		LLVMDoubleTypeKind,
219 		LLVMX86_FP80TypeKind,
220 		LLVMFP128TypeKind,
221 		LLVMPPC_FP128TypeKind,
222 		LLVMLabelTypeKind,
223 		LLVMIntegerTypeKind,
224 		LLVMFunctionTypeKind,
225 		LLVMStructTypeKind,
226 		LLVMArrayTypeKind,
227 		LLVMPointerTypeKind,
228 		LLVMVectorTypeKind,
229 		LLVMMetadataTypeKind,
230 		LLVMX86_MMXTypeKind,
231 		LLVMTokenTypeKind
232 	}
233 }
234 
235 static if (LLVM_Version >= asVersion(3, 2, 0)) {
236 	enum : LLVMLinkage
237 	{
238 		LLVMExternalLinkage,
239 		LLVMAvailableExternallyLinkage,
240 		LLVMLinkOnceAnyLinkage,
241 		LLVMLinkOnceODRLinkage,
242 		LLVMLinkOnceODRAutoHideLinkage,
243 		LLVMWeakAnyLinkage,
244 		LLVMWeakODRLinkage,
245 		LLVMAppendingLinkage,
246 		LLVMInternalLinkage,
247 		LLVMPrivateLinkage,
248 		LLVMDLLImportLinkage,
249 		LLVMDLLExportLinkage,
250 		LLVMExternalWeakLinkage,
251 		LLVMGhostLinkage,
252 		LLVMCommonLinkage,
253 		LLVMLinkerPrivateLinkage,
254 		LLVMLinkerPrivateWeakLinkage,
255 	}
256 } else {
257 	enum : LLVMLinkage
258 	{
259 		LLVMExternalLinkage,
260 		LLVMAvailableExternallyLinkage,
261 		LLVMLinkOnceAnyLinkage,
262 		LLVMLinkOnceODRLinkage,
263 		LLVMWeakAnyLinkage,
264 		LLVMWeakODRLinkage,
265 		LLVMAppendingLinkage,
266 		LLVMInternalLinkage,
267 		LLVMPrivateLinkage,
268 		LLVMDLLImportLinkage,
269 		LLVMDLLExportLinkage,
270 		LLVMExternalWeakLinkage,
271 		LLVMGhostLinkage,
272 		LLVMCommonLinkage,
273 		LLVMLinkerPrivateLinkage,
274 		LLVMLinkerPrivateWeakLinkage,
275 		LLVMLinkerPrivateWeakDefAutoLinkage
276 	}
277 }
278 
279 enum : LLVMVisibility
280 {
281 	LLVMDefaultVisibility,
282 	LLVMHiddenVisibility,
283 	LLVMProtectedVisibility
284 }
285 
286 static if (LLVM_Version >= asVersion(3, 5, 0))
287 {
288 	enum : LLVMDLLStorageClass {
289 		LLVMDefaultStorageClass = 0,
290 		LLVMDLLImportStorageClass = 1,
291 		LLVMDLLExportStorageClass = 2
292 	}
293 }
294 
295 static if (LLVM_Version >= asVersion(7, 0, 0))
296 {
297 	enum : LLVMCallConv {
298 		LLVMCCallConv             = 0,
299 		LLVMFastCallConv          = 8,
300 		LLVMColdCallConv          = 9,
301 		LLVMGHCCallConv           = 10,
302 		LLVMHiPECallConv          = 11,
303 		LLVMWebKitJSCallConv      = 12,
304 		LLVMAnyRegCallConv        = 13,
305 		LLVMPreserveMostCallConv  = 14,
306 		LLVMPreserveAllCallConv   = 15,
307 		LLVMSwiftCallConv         = 16,
308 		LLVMCXXFASTTLSCallConv    = 17,
309 		LLVMX86StdcallCallConv    = 64,
310 		LLVMX86FastcallCallConv   = 65,
311 		LLVMARMAPCSCallConv       = 66,
312 		LLVMARMAAPCSCallConv      = 67,
313 		LLVMARMAAPCSVFPCallConv   = 68,
314 		LLVMMSP430INTRCallConv    = 69,
315 		LLVMX86ThisCallCallConv   = 70,
316 		LLVMPTXKernelCallConv     = 71,
317 		LLVMPTXDeviceCallConv     = 72,
318 		LLVMSPIRFUNCCallConv      = 75,
319 		LLVMSPIRKERNELCallConv    = 76,
320 		LLVMIntelOCLBICallConv    = 77,
321 		LLVMX8664SysVCallConv     = 78,
322 		LLVMWin64CallConv         = 79,
323 		LLVMX86VectorCallCallConv = 80,
324 		LLVMHHVMCallConv          = 81,
325 		LLVMHHVMCCallConv         = 82,
326 		LLVMX86INTRCallConv       = 83,
327 		LLVMAVRINTRCallConv       = 84,
328 		LLVMAVRSIGNALCallConv     = 85,
329 		LLVMAVRBUILTINCallConv    = 86,
330 		LLVMAMDGPUVSCallConv      = 87,
331 		LLVMAMDGPUGSCallConv      = 88,
332 		LLVMAMDGPUPSCallConv      = 89,
333 		LLVMAMDGPUCSCallConv      = 90,
334 		LLVMAMDGPUKERNELCallConv  = 91,
335 		LLVMX86RegCallCallConv    = 92,
336 		LLVMAMDGPUHSCallConv      = 93,
337 		LLVMMSP430BUILTINCallConv = 94,
338 		LLVMAMDGPULSCallConv      = 95,
339 		LLVMAMDGPUESCallConv      = 96
340 	}
341 }
342 else static if (LLVM_Version >= asVersion(3, 4, 0))
343 {
344 	enum : LLVMCallConv {
345 		LLVMCCallConv           = 0,
346 		LLVMFastCallConv        = 8,
347 		LLVMColdCallConv        = 9,
348 		LLVMWebKitJSCallConv    = 12,
349 		LLVMAnyRegCallConv      = 13,
350 		LLVMX86StdcallCallConv  = 64,
351 		LLVMX86FastcallCallConv = 65
352 	}
353 } else {
354 	enum : LLVMCallConv {
355 		LLVMCCallConv           = 0,
356 		LLVMFastCallConv        = 8,
357 		LLVMColdCallConv        = 9,
358 		LLVMX86StdcallCallConv  = 64,
359 		LLVMX86FastcallCallConv = 65
360 	}
361 }
362 
363 enum : LLVMIntPredicate
364 {
365 	LLVMIntEQ = 32,
366 	LLVMIntNE,
367 	LLVMIntUGT,
368 	LLVMIntUGE,
369 	LLVMIntULT,
370 	LLVMIntULE,
371 	LLVMIntSGT,
372 	LLVMIntSGE,
373 	LLVMIntSLT,
374 	LLVMIntSLE
375 }
376 
377 enum : LLVMRealPredicate
378 {
379 	LLVMRealPredicateFalse,
380 	LLVMRealOEQ,
381 	LLVMRealOGT,
382 	LLVMRealOGE,
383 	LLVMRealOLT,
384 	LLVMRealOLE,
385 	LLVMRealONE,
386 	LLVMRealORD,
387 	LLVMRealUNO,
388 	LLVMRealUEQ,
389 	LLVMRealUGT,
390 	LLVMRealUGE,
391 	LLVMRealULT,
392 	LLVMRealULE,
393 	LLVMRealUNE,
394 	LLVMRealPredicateTrue
395 }
396 
397 enum : LLVMLandingPadClauseTy
398 {
399 	LLVMLandingPadCatch,
400 	LLVMLandingPadFilter
401 }
402 
403 static if (LLVM_Version >= asVersion(3, 3, 0))
404 {
405 	enum : LLVMThreadLocalMode
406 	{
407 		LLVMNotThreadLocal = 0,
408 		LLVMGeneralDynamicTLSModel,
409 		LLVMLocalDynamicTLSModel,
410 		LLVMInitialExecTLSModel,
411 		LLVMLocalExecTLSModel
412 	}
413 
414 	enum : LLVMAtomicOrdering
415 	{
416 		LLVMAtomicOrderingNotAtomic = 0,
417 		LLVMAtomicOrderingUnordered = 1,
418 		LLVMAtomicOrderingMonotonic = 2,
419 		LLVMAtomicOrderingAcquire = 4,
420 		LLVMAtomicOrderingRelease = 5,
421 		LLVMAtomicOrderingAcquireRelease = 6,
422 		LLVMAtomicOrderingSequentiallyConsistent = 7
423 	}
424 
425 	static if (LLVM_Version >= asVersion(10, 0, 0))
426 	{
427 		enum : LLVMAtomicRMWBinOp
428 		{
429 			LLVMAtomicRMWBinOpXchg,
430 			LLVMAtomicRMWBinOpAdd,
431 			LLVMAtomicRMWBinOpSub,
432 			LLVMAtomicRMWBinOpAnd,
433 			LLVMAtomicRMWBinOpNand,
434 			LLVMAtomicRMWBinOpOr,
435 			LLVMAtomicRMWBinOpXor,
436 			LLVMAtomicRMWBinOpMax,
437 			LLVMAtomicRMWBinOpMin,
438 			LLVMAtomicRMWBinOpUMax,
439 			LLVMAtomicRMWBinOpUMin,
440 			LLVMAtomicRMWBinOpFAdd,
441 			LLVMAtomicRMWBinOpFSub
442 		}
443 	}
444 	else
445 	{
446 		enum : LLVMAtomicRMWBinOp
447 		{
448 			LLVMAtomicRMWBinOpXchg,
449 			LLVMAtomicRMWBinOpAdd,
450 			LLVMAtomicRMWBinOpSub,
451 			LLVMAtomicRMWBinOpAnd,
452 			LLVMAtomicRMWBinOpNand,
453 			LLVMAtomicRMWBinOpOr,
454 			LLVMAtomicRMWBinOpXor,
455 			LLVMAtomicRMWBinOpMax,
456 			LLVMAtomicRMWBinOpMin,
457 			LLVMAtomicRMWBinOpUMax,
458 			LLVMAtomicRMWBinOpUMin
459 		}
460 	}
461 }
462 static if (LLVM_Version >= asVersion(3, 5, 0))
463 {
464 	enum : LLVMDiagnosticSeverity {
465 		LLVMDSError,
466 		LLVMDSWarning,
467 		LLVMDSRemark,
468 		LLVMDSNote
469 	}
470 }
471 
472 /+ Disassembler +/
473 
474 //TODO: replace const with enum?
475 const
476 {
477 	uint LLVMDisassembler_VariantKind_None = 0;
478 	uint LLVMDisassembler_VariantKind_ARM_HI16 = 1;
479 	uint LLVMDisassembler_VariantKind_ARM_LO16 = 2;
480 	static if (LLVM_Version >= asVersion(3, 5, 0))
481 	{
482 		uint LLVMDisassembler_VariantKind_ARM64_PAGE = 1;
483 		uint LLVMDisassembler_VariantKind_ARM64_PAGEOFF = 2;
484 		uint LLVMDisassembler_VariantKind_ARM64_GOTPAGE = 3;
485 		uint LLVMDisassembler_VariantKind_ARM64_GOTPAGEOFF = 4;
486 		uint LLVMDisassembler_VariantKind_ARM64_TLVP = 5;
487 		uint LLVMDisassembler_VariantKind_ARM64_TLVOFF = 6;
488 	}
489 	uint LLVMDisassembler_ReferenceType_InOut_None = 0;
490 	uint LLVMDisassembler_ReferenceType_In_Branch = 1;
491 	uint LLVMDisassembler_ReferenceType_In_PCrel_Load = 2;
492 	static if (LLVM_Version >= asVersion(3, 5, 0))
493 	{
494 		ulong LLVMDisassembler_ReferenceType_In_ARM64_ADRP = 0x100000001;
495 		ulong LLVMDisassembler_ReferenceType_In_ARM64_ADDXri = 0x100000002;
496 		ulong LLVMDisassembler_ReferenceType_In_ARM64_LDRXui = 0x100000003;
497 		ulong LLVMDisassembler_ReferenceType_In_ARM64_LDRXl = 0x100000004;
498 		ulong LLVMDisassembler_ReferenceType_In_ARM64_ADR = 0x100000005;
499 	}
500 	uint LLVMDisassembler_ReferenceType_Out_SymbolStub = 1;
501 	uint LLVMDisassembler_ReferenceType_Out_LitPool_SymAddr = 2;
502 	uint LLVMDisassembler_ReferenceType_Out_LitPool_CstrAddr = 3;
503 	static if (LLVM_Version >= asVersion(3, 2, 0))
504 	{
505 		uint LLVMDisassembler_Option_UseMarkup = 1;
506 	}
507 	static if (LLVM_Version >= asVersion(3, 3, 0))
508 	{
509 		uint LLVMDisassembler_Option_PrintImmHex = 2;
510 		uint LLVMDisassembler_Option_AsmPrinterVariant = 4;
511 	}
512 	static if (LLVM_Version >= asVersion(3, 4, 0))
513 	{
514 		uint LLVMDisassembler_ReferenceType_Out_Objc_CFString_Ref = 4;
515 		uint LLVMDisassembler_ReferenceType_Out_Objc_Message = 5;
516 		uint LLVMDisassembler_ReferenceType_Out_Objc_Message_Ref = 6;
517 		uint LLVMDisassembler_ReferenceType_Out_Objc_Selector_Ref = 7;
518 		uint LLVMDisassembler_ReferenceType_Out_Objc_Class_Ref = 8;
519 		uint LLVMDisassembler_Option_SetInstrComments = 8;
520 		uint LLVMDisassembler_Option_PrintLatency = 16;
521 	}
522 	static if (LLVM_Version >= asVersion(3, 5, 0))
523 	{
524 		uint LLVMDisassembler_ReferenceType_DeMangled_Name = 9;
525 	}
526 }
527 
528 static if (LLVM_Version < asVersion(3, 3, 0))
529 {
530 	/+ Enhanced Disassembly +/
531 
532 	enum : EDAssemblySyntax_t
533 	{
534 		kEDAssemblySyntaxX86Intel = 0,
535 		kEDAssemblySyntaxX86ATT = 1,
536 		kEDAssemblySyntaxARMUAL = 2
537 	}
538 }
539 
540 /+ Linker +/
541 static if (LLVM_Version >= asVersion(3, 2, 0))
542 {
543 	enum : LLVMLinkerMode
544 	{
545 		LLVMLinkerDestroySource  = 0
546 	}
547 
548 	static if (LLVM_Version < asVersion(3, 7, 0))
549 	{
550 		enum : LLVMLinkerMode
551 		{
552 			LLVMLinkerPreserveSource  = 1
553 		}
554 	}
555 }
556 
557 /+ Link Time Optimization +/
558 
559 enum : llvm_lto_status
560 {
561 	LLVM_LTO_UNKNOWN,
562 	LLVM_LTO_OPT_SUCCESS,
563 	LLVM_LTO_READ_SUCCESS,
564 	LLVM_LTO_READ_FAILURE,
565 	LLVM_LTO_WRITE_FAILURE,
566 	LLVM_LTO_NO_TARGET,
567 	LLVM_LTO_NO_WORK,
568 	LLVM_LTO_MODULE_MERGE_FAILURE,
569 	LLVM_LTO_ASM_FAILURE,
570 	LLVM_LTO_NULL_OBJECT
571 }
572 
573 /+ LTO +/
574 static if (LLVM_Version >= asVersion(10, 0, 0))
575 {
576 	const uint LTO_API_VERSION = 26;
577 }
578 else static if (LLVM_Version >= asVersion(9, 0, 0))
579 {
580 	const uint LTO_API_VERSION = 24;
581 }
582 else static if (LLVM_Version >= asVersion(8, 0, 0))
583 {
584 	const uint LTO_API_VERSION = 23;
585 }
586 else static if (LLVM_Version >= asVersion(7, 0, 0))
587 {
588 	const uint LTO_API_VERSION = 22;
589 }
590 else static if (LLVM_Version >= asVersion(4, 0, 0))
591 {
592 	const uint LTO_API_VERSION = 21;
593 }
594 else static if (LLVM_Version >= asVersion(3, 9, 0))
595 {
596 	const uint LTO_API_VERSION = 20;
597 }
598 else static if (LLVM_Version >= asVersion(3, 7, 0))
599 {
600 	const uint LTO_API_VERSION = 17;
601 }
602 else static if (LLVM_Version >= asVersion(3, 6, 0))
603 {
604 	const uint LTO_API_VERSION = 11;
605 }
606 else static if (LLVM_Version >= asVersion(3, 5, 0))
607 {
608 	const uint LTO_API_VERSION = 10;
609 }
610 else static if (LLVM_Version >= asVersion(3, 4, 0))
611 {
612 	const uint LTO_API_VERSION = 5;
613 }
614 else
615 {
616 	const uint LTO_API_VERSION = 4;
617 }
618 
619 enum : lto_symbol_attributes
620 {
621 	LTO_SYMBOL_ALIGNMENT_MASK              = 0x0000001F,
622 	LTO_SYMBOL_PERMISSIONS_MASK            = 0x000000E0,
623 	LTO_SYMBOL_PERMISSIONS_CODE            = 0x000000A0,
624 	LTO_SYMBOL_PERMISSIONS_DATA            = 0x000000C0,
625 	LTO_SYMBOL_PERMISSIONS_RODATA          = 0x00000080,
626 	LTO_SYMBOL_DEFINITION_MASK             = 0x00000700,
627 	LTO_SYMBOL_DEFINITION_REGULAR          = 0x00000100,
628 	LTO_SYMBOL_DEFINITION_TENTATIVE        = 0x00000200,
629 	LTO_SYMBOL_DEFINITION_WEAK             = 0x00000300,
630 	LTO_SYMBOL_DEFINITION_UNDEFINED        = 0x00000400,
631 	LTO_SYMBOL_DEFINITION_WEAKUNDEF        = 0x00000500,
632 	LTO_SYMBOL_SCOPE_MASK                  = 0x00003800,
633 	LTO_SYMBOL_SCOPE_INTERNAL              = 0x00000800,
634 	LTO_SYMBOL_SCOPE_HIDDEN                = 0x00001000,
635 	LTO_SYMBOL_SCOPE_PROTECTED             = 0x00002000,
636 	LTO_SYMBOL_SCOPE_DEFAULT               = 0x00001800,
637 	LTO_SYMBOL_SCOPE_DEFAULT_CAN_BE_HIDDEN = 0x00002800,
638 }
639 static if (LLVM_Version >= asVersion(3, 7, 0))
640 {
641 	enum : lto_symbol_attributes
642 	{
643 		LTO_SYMBOL_COMDAT                  = 0x00004000,
644 		LTO_SYMBOL_ALIAS                   = 0x00008000
645 	}
646 }
647 
648 enum : lto_debug_model
649 {
650 	LTO_DEBUG_MODEL_NONE = 0,
651 	LTO_DEBUG_MODEL_DWARF = 1
652 }
653 
654 enum : lto_codegen_model
655 {
656 	LTO_CODEGEN_PIC_MODEL_STATIC = 0,
657 	LTO_CODEGEN_PIC_MODEL_DYNAMIC = 1,
658 	LTO_CODEGEN_PIC_MODEL_DYNAMIC_NO_PIC = 2,
659 	LTO_CODEGEN_PIC_MODEL_DEFAULT = 3
660 }
661 
662 static if (LLVM_Version >= asVersion(3, 5, 0))
663 {
664 	enum : lto_codegen_diagnostic_severity_t
665 	{
666 		LTO_DS_ERROR = 0,
667 		LTO_DS_WARNING = 1,
668 	   	LTO_DS_REMARK = 3,
669 		LTO_DS_NOTE = 2
670 	}
671 }
672 
673 /+ Object file reading and writing +/
674 
675 static if (LLVM_Version >= asVersion(9, 0, 0))
676 {
677 	enum : LLVMBinaryType
678 	{
679 		LLVMBinaryTypeArchive,
680 		LLVMBinaryTypeMachOUniversalBinary,
681 		LLVMBinaryTypeCOFFImportFile,
682 		LLVMBinaryTypeIR,
683 		LLVMBinaryTypeWinRes,
684 		LLVMBinaryTypeCOFF,
685 		LLVMBinaryTypeELF32L,
686 		LLVMBinaryTypeELF32B,
687 		LLVMBinaryTypeELF64L,
688 		LLVMBinaryTypeELF64B,
689 		LLVMBinaryTypeMachO32L,
690 		LLVMBinaryTypeMachO32B,
691 		LLVMBinaryTypeMachO64L,
692 		LLVMBinaryTypeMachO64B,
693 		LLVMBinaryTypeWasm
694 	}
695 }
696 
697 /+ Target information +/
698 
699 enum : LLVMByteOrdering
700 {
701 	LLVMBigEndian,
702 	LLVMLittleEndian
703 }
704 
705 /+ Target machine +/
706 
707 enum : LLVMCodeGenOptLevel
708 {
709 	LLVMCodeGenLevelNone,
710 	LLVMCodeGenLevelLess,
711 	LLVMCodeGenLevelDefault,
712 	LLVMCodeGenLevelAggressive
713 }
714 
715 static if (LLVM_Version >= asVersion(8, 0, 0)) {
716 	enum : LLVMRelocMode
717 	{
718 		LLVMRelocDefault,
719 		LLVMRelocStatic,
720 		LLVMRelocPIC,
721       LLVMRelocDynamicNoPic,
722       LLVMRelocROPI,
723       LLVMRelocRWPI,
724       LLVMRelocROPI_RWPI
725 	}
726 } else {
727 	enum : LLVMRelocMode
728 	{
729 		LLVMRelocDefault,
730 		LLVMRelocStatic,
731 		LLVMRelocPIC,
732 		LLVMRelocDynamicNoPic
733 	}
734 }
735 
736 static if (LLVM_Version >= asVersion(8, 0, 0)) {
737 	enum : LLVMCodeModel
738 	{
739 		LLVMCodeModelDefault,
740 		LLVMCodeModelJITDefault,
741 		LLVMCodeModelTiny,
742 		LLVMCodeModelSmall,
743 		LLVMCodeModelKernel,
744 		LLVMCodeModelMedium,
745 		LLVMCodeModelLarge
746 	}
747 } else {
748 	enum : LLVMCodeModel
749 	{
750 		LLVMCodeModelDefault,
751 		LLVMCodeModelJITDefault,
752 		LLVMCodeModelSmall,
753 		LLVMCodeModelKernel,
754 		LLVMCodeModelMedium,
755 		LLVMCodeModelLarge
756 	}
757 }
758 
759 enum : LLVMCodeGenFileType
760 {
761 	LLVMAssemblyFile,
762 	LLVMObjectFile
763 }
764 
765 /+ Orc +/
766 
767 static if (LLVM_Version >= asVersion(3, 9, 0) && LLVM_Version < asVersion(8, 0, 0))
768 {
769 	enum : LLVMOrcErrorCode
770 	{
771 		LLVMOrcErrSuccess = 0,
772 		LLVMOrcErrGeneric,
773 	}
774 }
775 
776 /+ Debug info flags +/
777 
778 static if (LLVM_Version >= asVersion(10, 0, 0))
779 {
780 	enum : LLVMDIFlags {
781 		LLVMDIFlagZero = 0,
782 		LLVMDIFlagPrivate = 1,
783 		LLVMDIFlagProtected = 2,
784 		LLVMDIFlagPublic = 3,
785 		LLVMDIFlagFwdDecl = 1 << 2,
786 		LLVMDIFlagAppleBlock = 1 << 3,
787 		LLVMDIFlagReservedBit4 = 1 << 4,
788 		LLVMDIFlagVirtual = 1 << 5,
789 		LLVMDIFlagArtificial = 1 << 6,
790 		LLVMDIFlagExplicit = 1 << 7,
791 		LLVMDIFlagPrototyped = 1 << 8,
792 		LLVMDIFlagObjcClassComplete = 1 << 9,
793 		LLVMDIFlagObjectPointer = 1 << 10,
794 		LLVMDIFlagVector = 1 << 11,
795 		LLVMDIFlagStaticMember = 1 << 12,
796 		LLVMDIFlagLValueReference = 1 << 13,
797 		LLVMDIFlagRValueReference = 1 << 14,
798 		LLVMDIFlagReserved = 1 << 15,
799 		LLVMDIFlagSingleInheritance = 1 << 16,
800 		LLVMDIFlagMultipleInheritance = 2 << 16,
801 		LLVMDIFlagVirtualInheritance = 3 << 16,
802 		LLVMDIFlagIntroducedVirtual = 1 << 18,
803 		LLVMDIFlagBitField = 1 << 19,
804 		LLVMDIFlagNoReturn = 1 << 20,
805 		LLVMDIFlagTypePassByValue = 1 << 22,
806 		LLVMDIFlagTypePassByReference = 1 << 23,
807 		LLVMDIFlagEnumClass = 1 << 24,
808 		LLVMDIFlagFixedEnum = LLVMDIFlagEnumClass,
809 		LLVMDIFlagThunk = 1 << 25,
810 		LLVMDIFlagNonTrivial = 1 << 26,
811 		LLVMDIFlagBigEndian = 1 << 27,
812 		LLVMDIFlagLittleEndian = 1 << 28,
813 		LLVMDIFlagIndirectVirtualBase = (1 << 2) | (1 << 5),
814 		LLVMDIFlagAccessibility = LLVMDIFlagPrivate | LLVMDIFlagProtected | LLVMDIFlagPublic,
815 		LLVMDIFlagPtrToMemberRep = LLVMDIFlagSingleInheritance | LLVMDIFlagMultipleInheritance | LLVMDIFlagVirtualInheritance
816 	}
817 }
818 else static if (LLVM_Version >= asVersion(9, 0, 0))
819 {
820 	enum : LLVMDIFlags {
821 		LLVMDIFlagZero = 0,
822 		LLVMDIFlagPrivate = 1,
823 		LLVMDIFlagProtected = 2,
824 		LLVMDIFlagPublic = 3,
825 		LLVMDIFlagFwdDecl = 1 << 2,
826 		LLVMDIFlagAppleBlock = 1 << 3,
827 		LLVMDIFlagBlockByrefStruct = 1 << 4,
828 		LLVMDIFlagVirtual = 1 << 5,
829 		LLVMDIFlagArtificial = 1 << 6,
830 		LLVMDIFlagExplicit = 1 << 7,
831 		LLVMDIFlagPrototyped = 1 << 8,
832 		LLVMDIFlagObjcClassComplete = 1 << 9,
833 		LLVMDIFlagObjectPointer = 1 << 10,
834 		LLVMDIFlagVector = 1 << 11,
835 		LLVMDIFlagStaticMember = 1 << 12,
836 		LLVMDIFlagLValueReference = 1 << 13,
837 		LLVMDIFlagRValueReference = 1 << 14,
838 		LLVMDIFlagReserved = 1 << 15,
839 		LLVMDIFlagSingleInheritance = 1 << 16,
840 		LLVMDIFlagMultipleInheritance = 2 << 16,
841 		LLVMDIFlagVirtualInheritance = 3 << 16,
842 		LLVMDIFlagIntroducedVirtual = 1 << 18,
843 		LLVMDIFlagBitField = 1 << 19,
844 		LLVMDIFlagNoReturn = 1 << 20,
845 		LLVMDIFlagTypePassByValue = 1 << 22,
846 		LLVMDIFlagTypePassByReference = 1 << 23,
847 		LLVMDIFlagEnumClass = 1 << 24,
848 		LLVMDIFlagFixedEnum = LLVMDIFlagEnumClass,
849 		LLVMDIFlagThunk = 1 << 25,
850 		LLVMDIFlagNonTrivial = 1 << 26,
851 		LLVMDIFlagBigEndian = 1 << 27,
852 		LLVMDIFlagLittleEndian = 1 << 28,
853 		LLVMDIFlagIndirectVirtualBase = (1 << 2) | (1 << 5),
854 		LLVMDIFlagAccessibility = LLVMDIFlagPrivate | LLVMDIFlagProtected | LLVMDIFlagPublic,
855 		LLVMDIFlagPtrToMemberRep = LLVMDIFlagSingleInheritance | LLVMDIFlagMultipleInheritance | LLVMDIFlagVirtualInheritance
856 	}
857 }
858 else static if (LLVM_Version >= asVersion(8, 0, 0))
859 {
860 	enum : LLVMDIFlags {
861 		LLVMDIFlagZero = 0,
862 		LLVMDIFlagPrivate = 1,
863 		LLVMDIFlagProtected = 2,
864 		LLVMDIFlagPublic = 3,
865 		LLVMDIFlagFwdDecl = 1 << 2,
866 		LLVMDIFlagAppleBlock = 1 << 3,
867 		LLVMDIFlagBlockByrefStruct = 1 << 4,
868 		LLVMDIFlagVirtual = 1 << 5,
869 		LLVMDIFlagArtificial = 1 << 6,
870 		LLVMDIFlagExplicit = 1 << 7,
871 		LLVMDIFlagPrototyped = 1 << 8,
872 		LLVMDIFlagObjcClassComplete = 1 << 9,
873 		LLVMDIFlagObjectPointer = 1 << 10,
874 		LLVMDIFlagVector = 1 << 11,
875 		LLVMDIFlagStaticMember = 1 << 12,
876 		LLVMDIFlagLValueReference = 1 << 13,
877 		LLVMDIFlagRValueReference = 1 << 14,
878 		LLVMDIFlagReserved = 1 << 15,
879 		LLVMDIFlagSingleInheritance = 1 << 16,
880 		LLVMDIFlagMultipleInheritance = 2 << 16,
881 		LLVMDIFlagVirtualInheritance = 3 << 16,
882 		LLVMDIFlagIntroducedVirtual = 1 << 18,
883 		LLVMDIFlagBitField = 1 << 19,
884 		LLVMDIFlagNoReturn = 1 << 20,
885 		LLVMDIFlagMainSubprogram = 1 << 21,
886 		LLVMDIFlagTypePassByValue = 1 << 22,
887 		LLVMDIFlagTypePassByReference = 1 << 23,
888 		LLVMDIFlagEnumClass = 1 << 24,
889 		LLVMDIFlagFixedEnum = LLVMDIFlagEnumClass,
890 		LLVMDIFlagThunk = 1 << 25,
891 		LLVMDIFlagTrivial = 1 << 26,
892 		LLVMDIFlagBigEndian = 1 << 27,
893 		LLVMDIFlagLittleEndian = 1 << 28,
894 		LLVMDIFlagIndirectVirtualBase = (1 << 2) | (1 << 5),
895 		LLVMDIFlagAccessibility = LLVMDIFlagPrivate | LLVMDIFlagProtected | LLVMDIFlagPublic,
896 		LLVMDIFlagPtrToMemberRep = LLVMDIFlagSingleInheritance | LLVMDIFlagMultipleInheritance | LLVMDIFlagVirtualInheritance
897 	}
898 }
899 else static if (LLVM_Version >= asVersion(7, 0, 0))
900 {
901 	enum : LLVMDIFlags {
902 		LLVMDIFlagZero = 0,
903 		LLVMDIFlagPrivate = 1,
904 		LLVMDIFlagProtected = 2,
905 		LLVMDIFlagPublic = 3,
906 		LLVMDIFlagFwdDecl = 1 << 2,
907 		LLVMDIFlagAppleBlock = 1 << 3,
908 		LLVMDIFlagBlockByrefStruct = 1 << 4,
909 		LLVMDIFlagVirtual = 1 << 5,
910 		LLVMDIFlagArtificial = 1 << 6,
911 		LLVMDIFlagExplicit = 1 << 7,
912 		LLVMDIFlagPrototyped = 1 << 8,
913 		LLVMDIFlagObjcClassComplete = 1 << 9,
914 		LLVMDIFlagObjectPointer = 1 << 10,
915 		LLVMDIFlagVector = 1 << 11,
916 		LLVMDIFlagStaticMember = 1 << 12,
917 		LLVMDIFlagLValueReference = 1 << 13,
918 		LLVMDIFlagRValueReference = 1 << 14,
919 		LLVMDIFlagReserved = 1 << 15,
920 		LLVMDIFlagSingleInheritance = 1 << 16,
921 		LLVMDIFlagMultipleInheritance = 2 << 16,
922 		LLVMDIFlagVirtualInheritance = 3 << 16,
923 		LLVMDIFlagIntroducedVirtual = 1 << 18,
924 		LLVMDIFlagBitField = 1 << 19,
925 		LLVMDIFlagNoReturn = 1 << 20,
926 		LLVMDIFlagMainSubprogram = 1 << 21,
927 		LLVMDIFlagTypePassByValue = 1 << 22,
928 		LLVMDIFlagTypePassByReference = 1 << 23,
929 		LLVMDIFlagFixedEnum = 1 << 24,
930 		LLVMDIFlagThunk = 1 << 25,
931 		LLVMDIFlagTrivial = 1 << 26,
932 		LLVMDIFlagIndirectVirtualBase = (1 << 2) | (1 << 5),
933 		LLVMDIFlagAccessibility = LLVMDIFlagPrivate | LLVMDIFlagProtected | LLVMDIFlagPublic,
934 		LLVMDIFlagPtrToMemberRep = LLVMDIFlagSingleInheritance | LLVMDIFlagMultipleInheritance | LLVMDIFlagVirtualInheritance
935 	}
936 }
937 else static if (LLVM_Version >= asVersion(6, 0, 0))
938 {
939 	enum : LLVMDIFlags {
940 		LLVMDIFlagZero = 0,
941 		LLVMDIFlagPrivate = 1,
942 		LLVMDIFlagProtected = 2,
943 		LLVMDIFlagPublic = 3,
944 		LLVMDIFlagFwdDecl = 1 << 2,
945 		LLVMDIFlagAppleBlock = 1 << 3,
946 		LLVMDIFlagBlockByrefStruct = 1 << 4,
947 		LLVMDIFlagVirtual = 1 << 5,
948 		LLVMDIFlagArtificial = 1 << 6,
949 		LLVMDIFlagExplicit = 1 << 7,
950 		LLVMDIFlagPrototyped = 1 << 8,
951 		LLVMDIFlagObjcClassComplete = 1 << 9,
952 		LLVMDIFlagObjectPointer = 1 << 10,
953 		LLVMDIFlagVector = 1 << 11,
954 		LLVMDIFlagStaticMember = 1 << 12,
955 		LLVMDIFlagLValueReference = 1 << 13,
956 		LLVMDIFlagRValueReference = 1 << 14,
957 		LLVMDIFlagReserved = 1 << 15,
958 		LLVMDIFlagSingleInheritance = 1 << 16,
959 		LLVMDIFlagMultipleInheritance = 2 << 16,
960 		LLVMDIFlagVirtualInheritance = 3 << 16,
961 		LLVMDIFlagIntroducedVirtual = 1 << 18,
962 		LLVMDIFlagBitField = 1 << 19,
963 		LLVMDIFlagNoReturn = 1 << 20,
964 		LLVMDIFlagMainSubprogram = 1 << 21,
965 		LLVMDIFlagIndirectVirtualBase = (1 << 2) | (1 << 5),
966 		LLVMDIFlagAccessibility = LLVMDIFlagPrivate | LLVMDIFlagProtected |
967 		                          LLVMDIFlagPublic,
968 		LLVMDIFlagPtrToMemberRep = LLVMDIFlagSingleInheritance |
969 		                           LLVMDIFlagMultipleInheritance |
970 		                           LLVMDIFlagVirtualInheritance
971 	}
972 }
973 
974 static if (LLVM_Version >= asVersion(6, 0, 0))
975 {
976 	enum : LLVMDWARFSourceLanguage {
977 		LLVMDWARFSourceLanguageC89,
978 		LLVMDWARFSourceLanguageC,
979 		LLVMDWARFSourceLanguageAda83,
980 		LLVMDWARFSourceLanguageC_plus_plus,
981 		LLVMDWARFSourceLanguageCobol74,
982 		LLVMDWARFSourceLanguageCobol85,
983 		LLVMDWARFSourceLanguageFortran77,
984 		LLVMDWARFSourceLanguageFortran90,
985 		LLVMDWARFSourceLanguagePascal83,
986 		LLVMDWARFSourceLanguageModula2,
987 		// New in DWARF v3:
988 		LLVMDWARFSourceLanguageJava,
989 		LLVMDWARFSourceLanguageC99,
990 		LLVMDWARFSourceLanguageAda95,
991 		LLVMDWARFSourceLanguageFortran95,
992 		LLVMDWARFSourceLanguagePLI,
993 		LLVMDWARFSourceLanguageObjC,
994 		LLVMDWARFSourceLanguageObjC_plus_plus,
995 		LLVMDWARFSourceLanguageUPC,
996 		LLVMDWARFSourceLanguageD,
997 		// New in DWARF v4:
998 		LLVMDWARFSourceLanguagePython,
999 		// New in DWARF v5:
1000 		LLVMDWARFSourceLanguageOpenCL,
1001 		LLVMDWARFSourceLanguageGo,
1002 		LLVMDWARFSourceLanguageModula3,
1003 		LLVMDWARFSourceLanguageHaskell,
1004 		LLVMDWARFSourceLanguageC_plus_plus_03,
1005 		LLVMDWARFSourceLanguageC_plus_plus_11,
1006 		LLVMDWARFSourceLanguageOCaml,
1007 		LLVMDWARFSourceLanguageRust,
1008 		LLVMDWARFSourceLanguageC11,
1009 		LLVMDWARFSourceLanguageSwift,
1010 		LLVMDWARFSourceLanguageJulia,
1011 		LLVMDWARFSourceLanguageDylan,
1012 		LLVMDWARFSourceLanguageC_plus_plus_14,
1013 		LLVMDWARFSourceLanguageFortran03,
1014 		LLVMDWARFSourceLanguageFortran08,
1015 		LLVMDWARFSourceLanguageRenderScript,
1016 		LLVMDWARFSourceLanguageBLISS,
1017 		// Vendor extensions:
1018 		LLVMDWARFSourceLanguageMips_Assembler,
1019 		LLVMDWARFSourceLanguageGOOGLE_RenderScript,
1020 		LLVMDWARFSourceLanguageBORLAND_Delphi
1021 	}
1022 }
1023 
1024 static if (LLVM_Version >= asVersion(6, 0, 0))
1025 {
1026 	enum : LLVMDWARFEmissionKind {
1027 		LLVMDWARFEmissionNone = 0,
1028 		LLVMDWARFEmissionFull,
1029 		LLVMDWARFEmissionLineTablesOnly
1030 	}
1031 
1032 }
1033 
1034 static if (LLVM_Version >= asVersion(9, 0, 0))
1035 {
1036 	enum : LLVMMetadataKind {
1037 		LLVMMDStringMetadataKind,
1038 		LLVMConstantAsMetadataMetadataKind,
1039 		LLVMLocalAsMetadataMetadataKind,
1040 		LLVMDistinctMDOperandPlaceholderMetadataKind,
1041 		LLVMMDTupleMetadataKind,
1042 		LLVMDILocationMetadataKind,
1043 		LLVMDIExpressionMetadataKind,
1044 		LLVMDIGlobalVariableExpressionMetadataKind,
1045 		LLVMGenericDINodeMetadataKind,
1046 		LLVMDISubrangeMetadataKind,
1047 		LLVMDIEnumeratorMetadataKind,
1048 		LLVMDIBasicTypeMetadataKind,
1049 		LLVMDIDerivedTypeMetadataKind,
1050 		LLVMDICompositeTypeMetadataKind,
1051 		LLVMDISubroutineTypeMetadataKind,
1052 		LLVMDIFileMetadataKind,
1053 		LLVMDICompileUnitMetadataKind,
1054 		LLVMDISubprogramMetadataKind,
1055 		LLVMDILexicalBlockMetadataKind,
1056 		LLVMDILexicalBlockFileMetadataKind,
1057 		LLVMDINamespaceMetadataKind,
1058 		LLVMDIModuleMetadataKind,
1059 		LLVMDITemplateTypeParameterMetadataKind,
1060 		LLVMDITemplateValueParameterMetadataKind,
1061 		LLVMDIGlobalVariableMetadataKind,
1062 		LLVMDILocalVariableMetadataKind,
1063 		LLVMDILabelMetadataKind,
1064 		LLVMDIObjCPropertyMetadataKind,
1065 		LLVMDIImportedEntityMetadataKind,
1066 		LLVMDIMacroMetadataKind,
1067 		LLVMDIMacroFileMetadataKind,
1068 		LLVMDICommonBlockMetadataKind
1069 	}
1070 }
1071 else static if (LLVM_Version >= asVersion(8, 0, 0)) {
1072 	enum : LLVMMetadataKind {
1073 		LLVMMDStringMetadataKind,
1074 		LLVMConstantAsMetadataMetadataKind,
1075 		LLVMLocalAsMetadataMetadataKind,
1076 		LLVMDistinctMDOperandPlaceholderMetadataKind,
1077 		LLVMMDTupleMetadataKind,
1078 		LLVMDILocationMetadataKind,
1079 		LLVMDIExpressionMetadataKind,
1080 		LLVMDIGlobalVariableExpressionMetadataKind,
1081 		LLVMGenericDINodeMetadataKind,
1082 		LLVMDISubrangeMetadataKind,
1083 		LLVMDIEnumeratorMetadataKind,
1084 		LLVMDIBasicTypeMetadataKind,
1085 		LLVMDIDerivedTypeMetadataKind,
1086 		LLVMDICompositeTypeMetadataKind,
1087 		LLVMDISubroutineTypeMetadataKind,
1088 		LLVMDIFileMetadataKind,
1089 		LLVMDICompileUnitMetadataKind,
1090 		LLVMDISubprogramMetadataKind,
1091 		LLVMDILexicalBlockMetadataKind,
1092 		LLVMDILexicalBlockFileMetadataKind,
1093 		LLVMDINamespaceMetadataKind,
1094 		LLVMDIModuleMetadataKind,
1095 		LLVMDITemplateTypeParameterMetadataKind,
1096 		LLVMDITemplateValueParameterMetadataKind,
1097 		LLVMDIGlobalVariableMetadataKind,
1098 		LLVMDILocalVariableMetadataKind,
1099 		LLVMDILabelMetadataKind,
1100 		LLVMDIObjCPropertyMetadataKind,
1101 		LLVMDIImportedEntityMetadataKind,
1102 		LLVMDIMacroMetadataKind,
1103 		LLVMDIMacroFileMetadataKind
1104 	}
1105 }
1106 
1107 static if (LLVM_Version >= asVersion(7, 0, 0))
1108 {
1109 	enum : LLVMComdatSelectionKind {
1110 		LLVMAnyComdatSelectionKind,
1111 		LLVMExactMatchComdatSelectionKind,
1112 		LLVMLargestComdatSelectionKind,
1113 		LLVMNoDuplicatesComdatSelectionKind,
1114 		LLVMSameSizeComdatSelectionKind
1115 	}
1116 }
1117 
1118 static if (LLVM_Version >= asVersion(7, 0, 0))
1119 {
1120 	enum : LLVMUnnamedAddr {
1121 		  LLVMNoUnnamedAddr,
1122 		  LLVMLocalUnnamedAddr,
1123 		  LLVMGlobalUnnamedAddr
1124 	}
1125 }
1126 
1127 
1128 static if (LLVM_Version >= asVersion(7, 0, 0))
1129 {
1130 	enum : LLVMInlineAsmDialect {
1131 		LLVMInlineAsmDialectATT,
1132 		LLVMInlineAsmDialectIntel
1133 	}
1134 }
1135 
1136 static if (LLVM_Version >= asVersion(7, 0, 0))
1137 {
1138 	enum : LLVMModuleFlagBehavior {
1139 		LLVMModuleFlagBehaviorError,
1140 		LLVMModuleFlagBehaviorWarning,
1141 		LLVMModuleFlagBehaviorRequire,
1142 		LLVMModuleFlagBehaviorOverride,
1143 		LLVMModuleFlagBehaviorAppend,
1144 		LLVMModuleFlagBehaviorAppendUnique,
1145 	}
1146 }
1147 
1148 static if (LLVM_Version >= asVersion(10, 0, 0))
1149 {
1150 	enum : LLVMDWARFMacinfoRecordType {
1151 		LLVMDWARFMacinfoRecordTypeDefine    = 0x01,
1152 		LLVMDWARFMacinfoRecordTypeMacro     = 0x02,
1153 		LLVMDWARFMacinfoRecordTypeStartFile = 0x03,
1154 		LLVMDWARFMacinfoRecordTypeEndFile   = 0x04,
1155 		LLVMDWARFMacinfoRecordTypeVendorExt = 0xff
1156 	}
1157 }
1158 
1159 
1160 /+ Error +/
1161 
1162 static if (LLVM_Version >= asVersion(8, 0, 0)) {
1163 	enum LLVMErrorSuccess = 0;
1164 }
1165 
1166 /+ Remarks / OptRemarks +/
1167 
1168 static if (LLVM_Version >= asVersion(9, 0, 0)) {
1169 
1170 	static if (LLVM_Version >= asVersion(10, 0, 0)) {
1171 		enum REMARKS_API_VERSION = 1;
1172 	}
1173 	else {
1174 		enum REMARKS_API_VERSION = 0;
1175 	}
1176 
1177 	enum : LLVMRemarkType {
1178 		LLVMRemarkTypeUnknown,
1179 		LLVMRemarkTypePassed,
1180 		LLVMRemarkTypeMissed,
1181 		LLVMRemarkTypeAnalysis,
1182 		LLVMRemarkTypeAnalysisFPCommute,
1183 		LLVMRemarkTypeAnalysisAliasing,
1184 		LLVMRemarkTypeFailure
1185 	}
1186 } else static if (LLVM_Version >= asVersion(8, 0, 0)) {
1187 	enum OPT_REMARKS_API_VERSION = 0;
1188 }