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 
132 static if (LLVM_Version >= asVersion(3, 9, 0))
133 {
134 	enum : LLVMValueKind
135 	{
136 		LLVMArgumentValueKind,
137 		LLVMBasicBlockValueKind,
138 		LLVMMemoryUseValueKind,
139 		LLVMMemoryDefValueKind,
140 		LLVMMemoryPhiValueKind,
141 		LLVMFunctionValueKind,
142 		LLVMGlobalAliasValueKind,
143 		LLVMGlobalIFuncValueKind,
144 		LLVMGlobalVariableValueKind,
145 		LLVMBlockAddressValueKind,
146 		LLVMConstantExprValueKind,
147 		LLVMConstantArrayValueKind,
148 		LLVMConstantStructValueKind,
149 		LLVMConstantVectorValueKind,
150 		LLVMUndefValueValueKind,
151 		LLVMConstantAggregateZeroValueKind,
152 		LLVMConstantDataArrayValueKind,
153 		LLVMConstantDataVectorValueKind,
154 		LLVMConstantIntValueKind,
155 		LLVMConstantFPValueKind,
156 		LLVMConstantPointerNullValueKind,
157 		LLVMConstantTokenNoneValueKind,
158 		LLVMMetadataAsValueValueKind,
159 		LLVMInlineAsmValueKind,
160 		LLVMInstructionValueKind,
161 	}
162 
163 	enum : LLVMAttributeIndex
164 	{
165 		LLVMAttributeReturnIndex = 0U,
166 		LLVMAttributeFunctionIndex = -1,
167 	}
168 }
169 
170 static if (LLVM_Version >= asVersion(3, 8, 0)) {
171 	enum : LLVMTypeKind
172 	{
173 		LLVMVoidTypeKind,
174 		LLVMHalfTypeKind,
175 		LLVMFloatTypeKind,
176 		LLVMDoubleTypeKind,
177 		LLVMX86_FP80TypeKind,
178 		LLVMFP128TypeKind,
179 		LLVMPPC_FP128TypeKind,
180 		LLVMLabelTypeKind,
181 		LLVMIntegerTypeKind,
182 		LLVMFunctionTypeKind,
183 		LLVMStructTypeKind,
184 		LLVMArrayTypeKind,
185 		LLVMPointerTypeKind,
186 		LLVMVectorTypeKind,
187 		LLVMMetadataTypeKind,
188 		LLVMX86_MMXTypeKind,
189 		LLVMTokenTypeKind
190 	}
191 } else {
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 }
213 
214 static if (LLVM_Version >= asVersion(3, 2, 0)) {
215 	enum : LLVMLinkage
216 	{
217 		LLVMExternalLinkage,
218 		LLVMAvailableExternallyLinkage,
219 		LLVMLinkOnceAnyLinkage,
220 		LLVMLinkOnceODRLinkage,
221 		LLVMLinkOnceODRAutoHideLinkage,
222 		LLVMWeakAnyLinkage,
223 		LLVMWeakODRLinkage,
224 		LLVMAppendingLinkage,
225 		LLVMInternalLinkage,
226 		LLVMPrivateLinkage,
227 		LLVMDLLImportLinkage,
228 		LLVMDLLExportLinkage,
229 		LLVMExternalWeakLinkage,
230 		LLVMGhostLinkage,
231 		LLVMCommonLinkage,
232 		LLVMLinkerPrivateLinkage,
233 		LLVMLinkerPrivateWeakLinkage,
234 	}
235 } else {
236 	enum : LLVMLinkage
237 	{
238 		LLVMExternalLinkage,
239 		LLVMAvailableExternallyLinkage,
240 		LLVMLinkOnceAnyLinkage,
241 		LLVMLinkOnceODRLinkage,
242 		LLVMWeakAnyLinkage,
243 		LLVMWeakODRLinkage,
244 		LLVMAppendingLinkage,
245 		LLVMInternalLinkage,
246 		LLVMPrivateLinkage,
247 		LLVMDLLImportLinkage,
248 		LLVMDLLExportLinkage,
249 		LLVMExternalWeakLinkage,
250 		LLVMGhostLinkage,
251 		LLVMCommonLinkage,
252 		LLVMLinkerPrivateLinkage,
253 		LLVMLinkerPrivateWeakLinkage,
254 		LLVMLinkerPrivateWeakDefAutoLinkage
255 	}
256 }
257 
258 enum : LLVMVisibility
259 {
260 	LLVMDefaultVisibility,
261 	LLVMHiddenVisibility,
262 	LLVMProtectedVisibility
263 }
264 
265 static if (LLVM_Version >= asVersion(3, 5, 0))
266 {
267 	enum : LLVMDLLStorageClass {
268 		LLVMDefaultStorageClass = 0,
269 		LLVMDLLImportStorageClass = 1,
270 		LLVMDLLExportStorageClass = 2
271 	}
272 }
273 
274 static if (LLVM_Version >= asVersion(7, 0, 0))
275 {
276 	enum : LLVMCallConv {
277 		LLVMCCallConv             = 0,
278 		LLVMFastCallConv          = 8,
279 		LLVMColdCallConv          = 9,
280 		LLVMGHCCallConv           = 10,
281 		LLVMHiPECallConv          = 11,
282 		LLVMWebKitJSCallConv      = 12,
283 		LLVMAnyRegCallConv        = 13,
284 		LLVMPreserveMostCallConv  = 14,
285 		LLVMPreserveAllCallConv   = 15,
286 		LLVMSwiftCallConv         = 16,
287 		LLVMCXXFASTTLSCallConv    = 17,
288 		LLVMX86StdcallCallConv    = 64,
289 		LLVMX86FastcallCallConv   = 65,
290 		LLVMARMAPCSCallConv       = 66,
291 		LLVMARMAAPCSCallConv      = 67,
292 		LLVMARMAAPCSVFPCallConv   = 68,
293 		LLVMMSP430INTRCallConv    = 69,
294 		LLVMX86ThisCallCallConv   = 70,
295 		LLVMPTXKernelCallConv     = 71,
296 		LLVMPTXDeviceCallConv     = 72,
297 		LLVMSPIRFUNCCallConv      = 75,
298 		LLVMSPIRKERNELCallConv    = 76,
299 		LLVMIntelOCLBICallConv    = 77,
300 		LLVMX8664SysVCallConv     = 78,
301 		LLVMWin64CallConv         = 79,
302 		LLVMX86VectorCallCallConv = 80,
303 		LLVMHHVMCallConv          = 81,
304 		LLVMHHVMCCallConv         = 82,
305 		LLVMX86INTRCallConv       = 83,
306 		LLVMAVRINTRCallConv       = 84,
307 		LLVMAVRSIGNALCallConv     = 85,
308 		LLVMAVRBUILTINCallConv    = 86,
309 		LLVMAMDGPUVSCallConv      = 87,
310 		LLVMAMDGPUGSCallConv      = 88,
311 		LLVMAMDGPUPSCallConv      = 89,
312 		LLVMAMDGPUCSCallConv      = 90,
313 		LLVMAMDGPUKERNELCallConv  = 91,
314 		LLVMX86RegCallCallConv    = 92,
315 		LLVMAMDGPUHSCallConv      = 93,
316 		LLVMMSP430BUILTINCallConv = 94,
317 		LLVMAMDGPULSCallConv      = 95,
318 		LLVMAMDGPUESCallConv      = 96
319 	}
320 }
321 else static if (LLVM_Version >= asVersion(3, 4, 0))
322 {
323 	enum : LLVMCallConv {
324 		LLVMCCallConv           = 0,
325 		LLVMFastCallConv        = 8,
326 		LLVMColdCallConv        = 9,
327 		LLVMWebKitJSCallConv    = 12,
328 		LLVMAnyRegCallConv      = 13,
329 		LLVMX86StdcallCallConv  = 64,
330 		LLVMX86FastcallCallConv = 65
331 	}
332 } else {
333 	enum : LLVMCallConv {
334 		LLVMCCallConv           = 0,
335 		LLVMFastCallConv        = 8,
336 		LLVMColdCallConv        = 9,
337 		LLVMX86StdcallCallConv  = 64,
338 		LLVMX86FastcallCallConv = 65
339 	}
340 }
341 
342 enum : LLVMIntPredicate
343 {
344 	LLVMIntEQ = 32,
345 	LLVMIntNE,
346 	LLVMIntUGT,
347 	LLVMIntUGE,
348 	LLVMIntULT,
349 	LLVMIntULE,
350 	LLVMIntSGT,
351 	LLVMIntSGE,
352 	LLVMIntSLT,
353 	LLVMIntSLE
354 }
355 
356 enum : LLVMRealPredicate
357 {
358 	LLVMRealPredicateFalse,
359 	LLVMRealOEQ,
360 	LLVMRealOGT,
361 	LLVMRealOGE,
362 	LLVMRealOLT,
363 	LLVMRealOLE,
364 	LLVMRealONE,
365 	LLVMRealORD,
366 	LLVMRealUNO,
367 	LLVMRealUEQ,
368 	LLVMRealUGT,
369 	LLVMRealUGE,
370 	LLVMRealULT,
371 	LLVMRealULE,
372 	LLVMRealUNE,
373 	LLVMRealPredicateTrue
374 }
375 
376 enum : LLVMLandingPadClauseTy
377 {
378 	LLVMLandingPadCatch,
379 	LLVMLandingPadFilter
380 }
381 
382 static if (LLVM_Version >= asVersion(3, 3, 0))
383 {
384 	enum : LLVMThreadLocalMode
385 	{
386 		LLVMNotThreadLocal = 0,
387 		LLVMGeneralDynamicTLSModel,
388 		LLVMLocalDynamicTLSModel,
389 		LLVMInitialExecTLSModel,
390 		LLVMLocalExecTLSModel
391 	}
392 
393 	enum : LLVMAtomicOrdering
394 	{
395 		LLVMAtomicOrderingNotAtomic = 0,
396 		LLVMAtomicOrderingUnordered = 1,
397 		LLVMAtomicOrderingMonotonic = 2,
398 		LLVMAtomicOrderingAcquire = 4,
399 		LLVMAtomicOrderingRelease = 5,
400 		LLVMAtomicOrderingAcquireRelease = 6,
401 		LLVMAtomicOrderingSequentiallyConsistent = 7
402 	}
403 
404 	enum : LLVMAtomicRMWBinOp
405 	{
406 		LLVMAtomicRMWBinOpXchg,
407 		LLVMAtomicRMWBinOpAdd,
408 		LLVMAtomicRMWBinOpSub,
409 		LLVMAtomicRMWBinOpAnd,
410 		LLVMAtomicRMWBinOpNand,
411 		LLVMAtomicRMWBinOpOr,
412 		LLVMAtomicRMWBinOpXor,
413 		LLVMAtomicRMWBinOpMax,
414 		LLVMAtomicRMWBinOpMin,
415 		LLVMAtomicRMWBinOpUMax,
416 		LLVMAtomicRMWBinOpUMin
417 	}
418 }
419 static if (LLVM_Version >= asVersion(3, 5, 0))
420 {
421 	enum : LLVMDiagnosticSeverity {
422 		LLVMDSError,
423 		LLVMDSWarning,
424 		LLVMDSRemark,
425 		LLVMDSNote
426 	}
427 }
428 
429 /+ Disassembler +/
430 
431 //TODO: replace const with enum?
432 const
433 {
434 	uint LLVMDisassembler_VariantKind_None = 0;
435 	uint LLVMDisassembler_VariantKind_ARM_HI16 = 1;
436 	uint LLVMDisassembler_VariantKind_ARM_LO16 = 2;
437 	static if (LLVM_Version >= asVersion(3, 5, 0))
438 	{
439 		uint LLVMDisassembler_VariantKind_ARM64_PAGE = 1;
440 		uint LLVMDisassembler_VariantKind_ARM64_PAGEOFF = 2;
441 		uint LLVMDisassembler_VariantKind_ARM64_GOTPAGE = 3;
442 		uint LLVMDisassembler_VariantKind_ARM64_GOTPAGEOFF = 4;
443 		uint LLVMDisassembler_VariantKind_ARM64_TLVP = 5;
444 		uint LLVMDisassembler_VariantKind_ARM64_TLVOFF = 6;
445 	}
446 	uint LLVMDisassembler_ReferenceType_InOut_None = 0;
447 	uint LLVMDisassembler_ReferenceType_In_Branch = 1;
448 	uint LLVMDisassembler_ReferenceType_In_PCrel_Load = 2;
449 	static if (LLVM_Version >= asVersion(3, 5, 0))
450 	{
451 		ulong LLVMDisassembler_ReferenceType_In_ARM64_ADRP = 0x100000001;
452 		ulong LLVMDisassembler_ReferenceType_In_ARM64_ADDXri = 0x100000002;
453 		ulong LLVMDisassembler_ReferenceType_In_ARM64_LDRXui = 0x100000003;
454 		ulong LLVMDisassembler_ReferenceType_In_ARM64_LDRXl = 0x100000004;
455 		ulong LLVMDisassembler_ReferenceType_In_ARM64_ADR = 0x100000005;
456 	}
457 	uint LLVMDisassembler_ReferenceType_Out_SymbolStub = 1;
458 	uint LLVMDisassembler_ReferenceType_Out_LitPool_SymAddr = 2;
459 	uint LLVMDisassembler_ReferenceType_Out_LitPool_CstrAddr = 3;
460 	static if (LLVM_Version >= asVersion(3, 2, 0))
461 	{
462 		uint LLVMDisassembler_Option_UseMarkup = 1;
463 	}
464 	static if (LLVM_Version >= asVersion(3, 3, 0))
465 	{
466 		uint LLVMDisassembler_Option_PrintImmHex = 2;
467 		uint LLVMDisassembler_Option_AsmPrinterVariant = 4;
468 	}
469 	static if (LLVM_Version >= asVersion(3, 4, 0))
470 	{
471 		uint LLVMDisassembler_ReferenceType_Out_Objc_CFString_Ref = 4;
472 		uint LLVMDisassembler_ReferenceType_Out_Objc_Message = 5;
473 		uint LLVMDisassembler_ReferenceType_Out_Objc_Message_Ref = 6;
474 		uint LLVMDisassembler_ReferenceType_Out_Objc_Selector_Ref = 7;
475 		uint LLVMDisassembler_ReferenceType_Out_Objc_Class_Ref = 8;
476 		uint LLVMDisassembler_Option_SetInstrComments = 8;
477 		uint LLVMDisassembler_Option_PrintLatency = 16;
478 	}
479 	static if (LLVM_Version >= asVersion(3, 5, 0))
480 	{
481 		uint LLVMDisassembler_ReferenceType_DeMangled_Name = 9;
482 	}
483 }
484 
485 static if (LLVM_Version < asVersion(3, 3, 0))
486 {
487 	/+ Enhanced Disassembly +/
488 
489 	enum : EDAssemblySyntax_t
490 	{
491 		kEDAssemblySyntaxX86Intel = 0,
492 		kEDAssemblySyntaxX86ATT = 1,
493 		kEDAssemblySyntaxARMUAL = 2
494 	}
495 }
496 
497 /+ Linker +/
498 static if (LLVM_Version >= asVersion(3, 2, 0))
499 {
500 	enum : LLVMLinkerMode
501 	{
502 		LLVMLinkerDestroySource  = 0
503 	}
504 	
505 	static if (LLVM_Version < asVersion(3, 7, 0))
506 	{
507 		enum : LLVMLinkerMode
508 		{
509 			LLVMLinkerPreserveSource  = 1
510 		}
511 	}
512 }
513 
514 /+ Link Time Optimization +/
515 
516 enum : llvm_lto_status
517 {
518 	LLVM_LTO_UNKNOWN,
519 	LLVM_LTO_OPT_SUCCESS,
520 	LLVM_LTO_READ_SUCCESS,
521 	LLVM_LTO_READ_FAILURE,
522 	LLVM_LTO_WRITE_FAILURE,
523 	LLVM_LTO_NO_TARGET,
524 	LLVM_LTO_NO_WORK,
525 	LLVM_LTO_MODULE_MERGE_FAILURE,
526 	LLVM_LTO_ASM_FAILURE,
527 	LLVM_LTO_NULL_OBJECT
528 }
529 
530 /+ LTO +/
531 static if (LLVM_Version >= asVersion(7, 0, 0))
532 {
533 	const uint LTO_API_VERSION = 22;
534 }
535 else static if (LLVM_Version >= asVersion(4, 0, 0))
536 {
537 	const uint LTO_API_VERSION = 21;
538 }
539 else static if (LLVM_Version >= asVersion(3, 9, 0))
540 {
541 	const uint LTO_API_VERSION = 20;
542 }
543 else static if (LLVM_Version >= asVersion(3, 7, 0))
544 {
545 	const uint LTO_API_VERSION = 17;
546 }
547 else static if (LLVM_Version >= asVersion(3, 6, 0))
548 {
549 	const uint LTO_API_VERSION = 11;
550 }
551 else static if (LLVM_Version >= asVersion(3, 5, 0))
552 {
553 	const uint LTO_API_VERSION = 10;
554 }
555 else static if (LLVM_Version >= asVersion(3, 4, 0))
556 {
557 	const uint LTO_API_VERSION = 5;
558 }
559 else
560 {
561 	const uint LTO_API_VERSION = 4;
562 }
563 
564 enum : lto_symbol_attributes
565 {
566 	LTO_SYMBOL_ALIGNMENT_MASK              = 0x0000001F,
567 	LTO_SYMBOL_PERMISSIONS_MASK            = 0x000000E0,
568 	LTO_SYMBOL_PERMISSIONS_CODE            = 0x000000A0,
569 	LTO_SYMBOL_PERMISSIONS_DATA            = 0x000000C0,
570 	LTO_SYMBOL_PERMISSIONS_RODATA          = 0x00000080,
571 	LTO_SYMBOL_DEFINITION_MASK             = 0x00000700,
572 	LTO_SYMBOL_DEFINITION_REGULAR          = 0x00000100,
573 	LTO_SYMBOL_DEFINITION_TENTATIVE        = 0x00000200,
574 	LTO_SYMBOL_DEFINITION_WEAK             = 0x00000300,
575 	LTO_SYMBOL_DEFINITION_UNDEFINED        = 0x00000400,
576 	LTO_SYMBOL_DEFINITION_WEAKUNDEF        = 0x00000500,
577 	LTO_SYMBOL_SCOPE_MASK                  = 0x00003800,
578 	LTO_SYMBOL_SCOPE_INTERNAL              = 0x00000800,
579 	LTO_SYMBOL_SCOPE_HIDDEN                = 0x00001000,
580 	LTO_SYMBOL_SCOPE_PROTECTED             = 0x00002000,
581 	LTO_SYMBOL_SCOPE_DEFAULT               = 0x00001800,
582 	LTO_SYMBOL_SCOPE_DEFAULT_CAN_BE_HIDDEN = 0x00002800,
583 }
584 static if (LLVM_Version >= asVersion(3, 7, 0))
585 {
586 	enum : lto_symbol_attributes
587 	{
588 		LTO_SYMBOL_COMDAT                  = 0x00004000,
589 		LTO_SYMBOL_ALIAS                   = 0x00008000
590 	}
591 }
592 
593 enum : lto_debug_model
594 {
595 	LTO_DEBUG_MODEL_NONE = 0,
596 	LTO_DEBUG_MODEL_DWARF = 1
597 }
598 
599 enum : lto_codegen_model
600 {
601 	LTO_CODEGEN_PIC_MODEL_STATIC = 0,
602 	LTO_CODEGEN_PIC_MODEL_DYNAMIC = 1,
603 	LTO_CODEGEN_PIC_MODEL_DYNAMIC_NO_PIC = 2,
604 	LTO_CODEGEN_PIC_MODEL_DEFAULT = 3
605 }
606 
607 static if (LLVM_Version >= asVersion(3, 5, 0))
608 {
609 	enum : lto_codegen_diagnostic_severity_t
610 	{
611 		LTO_DS_ERROR = 0,
612 		LTO_DS_WARNING = 1,
613 	   	LTO_DS_REMARK = 3,
614 		LTO_DS_NOTE = 2
615 	}
616 }
617 
618 /+ Target information +/
619 
620 enum : LLVMByteOrdering
621 {
622 	LLVMBigEndian,
623 	LLVMLittleEndian
624 }
625 
626 /+ Target machine +/
627 
628 enum : LLVMCodeGenOptLevel
629 {
630 	LLVMCodeGenLevelNone,
631 	LLVMCodeGenLevelLess,
632 	LLVMCodeGenLevelDefault,
633 	LLVMCodeGenLevelAggressive
634 }
635 
636 enum : LLVMRelocMode
637 {
638 	LLVMRelocDefault,
639 	LLVMRelocStatic,
640 	LLVMRelocPIC,
641 	LLVMRelocDynamicNoPic
642 }
643 
644 enum : LLVMCodeModel
645 {
646 	LLVMCodeModelDefault,
647 	LLVMCodeModelJITDefault,
648 	LLVMCodeModelSmall,
649 	LLVMCodeModelKernel,
650 	LLVMCodeModelMedium,
651 	LLVMCodeModelLarge
652 }
653 
654 enum : LLVMCodeGenFileType
655 {
656 	LLVMAssemblyFile,
657 	LLVMObjectFile
658 }
659 
660 /+ Orc +/
661 
662 static if (LLVM_Version >= asVersion(3, 9, 0))
663 {
664 	enum : LLVMOrcErrorCode
665 	{
666 		LLVMOrcErrSuccess = 0,
667 		LLVMOrcErrGeneric,
668 	}
669 }
670 
671 /+ Debug info flags +/
672 
673 static if (LLVM_Version >= asVersion(7, 0, 0)) 
674 {
675 	enum : LLVMDIFlags {
676 		LLVMDIFlagZero = 0,
677 		LLVMDIFlagPrivate = 1,
678 		LLVMDIFlagProtected = 2,
679 		LLVMDIFlagPublic = 3,
680 		LLVMDIFlagFwdDecl = 1 << 2,
681 		LLVMDIFlagAppleBlock = 1 << 3,
682 		LLVMDIFlagBlockByrefStruct = 1 << 4,
683 		LLVMDIFlagVirtual = 1 << 5,
684 		LLVMDIFlagArtificial = 1 << 6,
685 		LLVMDIFlagExplicit = 1 << 7,
686 		LLVMDIFlagPrototyped = 1 << 8,
687 		LLVMDIFlagObjcClassComplete = 1 << 9,
688 		LLVMDIFlagObjectPointer = 1 << 10,
689 		LLVMDIFlagVector = 1 << 11,
690 		LLVMDIFlagStaticMember = 1 << 12,
691 		LLVMDIFlagLValueReference = 1 << 13,
692 		LLVMDIFlagRValueReference = 1 << 14,
693 		LLVMDIFlagReserved = 1 << 15,
694 		LLVMDIFlagSingleInheritance = 1 << 16,
695 		LLVMDIFlagMultipleInheritance = 2 << 16,
696 		LLVMDIFlagVirtualInheritance = 3 << 16,
697 		LLVMDIFlagIntroducedVirtual = 1 << 18,
698 		LLVMDIFlagBitField = 1 << 19,
699 		LLVMDIFlagNoReturn = 1 << 20,
700 		LLVMDIFlagMainSubprogram = 1 << 21,
701 		LLVMDIFlagTypePassByValue = 1 << 22,
702 		LLVMDIFlagTypePassByReference = 1 << 23,
703 		LLVMDIFlagFixedEnum = 1 << 24,
704 		LLVMDIFlagThunk = 1 << 25,
705 		LLVMDIFlagTrivial = 1 << 26,
706 		LLVMDIFlagIndirectVirtualBase = (1 << 2) | (1 << 5),
707 		LLVMDIFlagAccessibility = LLVMDIFlagPrivate | LLVMDIFlagProtected | LLVMDIFlagPublic,
708 		LLVMDIFlagPtrToMemberRep = LLVMDIFlagSingleInheritance | LLVMDIFlagMultipleInheritance | LLVMDIFlagVirtualInheritance
709 	}
710 } 
711 else static if (LLVM_Version >= asVersion(6, 0, 0))
712 {
713 	enum : LLVMDIFlags {
714 		LLVMDIFlagZero = 0,
715 		LLVMDIFlagPrivate = 1,
716 		LLVMDIFlagProtected = 2,
717 		LLVMDIFlagPublic = 3,
718 		LLVMDIFlagFwdDecl = 1 << 2,
719 		LLVMDIFlagAppleBlock = 1 << 3,
720 		LLVMDIFlagBlockByrefStruct = 1 << 4,
721 		LLVMDIFlagVirtual = 1 << 5,
722 		LLVMDIFlagArtificial = 1 << 6,
723 		LLVMDIFlagExplicit = 1 << 7,
724 		LLVMDIFlagPrototyped = 1 << 8,
725 		LLVMDIFlagObjcClassComplete = 1 << 9,
726 		LLVMDIFlagObjectPointer = 1 << 10,
727 		LLVMDIFlagVector = 1 << 11,
728 		LLVMDIFlagStaticMember = 1 << 12,
729 		LLVMDIFlagLValueReference = 1 << 13,
730 		LLVMDIFlagRValueReference = 1 << 14,
731 		LLVMDIFlagReserved = 1 << 15,
732 		LLVMDIFlagSingleInheritance = 1 << 16,
733 		LLVMDIFlagMultipleInheritance = 2 << 16,
734 		LLVMDIFlagVirtualInheritance = 3 << 16,
735 		LLVMDIFlagIntroducedVirtual = 1 << 18,
736 		LLVMDIFlagBitField = 1 << 19,
737 		LLVMDIFlagNoReturn = 1 << 20,
738 		LLVMDIFlagMainSubprogram = 1 << 21,
739 		LLVMDIFlagIndirectVirtualBase = (1 << 2) | (1 << 5),
740 		LLVMDIFlagAccessibility = LLVMDIFlagPrivate | LLVMDIFlagProtected |
741 		                          LLVMDIFlagPublic,
742 		LLVMDIFlagPtrToMemberRep = LLVMDIFlagSingleInheritance |
743 		                           LLVMDIFlagMultipleInheritance |
744 		                           LLVMDIFlagVirtualInheritance
745 	}
746 } 
747 
748 static if (LLVM_Version >= asVersion(6, 0, 0)) 
749 {
750 	enum : LLVMDWARFSourceLanguage {
751 		LLVMDWARFSourceLanguageC89,
752 		LLVMDWARFSourceLanguageC,
753 		LLVMDWARFSourceLanguageAda83,
754 		LLVMDWARFSourceLanguageC_plus_plus,
755 		LLVMDWARFSourceLanguageCobol74,
756 		LLVMDWARFSourceLanguageCobol85,
757 		LLVMDWARFSourceLanguageFortran77,
758 		LLVMDWARFSourceLanguageFortran90,
759 		LLVMDWARFSourceLanguagePascal83,
760 		LLVMDWARFSourceLanguageModula2,
761 		// New in DWARF v3:
762 		LLVMDWARFSourceLanguageJava,
763 		LLVMDWARFSourceLanguageC99,
764 		LLVMDWARFSourceLanguageAda95,
765 		LLVMDWARFSourceLanguageFortran95,
766 		LLVMDWARFSourceLanguagePLI,
767 		LLVMDWARFSourceLanguageObjC,
768 		LLVMDWARFSourceLanguageObjC_plus_plus,
769 		LLVMDWARFSourceLanguageUPC,
770 		LLVMDWARFSourceLanguageD,
771 		// New in DWARF v4:
772 		LLVMDWARFSourceLanguagePython,
773 		// New in DWARF v5:
774 		LLVMDWARFSourceLanguageOpenCL,
775 		LLVMDWARFSourceLanguageGo,
776 		LLVMDWARFSourceLanguageModula3,
777 		LLVMDWARFSourceLanguageHaskell,
778 		LLVMDWARFSourceLanguageC_plus_plus_03,
779 		LLVMDWARFSourceLanguageC_plus_plus_11,
780 		LLVMDWARFSourceLanguageOCaml,
781 		LLVMDWARFSourceLanguageRust,
782 		LLVMDWARFSourceLanguageC11,
783 		LLVMDWARFSourceLanguageSwift,
784 		LLVMDWARFSourceLanguageJulia,
785 		LLVMDWARFSourceLanguageDylan,
786 		LLVMDWARFSourceLanguageC_plus_plus_14,
787 		LLVMDWARFSourceLanguageFortran03,
788 		LLVMDWARFSourceLanguageFortran08,
789 		LLVMDWARFSourceLanguageRenderScript,
790 		LLVMDWARFSourceLanguageBLISS,
791 		// Vendor extensions:
792 		LLVMDWARFSourceLanguageMips_Assembler,
793 		LLVMDWARFSourceLanguageGOOGLE_RenderScript,
794 		LLVMDWARFSourceLanguageBORLAND_Delphi
795 	}
796 }
797 
798 static if (LLVM_Version >= asVersion(6, 0, 0)) 
799 {
800 	enum : LLVMDWARFEmissionKind {
801 		LLVMDWARFEmissionNone = 0,
802 		LLVMDWARFEmissionFull,
803 		LLVMDWARFEmissionLineTablesOnly
804 	}
805 
806 }
807 
808 
809 static if (LLVM_Version >= asVersion(7, 0, 0))
810 {
811 	enum : LLVMComdatSelectionKind {
812 		LLVMAnyComdatSelectionKind,
813 		LLVMExactMatchComdatSelectionKind,
814 		LLVMLargestComdatSelectionKind,
815 		LLVMNoDuplicatesComdatSelectionKind,
816 		LLVMSameSizeComdatSelectionKind
817 	}
818 }
819 
820 static if (LLVM_Version >= asVersion(7, 0, 0))
821 {
822 	enum : LLVMUnnamedAddr {
823 		  LLVMNoUnnamedAddr,
824 		  LLVMLocalUnnamedAddr,
825 		  LLVMGlobalUnnamedAddr
826 	}
827 }
828 
829 
830 static if (LLVM_Version >= asVersion(7, 0, 0))
831 {
832 	enum : LLVMInlineAsmDialect {
833 		LLVMInlineAsmDialectATT,
834 		LLVMInlineAsmDialectIntel
835 	}
836 }
837 
838 static if (LLVM_Version >= asVersion(7, 0, 0))
839 {
840 	enum : LLVMModuleFlagBehavior {
841 		LLVMModuleFlagBehaviorError,
842 		LLVMModuleFlagBehaviorWarning,
843 		LLVMModuleFlagBehaviorRequire,
844 		LLVMModuleFlagBehaviorOverride,
845 		LLVMModuleFlagBehaviorAppend,
846 		LLVMModuleFlagBehaviorAppendUnique,
847 	}
848 }