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