1 module llvm.types;
2 
3 public import std.stdint : uintptr_t;
4 
5 import llvm.config;
6 import core.stdc.stdint;
7 
8 /+ Analysis +/
9 
10 alias LLVMVerifierFailureAction = int;
11 
12 /+ Transforms +/
13 
14 /++ Interprocedural transformations ++/
15 
16 static if (LLVM_Version >= asVersion(10, 0, 0))
17 {
18 	alias MustPreserveCallback = extern(C) LLVMBool function(LLVMValueRef, void*);
19 }
20 
21 /++ Pass manager builder ++/
22 
23 struct LLVMOpaquePassManagerBuilder; alias LLVMPassManagerBuilderRef = LLVMOpaquePassManagerBuilder*;
24 
25 /+ Core +/
26 
27 static if (LLVM_Version >= asVersion(3, 4, 0))
28 {
29 	alias LLVMFatalErrorHandler = extern(C) void function(const char* Reason);
30 }
31 
32 static if (LLVM_Version >= asVersion(3, 5, 0))
33 {
34 	//This is here because putting it where it semantically belongs creates a forward reference issues.
35 	struct LLVMOpaqueDiagnosticInfo; alias LLVMDiagnosticInfoRef = LLVMOpaqueDiagnosticInfo*;
36 
37 	alias LLVMDiagnosticHandler = extern(C) void function(LLVMDiagnosticInfoRef, void*);
38 	alias LLVMYieldCallback = extern(C) void function(LLVMContextRef, void *);
39 }
40 
41 /++ Types and Enumerations ++/
42 
43 alias LLVMBool = int;
44 struct LLVMOpaqueContext; alias LLVMContextRef = LLVMOpaqueContext*;
45 struct LLVMOpaqueModule; alias LLVMModuleRef = LLVMOpaqueModule*;
46 struct LLVMOpaqueType; alias LLVMTypeRef = LLVMOpaqueType*;
47 struct LLVMOpaqueValue; alias LLVMValueRef = LLVMOpaqueValue*;
48 static if (LLVM_Version >= asVersion(5, 0, 0)) {
49 	struct LLVMOpaqueMetadata; alias LLVMMetadataRef = LLVMOpaqueMetadata*;
50 }
51 static if (LLVM_Version >= asVersion(8, 0, 0)) {
52 	struct LLVMOpaqueNamedMDNode; alias LLVMNamedMDNodeRef = LLVMOpaqueNamedMDNode*;
53 
54 	struct LLVMOpaqueValueMetadataEntry; alias LLVMValueMetadataEntry = LLVMOpaqueValueMetadataEntry*;
55 }
56 struct LLVMOpaqueBasicBlock; alias LLVMBasicBlockRef = LLVMOpaqueBasicBlock*;
57 static if (LLVM_Version >= asVersion(5, 0, 0)) {
58 	struct LLVMOpaqueDIBuilder; alias LLVMDIBuilderRef = LLVMOpaqueDIBuilder*;
59 }
60 struct LLVMOpaqueBuilder; alias LLVMBuilderRef = LLVMOpaqueBuilder*;
61 struct LLVMOpaqueModuleProvider; alias LLVMModuleProviderRef = LLVMOpaqueModuleProvider*;
62 struct LLVMOpaqueMemoryBuffer; alias LLVMMemoryBufferRef = LLVMOpaqueMemoryBuffer*;
63 struct LLVMOpaquePassManager; alias LLVMPassManagerRef = LLVMOpaquePassManager*;
64 struct LLVMOpaquePassRegistry; alias LLVMPassRegistryRef = LLVMOpaquePassRegistry*;
65 struct LLVMOpaqueUse; alias LLVMUseRef = LLVMOpaqueUse*;
66 
67 static if (LLVM_Version >= asVersion(3, 9, 0)) {
68 	struct LLVMOpaqueAttributeRef; alias LLVMAttributeRef = LLVMOpaqueAttributeRef*;
69 }
70 
71 alias LLVMAttribute = long;
72 alias LLVMOpcode = int;
73 alias LLVMTypeKind = int;
74 alias LLVMLinkage = int;
75 alias LLVMVisibility = int;
76 alias LLVMDLLStorageClass = int;
77 alias LLVMCallConv = int;
78 alias LLVMIntPredicate = int;
79 alias LLVMRealPredicate = int;
80 alias LLVMLandingPadClauseTy = int;
81 static if (LLVM_Version >= asVersion(3, 3, 0))
82 {
83 	alias LLVMThreadLocalMode = int;
84 	alias LLVMAtomicOrdering = int;
85 	alias LLVMAtomicRMWBinOp = int;
86 }
87 static if (LLVM_Version >= asVersion(3, 5, 0))
88 {
89 	alias LLVMDiagnosticSeverity = int;
90 }
91 static if (LLVM_Version >= asVersion(3, 9, 0))
92 {
93 	alias LLVMValueKind = int;
94 	alias LLVMAttributeIndex = uint;
95 }
96 /+ Disassembler +/
97 
98 alias LLVMDisasmContextRef = void*;
99 alias LLVMOpInfoCallback = extern(C) int function(void* DisInfo, ulong PC, ulong Offset, ulong Size, int TagType, void* TagBuf);
100 alias LLVMSymbolLookupCallback = extern(C) const char* function(void* DisInfo, ulong ReferenceValue, ulong* ReferenceType, ulong ReferencePC, const char** ReferenceName);
101 
102 struct LLVMOpInfoSymbol1
103 {
104 	ulong Present;
105 	const(char)* Name;
106 	ulong Value;
107 }
108 
109 struct LLVMOpInfo1
110 {
111 	LLVMOpInfoSymbol1 AddSymbol;
112 	LLVMOpInfoSymbol1 SubtractSymbol;
113 	ulong Value;
114 	ulong VariantKind;
115 }
116 
117 static if (LLVM_Version < asVersion(3, 3, 0))
118 {
119 	/+ Enhanced Disassembly +/
120 
121 	alias EDDisassemblerRef = void*;
122 	alias EDInstRef = void*;
123 	alias EDTokenRef = void*;
124 	alias EDOperandRef = void*;
125 
126 	alias EDAssemblySyntax_t = int;
127 
128 	alias EDByteReaderCallback = extern(C) int function(ubyte* Byte, ulong address, void* arg);
129 	alias EDRegisterReaderCallback = extern(C) int function(ulong* value, uint regID, void* arg);
130 
131 	alias EDByteBlock_t = extern(C) int function(ubyte* Byte, ulong address);
132 	alias EDRegisterBlock_t = extern(C) int function(ulong* value, uint regID);
133 	alias EDTokenVisitor_t = extern(C) int function(EDTokenRef token);
134 }
135 
136 /+ Execution Engine +/
137 
138 struct LLVMOpaqueGenericValue; alias LLVMGenericValueRef = LLVMOpaqueGenericValue*;
139 struct LLVMOpaqueExecutionEngine; alias LLVMExecutionEngineRef = LLVMOpaqueExecutionEngine*;
140 
141 static if (LLVM_Version >= asVersion(3, 3, 0))
142 {
143 	static if (LLVM_Version >= asVersion(3, 4, 0))
144 	{
145 		struct LLVMOpaqueMCJITMemoryManager; alias LLVMMCJITMemoryManagerRef = LLVMOpaqueMCJITMemoryManager*;
146 
147 		struct LLVMMCJITCompilerOptions
148 		{
149 			uint OptLevel;
150 			LLVMCodeModel CodeModel;
151 			LLVMBool NoFramePointerElim;
152 			LLVMBool EnableFastISel;
153 			LLVMMCJITMemoryManagerRef MCJMM;
154 		}
155 
156 		alias LLVMMemoryManagerAllocateCodeSectionCallback = extern(C) ubyte function(void* Opaque, uintptr_t Size, uint Alignment, uint SectionID, const char* SectionName);
157 		alias LLVMMemoryManagerAllocateDataSectionCallback = extern(C) ubyte function(void* Opaque, uintptr_t Size, uint Alignment, uint SectionID, const char* SectionName, LLVMBool IsReadOnly);
158 		alias LLVMMemoryManagerFinalizeMemoryCallback = extern(C) LLVMBool function(void* Opaque, char** ErrMsg);
159 		alias LLVMMemoryManagerDestroyCallback = extern(C) void function(void* Opaque);
160 	}
161 	else
162 	{
163 		struct LLVMMCJITCompilerOptions
164 		{
165 			uint OptLevel;
166 			LLVMCodeModel CodeModel;
167 			LLVMBool NoFramePointerElim;
168 			LLVMBool EnableFastISel;
169 		}
170 	}
171 }
172 
173 static if (LLVM_Version >= asVersion(3, 2, 0))
174 {
175 	/+ Linker +/
176 
177 	alias LLVMLinkerMode = int;
178 }
179 
180 /+ Link Time Optimization +/
181 alias lto_bool_t = bool;
182 alias llvm_lto_t = void*;
183 alias llvm_lto_status_t = llvm_lto_status;
184 
185 
186 alias llvm_lto_status = int;
187 
188 /+ LTO +/
189 
190 static if (LLVM_Version >= asVersion(9, 0, 0))
191 {
192 	struct LLVMOpaqueLTOInput; alias lto_input_t = LLVMOpaqueLTOInput*;
193 }
194 static if (LLVM_Version >= asVersion(3, 5, 0))
195 {
196 	struct LLVMOpaqueLTOModule; alias lto_module_t = LLVMOpaqueLTOModule*;
197 }
198 else
199 {
200 	struct LTOModule; alias lto_module_t = LTOModule*;
201 }
202 static if (LLVM_Version >= asVersion(3, 5, 0))
203 {
204 	struct LLVMOpaqueLTOCodeGenerator; alias lto_code_gen_t = LLVMOpaqueLTOCodeGenerator*;
205 }
206 else
207 {
208 	struct LTOCodeGenerator; alias lto_code_gen_t = LTOCodeGenerator*;
209 }
210 static if (LLVM_Version >= asVersion(3, 9, 0))
211 {
212 	struct LLVMOpaqueThinLTOCodeGenerator; alias thinlto_code_gen_t = LLVMOpaqueThinLTOCodeGenerator*;
213 }
214 
215 alias lto_symbol_attributes = int;
216 alias lto_debug_model = int;
217 alias lto_codegen_model = int;
218 alias lto_codegen_diagnostic_severity_t = int;
219 alias lto_diagnostic_handler_t = extern(C) void function(lto_codegen_diagnostic_severity_t severity, const(char)* diag, void* ctxt);
220 
221 /+ Object file reading and writing +/
222 
223 static if (LLVM_Version >= asVersion(9, 0, 0))
224 {
225 	alias LLVMBinaryType = int;
226 
227 	struct LLVMOpaqueBinary; alias LLVMBinaryRef = LLVMOpaqueBinary*;
228 
229 	deprecated("Use LLVMBinaryRef instead.") struct LLVMOpaqueObjectFile;
230 	deprecated("Use LLVMBinaryRef instead.") alias LLVMObjectFileRef = LLVMOpaqueObjectFile*;
231 }
232 else
233 {
234 	struct LLVMOpaqueObjectFile; alias LLVMObjectFileRef = LLVMOpaqueObjectFile*;
235 }
236 struct LLVMOpaqueSectionIterator; alias LLVMSectionIteratorRef = LLVMOpaqueSectionIterator*;
237 struct LLVMOpaqueSymbolIterator; alias LLVMSymbolIteratorRef = LLVMOpaqueSymbolIterator*;
238 struct LLVMOpaqueRelocationIterator; alias LLVMRelocationIteratorRef = LLVMOpaqueRelocationIterator*;
239 
240 /+ Target information +/
241 
242 struct LLVMOpaqueTargetData; alias LLVMTargetDataRef = LLVMOpaqueTargetData*;
243 struct LLVMOpaqueTargetLibraryInfotData; alias LLVMTargetLibraryInfoRef = LLVMOpaqueTargetLibraryInfotData*;
244 static if (LLVM_Version < asVersion(3, 4, 0))
245 {
246 	struct LLVMStructLayout; alias LLVMStructLayoutRef = LLVMStructLayout*;
247 }
248 alias LLVMByteOrdering = int;
249 
250 /+ Target machine +/
251 
252 struct LLVMOpaqueTargetMachine; alias LLVMTargetMachineRef = LLVMOpaqueTargetMachine*;
253 struct LLVMTarget; alias LLVMTargetRef = LLVMTarget*;
254 
255 alias LLVMCodeGenOptLevel = int;
256 alias LLVMRelocMode = int;
257 alias LLVMCodeModel = int;
258 alias LLVMCodeGenFileType = int;
259 
260 static if (LLVM_Version >= asVersion(5, 0, 0) && LLVM_Version < asVersion(7, 0, 0)) {
261 	struct LLVMOpaqueSharedModule; alias LLVMSharedModuleRef = LLVMOpaqueSharedModule*;
262 }
263 static if (LLVM_Version >= asVersion(5, 0, 0) && LLVM_Version < asVersion(6, 0, 0)) {
264 	struct LLVMOpaqueSharedObjectBuffer; alias LLVMSharedObjectBufferRef = LLVMOpaqueSharedObjectBuffer*;
265 }
266 
267 static if (LLVM_Version >= asVersion(3, 8, 0))
268 {
269 	/+ JIT compilation of LLVM IR +/
270 
271 	struct LLVMOrcOpaqueJITStack; alias LLVMOrcJITStackRef = LLVMOrcOpaqueJITStack*;
272 }
273 
274 static if (LLVM_Version >= asVersion(7, 0, 0))
275 {
276 	alias LLVMOrcModuleHandle = uint64_t;
277 }
278 else static if (LLVM_Version >= asVersion(3, 8, 0))
279 {
280 	alias LLVMOrcModuleHandle = uint32_t;
281 }
282 
283 static if (LLVM_Version >= asVersion(3, 8, 0))
284 {
285 	alias LLVMOrcTargetAddress = ulong;
286 
287 	alias LLVMOrcSymbolResolverFn = extern(C) ulong function(const(char)* Name, void* LookupCtx);
288 	alias LLVMOrcLazyCompileCallbackFn = extern(C) ulong function(LLVMOrcJITStackRef JITStack, void* CallbackCtx);
289 }
290 
291 static if (LLVM_Version >= asVersion(3, 9, 0))
292 {
293 	alias LLVMOrcErrorCode = int;
294 
295 	struct LTOObjectBuffer
296 	{
297 		const(char)* Buffer;
298 		size_t Size;
299 	}
300 }
301 
302 /+ Debug info flags +/
303 
304 static if (LLVM_Version >= asVersion(6, 0, 0))
305 {
306 	alias LLVMDIFlags = int;
307 	alias LLVMDWARFSourceLanguage = int;
308 	alias LLVMDWARFEmissionKind = int;
309 }
310 
311 
312 static if (LLVM_Version >= asVersion(7, 0, 0))
313 {
314 	alias LLVMComdatSelectionKind = int;
315 	alias LLVMUnnamedAddr = int;
316 	alias LLVMInlineAsmDialect = int;
317 	alias LLVMModuleFlagBehavior = int;
318 	alias LLVMDWARFTypeEncoding = int;
319 
320 }
321 
322 static if (LLVM_Version >= asVersion(10, 0, 0))
323 {
324 	alias LLVMDWARFMacinfoRecordType = int;
325 }
326 
327 
328 static if (LLVM_Version >= asVersion(8, 0, 0)) {
329 	alias LLVMMetadataKind = uint;
330 }
331 
332 static if (LLVM_Version >= asVersion(7, 0, 0)) {
333 	struct LLVMComdat; alias LLVMComdatRef = LLVMComdat*;
334 }
335 
336 static if (LLVM_Version >= asVersion(7, 0, 0)) {
337 	struct LLVMOpaqueModuleFlagEntry; alias LLVMModuleFlagEntry = LLVMOpaqueModuleFlagEntry*;
338 }
339 
340 static if (LLVM_Version >= asVersion(7, 0, 0)) {
341 	struct LLVMOpaqueJITEventListener; alias LLVMJITEventListenerRef = LLVMOpaqueJITEventListener*;
342 }
343 
344 /+ Error +/
345 
346 static if (LLVM_Version >= asVersion(8, 0, 0)) {
347 	struct LLVMOpaqueError; alias LLVMErrorRef = LLVMOpaqueError*;
348 
349 	alias LLVMErrorTypeId = const void*;
350 }
351 
352 /+ Remarks / OptRemarks +/
353 
354 static if (LLVM_Version >= asVersion(9, 0, 0)) {
355 	struct LLVMRemarkOpaqueString; alias LLVMRemarkStringRef = LLVMRemarkOpaqueString*;
356 	struct LLVMRemarkOpaqueEntry; alias LLVMRemarkEntryRef = LLVMRemarkOpaqueEntry*;
357 	struct LLVMRemarkOpaqueParser; alias LLVMRemarkParserRef = LLVMRemarkOpaqueParser*;
358 	struct LLVMRemarkOpaqueArg; alias LLVMRemarkArgRef = LLVMRemarkOpaqueArg*;
359 	struct LLVMRemarkOpaqueDebugLoc; alias LLVMRemarkDebugLocRef = LLVMRemarkOpaqueDebugLoc*;
360 
361 	alias LLVMRemarkType = int;
362 } else static if (LLVM_Version >= asVersion(8, 0, 0)) {
363 	struct LLVMOptRemarkStringRef
364 	{
365 		const(char)* Str;
366 		uint32_t Len;
367 	}
368 
369 	struct LLVMOptRemarkDebugLoc
370 	{
371 		// File:
372 		LLVMOptRemarkStringRef SourceFile;
373 		// Line:
374 		uint32_t SourceLineNumber;
375 		// Column:
376 		uint32_t SourceColumnNumber;
377 	}
378 
379 	struct LLVMOptRemarkArg
380 	{
381 		// e.g. "Callee"
382 		LLVMOptRemarkStringRef Key;
383 		// e.g. "malloc"
384 		LLVMOptRemarkStringRef Value;
385 
386 		// "DebugLoc": Optional
387 		LLVMOptRemarkDebugLoc DebugLoc;
388 	}
389 
390 	struct LLVMOptRemarkEntry
391 	{
392 		// e.g. !Missed, !Passed
393 		LLVMOptRemarkStringRef RemarkType;
394 		// "Pass": Required
395 		LLVMOptRemarkStringRef PassName;
396 		// "Name": Required
397 		LLVMOptRemarkStringRef RemarkName;
398 		// "Function": Required
399 		LLVMOptRemarkStringRef FunctionName;
400 
401 		// "DebugLoc": Optional
402 		LLVMOptRemarkDebugLoc DebugLoc;
403 		// "Hotness": Optional
404 		uint32_t Hotness;
405 		// "Args": Optional. It is an array of `num_args` elements.
406 		uint32_t NumArgs;
407 		LLVMOptRemarkArg* Args;
408 	}
409 
410 	struct LLVMOptRemarkOpaqueParser; alias LLVMOptRemarkParserRef = LLVMOptRemarkOpaqueParser*;
411 }