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 int LLVMVerifierFailureAction;
11 
12 /+ Transforms +/
13 
14 /++ Pass manager builder ++/
15 
16 struct LLVMOpaquePassManagerBuilder {}; alias LLVMOpaquePassManagerBuilder* LLVMPassManagerBuilderRef;
17 
18 /+ Core +/
19 
20 static if (LLVM_Version >= asVersion(3, 4, 0))
21 {
22 	alias extern(C) void function(const char* Reason) LLVMFatalErrorHandler;
23 }
24 
25 static if (LLVM_Version >= asVersion(3, 5, 0))
26 {
27 	//This is here because putting it where it semantically belongs creates a forward reference issues.
28 	struct LLVMOpaqueDiagnosticInfo {}; alias LLVMOpaqueDiagnosticInfo* LLVMDiagnosticInfoRef;
29 
30 	alias extern(C) void function(LLVMDiagnosticInfoRef, void*) LLVMDiagnosticHandler;
31 	alias extern(C) void function(LLVMContextRef, void *) LLVMYieldCallback;
32 }
33 
34 /++ Types and Enumerations ++/
35 
36 alias int LLVMBool;
37 struct LLVMOpaqueContext {}; alias LLVMOpaqueContext* LLVMContextRef;
38 struct LLVMOpaqueModule {}; alias LLVMOpaqueModule* LLVMModuleRef;
39 struct LLVMOpaqueType {}; alias LLVMOpaqueType* LLVMTypeRef;
40 struct LLVMOpaqueValue {}; alias LLVMOpaqueValue* LLVMValueRef;
41 static if (LLVM_Version >= asVersion(5, 0, 0)) {
42 	struct LLVMOpaqueMetadata; alias LLVMOpaqueMetadata* LLVMMetadataRef;
43 }
44 struct LLVMOpaqueBasicBlock {}; alias LLVMOpaqueBasicBlock* LLVMBasicBlockRef;
45 static if (LLVM_Version >= asVersion(5, 0, 0)) {
46 	struct LLVMOpaqueDIBuilder; alias LLVMOpaqueDIBuilder* LLVMDIBuilderRef;
47 }
48 struct LLVMOpaqueBuilder {}; alias LLVMOpaqueBuilder* LLVMBuilderRef;
49 struct LLVMOpaqueModuleProvider {}; alias LLVMOpaqueModuleProvider* LLVMModuleProviderRef;
50 struct LLVMOpaqueMemoryBuffer {}; alias LLVMOpaqueMemoryBuffer* LLVMMemoryBufferRef;
51 struct LLVMOpaquePassManager {}; alias LLVMOpaquePassManager* LLVMPassManagerRef;
52 struct LLVMOpaquePassRegistry {}; alias LLVMOpaquePassRegistry* LLVMPassRegistryRef;
53 struct LLVMOpaqueUse {}; alias LLVMOpaqueUse* LLVMUseRef;
54 
55 static if (LLVM_Version >= asVersion(3, 9, 0)) {
56 	struct LLVMOpaqueAttributeRef {}; alias LLVMOpaqueAttributeRef* LLVMAttributeRef;
57 }
58 
59 alias long LLVMAttribute;
60 alias int LLVMOpcode;
61 alias int LLVMTypeKind;
62 alias int LLVMLinkage;
63 alias int LLVMVisibility;
64 alias int LLVMDLLStorageClass;
65 alias int LLVMCallConv;
66 alias int LLVMIntPredicate;
67 alias int LLVMRealPredicate;
68 alias int LLVMLandingPadClauseTy;
69 static if (LLVM_Version >= asVersion(3, 3, 0))
70 {
71 	alias int LLVMThreadLocalMode;
72 	alias int LLVMAtomicOrdering;
73 	alias int LLVMAtomicRMWBinOp;
74 }
75 static if (LLVM_Version >= asVersion(3, 5, 0))
76 {
77 	alias int LLVMDiagnosticSeverity;
78 }
79 static if (LLVM_Version >= asVersion(3, 9, 0))
80 {
81 	alias int LLVMValueKind;
82 	alias uint LLVMAttributeIndex;
83 }
84 /+ Disassembler +/
85 
86 alias void* LLVMDisasmContextRef;
87 alias extern(C) int function(void* DisInfo, ulong PC, ulong Offset, ulong Size, int TagType, void* TagBuf) LLVMOpInfoCallback;
88 alias extern(C) const char* function(void* DisInfo, ulong ReferenceValue, ulong* ReferenceType, ulong ReferencePC, const char** ReferenceName) LLVMSymbolLookupCallback;
89 
90 struct LLVMOpInfoSymbol1
91 {
92 	ulong Present;
93 	const(char)* Name;
94 	ulong Value;
95 }
96 
97 struct LLVMOpInfo1
98 {
99 	LLVMOpInfoSymbol1 AddSymbol;
100 	LLVMOpInfoSymbol1 SubtractSymbol;
101 	ulong Value;
102 	ulong VariantKind;
103 }
104 
105 static if (LLVM_Version < asVersion(3, 3, 0))
106 {
107 	/+ Enhanced Disassembly +/
108 
109 	alias void* EDDisassemblerRef;
110 	alias void* EDInstRef;
111 	alias void* EDTokenRef;
112 	alias void* EDOperandRef;
113 
114 	alias int EDAssemblySyntax_t;
115 
116 	alias extern(C) int function(ubyte* Byte, ulong address, void* arg) EDByteReaderCallback;
117 	alias extern(C) int function(ulong* value, uint regID, void* arg) EDRegisterReaderCallback;
118 
119 	alias extern(C) int function(ubyte* Byte, ulong address) EDByteBlock_t;
120 	alias extern(C) int function(ulong* value, uint regID) EDRegisterBlock_t;
121 	alias extern(C) int function(EDTokenRef token) EDTokenVisitor_t;
122 }
123 
124 /+ Execution Engine +/
125 
126 struct LLVMOpaqueGenericValue {}; alias LLVMOpaqueGenericValue* LLVMGenericValueRef;
127 struct LLVMOpaqueExecutionEngine {}; alias LLVMOpaqueExecutionEngine* LLVMExecutionEngineRef;
128 
129 static if (LLVM_Version >= asVersion(3, 3, 0))
130 {
131 	static if (LLVM_Version >= asVersion(3, 4, 0))
132 	{
133 		struct LLVMOpaqueMCJITMemoryManager {}; alias LLVMOpaqueMCJITMemoryManager* LLVMMCJITMemoryManagerRef;
134 
135 		struct LLVMMCJITCompilerOptions
136 		{
137 			uint OptLevel;
138 			LLVMCodeModel CodeModel;
139 			LLVMBool NoFramePointerElim;
140 			LLVMBool EnableFastISel;
141 			LLVMMCJITMemoryManagerRef MCJMM;
142 		}
143 
144 		alias extern(C) ubyte function(void* Opaque, uintptr_t Size, uint Alignment, uint SectionID, const char* SectionName) LLVMMemoryManagerAllocateCodeSectionCallback;
145 		alias extern(C) ubyte function(void* Opaque, uintptr_t Size, uint Alignment, uint SectionID, const char* SectionName, LLVMBool IsReadOnly) LLVMMemoryManagerAllocateDataSectionCallback;
146 		alias extern(C) LLVMBool function(void* Opaque, char** ErrMsg) LLVMMemoryManagerFinalizeMemoryCallback;
147 		alias extern(C) void function(void* Opaque) LLVMMemoryManagerDestroyCallback;
148 	}
149 	else
150 	{
151 		struct LLVMMCJITCompilerOptions
152 		{
153 			uint OptLevel;
154 			LLVMCodeModel CodeModel;
155 			LLVMBool NoFramePointerElim;
156 			LLVMBool EnableFastISel;
157 		}
158 	}
159 }
160 
161 static if (LLVM_Version >= asVersion(3, 2, 0))
162 {
163 	/+ Linker +/
164 
165 	alias int LLVMLinkerMode;
166 }
167 
168 /+ Link Time Optimization +/
169 alias bool lto_bool_t;
170 alias void* llvm_lto_t;
171 alias llvm_lto_status llvm_lto_status_t;
172 
173 
174 alias int llvm_lto_status;
175 
176 /+ LTO +/
177 
178 static if (LLVM_Version >= asVersion(3, 5, 0))
179 {
180 	struct LLVMOpaqueLTOModule {}; alias LLVMOpaqueLTOModule* lto_module_t;
181 }
182 else
183 {
184 	struct LTOModule {}; alias LTOModule* lto_module_t;
185 }
186 static if (LLVM_Version >= asVersion(3, 5, 0))
187 {
188 	struct LLVMOpaqueLTOCodeGenerator {}; alias LLVMOpaqueLTOCodeGenerator* lto_code_gen_t;
189 }
190 else
191 {
192 	struct LTOCodeGenerator {}; alias LTOCodeGenerator* lto_code_gen_t;
193 }
194 static if (LLVM_Version >= asVersion(3, 9, 0))
195 {
196 	struct LLVMOpaqueThinLTOCodeGenerator {}; alias LLVMOpaqueThinLTOCodeGenerator* thinlto_code_gen_t;
197 }
198 
199 alias int lto_symbol_attributes;
200 alias int lto_debug_model;
201 alias int lto_codegen_model;
202 alias int lto_codegen_diagnostic_severity_t;
203 alias extern(C) void function(lto_codegen_diagnostic_severity_t severity, const(char)* diag, void* ctxt) lto_diagnostic_handler_t;
204 
205 /+ Object file reading and writing +/
206 
207 struct LLVMOpaqueObjectFile {}; alias LLVMOpaqueObjectFile* LLVMObjectFileRef;
208 struct LLVMOpaqueSectionIterator {}; alias LLVMOpaqueSectionIterator* LLVMSectionIteratorRef;
209 struct LLVMOpaqueSymbolIterator {}; alias LLVMOpaqueSymbolIterator* LLVMSymbolIteratorRef;
210 struct LLVMOpaqueRelocationIterator {}; alias LLVMOpaqueRelocationIterator* LLVMRelocationIteratorRef;
211 
212 /+ Target information +/
213 
214 struct LLVMOpaqueTargetData {}; alias LLVMOpaqueTargetData* LLVMTargetDataRef;
215 struct LLVMOpaqueTargetLibraryInfotData {}; alias LLVMOpaqueTargetLibraryInfotData* LLVMTargetLibraryInfoRef;
216 static if (LLVM_Version < asVersion(3, 4, 0))
217 {
218 	struct LLVMStructLayout {}; alias LLVMStructLayout* LLVMStructLayoutRef;
219 }
220 alias int LLVMByteOrdering;
221 
222 /+ Target machine +/
223 
224 struct LLVMOpaqueTargetMachine {}; alias LLVMOpaqueTargetMachine* LLVMTargetMachineRef;
225 struct LLVMTarget {}; alias LLVMTarget* LLVMTargetRef;
226 
227 alias int LLVMCodeGenOptLevel;
228 alias int LLVMRelocMode;
229 alias int LLVMCodeModel;
230 alias int LLVMCodeGenFileType;
231 
232 static if (LLVM_Version >= asVersion(5, 0, 0) && LLVM_Version < asVersion(7, 0, 0)) {
233 	struct LLVMOpaqueSharedModule; alias LLVMOpaqueSharedModule* LLVMSharedModuleRef;
234 }
235 static if (LLVM_Version >= asVersion(5, 0, 0) && LLVM_Version < asVersion(6, 0, 0)) {
236 	struct LLVMOpaqueSharedObjectBuffer; alias LLVMOpaqueSharedObjectBuffer* LLVMSharedObjectBufferRef;
237 }
238 
239 static if (LLVM_Version >= asVersion(3, 8, 0))
240 {
241 	/+ JIT compilation of LLVM IR +/
242 	
243 	struct LLVMOrcOpaqueJITStack {}; alias LLVMOrcOpaqueJITStack* LLVMOrcJITStackRef;
244 }
245 
246 static if (LLVM_Version >= asVersion(7, 0, 0))
247 {
248 	alias uint64_t LLVMOrcModuleHandle;
249 }
250 else static if (LLVM_Version >= asVersion(3, 8, 0))
251 {
252 	alias uint32_t LLVMOrcModuleHandle;
253 }
254 
255 static if (LLVM_Version >= asVersion(3, 8, 0))
256 {
257 	alias ulong LLVMOrcTargetAddress;
258 
259 	alias extern(C) ulong function(const(char)* Name, void* LookupCtx) LLVMOrcSymbolResolverFn;
260 	alias extern(C) ulong function(LLVMOrcJITStackRef JITStack, void* CallbackCtx) LLVMOrcLazyCompileCallbackFn;
261 }
262 
263 static if (LLVM_Version >= asVersion(3, 9, 0))
264 {
265 	alias int LLVMOrcErrorCode;
266 
267 	struct LTOObjectBuffer
268 	{
269 		const(char)* Buffer;
270 		size_t Size;
271 	}
272 }
273 
274 /+ Debug info flags +/
275 
276 static if (LLVM_Version >= asVersion(6, 0, 0))
277 {
278 	alias int LLVMDIFlags;
279 	alias int LLVMDWARFSourceLanguage;
280 	alias int LLVMDWARFEmissionKind;
281 }
282 
283 
284 static if (LLVM_Version >= asVersion(7, 0, 0))
285 {
286 	alias int LLVMComdatSelectionKind;
287 	alias int LLVMUnnamedAddr;
288 	alias int LLVMInlineAsmDialect;
289 	alias int LLVMModuleFlagBehavior;
290 	alias int LLVMDWARFTypeEncoding;
291 
292 }
293 
294 
295 static if (LLVM_Version >= asVersion(7, 0, 0)) {
296 	struct LLVMComdat; alias LLVMComdat* LLVMComdatRef;
297 }
298 
299 static if (LLVM_Version >= asVersion(7, 0, 0)) {
300 	struct LLVMOpaqueModuleFlagEntry; alias LLVMOpaqueModuleFlagEntry* LLVMModuleFlagEntry;
301 }
302 
303 static if (LLVM_Version >= asVersion(7, 0, 0)) {
304 	struct LLVMOpaqueJITEventListener; alias LLVMOpaqueJITEventListener* LLVMJITEventListenerRef;
305 }