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 }