diff options
Diffstat (limited to 'llvm/llvm.nim')
-rw-r--r-- | llvm/llvm.nim | 1452 |
1 files changed, 1452 insertions, 0 deletions
diff --git a/llvm/llvm.nim b/llvm/llvm.nim new file mode 100644 index 000000000..d010457f8 --- /dev/null +++ b/llvm/llvm.nim @@ -0,0 +1,1452 @@ +const + libname* = "llvm.dll" #Setup as you need + +type + OpaqueContext {.pure.} = object + OpaqueModule {.pure.} = object + TOpaqueType {.pure.} = object + OpaqueTypeHandle {.pure.} = object + OpaqueValue {.pure.} = object + OpaqueBasicBlock {.pure.} = object + OpaqueBuilder {.pure.} = object + OpaqueModuleProvider {.pure.} = object + OpaqueMemoryBuffer {.pure.} = object + OpaquePassManager {.pure.} = object + OpaqueUseIterator {.pure.} = object + + ContextRef* = OpaqueContext + ModuleRef* = OpaqueModule + TypeRef* = TOpaqueType + TypeHandleRef* = OpaqueTypeHandle + ValueRef* = OpaqueValue + BasicBlockRef* = OpaqueBasicBlock + BuilderRef* = OpaqueBuilder + ModuleProviderRef* = OpaqueModuleProvider + MemoryBufferRef* = OpaqueMemoryBuffer + PassManagerRef* = OpaquePassManager + UseIteratorRef* = OpaqueUseIterator + Attribute* = enum + ZExtAttribute = 1 shl 0, SExtAttribute = 1 shl 1, + NoReturnAttribute = 1 shl 2, InRegAttribute = 1 shl 3, + StructRetAttribute = 1 shl 4, NoUnwindAttribute = 1 shl 5, + NoAliasAttribute = 1 shl 6, ByValAttribute = 1 shl 7, + NestAttribute = 1 shl 8, ReadNoneAttribute = 1 shl 9, + ReadOnlyAttribute = 1 shl 10, NoInlineAttribute = 1 shl 11, + AlwaysInlineAttribute = 1 shl 12, OptimizeForSizeAttribute = 1 shl 13, + StackProtectAttribute = 1 shl 14, StackProtectReqAttribute = 1 shl 15, + NoCaptureAttribute = 1 shl 21, NoRedZoneAttribute = 1 shl 22, + NoImplicitFloatAttribute = 1 shl 23, NakedAttribute = 1 shl 24, + InlineHintAttribute = 1 shl 25 + Opcode* = enum + opcRet = 1, opcBr = 2, opcSwitch = 3, opcInvoke = 4, opcUnwind = 5, + opcUnreachable = 6, + opcAdd = 7, opcFAdd = 8, opcSub = 9, opcFSub = 10, opcMul = 11, + opcFMul = 12, opcUDiv = 13, + opcSDiv = 14, opcFDiv = 15, opcURem = 16, opcSRem = 17, opcFRem = 18, + opcShl = 19, + opcLShr = 20, opcAShr = 21, opcAnd = 22, opcOr = 23, opcXor = 24, + opcMalloc = 25, opcFree = 26, opcAlloca = 27, + opcLoad = 28, opcStore = 29, + opcGetElementPtr = 30, opcTrunk = 31, opcZExt = 32, opcSExt = 33, + opcFPToUI = 34, opcFPToSI = 35, opcUIToFP = 36, opcSIToFP = 37, + opcFPTrunc = 38, opcFPExt = 39, opcPtrToInt = 40, opcIntToPtr = 41, + opcBitCast = 42, opcICmp = 43, + opcFCmp = 44, opcPHI = 45, opcCall = 46, opcSelect = 47, opcVAArg = 50, + opcExtractElement = 51, opcInsertElement = 52, opcShuffleVector = 53, + opcExtractValue = 54, opcInsertValue = 55 + TypeKind* = enum + VoidTypeKind, FloatTypeKind, DoubleTypeKind, X86_FP80TypeKind, + FP128TypeKind, PPC_FP128TypeKind, LabelTypeKind, IntegerTypeKind, + FunctionTypeKind, StructTypeKind, ArrayTypeKind, PointerTypeKind, + OpaqueTypeKind, VectorTypeKind, MetadataTypeKind + TLinkage* = enum + ExternalLinkage, ## Externally visible function + AvailableExternallyLinkage, ## Keep one copy of function when linking (inline) + LinkOnceAnyLinkage, ## Same, but only replaced by something equivalent. + LinkOnceODRLinkage, ## Keep one copy of function when linking (weak) + WeakAnyLinkage, ## Same, but only replaced by something equivalent. + WeakODRLinkage, ## Special purpose, only applies to global arrays + AppendingLinkage, ## Rename collisions when linking (static functions) + InternalLinkage, ## + PrivateLinkage, ## Like Internal, but omit from symbol table + DLLImportLinkage, ## Function to be imported from DLL + DLLExportLinkage, ## Function to be accessible from DLL + ExternalWeakLinkage, ## ExternalWeak linkage description + GhostLinkage, ## Stand-in functions for streaming fns from bitcode + CommonLinkage, ## Tentative definitions + LinkerPrivateLinkage ## Like Private, but linker removes. + TVisibility* = enum + DefaultVisibility, + HiddenVisibility, + ProtectedVisibility + TCallConv* = enum + CCallConv = 0, FastCallConv = 8, ColdCallConv = 9, X86StdcallCallConv = 64, + X86FastcallCallConv = 65 + IntPredicate* = enum + IntEQ = 32, IntNE, IntUGT, IntUGE, IntULT, IntULE, IntSGT, IntSGE, IntSLT, + IntSLE + RealPredicate* = enum + RealPredicateFalse, RealOEQ, RealOGT, RealOGE, RealOLT, RealOLE, RealONE, + RealORD, RealUNO, RealUEQ, RealUGT, RealUGE, RealULT, RealULE, RealUNE, + RealPredicateTrue + +#===-- Error handling ----------------------------------------------------=== + +proc DisposeMessage*(Message: cstring){.cdecl, dynlib: libname, + importc: "LLVMDisposeMessage".} + +#===-- Modules -----------------------------------------------------------=== +# Create and destroy contexts. +proc ContextCreate*(): ContextRef{.cdecl, dynlib: libname, + importc: "LLVMContextCreate".} +proc GetGlobalContext*(): ContextRef{.cdecl, dynlib: libname, + importc: "LLVMGetGlobalContext".} +proc ContextDispose*(C: ContextRef){.cdecl, dynlib: libname, + importc: "LLVMContextDispose".} + # Create and destroy modules. + # See llvm::Module::Module. +proc ModuleCreateWithName*(ModuleID: cstring): ModuleRef{.cdecl, + dynlib: libname, importc: "LLVMModuleCreateWithName".} +proc ModuleCreateWithNameInContext*(ModuleID: cstring, C: ContextRef): ModuleRef{. + cdecl, dynlib: libname, importc: "LLVMModuleCreateWithNameInContext".} + # See llvm::Module::~Module. +proc DisposeModule*(M: ModuleRef){.cdecl, dynlib: libname, + importc: "LLVMDisposeModule".} + # Data layout. See Module::getDataLayout. +proc GetDataLayout*(M: ModuleRef): cstring{.cdecl, dynlib: libname, + importc: "LLVMGetDataLayout".} +proc SetDataLayout*(M: ModuleRef, Triple: cstring){.cdecl, dynlib: libname, + importc: "LLVMSetDataLayout".} + # Target triple. See Module::getTargetTriple. +proc GetTarget*(M: ModuleRef): cstring{.cdecl, dynlib: libname, + importc: "LLVMGetTarget".} +proc SetTarget*(M: ModuleRef, Triple: cstring){.cdecl, dynlib: libname, + importc: "LLVMSetTarget".} + # See Module::addTypeName. +proc AddTypeName*(M: ModuleRef, Name: cstring, Ty: TypeRef): int32{.cdecl, + dynlib: libname, importc: "LLVMAddTypeName".} +proc DeleteTypeName*(M: ModuleRef, Name: cstring){.cdecl, dynlib: libname, + importc: "LLVMDeleteTypeName".} +proc GetTypeByName*(M: ModuleRef, Name: cstring): TypeRef{.cdecl, + dynlib: libname, importc: "LLVMGetTypeByName".} + # See Module::dump. +proc DumpModule*(M: ModuleRef){.cdecl, dynlib: libname, + importc: "LLVMDumpModule".} + #===-- Types -------------------------------------------------------------=== + # LLVM types conform to the following hierarchy: + # * + # * types: + # * integer type + # * real type + # * function type + # * sequence types: + # * array type + # * pointer type + # * vector type + # * void type + # * label type + # * opaque type + # + # See llvm::LLVMTypeKind::getTypeID. +proc GetTypeKind*(Ty: TypeRef): TypeKind{.cdecl, dynlib: libname, + importc: "LLVMGetTypeKind".} + # See llvm::LLVMType::getContext. +proc GetTypeContext*(Ty: TypeRef): ContextRef{.cdecl, dynlib: libname, + importc: "LLVMGetTypeContext".} + # Operations on integer types +proc Int1TypeInContext*(C: ContextRef): TypeRef{.cdecl, dynlib: libname, + importc: "LLVMInt1TypeInContext".} +proc Int8TypeInContext*(C: ContextRef): TypeRef{.cdecl, dynlib: libname, + importc: "LLVMInt8TypeInContext".} +proc Int16TypeInContext*(C: ContextRef): TypeRef{.cdecl, dynlib: libname, + importc: "LLVMInt16TypeInContext".} +proc Int32TypeInContext*(C: ContextRef): TypeRef{.cdecl, dynlib: libname, + importc: "LLVMInt32TypeInContext".} +proc Int64TypeInContext*(C: ContextRef): TypeRef{.cdecl, dynlib: libname, + importc: "LLVMInt64TypeInContext".} +proc IntTypeInContext*(C: ContextRef, NumBits: int32): TypeRef{.cdecl, + dynlib: libname, importc: "LLVMIntTypeInContext".} +proc Int1Type*(): TypeRef{.cdecl, dynlib: libname, importc: "LLVMInt1Type".} +proc Int8Type*(): TypeRef{.cdecl, dynlib: libname, importc: "LLVMInt8Type".} +proc Int16Type*(): TypeRef{.cdecl, dynlib: libname, importc: "LLVMInt16Type".} +proc Int32Type*(): TypeRef{.cdecl, dynlib: libname, importc: "LLVMInt32Type".} +proc Int64Type*(): TypeRef{.cdecl, dynlib: libname, importc: "LLVMInt64Type".} +proc IntType*(NumBits: int32): TypeRef{.cdecl, dynlib: libname, + importc: "LLVMIntType".} +proc GetIntTypeWidth*(IntegerTy: TypeRef): int32{.cdecl, dynlib: libname, + importc: "LLVMGetIntTypeWidth".} + # Operations on real types +proc FloatTypeInContext*(C: ContextRef): TypeRef{.cdecl, dynlib: libname, + importc: "LLVMFloatTypeInContext".} +proc DoubleTypeInContext*(C: ContextRef): TypeRef{.cdecl, dynlib: libname, + importc: "LLVMDoubleTypeInContext".} +proc X86FP80TypeInContext*(C: ContextRef): TypeRef{.cdecl, dynlib: libname, + importc: "LLVMX86FP80TypeInContext".} +proc FP128TypeInContext*(C: ContextRef): TypeRef{.cdecl, dynlib: libname, + importc: "LLVMFP128TypeInContext".} +proc PPCFP128TypeInContext*(C: ContextRef): TypeRef{.cdecl, dynlib: libname, + importc: "LLVMPPCFP128TypeInContext".} +proc FloatType*(): TypeRef{.cdecl, dynlib: libname, importc: "LLVMFloatType".} +proc DoubleType*(): TypeRef{.cdecl, dynlib: libname, importc: "LLVMDoubleType".} +proc X86FP80Type*(): TypeRef{.cdecl, dynlib: libname, importc: "LLVMX86FP80Type".} +proc FP128Type*(): TypeRef{.cdecl, dynlib: libname, importc: "LLVMFP128Type".} +proc PPCFP128Type*(): TypeRef{.cdecl, dynlib: libname, + importc: "LLVMPPCFP128Type".} + # Operations on function types +proc FunctionType*(ReturnType: TypeRef, ParamTypes: ptr TypeRef, + ParamCount: int32, IsVarArg: int32): TypeRef {. + cdecl, dynlib: libname, importc: "LLVMFunctionType".} +proc IsFunctionVarArg*(FunctionTy: TypeRef): int32{.cdecl, dynlib: libname, + importc: "LLVMIsFunctionVarArg".} +proc GetReturnType*(FunctionTy: TypeRef): TypeRef{.cdecl, dynlib: libname, + importc: "LLVMGetReturnType".} +proc CountParamTypes*(FunctionTy: TypeRef): int32{.cdecl, dynlib: libname, + importc: "LLVMCountParamTypes".} +proc GetParamTypes*(FunctionTy: TypeRef, Dest: ptr TypeRef){.cdecl, + dynlib: libname, importc: "LLVMGetParamTypes".} + # Operations on struct types +proc StructTypeInContext*(C: ContextRef, ElementTypes: ptr TypeRef, + ElementCount: int32, isPacked: int32): TypeRef{.cdecl, + dynlib: libname, importc: "LLVMStructTypeInContext".} +proc StructType*(ElementTypes: ptr TypeRef, ElementCount: int32, isPacked: int32): TypeRef{. + cdecl, dynlib: libname, importc: "LLVMStructType".} +proc CountStructElementTypes*(StructTy: TypeRef): int32{.cdecl, dynlib: libname, + importc: "LLVMCountStructElementTypes".} +proc GetStructElementTypes*(StructTy: TypeRef, Dest: ptr TypeRef){.cdecl, + dynlib: libname, importc: "LLVMGetStructElementTypes".} +proc IsPackedStruct*(StructTy: TypeRef): int32{.cdecl, dynlib: libname, + importc: "LLVMIsPackedStruct".} + # Operations on array, pointer, and vector types (sequence types) +proc ArrayType*(ElementType: TypeRef, ElementCount: int32): TypeRef{.cdecl, + dynlib: libname, importc: "LLVMArrayType".} +proc PointerType*(ElementType: TypeRef, AddressSpace: int32): TypeRef{.cdecl, + dynlib: libname, importc: "LLVMPointerType".} +proc VectorType*(ElementType: TypeRef, ElementCount: int32): TypeRef{.cdecl, + dynlib: libname, importc: "LLVMVectorType".} +proc GetElementType*(Ty: TypeRef): TypeRef{.cdecl, dynlib: libname, + importc: "LLVMGetElementType".} +proc GetArrayLength*(ArrayTy: TypeRef): int32{.cdecl, dynlib: libname, + importc: "LLVMGetArrayLength".} +proc GetPointerAddressSpace*(PointerTy: TypeRef): int32{.cdecl, dynlib: libname, + importc: "LLVMGetPointerAddressSpace".} +proc GetVectorSize*(VectorTy: TypeRef): int32{.cdecl, dynlib: libname, + importc: "LLVMGetVectorSize".} + # Operations on other types +proc VoidTypeInContext*(C: ContextRef): TypeRef{.cdecl, dynlib: libname, + importc: "LLVMVoidTypeInContext".} +proc LabelTypeInContext*(C: ContextRef): TypeRef{.cdecl, dynlib: libname, + importc: "LLVMLabelTypeInContext".} +proc OpaqueTypeInContext*(C: ContextRef): TypeRef{.cdecl, dynlib: libname, + importc: "LLVMOpaqueTypeInContext".} +proc VoidType*(): TypeRef{.cdecl, dynlib: libname, importc: "LLVMVoidType".} +proc LabelType*(): TypeRef{.cdecl, dynlib: libname, importc: "LLVMLabelType".} +proc OpaqueType*(): TypeRef{.cdecl, dynlib: libname, importc: "LLVMOpaqueType".} + # Operations on type handles +proc CreateTypeHandle*(PotentiallyAbstractTy: TypeRef): TypeHandleRef{.cdecl, + dynlib: libname, importc: "LLVMCreateTypeHandle".} +proc RefineType*(AbstractTy: TypeRef, ConcreteTy: TypeRef){.cdecl, + dynlib: libname, importc: "LLVMRefineType".} +proc ResolveTypeHandle*(TypeHandle: TypeHandleRef): TypeRef{.cdecl, + dynlib: libname, importc: "LLVMResolveTypeHandle".} +proc DisposeTypeHandle*(TypeHandle: TypeHandleRef){.cdecl, dynlib: libname, + importc: "LLVMDisposeTypeHandle".} + # Operations on all values +proc TypeOf*(Val: ValueRef): TypeRef{.cdecl, dynlib: libname, + importc: "LLVMTypeOf".} +proc GetValueName*(Val: ValueRef): cstring{.cdecl, dynlib: libname, + importc: "LLVMGetValueName".} +proc SetValueName*(Val: ValueRef, Name: cstring){.cdecl, dynlib: libname, + importc: "LLVMSetValueName".} +proc DumpValue*(Val: ValueRef){.cdecl, dynlib: libname, importc: "LLVMDumpValue".} +proc ReplaceAllUsesWith*(OldVal: ValueRef, NewVal: ValueRef){.cdecl, + dynlib: libname, importc: "LLVMReplaceAllUsesWith".} + # Conversion functions. Return the input value if it is an instance of the + # specified class, otherwise NULL. See llvm::dyn_cast_or_null<>. +proc IsAArgument*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsAArgument".} +proc IsABasicBlock*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsABasicBlock".} +proc IsAInlineAsm*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsAInlineAsm".} +proc IsAUser*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsAUser".} +proc IsAConstant*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsAConstant".} +proc IsAConstantAggregateZero*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsAConstantAggregateZero".} +proc IsAConstantArray*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsAConstantArray".} +proc IsAConstantExpr*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsAConstantExpr".} +proc IsAConstantFP*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsAConstantFP".} +proc IsAConstantInt*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsAConstantInt".} +proc IsAConstantPointerNull*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsAConstantPointerNull".} +proc IsAConstantStruct*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsAConstantStruct".} +proc IsAConstantVector*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsAConstantVector".} +proc IsAGlobalValue*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsAGlobalValue".} +proc IsAFunction*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsAFunction".} +proc IsAGlobalAlias*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsAGlobalAlias".} +proc IsAGlobalVariable*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsAGlobalVariable".} +proc IsAUndefValue*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsAUndefValue".} +proc IsAInstruction*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsAInstruction".} +proc IsABinaryOperator*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsABinaryOperator".} +proc IsACallInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsACallInst".} +proc IsAIntrinsicInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsAIntrinsicInst".} +proc IsADbgInfoIntrinsic*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsADbgInfoIntrinsic".} +proc IsADbgDeclareInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsADbgDeclareInst".} +proc IsADbgFuncStartInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsADbgFuncStartInst".} +proc IsADbgRegionEndInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsADbgRegionEndInst".} +proc IsADbgRegionStartInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsADbgRegionStartInst".} +proc IsADbgStopPointInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsADbgStopPointInst".} +proc IsAEHSelectorInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsAEHSelectorInst".} +proc IsAMemIntrinsic*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsAMemIntrinsic".} +proc IsAMemCpyInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsAMemCpyInst".} +proc IsAMemMoveInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsAMemMoveInst".} +proc IsAMemSetInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsAMemSetInst".} +proc IsACmpInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsACmpInst".} +proc IsAFCmpInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsAFCmpInst".} +proc IsAICmpInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsAICmpInst".} +proc IsAExtractElementInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsAExtractElementInst".} +proc IsAGetElementPtrInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsAGetElementPtrInst".} +proc IsAInsertElementInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsAInsertElementInst".} +proc IsAInsertValueInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsAInsertValueInst".} +proc IsAPHINode*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsAPHINode".} +proc IsASelectInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsASelectInst".} +proc IsAShuffleVectorInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsAShuffleVectorInst".} +proc IsAStoreInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsAStoreInst".} +proc IsATerminatorInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsATerminatorInst".} +proc IsABranchInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsABranchInst".} +proc IsAInvokeInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsAInvokeInst".} +proc IsAReturnInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsAReturnInst".} +proc IsASwitchInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsASwitchInst".} +proc IsAUnreachableInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsAUnreachableInst".} +proc IsAUnwindInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsAUnwindInst".} +proc IsAUnaryInstruction*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsAUnaryInstruction".} +proc IsAAllocationInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsAAllocationInst".} +proc IsAAllocaInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsAAllocaInst".} +proc IsACastInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsACastInst".} +proc IsABitCastInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsABitCastInst".} +proc IsAFPExtInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsAFPExtInst".} +proc IsAFPToSIInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsAFPToSIInst".} +proc IsAFPToUIInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsAFPToUIInst".} +proc IsAFPTruncInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsAFPTruncInst".} +proc IsAIntToPtrInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsAIntToPtrInst".} +proc IsAPtrToIntInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsAPtrToIntInst".} +proc IsASExtInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsASExtInst".} +proc IsASIToFPInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsASIToFPInst".} +proc IsATruncInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsATruncInst".} +proc IsAUIToFPInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsAUIToFPInst".} +proc IsAZExtInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsAZExtInst".} +proc IsAExtractValueInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsAExtractValueInst".} +proc IsAFreeInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsAFreeInst".} +proc IsALoadInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsALoadInst".} +proc IsAVAArgInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMIsAVAArgInst".} + # Operations on Uses +proc GetFirstUse*(Val: ValueRef): UseIteratorRef{.cdecl, dynlib: libname, + importc: "LLVMGetFirstUse".} +proc GetNextUse*(U: UseIteratorRef): UseIteratorRef{.cdecl, dynlib: libname, + importc: "LLVMGetNextUse".} +proc GetUser*(U: UseIteratorRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMGetUser".} +proc GetUsedValue*(U: UseIteratorRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMGetUsedValue".} + # Operations on Users +proc GetOperand*(Val: ValueRef, Index: int32): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMGetOperand".} + # Operations on constants of any type +proc ConstNull*(Ty: TypeRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMConstNull".} + # all zeroes +proc ConstAllOnes*(Ty: TypeRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMConstAllOnes".} + # only for int/vector +proc GetUndef*(Ty: TypeRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMGetUndef".} +proc IsConstant*(Val: ValueRef): int32{.cdecl, dynlib: libname, + importc: "LLVMIsConstant".} +proc IsNull*(Val: ValueRef): int32{.cdecl, dynlib: libname, + importc: "LLVMIsNull".} +proc IsUndef*(Val: ValueRef): int32{.cdecl, dynlib: libname, + importc: "LLVMIsUndef".} +proc ConstPointerNull*(Ty: TypeRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMConstPointerNull".} + # Operations on scalar constants +proc ConstInt*(IntTy: TypeRef, N: int64, SignExtend: int32): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMConstInt".} +proc ConstIntOfString*(IntTy: TypeRef, Text: cstring, Radix: byte): ValueRef{. + cdecl, dynlib: libname, importc: "LLVMConstIntOfString".} +proc ConstIntOfStringAndSize*(IntTy: TypeRef, Text: cstring, SLen: int32, + Radix: byte): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMConstIntOfStringAndSize".} +proc ConstReal*(RealTy: TypeRef, N: float64): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMConstReal".} +proc ConstRealOfString*(RealTy: TypeRef, Text: cstring): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMConstRealOfString".} +proc ConstRealOfStringAndSize*(RealTy: TypeRef, Text: cstring, SLen: int32): ValueRef{. + cdecl, dynlib: libname, importc: "LLVMConstRealOfStringAndSize".} +proc ConstIntGetZExtValue*(ConstantVal: ValueRef): int64{.cdecl, + dynlib: libname, importc: "LLVMConstIntGetZExtValue".} +proc ConstIntGetSExtValue*(ConstantVal: ValueRef): int64{.cdecl, + dynlib: libname, importc: "LLVMConstIntGetSExtValue".} + # Operations on composite constants +proc ConstStringInContext*(C: ContextRef, Str: cstring, len: int32, + DontNullTerminate: int32): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMConstStringInContext".} +proc ConstStructInContext*(C: ContextRef, ConstantVals: ptr ValueRef, + Count: int32, + isPacked: int32): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMConstStructInContext".} +proc ConstString*(Str: cstring, len: int32, DontNullTerminate: int32): ValueRef{. + cdecl, dynlib: libname, importc: "LLVMConstString".} +proc ConstArray*(ElementTy: TypeRef, ConstantVals: ptr ValueRef, len: int32): ValueRef{. + cdecl, dynlib: libname, importc: "LLVMConstArray".} +proc ConstStruct*(ConstantVals: ptr ValueRef, Count: int32, isPacked: int32): ValueRef{. + cdecl, dynlib: libname, importc: "LLVMConstStruct".} +proc ConstVector*(ScalarConstantVals: ptr ValueRef, Size: int32): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMConstVector".} + # Constant expressions +proc GetConstOpcode*(ConstantVal: ValueRef): Opcode{.cdecl, dynlib: libname, + importc: "LLVMGetConstOpcode".} +proc AlignOf*(Ty: TypeRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMAlignOf".} +proc SizeOf*(Ty: TypeRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMSizeOf".} +proc ConstNeg*(ConstantVal: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMConstNeg".} +proc ConstFNeg*(ConstantVal: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMConstFNeg".} +proc ConstNot*(ConstantVal: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMConstNot".} +proc ConstAdd*(LHSConstant: ValueRef, RHSConstant: ValueRef): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMConstAdd".} +proc ConstNSWAdd*(LHSConstant: ValueRef, RHSConstant: ValueRef): ValueRef{. + cdecl, dynlib: libname, importc: "LLVMConstNSWAdd".} +proc ConstFAdd*(LHSConstant: ValueRef, RHSConstant: ValueRef): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMConstFAdd".} +proc ConstSub*(LHSConstant: ValueRef, RHSConstant: ValueRef): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMConstSub".} +proc ConstFSub*(LHSConstant: ValueRef, RHSConstant: ValueRef): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMConstFSub".} +proc ConstMul*(LHSConstant: ValueRef, RHSConstant: ValueRef): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMConstMul".} +proc ConstFMul*(LHSConstant: ValueRef, RHSConstant: ValueRef): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMConstFMul".} +proc ConstUDiv*(LHSConstant: ValueRef, RHSConstant: ValueRef): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMConstUDiv".} +proc ConstSDiv*(LHSConstant: ValueRef, RHSConstant: ValueRef): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMConstSDiv".} +proc ConstExactSDiv*(LHSConstant: ValueRef, RHSConstant: ValueRef): ValueRef{. + cdecl, dynlib: libname, importc: "LLVMConstExactSDiv".} +proc ConstFDiv*(LHSConstant: ValueRef, RHSConstant: ValueRef): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMConstFDiv".} +proc ConstURem*(LHSConstant: ValueRef, RHSConstant: ValueRef): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMConstURem".} +proc ConstSRem*(LHSConstant: ValueRef, RHSConstant: ValueRef): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMConstSRem".} +proc ConstFRem*(LHSConstant: ValueRef, RHSConstant: ValueRef): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMConstFRem".} +proc ConstAnd*(LHSConstant: ValueRef, RHSConstant: ValueRef): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMConstAnd".} +proc ConstOr*(LHSConstant: ValueRef, RHSConstant: ValueRef): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMConstOr".} +proc ConstXor*(LHSConstant: ValueRef, RHSConstant: ValueRef): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMConstXor".} +proc ConstICmp*(Predicate: IntPredicate, LHSConstant: ValueRef, + RHSConstant: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMConstICmp".} +proc ConstFCmp*(Predicate: RealPredicate, LHSConstant: ValueRef, + RHSConstant: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMConstFCmp".} +proc ConstShl*(LHSConstant: ValueRef, RHSConstant: ValueRef): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMConstShl".} +proc ConstLShr*(LHSConstant: ValueRef, RHSConstant: ValueRef): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMConstLShr".} +proc ConstAShr*(LHSConstant: ValueRef, RHSConstant: ValueRef): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMConstAShr".} +proc ConstGEP*(ConstantVal: ValueRef, ConstantIndices: ptr ValueRef, + NumIndices: int32): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMConstGEP".} +proc ConstInBoundsGEP*(ConstantVal: ValueRef, ConstantIndices: ptr ValueRef, + NumIndices: int32): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMConstInBoundsGEP".} +proc ConstTrunc*(ConstantVal: ValueRef, ToType: TypeRef): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMConstTrunc".} +proc ConstSExt*(ConstantVal: ValueRef, ToType: TypeRef): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMConstSExt".} +proc ConstZExt*(ConstantVal: ValueRef, ToType: TypeRef): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMConstZExt".} +proc ConstFPTrunc*(ConstantVal: ValueRef, ToType: TypeRef): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMConstFPTrunc".} +proc ConstFPExt*(ConstantVal: ValueRef, ToType: TypeRef): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMConstFPExt".} +proc ConstUIToFP*(ConstantVal: ValueRef, ToType: TypeRef): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMConstUIToFP".} +proc ConstSIToFP*(ConstantVal: ValueRef, ToType: TypeRef): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMConstSIToFP".} +proc ConstFPToUI*(ConstantVal: ValueRef, ToType: TypeRef): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMConstFPToUI".} +proc ConstFPToSI*(ConstantVal: ValueRef, ToType: TypeRef): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMConstFPToSI".} +proc ConstPtrToInt*(ConstantVal: ValueRef, ToType: TypeRef): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMConstPtrToInt".} +proc ConstIntToPtr*(ConstantVal: ValueRef, ToType: TypeRef): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMConstIntToPtr".} +proc ConstBitCast*(ConstantVal: ValueRef, ToType: TypeRef): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMConstBitCast".} +proc ConstZExtOrBitCast*(ConstantVal: ValueRef, ToType: TypeRef): ValueRef{. + cdecl, dynlib: libname, importc: "LLVMConstZExtOrBitCast".} +proc ConstSExtOrBitCast*(ConstantVal: ValueRef, ToType: TypeRef): ValueRef{. + cdecl, dynlib: libname, importc: "LLVMConstSExtOrBitCast".} +proc ConstTruncOrBitCast*(ConstantVal: ValueRef, ToType: TypeRef): ValueRef{. + cdecl, dynlib: libname, importc: "LLVMConstTruncOrBitCast".} +proc ConstPointerCast*(ConstantVal: ValueRef, ToType: TypeRef): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMConstPointerCast".} +proc ConstIntCast*(ConstantVal: ValueRef, ToType: TypeRef, isSigned: int32): ValueRef{. + cdecl, dynlib: libname, importc: "LLVMConstIntCast".} +proc ConstFPCast*(ConstantVal: ValueRef, ToType: TypeRef): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMConstFPCast".} +proc ConstSelect*(ConstantCondition: ValueRef, ConstantIfTrue: ValueRef, + ConstantIfFalse: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMConstSelect".} +proc ConstExtractElement*(VectorConstant: ValueRef, IndexConstant: ValueRef): ValueRef{. + cdecl, dynlib: libname, importc: "LLVMConstExtractElement".} +proc ConstInsertElement*(VectorConstant: ValueRef, + ElementValueConstant: ValueRef, IndexConstant: ValueRef): ValueRef{. + cdecl, dynlib: libname, importc: "LLVMConstInsertElement".} +proc ConstShuffleVector*(VectorAConstant: ValueRef, VectorBConstant: ValueRef, + MaskConstant: ValueRef): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMConstShuffleVector".} +proc ConstExtractValue*(AggConstant: ValueRef, IdxList: ptr int32, NumIdx: int32): ValueRef{. + cdecl, dynlib: libname, importc: "LLVMConstExtractValue".} +proc ConstInsertValue*(AggConstant: ValueRef, ElementValueConstant: ValueRef, + IdxList: ptr int32, NumIdx: int32): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMConstInsertValue".} +proc ConstInlineAsm*(Ty: TypeRef, AsmString: cstring, Constraints: cstring, + HasSideEffects: int32): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMConstInlineAsm".} + # Operations on global variables, functions, and aliases (globals) +proc GetGlobalParent*(Global: ValueRef): ModuleRef{.cdecl, dynlib: libname, + importc: "LLVMGetGlobalParent".} +proc IsDeclaration*(Global: ValueRef): int32{.cdecl, dynlib: libname, + importc: "LLVMIsDeclaration".} +proc GetLinkage*(Global: ValueRef): TLinkage{.cdecl, dynlib: libname, + importc: "LLVMGetLinkage".} +proc SetLinkage*(Global: ValueRef, Linkage: TLinkage){.cdecl, dynlib: libname, + importc: "LLVMSetLinkage".} +proc GetSection*(Global: ValueRef): cstring{.cdecl, dynlib: libname, + importc: "LLVMGetSection".} +proc SetSection*(Global: ValueRef, Section: cstring){.cdecl, dynlib: libname, + importc: "LLVMSetSection".} +proc GetVisibility*(Global: ValueRef): TVisibility{.cdecl, dynlib: libname, + importc: "LLVMGetVisibility".} +proc SetVisibility*(Global: ValueRef, Viz: TVisibility){.cdecl, dynlib: libname, + importc: "LLVMSetVisibility".} +proc GetAlignment*(Global: ValueRef): int32{.cdecl, dynlib: libname, + importc: "LLVMGetAlignment".} +proc SetAlignment*(Global: ValueRef, Bytes: int32){.cdecl, dynlib: libname, + importc: "LLVMSetAlignment".} + # Operations on global variables +proc AddGlobal*(M: ModuleRef, Ty: TypeRef, Name: cstring): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMAddGlobal".} +proc GetNamedGlobal*(M: ModuleRef, Name: cstring): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMGetNamedGlobal".} +proc GetFirstGlobal*(M: ModuleRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMGetFirstGlobal".} +proc GetLastGlobal*(M: ModuleRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMGetLastGlobal".} +proc GetNextGlobal*(GlobalVar: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMGetNextGlobal".} +proc GetPreviousGlobal*(GlobalVar: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMGetPreviousGlobal".} +proc DeleteGlobal*(GlobalVar: ValueRef){.cdecl, dynlib: libname, + importc: "LLVMDeleteGlobal".} +proc GetInitializer*(GlobalVar: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMGetInitializer".} +proc SetInitializer*(GlobalVar: ValueRef, ConstantVal: ValueRef){.cdecl, + dynlib: libname, importc: "LLVMSetInitializer".} +proc IsThreadLocal*(GlobalVar: ValueRef): int32{.cdecl, dynlib: libname, + importc: "LLVMIsThreadLocal".} +proc SetThreadLocal*(GlobalVar: ValueRef, IsThreadLocal: int32){.cdecl, + dynlib: libname, importc: "LLVMSetThreadLocal".} +proc IsGlobalConstant*(GlobalVar: ValueRef): int32{.cdecl, dynlib: libname, + importc: "LLVMIsGlobalConstant".} +proc SetGlobalConstant*(GlobalVar: ValueRef, IsConstant: int32){.cdecl, + dynlib: libname, importc: "LLVMSetGlobalConstant".} + # Operations on aliases +proc AddAlias*(M: ModuleRef, Ty: TypeRef, Aliasee: ValueRef, Name: cstring): ValueRef{. + cdecl, dynlib: libname, importc: "LLVMAddAlias".} + # Operations on functions +proc AddFunction*(M: ModuleRef, Name: cstring, FunctionTy: TypeRef): ValueRef{. + cdecl, dynlib: libname, importc: "LLVMAddFunction".} +proc GetNamedFunction*(M: ModuleRef, Name: cstring): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMGetNamedFunction".} +proc GetFirstFunction*(M: ModuleRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMGetFirstFunction".} +proc GetLastFunction*(M: ModuleRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMGetLastFunction".} +proc GetNextFunction*(Fn: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMGetNextFunction".} +proc GetPreviousFunction*(Fn: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMGetPreviousFunction".} +proc DeleteFunction*(Fn: ValueRef){.cdecl, dynlib: libname, + importc: "LLVMDeleteFunction".} +proc GetIntrinsicID*(Fn: ValueRef): int32{.cdecl, dynlib: libname, + importc: "LLVMGetIntrinsicID".} +proc GetFunctionCallConv*(Fn: ValueRef): int32{.cdecl, dynlib: libname, + importc: "LLVMGetFunctionCallConv".} +proc SetFunctionCallConv*(Fn: ValueRef, CC: int32){.cdecl, dynlib: libname, + importc: "LLVMSetFunctionCallConv".} +proc GetGC*(Fn: ValueRef): cstring{.cdecl, dynlib: libname, importc: "LLVMGetGC".} +proc SetGC*(Fn: ValueRef, Name: cstring){.cdecl, dynlib: libname, + importc: "LLVMSetGC".} +proc AddFunctionAttr*(Fn: ValueRef, PA: Attribute){.cdecl, dynlib: libname, + importc: "LLVMAddFunctionAttr".} +proc GetFunctionAttr*(Fn: ValueRef): Attribute{.cdecl, dynlib: libname, + importc: "LLVMGetFunctionAttr".} +proc RemoveFunctionAttr*(Fn: ValueRef, PA: Attribute){.cdecl, dynlib: libname, + importc: "LLVMRemoveFunctionAttr".} + # Operations on parameters +proc CountParams*(Fn: ValueRef): int32{.cdecl, dynlib: libname, + importc: "LLVMCountParams".} +proc GetParams*(Fn: ValueRef, Params: ptr ValueRef){.cdecl, dynlib: libname, + importc: "LLVMGetParams".} +proc GetParam*(Fn: ValueRef, Index: int32): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMGetParam".} +proc GetParamParent*(Inst: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMGetParamParent".} +proc GetFirstParam*(Fn: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMGetFirstParam".} +proc GetLastParam*(Fn: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMGetLastParam".} +proc GetNextParam*(Arg: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMGetNextParam".} +proc GetPreviousParam*(Arg: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMGetPreviousParam".} +proc AddAttribute*(Arg: ValueRef, PA: Attribute){.cdecl, dynlib: libname, + importc: "LLVMAddAttribute".} +proc RemoveAttribute*(Arg: ValueRef, PA: Attribute){.cdecl, dynlib: libname, + importc: "LLVMRemoveAttribute".} +proc GetAttribute*(Arg: ValueRef): Attribute{.cdecl, dynlib: libname, + importc: "LLVMGetAttribute".} +proc SetParamAlignment*(Arg: ValueRef, align: int32){.cdecl, dynlib: libname, + importc: "LLVMSetParamAlignment".} + # Operations on basic blocks +proc BasicBlockAsValue*(BB: BasicBlockRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMBasicBlockAsValue".} +proc ValueIsBasicBlock*(Val: ValueRef): int32{.cdecl, dynlib: libname, + importc: "LLVMValueIsBasicBlock".} +proc ValueAsBasicBlock*(Val: ValueRef): BasicBlockRef{.cdecl, dynlib: libname, + importc: "LLVMValueAsBasicBlock".} +proc GetBasicBlockParent*(BB: BasicBlockRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMGetBasicBlockParent".} +proc CountBasicBlocks*(Fn: ValueRef): int32{.cdecl, dynlib: libname, + importc: "LLVMCountBasicBlocks".} +proc GetBasicBlocks*(Fn: ValueRef, BasicBlocks: ptr BasicBlockRef){.cdecl, + dynlib: libname, importc: "LLVMGetBasicBlocks".} +proc GetFirstBasicBlock*(Fn: ValueRef): BasicBlockRef{.cdecl, dynlib: libname, + importc: "LLVMGetFirstBasicBlock".} +proc GetLastBasicBlock*(Fn: ValueRef): BasicBlockRef{.cdecl, dynlib: libname, + importc: "LLVMGetLastBasicBlock".} +proc GetNextBasicBlock*(BB: BasicBlockRef): BasicBlockRef{.cdecl, + dynlib: libname, importc: "LLVMGetNextBasicBlock".} +proc GetPreviousBasicBlock*(BB: BasicBlockRef): BasicBlockRef{.cdecl, + dynlib: libname, importc: "LLVMGetPreviousBasicBlock".} +proc GetEntryBasicBlock*(Fn: ValueRef): BasicBlockRef{.cdecl, dynlib: libname, + importc: "LLVMGetEntryBasicBlock".} +proc AppendBasicBlockInContext*(C: ContextRef, Fn: ValueRef, Name: cstring): BasicBlockRef{. + cdecl, dynlib: libname, importc: "LLVMAppendBasicBlockInContext".} +proc InsertBasicBlockInContext*(C: ContextRef, BB: BasicBlockRef, Name: cstring): BasicBlockRef{. + cdecl, dynlib: libname, importc: "LLVMInsertBasicBlockInContext".} +proc AppendBasicBlock*(Fn: ValueRef, Name: cstring): BasicBlockRef{.cdecl, + dynlib: libname, importc: "LLVMAppendBasicBlock".} +proc InsertBasicBlock*(InsertBeforeBB: BasicBlockRef, Name: cstring): BasicBlockRef{. + cdecl, dynlib: libname, importc: "LLVMInsertBasicBlock".} +proc DeleteBasicBlock*(BB: BasicBlockRef){.cdecl, dynlib: libname, + importc: "LLVMDeleteBasicBlock".} + # Operations on instructions +proc GetInstructionParent*(Inst: ValueRef): BasicBlockRef{.cdecl, + dynlib: libname, importc: "LLVMGetInstructionParent".} +proc GetFirstInstruction*(BB: BasicBlockRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMGetFirstInstruction".} +proc GetLastInstruction*(BB: BasicBlockRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMGetLastInstruction".} +proc GetNextInstruction*(Inst: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMGetNextInstruction".} +proc GetPreviousInstruction*(Inst: ValueRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMGetPreviousInstruction".} + # Operations on call sites +proc SetInstructionCallConv*(Instr: ValueRef, CC: int32){.cdecl, + dynlib: libname, importc: "LLVMSetInstructionCallConv".} +proc GetInstructionCallConv*(Instr: ValueRef): int32{.cdecl, dynlib: libname, + importc: "LLVMGetInstructionCallConv".} +proc AddInstrAttribute*(Instr: ValueRef, index: int32, para3: Attribute){.cdecl, + dynlib: libname, importc: "LLVMAddInstrAttribute".} +proc RemoveInstrAttribute*(Instr: ValueRef, index: int32, para3: Attribute){. + cdecl, dynlib: libname, importc: "LLVMRemoveInstrAttribute".} +proc SetInstrParamAlignment*(Instr: ValueRef, index: int32, align: int32){. + cdecl, dynlib: libname, importc: "LLVMSetInstrParamAlignment".} + # Operations on call instructions (only) +proc IsTailCall*(CallInst: ValueRef): int32{.cdecl, dynlib: libname, + importc: "LLVMIsTailCall".} +proc SetTailCall*(CallInst: ValueRef, IsTailCall: int32){.cdecl, + dynlib: libname, importc: "LLVMSetTailCall".} + # Operations on phi nodes +proc AddIncoming*(PhiNode: ValueRef, IncomingValues: ptr ValueRef, + IncomingBlocks: ptr BasicBlockRef, Count: int32){.cdecl, + dynlib: libname, importc: "LLVMAddIncoming".} +proc CountIncoming*(PhiNode: ValueRef): int32{.cdecl, dynlib: libname, + importc: "LLVMCountIncoming".} +proc GetIncomingValue*(PhiNode: ValueRef, Index: int32): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMGetIncomingValue".} +proc GetIncomingBlock*(PhiNode: ValueRef, Index: int32): BasicBlockRef{.cdecl, + dynlib: libname, importc: "LLVMGetIncomingBlock".} + #===-- Instruction builders ----------------------------------------------=== + # An instruction builder represents a point within a basic block, and is the + # * exclusive means of building instructions using the C interface. + # +proc CreateBuilderInContext*(C: ContextRef): BuilderRef{.cdecl, dynlib: libname, + importc: "LLVMCreateBuilderInContext".} +proc CreateBuilder*(): BuilderRef{.cdecl, dynlib: libname, + importc: "LLVMCreateBuilder".} +proc PositionBuilder*(Builder: BuilderRef, theBlock: BasicBlockRef, + Instr: ValueRef){.cdecl, dynlib: libname, + importc: "LLVMPositionBuilder".} +proc PositionBuilderBefore*(Builder: BuilderRef, Instr: ValueRef){.cdecl, + dynlib: libname, importc: "LLVMPositionBuilderBefore".} +proc PositionBuilderAtEnd*(Builder: BuilderRef, theBlock: BasicBlockRef){.cdecl, + dynlib: libname, importc: "LLVMPositionBuilderAtEnd".} +proc GetInsertBlock*(Builder: BuilderRef): BasicBlockRef{.cdecl, + dynlib: libname, importc: "LLVMGetInsertBlock".} +proc ClearInsertionPosition*(Builder: BuilderRef){.cdecl, dynlib: libname, + importc: "LLVMClearInsertionPosition".} +proc InsertIntoBuilder*(Builder: BuilderRef, Instr: ValueRef){.cdecl, + dynlib: libname, importc: "LLVMInsertIntoBuilder".} +proc InsertIntoBuilderWithName*(Builder: BuilderRef, Instr: ValueRef, + Name: cstring){.cdecl, dynlib: libname, + importc: "LLVMInsertIntoBuilderWithName".} +proc DisposeBuilder*(Builder: BuilderRef){.cdecl, dynlib: libname, + importc: "LLVMDisposeBuilder".} + # Terminators +proc BuildRetVoid*(para1: BuilderRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMBuildRetVoid".} +proc BuildRet*(para1: BuilderRef, V: ValueRef): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMBuildRet".} +proc BuildAggregateRet*(para1: BuilderRef, RetVals: ptr ValueRef, N: int32): ValueRef{. + cdecl, dynlib: libname, importc: "LLVMBuildAggregateRet".} +proc BuildBr*(para1: BuilderRef, Dest: BasicBlockRef): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMBuildBr".} +proc BuildCondBr*(para1: BuilderRef, Cond: ValueRef, ThenBranch: BasicBlockRef, + ElseBranch: BasicBlockRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMBuildCondBr".} +proc BuildSwitch*(para1: BuilderRef, V: ValueRef, ElseBranch: BasicBlockRef, + NumCases: int32): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMBuildSwitch".} +proc BuildInvoke*(para1: BuilderRef, Fn: ValueRef, Args: ptr ValueRef, + NumArgs: int32, ThenBranch: BasicBlockRef, + Catch: BasicBlockRef, Name: cstring): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMBuildInvoke".} +proc BuildUnwind*(para1: BuilderRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMBuildUnwind".} +proc BuildUnreachable*(para1: BuilderRef): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMBuildUnreachable".} + # Add a case to the switch instruction +proc AddCase*(Switch: ValueRef, OnVal: ValueRef, Dest: BasicBlockRef){.cdecl, + dynlib: libname, importc: "LLVMAddCase".} + # Arithmetic +proc BuildAdd*(para1: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: cstring): ValueRef{. + cdecl, dynlib: libname, importc: "LLVMBuildAdd".} +proc BuildNSWAdd*(para1: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: cstring): ValueRef{. + cdecl, dynlib: libname, importc: "LLVMBuildNSWAdd".} +proc BuildFAdd*(para1: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: cstring): ValueRef{. + cdecl, dynlib: libname, importc: "LLVMBuildFAdd".} +proc BuildSub*(para1: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: cstring): ValueRef{. + cdecl, dynlib: libname, importc: "LLVMBuildSub".} +proc BuildFSub*(para1: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: cstring): ValueRef{. + cdecl, dynlib: libname, importc: "LLVMBuildFSub".} +proc BuildMul*(para1: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: cstring): ValueRef{. + cdecl, dynlib: libname, importc: "LLVMBuildMul".} +proc BuildFMul*(para1: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: cstring): ValueRef{. + cdecl, dynlib: libname, importc: "LLVMBuildFMul".} +proc BuildUDiv*(para1: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: cstring): ValueRef{. + cdecl, dynlib: libname, importc: "LLVMBuildUDiv".} +proc BuildSDiv*(para1: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: cstring): ValueRef{. + cdecl, dynlib: libname, importc: "LLVMBuildSDiv".} +proc BuildExactSDiv*(para1: BuilderRef, LHS: ValueRef, RHS: ValueRef, + Name: cstring): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMBuildExactSDiv".} +proc BuildFDiv*(para1: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: cstring): ValueRef{. + cdecl, dynlib: libname, importc: "LLVMBuildFDiv".} +proc BuildURem*(para1: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: cstring): ValueRef{. + cdecl, dynlib: libname, importc: "LLVMBuildURem".} +proc BuildSRem*(para1: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: cstring): ValueRef{. + cdecl, dynlib: libname, importc: "LLVMBuildSRem".} +proc BuildFRem*(para1: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: cstring): ValueRef{. + cdecl, dynlib: libname, importc: "LLVMBuildFRem".} +proc BuildShl*(para1: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: cstring): ValueRef{. + cdecl, dynlib: libname, importc: "LLVMBuildShl".} +proc BuildLShr*(para1: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: cstring): ValueRef{. + cdecl, dynlib: libname, importc: "LLVMBuildLShr".} +proc BuildAShr*(para1: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: cstring): ValueRef{. + cdecl, dynlib: libname, importc: "LLVMBuildAShr".} +proc BuildAnd*(para1: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: cstring): ValueRef{. + cdecl, dynlib: libname, importc: "LLVMBuildAnd".} +proc BuildOr*(para1: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: cstring): ValueRef{. + cdecl, dynlib: libname, importc: "LLVMBuildOr".} +proc BuildXor*(para1: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: cstring): ValueRef{. + cdecl, dynlib: libname, importc: "LLVMBuildXor".} +proc BuildNeg*(para1: BuilderRef, V: ValueRef, Name: cstring): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMBuildNeg".} +proc BuildFNeg*(para1: BuilderRef, V: ValueRef, Name: cstring): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMBuildFNeg".} +proc BuildNot*(para1: BuilderRef, V: ValueRef, Name: cstring): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMBuildNot".} + # Memory +proc BuildMalloc*(para1: BuilderRef, Ty: TypeRef, Name: cstring): ValueRef{. + cdecl, dynlib: libname, importc: "LLVMBuildMalloc".} +proc BuildArrayMalloc*(para1: BuilderRef, Ty: TypeRef, Val: ValueRef, + Name: cstring): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMBuildArrayMalloc".} +proc BuildAlloca*(para1: BuilderRef, Ty: TypeRef, Name: cstring): ValueRef{. + cdecl, dynlib: libname, importc: "LLVMBuildAlloca".} +proc BuildArrayAlloca*(para1: BuilderRef, Ty: TypeRef, Val: ValueRef, + Name: cstring): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMBuildArrayAlloca".} +proc BuildFree*(para1: BuilderRef, PointerVal: ValueRef): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMBuildFree".} +proc BuildLoad*(para1: BuilderRef, PointerVal: ValueRef, Name: cstring): ValueRef{. + cdecl, dynlib: libname, importc: "LLVMBuildLoad".} +proc BuildStore*(para1: BuilderRef, Val: ValueRef, thePtr: ValueRef): ValueRef{. + cdecl, dynlib: libname, importc: "LLVMBuildStore".} +proc BuildGEP*(B: BuilderRef, Pointer: ValueRef, Indices: ptr ValueRef, + NumIndices: int32, Name: cstring): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMBuildGEP".} +proc BuildInBoundsGEP*(B: BuilderRef, Pointer: ValueRef, Indices: ptr ValueRef, + NumIndices: int32, Name: cstring): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMBuildInBoundsGEP".} +proc BuildStructGEP*(B: BuilderRef, Pointer: ValueRef, Idx: int32, Name: cstring): ValueRef{. + cdecl, dynlib: libname, importc: "LLVMBuildStructGEP".} +proc BuildGlobalString*(B: BuilderRef, Str: cstring, Name: cstring): ValueRef{. + cdecl, dynlib: libname, importc: "LLVMBuildGlobalString".} +proc BuildGlobalStringPtr*(B: BuilderRef, Str: cstring, Name: cstring): ValueRef{. + cdecl, dynlib: libname, importc: "LLVMBuildGlobalStringPtr".} + # Casts +proc BuildTrunc*(para1: BuilderRef, Val: ValueRef, DestTy: TypeRef, + Name: cstring): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMBuildTrunc".} +proc BuildZExt*(para1: BuilderRef, Val: ValueRef, DestTy: TypeRef, Name: cstring): ValueRef{. + cdecl, dynlib: libname, importc: "LLVMBuildZExt".} +proc BuildSExt*(para1: BuilderRef, Val: ValueRef, DestTy: TypeRef, Name: cstring): ValueRef{. + cdecl, dynlib: libname, importc: "LLVMBuildSExt".} +proc BuildFPToUI*(para1: BuilderRef, Val: ValueRef, DestTy: TypeRef, + Name: cstring): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMBuildFPToUI".} +proc BuildFPToSI*(para1: BuilderRef, Val: ValueRef, DestTy: TypeRef, + Name: cstring): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMBuildFPToSI".} +proc BuildUIToFP*(para1: BuilderRef, Val: ValueRef, DestTy: TypeRef, + Name: cstring): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMBuildUIToFP".} +proc BuildSIToFP*(para1: BuilderRef, Val: ValueRef, DestTy: TypeRef, + Name: cstring): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMBuildSIToFP".} +proc BuildFPTrunc*(para1: BuilderRef, Val: ValueRef, DestTy: TypeRef, + Name: cstring): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMBuildFPTrunc".} +proc BuildFPExt*(para1: BuilderRef, Val: ValueRef, DestTy: TypeRef, + Name: cstring): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMBuildFPExt".} +proc BuildPtrToInt*(para1: BuilderRef, Val: ValueRef, DestTy: TypeRef, + Name: cstring): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMBuildPtrToInt".} +proc BuildIntToPtr*(para1: BuilderRef, Val: ValueRef, DestTy: TypeRef, + Name: cstring): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMBuildIntToPtr".} +proc BuildBitCast*(para1: BuilderRef, Val: ValueRef, DestTy: TypeRef, + Name: cstring): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMBuildBitCast".} +proc BuildZExtOrBitCast*(para1: BuilderRef, Val: ValueRef, DestTy: TypeRef, + Name: cstring): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMBuildZExtOrBitCast".} +proc BuildSExtOrBitCast*(para1: BuilderRef, Val: ValueRef, DestTy: TypeRef, + Name: cstring): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMBuildSExtOrBitCast".} +proc BuildTruncOrBitCast*(para1: BuilderRef, Val: ValueRef, DestTy: TypeRef, + Name: cstring): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMBuildTruncOrBitCast".} +proc BuildPointerCast*(para1: BuilderRef, Val: ValueRef, DestTy: TypeRef, + Name: cstring): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMBuildPointerCast".} +proc BuildIntCast*(para1: BuilderRef, Val: ValueRef, DestTy: TypeRef, + Name: cstring): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMBuildIntCast".} +proc BuildFPCast*(para1: BuilderRef, Val: ValueRef, DestTy: TypeRef, + Name: cstring): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMBuildFPCast".} + # Comparisons +proc BuildICmp*(para1: BuilderRef, Op: IntPredicate, LHS: ValueRef, + RHS: ValueRef, Name: cstring): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMBuildICmp".} +proc BuildFCmp*(para1: BuilderRef, Op: RealPredicate, LHS: ValueRef, + RHS: ValueRef, Name: cstring): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMBuildFCmp".} + # Miscellaneous instructions +proc BuildPhi*(para1: BuilderRef, Ty: TypeRef, Name: cstring): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMBuildPhi".} +proc BuildCall*(para1: BuilderRef, Fn: ValueRef, Args: ptr ValueRef, + NumArgs: int32, Name: cstring): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMBuildCall".} +proc BuildSelect*(para1: BuilderRef, Cond: ValueRef, ThenBranch: ValueRef, + ElseBranch: ValueRef, Name: cstring): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMBuildSelect".} +proc BuildVAArg*(para1: BuilderRef, List: ValueRef, Ty: TypeRef, Name: cstring): ValueRef{. + cdecl, dynlib: libname, importc: "LLVMBuildVAArg".} +proc BuildExtractElement*(para1: BuilderRef, VecVal: ValueRef, Index: ValueRef, + Name: cstring): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMBuildExtractElement".} +proc BuildInsertElement*(para1: BuilderRef, VecVal: ValueRef, EltVal: ValueRef, + Index: ValueRef, Name: cstring): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMBuildInsertElement".} +proc BuildShuffleVector*(para1: BuilderRef, V1: ValueRef, V2: ValueRef, + Mask: ValueRef, Name: cstring): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMBuildShuffleVector".} +proc BuildExtractValue*(para1: BuilderRef, AggVal: ValueRef, Index: int32, + Name: cstring): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMBuildExtractValue".} +proc BuildInsertValue*(para1: BuilderRef, AggVal: ValueRef, EltVal: ValueRef, + Index: int32, Name: cstring): ValueRef{.cdecl, + dynlib: libname, importc: "LLVMBuildInsertValue".} +proc BuildIsNull*(para1: BuilderRef, Val: ValueRef, Name: cstring): ValueRef{. + cdecl, dynlib: libname, importc: "LLVMBuildIsNull".} +proc BuildIsNotNull*(para1: BuilderRef, Val: ValueRef, Name: cstring): ValueRef{. + cdecl, dynlib: libname, importc: "LLVMBuildIsNotNull".} +proc BuildPtrDiff*(para1: BuilderRef, LHS: ValueRef, RHS: ValueRef, + Name: cstring): ValueRef{.cdecl, dynlib: libname, + importc: "LLVMBuildPtrDiff".} + #===-- Module providers --------------------------------------------------=== + # Encapsulates the module M in a module provider, taking ownership of the + # module. + # See the constructor llvm::ExistingModuleProvider::ExistingModuleProvider. + # +proc CreateModuleProviderForExistingModule*(M: ModuleRef): ModuleProviderRef{. + cdecl, dynlib: libname, importc: "LLVMCreateModuleProviderForExistingModule".} + # Destroys the module provider MP as well as the contained module. + # See the destructor llvm::ModuleProvider::~ModuleProvider. + # +proc DisposeModuleProvider*(MP: ModuleProviderRef){.cdecl, dynlib: libname, + importc: "LLVMDisposeModuleProvider".} + #===-- Memory buffers ----------------------------------------------------=== +proc CreateMemoryBufferWithContentsOfFile*(Path: cstring, + OutMemBuf: ptr MemoryBufferRef, OutMessage: var cstring): int32{.cdecl, + dynlib: libname, importc: "LLVMCreateMemoryBufferWithContentsOfFile".} +proc CreateMemoryBufferWithSTDIN*(OutMemBuf: ptr MemoryBufferRef, + OutMessage: var cstring): int32{.cdecl, + dynlib: libname, importc: "LLVMCreateMemoryBufferWithSTDIN".} +proc DisposeMemoryBuffer*(MemBuf: MemoryBufferRef){.cdecl, dynlib: libname, + importc: "LLVMDisposeMemoryBuffer".} + #===-- Pass Managers -----------------------------------------------------=== + # Constructs a new whole-module pass pipeline. This type of pipeline is + # suitable for link-time optimization and whole-module transformations. + # See llvm::PassManager::PassManager. +proc CreatePassManager*(): PassManagerRef{.cdecl, dynlib: libname, + importc: "LLVMCreatePassManager".} + # Constructs a new function-by-function pass pipeline over the module + # provider. It does not take ownership of the module provider. This type of + # pipeline is suitable for code generation and JIT compilation tasks. + # See llvm::FunctionPassManager::FunctionPassManager. +proc CreateFunctionPassManager*(MP: ModuleProviderRef): PassManagerRef{.cdecl, + dynlib: libname, importc: "LLVMCreateFunctionPassManager".} + # Initializes, executes on the provided module, and finalizes all of the + # passes scheduled in the pass manager. Returns 1 if any of the passes + # modified the module, 0 otherwise. See llvm::PassManager::run(Module&). +proc RunPassManager*(PM: PassManagerRef, M: ModuleRef): int32{.cdecl, + dynlib: libname, importc: "LLVMRunPassManager".} + # Initializes all of the function passes scheduled in the function pass + # manager. Returns 1 if any of the passes modified the module, 0 otherwise. + # See llvm::FunctionPassManager::doInitialization. +proc InitializeFunctionPassManager*(FPM: PassManagerRef): int32{.cdecl, + dynlib: libname, importc: "LLVMInitializeFunctionPassManager".} + # Executes all of the function passes scheduled in the function pass manager + # on the provided function. Returns 1 if any of the passes modified the + # function, false otherwise. + # See llvm::FunctionPassManager::run(Function&). +proc RunFunctionPassManager*(FPM: PassManagerRef, F: ValueRef): int32{.cdecl, + dynlib: libname, importc: "LLVMRunFunctionPassManager".} + # Finalizes all of the function passes scheduled in in the function pass + # manager. Returns 1 if any of the passes modified the module, 0 otherwise. + # See llvm::FunctionPassManager::doFinalization. +proc FinalizeFunctionPassManager*(FPM: PassManagerRef): int32{.cdecl, + dynlib: libname, importc: "LLVMFinalizeFunctionPassManager".} + # Frees the memory of a pass pipeline. For function pipelines, does not free + # the module provider. + # See llvm::PassManagerBase::~PassManagerBase. +proc DisposePassManager*(PM: PassManagerRef){.cdecl, dynlib: libname, + importc: "LLVMDisposePassManager".} + # Analysis.h + # verifier will print to stderr and abort() + # verifier will print to stderr and return 1 + # verifier will just return 1 +type + VerifierFailureAction* = enum # Verifies that a module is valid, taking the specified action if not. + # Optionally returns a human-readable description of any invalid constructs. + # OutMessage must be disposed with LLVMDisposeMessage. + AbortProcessAction, PrintMessageAction, ReturnStatusAction + +proc VerifyModule*(M: ModuleRef, Action: VerifierFailureAction, + OutMessage: var cstring): int32{.cdecl, dynlib: libname, + importc: "LLVMVerifyModule".} + # Verifies that a single function is valid, taking the specified action. Useful + # for debugging. +proc VerifyFunction*(Fn: ValueRef, Action: VerifierFailureAction): int32{.cdecl, + dynlib: libname, importc: "LLVMVerifyFunction".} + # Open up a ghostview window that displays the CFG of the current function. + # Useful for debugging. +proc ViewFunctionCFG*(Fn: ValueRef){.cdecl, dynlib: libname, + importc: "LLVMViewFunctionCFG".} +proc ViewFunctionCFGOnly*(Fn: ValueRef){.cdecl, dynlib: libname, + importc: "LLVMViewFunctionCFGOnly".} + # BitReader.h + # Builds a module from the bitcode in the specified memory buffer, returning a + # reference to the module via the OutModule parameter. Returns 0 on success. + # Optionally returns a human-readable error message via OutMessage. +proc ParseBitcode*(MemBuf: MemoryBufferRef, OutModule: var ModuleRef, + OutMessage: var cstring): int32{.cdecl, dynlib: libname, + importc: "LLVMParseBitcode".} +proc ParseBitcodeInContext*(ContextRef: ContextRef, MemBuf: MemoryBufferRef, + OutModule: var ModuleRef, OutMessage: var cstring): int32{. + cdecl, dynlib: libname, importc: "LLVMParseBitcodeInContext".} + # Reads a module from the specified path, returning via the OutMP parameter + # a module provider which performs lazy deserialization. Returns 0 on success. + # Optionally returns a human-readable error message via OutMessage. +proc GetBitcodeModuleProvider*(MemBuf: MemoryBufferRef, + OutMP: var ModuleProviderRef, + OutMessage: var cstring): int32{. + cdecl, dynlib: libname, importc: "LLVMGetBitcodeModuleProvider".} +proc GetBitcodeModuleProviderInContext*(ContextRef: ContextRef, + MemBuf: MemoryBufferRef, + OutMP: var ModuleProviderRef, + OutMessage: var cstring): int32{.cdecl, + dynlib: libname, importc: "LLVMGetBitcodeModuleProviderInContext".} + # BitWriter.h + #===-- Operations on modules ---------------------------------------------=== + # Writes a module to an open file descriptor. Returns 0 on success. + # Closes the Handle. Use dup first if this is not what you want. +proc WriteBitcodeToFileHandle*(M: ModuleRef, Handle: int32): int32{.cdecl, + dynlib: libname, importc: "LLVMWriteBitcodeToFileHandle".} + # Writes a module to the specified path. Returns 0 on success. +proc WriteBitcodeToFile*(M: ModuleRef, Path: cstring): int32{.cdecl, + dynlib: libname, importc: "LLVMWriteBitcodeToFile".} + # Target.h +const + BigEndian* = 0 + LittleEndian* = 1 + +type + ByteOrdering* = int32 + OpaqueTargetData {.pure} = object + StructLayout {.pure} = object + TargetDataRef* = ref OpaqueTargetData + StructLayoutRef* = ref StructLayout + + +#===-- Target Data -------------------------------------------------------=== +# Creates target data from a target layout string. +# See the constructor llvm::TargetData::TargetData. + +proc CreateTargetData*(StringRep: cstring): TargetDataRef{.cdecl, + dynlib: libname, importc: "LLVMCreateTargetData".} + # Adds target data information to a pass manager. This does not take ownership + # of the target data. + # See the method llvm::PassManagerBase::add. +proc AddTargetData*(para1: TargetDataRef, para2: PassManagerRef){.cdecl, + dynlib: libname, importc: "LLVMAddTargetData".} + # Converts target data to a target layout string. The string must be disposed + # with LLVMDisposeMessage. + # See the constructor llvm::TargetData::TargetData. +proc CopyStringRepOfTargetData*(para1: TargetDataRef): cstring{.cdecl, + dynlib: libname, importc: "LLVMCopyStringRepOfTargetData".} + # Returns the byte order of a target, either LLVMBigEndian or + # LLVMLittleEndian. + # See the method llvm::TargetData::isLittleEndian. +proc ByteOrder*(para1: TargetDataRef): ByteOrdering{.cdecl, dynlib: libname, + importc: "LLVMByteOrder".} + # Returns the pointer size in bytes for a target. + # See the method llvm::TargetData::getPointerSize. +proc PointerSize*(para1: TargetDataRef): int32{.cdecl, dynlib: libname, + importc: "LLVMPointerSize".} + # Returns the integer type that is the same size as a pointer on a target. + # See the method llvm::TargetData::getIntPtrType. +proc IntPtrType*(para1: TargetDataRef): TypeRef{.cdecl, dynlib: libname, + importc: "LLVMIntPtrType".} + # Computes the size of a type in bytes for a target. + # See the method llvm::TargetData::getTypeSizeInBits. +proc SizeOfTypeInBits*(para1: TargetDataRef, para2: TypeRef): int64{.cdecl, + dynlib: libname, importc: "LLVMSizeOfTypeInBits".} + # Computes the storage size of a type in bytes for a target. + # See the method llvm::TargetData::getTypeStoreSize. +proc StoreSizeOfType*(para1: TargetDataRef, para2: TypeRef): int64{.cdecl, + dynlib: libname, importc: "LLVMStoreSizeOfType".} + # Computes the ABI size of a type in bytes for a target. + # See the method llvm::TargetData::getTypeAllocSize. +proc ABISizeOfType*(para1: TargetDataRef, para2: TypeRef): int64{.cdecl, + dynlib: libname, importc: "LLVMABISizeOfType".} + # Computes the ABI alignment of a type in bytes for a target. + # See the method llvm::TargetData::getTypeABISize. +proc ABIAlignmentOfType*(para1: TargetDataRef, para2: TypeRef): int32{.cdecl, + dynlib: libname, importc: "LLVMABIAlignmentOfType".} + # Computes the call frame alignment of a type in bytes for a target. + # See the method llvm::TargetData::getTypeABISize. +proc CallFrameAlignmentOfType*(para1: TargetDataRef, para2: TypeRef): int32{. + cdecl, dynlib: libname, importc: "LLVMCallFrameAlignmentOfType".} + # Computes the preferred alignment of a type in bytes for a target. + # See the method llvm::TargetData::getTypeABISize. +proc PreferredAlignmentOfType*(para1: TargetDataRef, para2: TypeRef): int32{. + cdecl, dynlib: libname, importc: "LLVMPreferredAlignmentOfType".} + # Computes the preferred alignment of a global variable in bytes for a target. + # See the method llvm::TargetData::getPreferredAlignment. +proc PreferredAlignmentOfGlobal*(para1: TargetDataRef, GlobalVar: ValueRef): int32{. + cdecl, dynlib: libname, importc: "LLVMPreferredAlignmentOfGlobal".} + # Computes the structure element that contains the byte offset for a target. + # See the method llvm::StructLayout::getElementContainingOffset. +proc ElementAtOffset*(para1: TargetDataRef, StructTy: TypeRef, Offset: int64): int32{. + cdecl, dynlib: libname, importc: "LLVMElementAtOffset".} + # Computes the byte offset of the indexed struct element for a target. + # See the method llvm::StructLayout::getElementContainingOffset. +proc OffsetOfElement*(para1: TargetDataRef, StructTy: TypeRef, Element: int32): int64{. + cdecl, dynlib: libname, importc: "LLVMOffsetOfElement".} + # Struct layouts are speculatively cached. If a TargetDataRef is alive when + # types are being refined and removed, this method must be called whenever a + # struct type is removed to avoid a dangling pointer in this cache. + # See the method llvm::TargetData::InvalidateStructLayoutInfo. +proc InvalidateStructLayout*(para1: TargetDataRef, StructTy: TypeRef){.cdecl, + dynlib: libname, importc: "LLVMInvalidateStructLayout".} + # Deallocates a TargetData. + # See the destructor llvm::TargetData::~TargetData. +proc DisposeTargetData*(para1: TargetDataRef){.cdecl, dynlib: libname, + importc: "LLVMDisposeTargetData".} + # ExecutionEngine.h +proc LinkInJIT*(){.cdecl, dynlib: libname, importc: "LLVMLinkInJIT".} +proc LinkInInterpreter*(){.cdecl, dynlib: libname, + importc: "LLVMLinkInInterpreter".} +type + OpaqueGenericValue {.pure} = object + OpaqueExecutionEngine {.pure} = object + GenericValueRef* = OpaqueGenericValue + ExecutionEngineRef* = OpaqueExecutionEngine + +#===-- Operations on generic values --------------------------------------=== + +proc CreateGenericValueOfInt*(Ty: TypeRef, N: int64, IsSigned: int32): GenericValueRef{. + cdecl, dynlib: libname, importc: "LLVMCreateGenericValueOfInt".} +proc CreateGenericValueOfPointer*(P: pointer): GenericValueRef{.cdecl, + dynlib: libname, importc: "LLVMCreateGenericValueOfPointer".} +proc CreateGenericValueOfFloat*(Ty: TypeRef, N: float64): GenericValueRef{. + cdecl, dynlib: libname, importc: "LLVMCreateGenericValueOfFloat".} +proc GenericValueIntWidth*(GenValRef: GenericValueRef): int32{.cdecl, + dynlib: libname, importc: "LLVMGenericValueIntWidth".} +proc GenericValueToInt*(GenVal: GenericValueRef, IsSigned: int32): int64{.cdecl, + dynlib: libname, importc: "LLVMGenericValueToInt".} +proc GenericValueToPointer*(GenVal: GenericValueRef): pointer{.cdecl, + dynlib: libname, importc: "LLVMGenericValueToPointer".} +proc GenericValueToFloat*(TyRef: TypeRef, GenVal: GenericValueRef): float64{. + cdecl, dynlib: libname, importc: "LLVMGenericValueToFloat".} +proc DisposeGenericValue*(GenVal: GenericValueRef){.cdecl, dynlib: libname, + importc: "LLVMDisposeGenericValue".} + +#===-- Operations on execution engines -----------------------------------=== +proc CreateExecutionEngine*(OutEE: var ExecutionEngineRef, MP: ModuleProviderRef, + OutError: var cstring): int32{.cdecl, dynlib: libname, + importc: "LLVMCreateExecutionEngine".} +proc CreateInterpreter*(OutInterp: var ExecutionEngineRef, MP: ModuleProviderRef, + OutError: var cstring): int32{.cdecl, dynlib: libname, + importc: "LLVMCreateInterpreter".} +proc CreateJITCompiler*(OutJIT: var ExecutionEngineRef, MP: ModuleProviderRef, + OptLevel: int32, OutError: var cstring): int32{.cdecl, + dynlib: libname, importc: "LLVMCreateJITCompiler".} +proc DisposeExecutionEngine*(EE: ExecutionEngineRef){.cdecl, dynlib: libname, + importc: "LLVMDisposeExecutionEngine".} +proc RunStaticConstructors*(EE: ExecutionEngineRef){.cdecl, dynlib: libname, + importc: "LLVMRunStaticConstructors".} +proc RunStaticDestructors*(EE: ExecutionEngineRef){.cdecl, dynlib: libname, + importc: "LLVMRunStaticDestructors".} + +proc RunFunctionAsMain*(EE: ExecutionEngineRef, F: ValueRef, ArgC: int32, + ArgV: cstringArray, EnvP: cstringArray): int32{.cdecl, + dynlib: libname, importc: "LLVMRunFunctionAsMain".} +proc RunFunction*(EE: ExecutionEngineRef, F: ValueRef, NumArgs: int32, + Args: ptr GenericValueRef): GenericValueRef{.cdecl, + dynlib: libname, importc: "LLVMRunFunction".} +proc FreeMachineCodeForFunction*(EE: ExecutionEngineRef, F: ValueRef){.cdecl, + dynlib: libname, importc: "LLVMFreeMachineCodeForFunction".} +proc AddModuleProvider*(EE: ExecutionEngineRef, MP: ModuleProviderRef){.cdecl, + dynlib: libname, importc: "LLVMAddModuleProvider".} +proc RemoveModuleProvider*(EE: ExecutionEngineRef, MP: ModuleProviderRef, + OutMod: var ModuleRef, OutError: var cstring): int32{.cdecl, + dynlib: libname, importc: "LLVMRemoveModuleProvider".} +proc FindFunction*(EE: ExecutionEngineRef, Name: cstring, OutFn: var ValueRef): int32{. + cdecl, dynlib: libname, importc: "LLVMFindFunction".} +proc GetExecutionEngineTargetData*(EE: ExecutionEngineRef): TargetDataRef{. + cdecl, dynlib: libname, importc: "LLVMGetExecutionEngineTargetData".} +proc AddGlobalMapping*(EE: ExecutionEngineRef, Global: ValueRef, + theAddr: pointer){.cdecl, dynlib: libname, + importc: "LLVMAddGlobalMapping".} +proc GetPointerToGlobal*(EE: ExecutionEngineRef, Global: ValueRef): pointer{. + cdecl, dynlib: libname, importc: "LLVMGetPointerToGlobal".} + +# LinkTimeOptimizer.h +# This provides a dummy type for pointers to the LTO object. +type + lto_t* = pointer + lto_status* = enum + LTO_UNKNOWN, LTO_OPT_SUCCESS, LTO_READ_SUCCESS, LTO_READ_FAILURE, + LTO_WRITE_FAILURE, LTO_NO_TARGET, LTO_NO_WORK, LTO_MODULE_MERGE_FAILURE, + LTO_ASM_FAILURE, LTO_NULL_OBJECT + lto_status_t* = lto_status + # This provides C interface to initialize link time optimizer. This allows + # linker to use dlopen() interface to dynamically load LinkTimeOptimizer. + # extern "C" helps, because dlopen() interface uses name to find the symbol. + +proc create_optimizer*(): lto_t{.cdecl, dynlib: libname, + importc: "llvm_create_optimizer".} +proc destroy_optimizer*(lto: lto_t){.cdecl, dynlib: libname, + importc: "llvm_destroy_optimizer".} +proc read_object_file*(lto: lto_t, input_filename: cstring): lto_status_t{. + cdecl, dynlib: libname, importc: "llvm_read_object_file".} +proc optimize_modules*(lto: lto_t, output_filename: cstring): lto_status_t{. + cdecl, dynlib: libname, importc: "llvm_optimize_modules".} + +# lto.h +const + LTO_API_VERSION* = 3 # log2 of alignment + +type + lto_symbol_attributes* = enum + SYMBOL_ALIGNMENT_MASK = 0x0000001F, + SYMBOL_PERMISSIONS_RODATA = 0x00000080, + SYMBOL_PERMISSIONS_CODE = 0x000000A0, + SYMBOL_PERMISSIONS_DATA = 0x000000C0, + SYMBOL_PERMISSIONS_MASK = 0x000000E0, + + SYMBOL_DEFINITION_REGULAR = 0x00000100, + SYMBOL_DEFINITION_TENTATIVE = 0x00000200, + SYMBOL_DEFINITION_WEAK = 0x00000300, + SYMBOL_DEFINITION_UNDEFINED = 0x00000400, + SYMBOL_DEFINITION_WEAKUNDEF = 0x00000500, + SYMBOL_DEFINITION_MASK = 0x00000700, + SYMBOL_SCOPE_INTERNAL = 0x00000800, + + SYMBOL_SCOPE_HIDDEN = 0x00001000, + SYMBOL_SCOPE_DEFAULT = 0x00001800, + SYMBOL_SCOPE_PROTECTED = 0x00002000, + SYMBOL_SCOPE_MASK = 0x00003800, + lto_debug_model* = enum + DEBUG_MODEL_NONE = 0, DEBUG_MODEL_DWARF = 1 + lto_codegen_model* = enum + CODEGEN_PIC_MODEL_STATIC = 0, CODEGEN_PIC_MODEL_DYNAMIC = 1, + CODEGEN_PIC_MODEL_DYNAMIC_NO_PIC = 2 + + LTOModule {.pure} = object + LTOCodeGenerator {.pure} = object + lto_module_t* = ref LTOModule + lto_code_gen_t* = ref LTOCodeGenerator + +proc lto_get_version*(): cstring{.cdecl, dynlib: libname, + importc: "lto_get_version".} + # + # Returns the last error string or NULL if last operation was sucessful. + # +proc lto_get_error_message*(): cstring{.cdecl, dynlib: libname, + importc: "lto_get_error_message".} + # + # Checks if a file is a loadable object file. + # +proc lto_module_is_object_file*(path: cstring): bool{.cdecl, dynlib: libname, + importc: "lto_module_is_object_file".} + # + # Checks if a file is a loadable object compiled for requested target. + # +proc lto_module_is_object_file_for_target*(path: cstring, + target_triple_prefix: cstring): bool{.cdecl, dynlib: libname, + importc: "lto_module_is_object_file_for_target".} + # + # Checks if a buffer is a loadable object file. + # +proc lto_module_is_object_file_in_memory*(mem: pointer, len: int): bool{. + cdecl, dynlib: libname, importc: "lto_module_is_object_file_in_memory".} + # + # Checks if a buffer is a loadable object compiled for requested target. + # +proc lto_module_is_object_file_in_memory_for_target*(mem: pointer, len: int, + target_triple_prefix: cstring): bool{.cdecl, dynlib: libname, + importc: "lto_module_is_object_file_in_memory_for_target".} + # + # Loads an object file from disk. + # Returns NULL on error (check lto_get_error_message() for details). + # +proc lto_module_create*(path: cstring): lto_module_t{.cdecl, dynlib: libname, + importc: "lto_module_create".} + # + # Loads an object file from memory. + # Returns NULL on error (check lto_get_error_message() for details). + # +proc lto_module_create_from_memory*(mem: pointer, len: int): lto_module_t{. + cdecl, dynlib: libname, importc: "lto_module_create_from_memory".} + # + # Frees all memory internally allocated by the module. + # Upon return the lto_module_t is no longer valid. + # +proc lto_module_dispose*(module: lto_module_t){.cdecl, dynlib: libname, + importc: "lto_module_dispose".} + # + # Returns triple string which the object module was compiled under. + # +proc lto_module_get_target_triple*(module: lto_module_t): cstring{.cdecl, + dynlib: libname, importc: "lto_module_get_target_triple".} + # + # Returns the number of symbols in the object module. + # +proc lto_module_get_num_symbols*(module: lto_module_t): int32{.cdecl, + dynlib: libname, importc: "lto_module_get_num_symbols".} + # + # Returns the name of the ith symbol in the object module. + # +proc lto_module_get_symbol_name*(module: lto_module_t, index: int32): cstring{. + cdecl, dynlib: libname, importc: "lto_module_get_symbol_name".} + # + # Returns the attributes of the ith symbol in the object module. + # +proc lto_module_get_symbol_attribute*(module: lto_module_t, index: int32): lto_symbol_attributes{. + cdecl, dynlib: libname, importc: "lto_module_get_symbol_attribute".} + # + # Instantiates a code generator. + # Returns NULL on error (check lto_get_error_message() for details). + # +proc lto_codegen_create*(): lto_code_gen_t{.cdecl, dynlib: libname, + importc: "lto_codegen_create".} + # + # Frees all code generator and all memory it internally allocated. + # Upon return the lto_code_gen_t is no longer valid. + # +proc lto_codegen_dispose*(para1: lto_code_gen_t){.cdecl, dynlib: libname, + importc: "lto_codegen_dispose".} + # + # Add an object module to the set of modules for which code will be generated. + # Returns true on error (check lto_get_error_message() for details). + # +proc lto_codegen_add_module*(cg: lto_code_gen_t, module: lto_module_t): bool{. + cdecl, dynlib: libname, importc: "lto_codegen_add_module".} + # + # Sets if debug info should be generated. + # Returns true on error (check lto_get_error_message() for details). + # +proc lto_codegen_set_debug_model*(cg: lto_code_gen_t, para2: lto_debug_model): bool{. + cdecl, dynlib: libname, importc: "lto_codegen_set_debug_model".} + # + # Sets which PIC code model to generated. + # Returns true on error (check lto_get_error_message() for details). + # +proc lto_codegen_set_pic_model*(cg: lto_code_gen_t, para2: lto_codegen_model): bool{. + cdecl, dynlib: libname, importc: "lto_codegen_set_pic_model".} + # + # Sets the location of the "gcc" to run. If not set, libLTO will search for + # "gcc" on the path. + # +proc lto_codegen_set_gcc_path*(cg: lto_code_gen_t, path: cstring){.cdecl, + dynlib: libname, importc: "lto_codegen_set_gcc_path".} + # + # Sets the location of the assembler tool to run. If not set, libLTO + # will use gcc to invoke the assembler. + # +proc lto_codegen_set_assembler_path*(cg: lto_code_gen_t, path: cstring){.cdecl, + dynlib: libname, importc: "lto_codegen_set_assembler_path".} + # + # Adds to a list of all global symbols that must exist in the final + # generated code. If a function is not listed, it might be + # inlined into every usage and optimized away. + # +proc lto_codegen_add_must_preserve_symbol*(cg: lto_code_gen_t, symbol: cstring){. + cdecl, dynlib: libname, importc: "lto_codegen_add_must_preserve_symbol".} + # + # Writes a new object file at the specified path that contains the + # merged contents of all modules added so far. + # Returns true on error (check lto_get_error_message() for details). + # +proc lto_codegen_write_merged_modules*(cg: lto_code_gen_t, path: cstring): bool{. + cdecl, dynlib: libname, importc: "lto_codegen_write_merged_modules".} + # + # Generates code for all added modules into one native object file. + # On sucess returns a pointer to a generated mach-o/ELF buffer and + # length set to the buffer size. The buffer is owned by the + # lto_code_gen_t and will be freed when lto_codegen_dispose() + # is called, or lto_codegen_compile() is called again. + # On failure, returns NULL (check lto_get_error_message() for details). + # +proc lto_codegen_compile*(cg: lto_code_gen_t, len: var int): pointer{.cdecl, + dynlib: libname, importc: "lto_codegen_compile".} + # + # Sets options to help debug codegen bugs. + # +proc lto_codegen_debug_options*(cg: lto_code_gen_t, para2: cstring){.cdecl, + dynlib: libname, importc: "lto_codegen_debug_options".} |