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 enum : LLVMAttribute
20 {
21 	LLVMZExtAttribute = 1<<0,
22 	LLVMSExtAttribute = 1<<1,
23 	LLVMNoReturnAttribute = 1<<2,
24 	LLVMInRegAttribute = 1<<3,
25 	LLVMStructRetAttribute = 1<<4,
26 	LLVMNoUnwindAttribute = 1<<5,
27 	LLVMNoAliasAttribute = 1<<6,
28 	LLVMByValAttribute = 1<<7,
29 	LLVMNestAttribute = 1<<8,
30 	LLVMReadNoneAttribute = 1<<9,
31 	LLVMReadOnlyAttribute = 1<<10,
32 	LLVMNoInlineAttribute = 1<<11,
33 	LLVMAlwaysInlineAttribute = 1<<12,
34 	LLVMOptimizeForSizeAttribute = 1<<13,
35 	LLVMStackProtectAttribute = 1<<14,
36 	LLVMStackProtectReqAttribute = 1<<15,
37 	LLVMAlignment = 31<<16,
38 	LLVMNoCaptureAttribute = 1<<21,
39 	LLVMNoRedZoneAttribute = 1<<22,
40 	LLVMNoImplicitFloatAttribute = 1<<23,
41 	LLVMNakedAttribute = 1<<24,
42 	LLVMInlineHintAttribute = 1<<25,
43 	LLVMStackAlignment = 7<<26,
44 	LLVMReturnsTwice = 1<<29,
45 	LLVMUWTable = 1<<30,
46 	LLVMNonLazyBind = 1<<31
47 }
48 
49 enum : LLVMOpcode
50 {
51 	LLVMRet            = 1,
52 	LLVMBr             = 2,
53 	LLVMSwitch         = 3,
54 	LLVMIndirectBr     = 4,
55 	LLVMInvoke         = 5,
56 	LLVMUnreachable    = 7,
57 	LLVMAdd            = 8,
58 	LLVMFAdd           = 9,
59 	LLVMSub            = 10,
60 	LLVMFSub           = 11,
61 	LLVMMul            = 12,
62 	LLVMFMul           = 13,
63 	LLVMUDiv           = 14,
64 	LLVMSDiv           = 15,
65 	LLVMFDiv           = 16,
66 	LLVMURem           = 17,
67 	LLVMSRem           = 18,
68 	LLVMFRem           = 19,
69 	LLVMShl            = 20,
70 	LLVMLShr           = 21,
71 	LLVMAShr           = 22,
72 	LLVMAnd            = 23,
73 	LLVMOr             = 24,
74 	LLVMXor            = 25,
75 	LLVMAlloca         = 26,
76 	LLVMLoad           = 27,
77 	LLVMStore          = 28,
78 	LLVMGetElementPtr  = 29,
79 	LLVMTrunc          = 30,
80 	LLVMZExt           = 31,
81 	LLVMSExt           = 32,
82 	LLVMFPToUI         = 33,
83 	LLVMFPToSI         = 34,
84 	LLVMUIToFP         = 35,
85 	LLVMSIToFP         = 36,
86 	LLVMFPTrunc        = 37,
87 	LLVMFPExt          = 38,
88 	LLVMPtrToInt       = 39,
89 	LLVMIntToPtr       = 40,
90 	LLVMBitCast        = 41,
91 	LLVMICmp           = 42,
92 	LLVMFCmp           = 43,
93 	LLVMPHI            = 44,
94 	LLVMCall           = 45,
95 	LLVMSelect         = 46,
96 	LLVMUserOp1        = 47,
97 	LLVMUserOp2        = 48,
98 	LLVMVAArg          = 49,
99 	LLVMExtractElement = 50,
100 	LLVMInsertElement  = 51,
101 	LLVMShuffleVector  = 52,
102 	LLVMExtractValue   = 53,
103 	LLVMInsertValue    = 54,
104 	LLVMFence          = 55,
105 	LLVMAtomicCmpXchg  = 56,
106 	LLVMAtomicRMW      = 57,
107 	LLVMResume         = 58,
108 	LLVMLandingPad     = 59,
109 }
110 static if (LLVM_Version >= asVersion(3, 4, 0))
111 {
112 	enum : LLVMOpcode
113 	{
114 		LLVMAddrSpaceCast  = 60
115 	}
116 }
117 static if (LLVM_Version >= asVersion(3, 8, 0))
118 {
119 	enum : LLVMOpcode
120 	{
121 		LLVMCleanupRet     = 61,
122 		LLVMCatchRet       = 62,
123 		LLVMCatchPad       = 63,
124 		LLVMCleanupPad     = 64,
125 		LLVMCatchSwitch    = 65
126 	}
127 }
128 
129 static if (LLVM_Version >= asVersion(3, 9, 0))
130 {
131 	enum : LLVMValueKind
132 	{
133 		LLVMArgumentValueKind,
134 		LLVMBasicBlockValueKind,
135 		LLVMMemoryUseValueKind,
136 		LLVMMemoryDefValueKind,
137 		LLVMMemoryPhiValueKind,
138 		LLVMFunctionValueKind,
139 		LLVMGlobalAliasValueKind,
140 		LLVMGlobalIFuncValueKind,
141 		LLVMGlobalVariableValueKind,
142 		LLVMBlockAddressValueKind,
143 		LLVMConstantExprValueKind,
144 		LLVMConstantArrayValueKind,
145 		LLVMConstantStructValueKind,
146 		LLVMConstantVectorValueKind,
147 		LLVMUndefValueValueKind,
148 		LLVMConstantAggregateZeroValueKind,
149 		LLVMConstantDataArrayValueKind,
150 		LLVMConstantDataVectorValueKind,
151 		LLVMConstantIntValueKind,
152 		LLVMConstantFPValueKind,
153 		LLVMConstantPointerNullValueKind,
154 		LLVMConstantTokenNoneValueKind,
155 		LLVMMetadataAsValueValueKind,
156 		LLVMInlineAsmValueKind,
157 		LLVMInstructionValueKind,
158 	}
159 
160 	enum : LLVMAttributeIndex
161 	{
162 		LLVMAttributeReturnIndex = 0U,
163 		LLVMAttributeFunctionIndex = -1,
164 	}
165 }
166 
167 static if (LLVM_Version >= asVersion(3, 8, 0)) {
168 	enum : LLVMTypeKind
169 	{
170 		LLVMVoidTypeKind,
171 		LLVMHalfTypeKind,
172 		LLVMFloatTypeKind,
173 		LLVMDoubleTypeKind,
174 		LLVMX86_FP80TypeKind,
175 		LLVMFP128TypeKind,
176 		LLVMPPC_FP128TypeKind,
177 		LLVMLabelTypeKind,
178 		LLVMIntegerTypeKind,
179 		LLVMFunctionTypeKind,
180 		LLVMStructTypeKind,
181 		LLVMArrayTypeKind,
182 		LLVMPointerTypeKind,
183 		LLVMVectorTypeKind,
184 		LLVMMetadataTypeKind,
185 		LLVMX86_MMXTypeKind,
186 		LLVMTokenTypeKind
187 	}
188 } else {
189 	enum : LLVMTypeKind
190 	{
191 		LLVMVoidTypeKind,
192 		LLVMHalfTypeKind,
193 		LLVMFloatTypeKind,
194 		LLVMDoubleTypeKind,
195 		LLVMX86_FP80TypeKind,
196 		LLVMFP128TypeKind,
197 		LLVMPPC_FP128TypeKind,
198 		LLVMLabelTypeKind,
199 		LLVMIntegerTypeKind,
200 		LLVMFunctionTypeKind,
201 		LLVMStructTypeKind,
202 		LLVMArrayTypeKind,
203 		LLVMPointerTypeKind,
204 		LLVMVectorTypeKind,
205 		LLVMMetadataTypeKind,
206 		LLVMX86_MMXTypeKind,
207 		LLVMTokenTypeKind
208 	}
209 }
210 
211 static if (LLVM_Version >= asVersion(3, 2, 0)) {
212 	enum : LLVMLinkage
213 	{
214 		LLVMExternalLinkage,
215 		LLVMAvailableExternallyLinkage,
216 		LLVMLinkOnceAnyLinkage,
217 		LLVMLinkOnceODRLinkage,
218 		LLVMLinkOnceODRAutoHideLinkage,
219 		LLVMWeakAnyLinkage,
220 		LLVMWeakODRLinkage,
221 		LLVMAppendingLinkage,
222 		LLVMInternalLinkage,
223 		LLVMPrivateLinkage,
224 		LLVMDLLImportLinkage,
225 		LLVMDLLExportLinkage,
226 		LLVMExternalWeakLinkage,
227 		LLVMGhostLinkage,
228 		LLVMCommonLinkage,
229 		LLVMLinkerPrivateLinkage,
230 		LLVMLinkerPrivateWeakLinkage,
231 	}
232 } else {
233 	enum : LLVMLinkage
234 	{
235 		LLVMExternalLinkage,
236 		LLVMAvailableExternallyLinkage,
237 		LLVMLinkOnceAnyLinkage,
238 		LLVMLinkOnceODRLinkage,
239 		LLVMWeakAnyLinkage,
240 		LLVMWeakODRLinkage,
241 		LLVMAppendingLinkage,
242 		LLVMInternalLinkage,
243 		LLVMPrivateLinkage,
244 		LLVMDLLImportLinkage,
245 		LLVMDLLExportLinkage,
246 		LLVMExternalWeakLinkage,
247 		LLVMGhostLinkage,
248 		LLVMCommonLinkage,
249 		LLVMLinkerPrivateLinkage,
250 		LLVMLinkerPrivateWeakLinkage,
251 		LLVMLinkerPrivateWeakDefAutoLinkage
252 	}
253 }
254 
255 enum : LLVMVisibility
256 {
257 	LLVMDefaultVisibility,
258 	LLVMHiddenVisibility,
259 	LLVMProtectedVisibility
260 }
261 
262 static if (LLVM_Version >= asVersion(3, 5, 0))
263 {
264 	enum : LLVMDLLStorageClass {
265 		LLVMDefaultStorageClass = 0,
266 		LLVMDLLImportStorageClass = 1,
267 		LLVMDLLExportStorageClass = 2
268 	}
269 }
270 
271 static if (LLVM_Version >= asVersion(3, 4, 0))
272 {
273 	enum : LLVMCallConv {
274 		LLVMCCallConv           = 0,
275 		LLVMFastCallConv        = 8,
276 		LLVMColdCallConv        = 9,
277 		LLVMWebKitJSCallConv    = 12,
278 		LLVMAnyRegCallConv      = 13,
279 		LLVMX86StdcallCallConv  = 64,
280 		LLVMX86FastcallCallConv = 65
281 	}
282 } else {
283 	enum : LLVMCallConv {
284 		LLVMCCallConv           = 0,
285 		LLVMFastCallConv        = 8,
286 		LLVMColdCallConv        = 9,
287 		LLVMX86StdcallCallConv  = 64,
288 		LLVMX86FastcallCallConv = 65
289 	}
290 }
291 
292 enum : LLVMIntPredicate
293 {
294 	LLVMIntEQ = 32,
295 	LLVMIntNE,
296 	LLVMIntUGT,
297 	LLVMIntUGE,
298 	LLVMIntULT,
299 	LLVMIntULE,
300 	LLVMIntSGT,
301 	LLVMIntSGE,
302 	LLVMIntSLT,
303 	LLVMIntSLE
304 }
305 
306 enum : LLVMRealPredicate
307 {
308 	LLVMRealPredicateFalse,
309 	LLVMRealOEQ,
310 	LLVMRealOGT,
311 	LLVMRealOGE,
312 	LLVMRealOLT,
313 	LLVMRealOLE,
314 	LLVMRealONE,
315 	LLVMRealORD,
316 	LLVMRealUNO,
317 	LLVMRealUEQ,
318 	LLVMRealUGT,
319 	LLVMRealUGE,
320 	LLVMRealULT,
321 	LLVMRealULE,
322 	LLVMRealUNE,
323 	LLVMRealPredicateTrue
324 }
325 
326 enum : LLVMLandingPadClauseTy
327 {
328 	LLVMLandingPadCatch,
329 	LLVMLandingPadFilter
330 }
331 
332 static if (LLVM_Version >= asVersion(3, 3, 0))
333 {
334 	enum : LLVMThreadLocalMode
335 	{
336 		LLVMNotThreadLocal = 0,
337 		LLVMGeneralDynamicTLSModel,
338 		LLVMLocalDynamicTLSModel,
339 		LLVMInitialExecTLSModel,
340 		LLVMLocalExecTLSModel
341 	}
342 
343 	enum : LLVMAtomicOrdering
344 	{
345 		LLVMAtomicOrderingNotAtomic = 0,
346 		LLVMAtomicOrderingUnordered = 1,
347 		LLVMAtomicOrderingMonotonic = 2,
348 		LLVMAtomicOrderingAcquire = 4,
349 		LLVMAtomicOrderingRelease = 5,
350 		LLVMAtomicOrderingAcquireRelease = 6,
351 		LLVMAtomicOrderingSequentiallyConsistent = 7
352 	}
353 
354 	enum : LLVMAtomicRMWBinOp
355 	{
356 		LLVMAtomicRMWBinOpXchg,
357 		LLVMAtomicRMWBinOpAdd,
358 		LLVMAtomicRMWBinOpSub,
359 		LLVMAtomicRMWBinOpAnd,
360 		LLVMAtomicRMWBinOpNand,
361 		LLVMAtomicRMWBinOpOr,
362 		LLVMAtomicRMWBinOpXor,
363 		LLVMAtomicRMWBinOpMax,
364 		LLVMAtomicRMWBinOpMin,
365 		LLVMAtomicRMWBinOpUMax,
366 		LLVMAtomicRMWBinOpUMin
367 	}
368 }
369 static if (LLVM_Version >= asVersion(3, 5, 0))
370 {
371 	enum : LLVMDiagnosticSeverity {
372 		LLVMDSError,
373 		LLVMDSWarning,
374 		LLVMDSRemark,
375 		LLVMDSNote
376 	}
377 }
378 
379 /+ Disassembler +/
380 
381 //TODO: replace const with enum?
382 const
383 {
384 	uint LLVMDisassembler_VariantKind_None = 0;
385 	uint LLVMDisassembler_VariantKind_ARM_HI16 = 1;
386 	uint LLVMDisassembler_VariantKind_ARM_LO16 = 2;
387 	static if (LLVM_Version >= asVersion(3, 5, 0))
388 	{
389 		uint LLVMDisassembler_VariantKind_ARM64_PAGE = 1;
390 		uint LLVMDisassembler_VariantKind_ARM64_PAGEOFF = 2;
391 		uint LLVMDisassembler_VariantKind_ARM64_GOTPAGE = 3;
392 		uint LLVMDisassembler_VariantKind_ARM64_GOTPAGEOFF = 4;
393 		uint LLVMDisassembler_VariantKind_ARM64_TLVP = 5;
394 		uint LLVMDisassembler_VariantKind_ARM64_TLVOFF = 6;
395 	}
396 	uint LLVMDisassembler_ReferenceType_InOut_None = 0;
397 	uint LLVMDisassembler_ReferenceType_In_Branch = 1;
398 	uint LLVMDisassembler_ReferenceType_In_PCrel_Load = 2;
399 	static if (LLVM_Version >= asVersion(3, 5, 0))
400 	{
401 		ulong LLVMDisassembler_ReferenceType_In_ARM64_ADRP = 0x100000001;
402 		ulong LLVMDisassembler_ReferenceType_In_ARM64_ADDXri = 0x100000002;
403 		ulong LLVMDisassembler_ReferenceType_In_ARM64_LDRXui = 0x100000003;
404 		ulong LLVMDisassembler_ReferenceType_In_ARM64_LDRXl = 0x100000004;
405 		ulong LLVMDisassembler_ReferenceType_In_ARM64_ADR = 0x100000005;
406 	}
407 	uint LLVMDisassembler_ReferenceType_Out_SymbolStub = 1;
408 	uint LLVMDisassembler_ReferenceType_Out_LitPool_SymAddr = 2;
409 	uint LLVMDisassembler_ReferenceType_Out_LitPool_CstrAddr = 3;
410 	static if (LLVM_Version >= asVersion(3, 2, 0))
411 	{
412 		uint LLVMDisassembler_Option_UseMarkup = 1;
413 	}
414 	static if (LLVM_Version >= asVersion(3, 3, 0))
415 	{
416 		uint LLVMDisassembler_Option_PrintImmHex = 2;
417 		uint LLVMDisassembler_Option_AsmPrinterVariant = 4;
418 	}
419 	static if (LLVM_Version >= asVersion(3, 4, 0))
420 	{
421 		uint LLVMDisassembler_ReferenceType_Out_Objc_CFString_Ref = 4;
422 		uint LLVMDisassembler_ReferenceType_Out_Objc_Message = 5;
423 		uint LLVMDisassembler_ReferenceType_Out_Objc_Message_Ref = 6;
424 		uint LLVMDisassembler_ReferenceType_Out_Objc_Selector_Ref = 7;
425 		uint LLVMDisassembler_ReferenceType_Out_Objc_Class_Ref = 8;
426 		uint LLVMDisassembler_Option_SetInstrComments = 8;
427 		uint LLVMDisassembler_Option_PrintLatency = 16;
428 	}
429 	static if (LLVM_Version >= asVersion(3, 5, 0))
430 	{
431 		uint LLVMDisassembler_ReferenceType_DeMangled_Name = 9;
432 	}
433 }
434 
435 static if (LLVM_Version < asVersion(3, 3, 0))
436 {
437 	/+ Enhanced Disassembly +/
438 
439 	enum : EDAssemblySyntax_t
440 	{
441 		kEDAssemblySyntaxX86Intel = 0,
442 		kEDAssemblySyntaxX86ATT = 1,
443 		kEDAssemblySyntaxARMUAL = 2
444 	}
445 }
446 
447 /+ Linker +/
448 static if (LLVM_Version >= asVersion(3, 2, 0))
449 {
450 	enum : LLVMLinkerMode
451 	{
452 		LLVMLinkerDestroySource  = 0
453 	}
454 	
455 	static if (LLVM_Version < asVersion(3, 7, 0))
456 	{
457 		enum : LLVMLinkerMode
458 		{
459 			LLVMLinkerPreserveSource  = 1
460 		}
461 	}
462 }
463 
464 /+ Link Time Optimization +/
465 
466 enum : llvm_lto_status
467 {
468 	LLVM_LTO_UNKNOWN,
469 	LLVM_LTO_OPT_SUCCESS,
470 	LLVM_LTO_READ_SUCCESS,
471 	LLVM_LTO_READ_FAILURE,
472 	LLVM_LTO_WRITE_FAILURE,
473 	LLVM_LTO_NO_TARGET,
474 	LLVM_LTO_NO_WORK,
475 	LLVM_LTO_MODULE_MERGE_FAILURE,
476 	LLVM_LTO_ASM_FAILURE,
477 	LLVM_LTO_NULL_OBJECT
478 }
479 
480 /+ LTO +/
481 
482 static if (LLVM_Version >= asVersion(3, 7, 0))
483 {
484 	const uint LTO_API_VERSION = 17;
485 }
486 else static if (LLVM_Version >= asVersion(3, 6, 0))
487 {
488 	const uint LTO_API_VERSION = 11;
489 }
490 else static if (LLVM_Version >= asVersion(3, 5, 0))
491 {
492 	const uint LTO_API_VERSION = 10;
493 }
494 else static if (LLVM_Version >= asVersion(3, 4, 0))
495 {
496 	const uint LTO_API_VERSION = 5;
497 }
498 else
499 {
500 	const uint LTO_API_VERSION = 4;
501 }
502 
503 enum : lto_symbol_attributes
504 {
505 	LTO_SYMBOL_ALIGNMENT_MASK              = 0x0000001F,
506 	LTO_SYMBOL_PERMISSIONS_MASK            = 0x000000E0,
507 	LTO_SYMBOL_PERMISSIONS_CODE            = 0x000000A0,
508 	LTO_SYMBOL_PERMISSIONS_DATA            = 0x000000C0,
509 	LTO_SYMBOL_PERMISSIONS_RODATA          = 0x00000080,
510 	LTO_SYMBOL_DEFINITION_MASK             = 0x00000700,
511 	LTO_SYMBOL_DEFINITION_REGULAR          = 0x00000100,
512 	LTO_SYMBOL_DEFINITION_TENTATIVE        = 0x00000200,
513 	LTO_SYMBOL_DEFINITION_WEAK             = 0x00000300,
514 	LTO_SYMBOL_DEFINITION_UNDEFINED        = 0x00000400,
515 	LTO_SYMBOL_DEFINITION_WEAKUNDEF        = 0x00000500,
516 	LTO_SYMBOL_SCOPE_MASK                  = 0x00003800,
517 	LTO_SYMBOL_SCOPE_INTERNAL              = 0x00000800,
518 	LTO_SYMBOL_SCOPE_HIDDEN                = 0x00001000,
519 	LTO_SYMBOL_SCOPE_PROTECTED             = 0x00002000,
520 	LTO_SYMBOL_SCOPE_DEFAULT               = 0x00001800,
521 	LTO_SYMBOL_SCOPE_DEFAULT_CAN_BE_HIDDEN = 0x00002800,
522 }
523 static if (LLVM_Version >= asVersion(3, 7, 0))
524 {
525 	enum : lto_symbol_attributes
526 	{
527 		LTO_SYMBOL_COMDAT                  = 0x00004000,
528 		LTO_SYMBOL_ALIAS                   = 0x00008000
529 	}
530 }
531 
532 enum : lto_debug_model
533 {
534 	LTO_DEBUG_MODEL_NONE = 0,
535 	LTO_DEBUG_MODEL_DWARF = 1
536 }
537 
538 enum : lto_codegen_model
539 {
540 	LTO_CODEGEN_PIC_MODEL_STATIC = 0,
541 	LTO_CODEGEN_PIC_MODEL_DYNAMIC = 1,
542 	LTO_CODEGEN_PIC_MODEL_DYNAMIC_NO_PIC = 2,
543 	LTO_CODEGEN_PIC_MODEL_DEFAULT = 3
544 }
545 
546 static if (LLVM_Version >= asVersion(3, 5, 0))
547 {
548 	enum : lto_codegen_diagnostic_severity_t
549 	{
550 		LTO_DS_ERROR = 0,
551 		LTO_DS_WARNING = 1,
552 	   	LTO_DS_REMARK = 3,
553 		LTO_DS_NOTE = 2
554 	}
555 }
556 
557 /+ Target information +/
558 
559 enum : LLVMByteOrdering
560 {
561 	LLVMBigEndian,
562 	LLVMLittleEndian
563 }
564 
565 /+ Target machine +/
566 
567 enum : LLVMCodeGenOptLevel
568 {
569 	LLVMCodeGenLevelNone,
570 	LLVMCodeGenLevelLess,
571 	LLVMCodeGenLevelDefault,
572 	LLVMCodeGenLevelAggressive
573 }
574 
575 enum : LLVMRelocMode
576 {
577 	LLVMRelocDefault,
578 	LLVMRelocStatic,
579 	LLVMRelocPIC,
580 	LLVMRelocDynamicNoPic
581 }
582 
583 enum : LLVMCodeModel
584 {
585 	LLVMCodeModelDefault,
586 	LLVMCodeModelJITDefault,
587 	LLVMCodeModelSmall,
588 	LLVMCodeModelKernel,
589 	LLVMCodeModelMedium,
590 	LLVMCodeModelLarge
591 }
592 
593 enum : LLVMCodeGenFileType
594 {
595 	LLVMAssemblyFile,
596 	LLVMObjectFile
597 }
598 
599 /+ Orc +/
600 
601 static if (LLVM_Version >= asVersion(3, 9, 0))
602 {
603 	enum : LLVMOrcErrorCode
604 	{
605 		LLVMOrcErrSuccess = 0,
606 		LLVMOrcErrGeneric,
607 	}
608 }