summary refs log tree commit diff stats
path: root/llvm/llvm_orig.nim
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/llvm_orig.nim')
-rw-r--r--llvm/llvm_orig.nim1569
1 files changed, 1569 insertions, 0 deletions
diff --git a/llvm/llvm_orig.nim b/llvm/llvm_orig.nim
new file mode 100644
index 000000000..8e09f9c68
--- /dev/null
+++ b/llvm/llvm_orig.nim
@@ -0,0 +1,1569 @@
+
+const 
+  libname* = ""               #Setup as you need
+
+type 
+  PLLVMBasicBlockRef* = ptr LLVMBasicBlockRef
+  PLLVMExecutionEngineRef* = ptr LLVMExecutionEngineRef
+  PLLVMGenericValueRef* = ptr LLVMGenericValueRef
+  PLLVMMemoryBufferRef* = ptr LLVMMemoryBufferRef
+  PLLVMModuleProviderRef* = ptr LLVMModuleProviderRef
+  PLLVMModuleRef* = ptr LLVMModuleRef
+  PLLVMTypeRef* = ptr LLVMTypeRef
+  PLLVMValueRef* = ptr LLVMValueRef # Core.h  
+                                    # Opaque types.  
+                                    #*
+                                    # * The top-level container for all LLVM global data.  See the LLVMContext class.
+                                    #  
+
+type 
+  LLVMContextRef* = LLVMOpaqueContext #*
+                                      # * The top-level container for all other LLVM Intermediate Representation (IR)
+                                      # * objects. See the llvm::Module class.
+                                      #  
+  LLVMModuleRef* = LLVMOpaqueModule #*
+                                    # * Each value in the LLVM IR has a type, an LLVMTypeRef. See the llvm::Type
+                                    # * class.
+                                    #  
+  LLVMTypeRef* = LLVMOpaqueType #*
+                                # * When building recursive types using LLVMRefineType, LLVMTypeRef values may
+                                # * become invalid; use LLVMTypeHandleRef to resolve this problem. See the
+                                # * llvm::AbstractTypeHolder class.
+                                #  
+  LLVMTypeHandleRef* = LLVMOpaqueTypeHandle
+  LLVMValueRef* = LLVMOpaqueValue
+  LLVMBasicBlockRef* = LLVMOpaqueBasicBlock
+  LLVMBuilderRef* = LLVMOpaqueBuilder # Used to provide a module to JIT or interpreter.
+                                      # * See the llvm::ModuleProvider class.
+                                      #  
+  LLVMModuleProviderRef* = LLVMOpaqueModuleProvider # Used to provide a module to JIT or interpreter.
+                                                    # * See the llvm::MemoryBuffer class.
+                                                    #  
+  LLVMMemoryBufferRef* = LLVMOpaqueMemoryBuffer #* See the llvm::PassManagerBase class.  
+  LLVMPassManagerRef* = LLVMOpaquePassManager #*
+                                              # * Used to iterate through the uses of a Value, allowing access to all Values
+                                              # * that use this Value.  See the llvm::Use and llvm::value_use_iterator classes.
+                                              #  
+  LLVMUseIteratorRef* = LLVMOpaqueUseIterator
+  LLVMAttribute* = enum 
+    LLVMZExtAttribute = 1 shl 0, LLVMSExtAttribute = 1 shl 1, 
+    LLVMNoReturnAttribute = 1 shl 2, LLVMInRegAttribute = 1 shl 3, 
+    LLVMStructRetAttribute = 1 shl 4, LLVMNoUnwindAttribute = 1 shl 5, 
+    LLVMNoAliasAttribute = 1 shl 6, LLVMByValAttribute = 1 shl 7, 
+    LLVMNestAttribute = 1 shl 8, LLVMReadNoneAttribute = 1 shl 9, 
+    LLVMReadOnlyAttribute = 1 shl 10, LLVMNoInlineAttribute = 1 shl 11, 
+    LLVMAlwaysInlineAttribute = 1 shl 12, 
+    LLVMOptimizeForSizeAttribute = 1 shl 13, 
+    LLVMStackProtectAttribute = 1 shl 14, 
+    LLVMStackProtectReqAttribute = 1 shl 15, LLVMNoCaptureAttribute = 1 shl
+        21, LLVMNoRedZoneAttribute = 1 shl 22, 
+    LLVMNoImplicitFloatAttribute = 1 shl 23, LLVMNakedAttribute = 1 shl 24, 
+    LLVMInlineHintAttribute = 1 shl 25
+  LLVMOpcode* = enum  #*< type with no size  
+                      #*< 32 bit floating point type  
+                      #*< 64 bit floating point type  
+                      #*< 80 bit floating point type (X87)  
+                      #*< 128 bit floating point type (112-bit mantissa) 
+                      #*< 128 bit floating point type (two 64-bits)  
+                      #*< Labels  
+                      #*< Arbitrary bit width integers  
+                      #*< Functions  
+                      #*< Structures  
+                      #*< Arrays  
+                      #*< Pointers  
+                      #*< Opaque: type with unknown structure  
+                      #*< SIMD 'packed' format, or other vector type  
+                      #*< Metadata  
+    LLVMRet = 1, LLVMBr = 2, LLVMSwitch = 3, LLVMInvoke = 4, LLVMUnwind = 5, 
+    LLVMUnreachable = 6, LLVMAdd = 7, LLVMFAdd = 8, LLVMSub = 9, LLVMFSub = 10, 
+    LLVMMul = 11, LLVMFMul = 12, LLVMUDiv = 13, LLVMSDiv = 14, LLVMFDiv = 15, 
+    LLVMURem = 16, LLVMSRem = 17, LLVMFRem = 18, LLVMShl = 19, LLVMLShr = 20, 
+    LLVMAShr = 21, LLVMAnd = 22, LLVMOr = 23, LLVMXor = 24, LLVMMalloc = 25, 
+    LLVMFree = 26, LLVMAlloca = 27, LLVMLoad = 28, LLVMStore = 29, 
+    LLVMGetElementPtr = 30, LLVMTrunk = 31, LLVMZExt = 32, LLVMSExt = 33, 
+    LLVMFPToUI = 34, LLVMFPToSI = 35, LLVMUIToFP = 36, LLVMSIToFP = 37, 
+    LLVMFPTrunc = 38, LLVMFPExt = 39, LLVMPtrToInt = 40, LLVMIntToPtr = 41, 
+    LLVMBitCast = 42, LLVMICmp = 43, LLVMFCmp = 44, LLVMPHI = 45, LLVMCall = 46, 
+    LLVMSelect = 47, LLVMVAArg = 50, LLVMExtractElement = 51, 
+    LLVMInsertElement = 52, LLVMShuffleVector = 53, LLVMExtractValue = 54, 
+    LLVMInsertValue = 55
+  LLVMTypeKind* = enum  #*< Externally visible function  
+                        #*< Keep one copy of function when linking (inline) 
+                        #*< Same, but only replaced by something
+                        #                            equivalent.  
+                        #*< Keep one copy of function when linking (weak)  
+                        #*< Same, but only replaced by something
+                        #                            equivalent.  
+                        #*< Special purpose, only applies to global arrays  
+                        #*< Rename collisions when linking (static
+                        #                               functions)  
+                        #*< Like Internal, but omit from symbol table  
+                        #*< Function to be imported from DLL  
+                        #*< Function to be accessible from DLL  
+                        #*< ExternalWeak linkage description  
+                        #*< Stand-in functions for streaming fns from
+                        #                               bitcode  
+                        #*< Tentative definitions  
+                        #*< Like Private, but linker removes.  
+    LLVMVoidTypeKind, LLVMFloatTypeKind, LLVMDoubleTypeKind, 
+    LLVMX86_FP80TypeKind, LLVMFP128TypeKind, LLVMPPC_FP128TypeKind, 
+    LLVMLabelTypeKind, LLVMIntegerTypeKind, LLVMFunctionTypeKind, 
+    LLVMStructTypeKind, LLVMArrayTypeKind, LLVMPointerTypeKind, 
+    LLVMOpaqueTypeKind, LLVMVectorTypeKind, LLVMMetadataTypeKind
+  LLVMLinkage* = enum         #*< The GV is visible  
+                              #*< The GV is hidden  
+                              #*< The GV is protected  
+    LLVMExternalLinkage, LLVMAvailableExternallyLinkage, LLVMLinkOnceAnyLinkage, 
+    LLVMLinkOnceODRLinkage, LLVMWeakAnyLinkage, LLVMWeakODRLinkage, 
+    LLVMAppendingLinkage, LLVMInternalLinkage, LLVMPrivateLinkage, 
+    LLVMDLLImportLinkage, LLVMDLLExportLinkage, LLVMExternalWeakLinkage, 
+    LLVMGhostLinkage, LLVMCommonLinkage, LLVMLinkerPrivateLinkage
+  LLVMVisibility* = enum 
+    LLVMDefaultVisibility, LLVMHiddenVisibility, LLVMProtectedVisibility
+  LLVMCallConv* = enum        #*< equal  
+                              #*< not equal  
+                              #*< unsigned greater than  
+                              #*< unsigned greater or equal  
+                              #*< unsigned less than  
+                              #*< unsigned less or equal  
+                              #*< signed greater than  
+                              #*< signed greater or equal  
+                              #*< signed less than  
+                              #*< signed less or equal  
+    LLVMCCallConv = 0, LLVMFastCallConv = 8, LLVMColdCallConv = 9, 
+    LLVMX86StdcallCallConv = 64, LLVMX86FastcallCallConv = 65
+  LLVMIntPredicate* = enum    #*< Always false (always folded)  
+                              #*< True if ordered and equal  
+                              #*< True if ordered and greater than  
+                              #*< True if ordered and greater than or equal  
+                              #*< True if ordered and less than  
+                              #*< True if ordered and less than or equal  
+                              #*< True if ordered and operands are unequal  
+                              #*< True if ordered (no nans)  
+                              #*< True if unordered: isnan(X) | isnan(Y)  
+                              #*< True if unordered or equal  
+                              #*< True if unordered or greater than  
+                              #*< True if unordered, greater than, or equal  
+                              #*< True if unordered or less than  
+                              #*< True if unordered, less than, or equal  
+                              #*< True if unordered or not equal  
+                              #*< Always true (always folded)  
+    LLVMIntEQ = 32, LLVMIntNE, LLVMIntUGT, LLVMIntUGE, LLVMIntULT, LLVMIntULE, 
+    LLVMIntSGT, LLVMIntSGE, LLVMIntSLT, LLVMIntSLE
+  LLVMRealPredicate* = enum   #===-- Error handling ----------------------------------------------------=== 
+    LLVMRealPredicateFalse, LLVMRealOEQ, LLVMRealOGT, LLVMRealOGE, LLVMRealOLT, 
+    LLVMRealOLE, LLVMRealONE, LLVMRealORD, LLVMRealUNO, LLVMRealUEQ, 
+    LLVMRealUGT, LLVMRealUGE, LLVMRealULT, LLVMRealULE, LLVMRealUNE, 
+    LLVMRealPredicateTrue
+
+proc LLVMDisposeMessage*(Message: cstring){.cdecl, dynlib: libname, 
+    importc: "LLVMDisposeMessage".}
+  #===-- Modules -----------------------------------------------------------=== 
+  # Create and destroy contexts.  
+proc LLVMContextCreate*(): LLVMContextRef{.cdecl, dynlib: libname, 
+    importc: "LLVMContextCreate".}
+proc LLVMGetGlobalContext*(): LLVMContextRef{.cdecl, dynlib: libname, 
+    importc: "LLVMGetGlobalContext".}
+proc LLVMContextDispose*(C: LLVMContextRef){.cdecl, dynlib: libname, 
+    importc: "LLVMContextDispose".}
+  # Create and destroy modules.  
+  #* See llvm::Module::Module.  
+proc LLVMModuleCreateWithName*(ModuleID: cstring): LLVMModuleRef{.cdecl, 
+    dynlib: libname, importc: "LLVMModuleCreateWithName".}
+proc LLVMModuleCreateWithNameInContext*(ModuleID: cstring, C: LLVMContextRef): LLVMModuleRef{.
+    cdecl, dynlib: libname, importc: "LLVMModuleCreateWithNameInContext".}
+  #* See llvm::Module::~Module.  
+proc LLVMDisposeModule*(M: LLVMModuleRef){.cdecl, dynlib: libname, 
+    importc: "LLVMDisposeModule".}
+  #* Data layout. See Module::getDataLayout.  
+proc LLVMGetDataLayout*(M: LLVMModuleRef): cstring{.cdecl, dynlib: libname, 
+    importc: "LLVMGetDataLayout".}
+proc LLVMSetDataLayout*(M: LLVMModuleRef, Triple: cstring){.cdecl, 
+    dynlib: libname, importc: "LLVMSetDataLayout".}
+  #* Target triple. See Module::getTargetTriple.  
+proc LLVMGetTarget*(M: LLVMModuleRef): cstring{.cdecl, dynlib: libname, 
+    importc: "LLVMGetTarget".}
+proc LLVMSetTarget*(M: LLVMModuleRef, Triple: cstring){.cdecl, dynlib: libname, 
+    importc: "LLVMSetTarget".}
+  #* See Module::addTypeName.  
+proc LLVMAddTypeName*(M: LLVMModuleRef, Name: cstring, Ty: LLVMTypeRef): int32{.
+    cdecl, dynlib: libname, importc: "LLVMAddTypeName".}
+proc LLVMDeleteTypeName*(M: LLVMModuleRef, Name: cstring){.cdecl, 
+    dynlib: libname, importc: "LLVMDeleteTypeName".}
+proc LLVMGetTypeByName*(M: LLVMModuleRef, Name: cstring): LLVMTypeRef{.cdecl, 
+    dynlib: libname, importc: "LLVMGetTypeByName".}
+  #* See Module::dump.  
+proc LLVMDumpModule*(M: LLVMModuleRef){.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 LLVMGetTypeKind*(Ty: LLVMTypeRef): LLVMTypeKind{.cdecl, dynlib: libname, 
+    importc: "LLVMGetTypeKind".}
+  #* See llvm::LLVMType::getContext.  
+proc LLVMGetTypeContext*(Ty: LLVMTypeRef): LLVMContextRef{.cdecl, 
+    dynlib: libname, importc: "LLVMGetTypeContext".}
+  # Operations on integer types  
+proc LLVMInt1TypeInContext*(C: LLVMContextRef): LLVMTypeRef{.cdecl, 
+    dynlib: libname, importc: "LLVMInt1TypeInContext".}
+proc LLVMInt8TypeInContext*(C: LLVMContextRef): LLVMTypeRef{.cdecl, 
+    dynlib: libname, importc: "LLVMInt8TypeInContext".}
+proc LLVMInt16TypeInContext*(C: LLVMContextRef): LLVMTypeRef{.cdecl, 
+    dynlib: libname, importc: "LLVMInt16TypeInContext".}
+proc LLVMInt32TypeInContext*(C: LLVMContextRef): LLVMTypeRef{.cdecl, 
+    dynlib: libname, importc: "LLVMInt32TypeInContext".}
+proc LLVMInt64TypeInContext*(C: LLVMContextRef): LLVMTypeRef{.cdecl, 
+    dynlib: libname, importc: "LLVMInt64TypeInContext".}
+proc LLVMIntTypeInContext*(C: LLVMContextRef, NumBits: dword): LLVMTypeRef{.
+    cdecl, dynlib: libname, importc: "LLVMIntTypeInContext".}
+proc LLVMInt1Type*(): LLVMTypeRef{.cdecl, dynlib: libname, 
+                                   importc: "LLVMInt1Type".}
+proc LLVMInt8Type*(): LLVMTypeRef{.cdecl, dynlib: libname, 
+                                   importc: "LLVMInt8Type".}
+proc LLVMInt16Type*(): LLVMTypeRef{.cdecl, dynlib: libname, 
+                                    importc: "LLVMInt16Type".}
+proc LLVMInt32Type*(): LLVMTypeRef{.cdecl, dynlib: libname, 
+                                    importc: "LLVMInt32Type".}
+proc LLVMInt64Type*(): LLVMTypeRef{.cdecl, dynlib: libname, 
+                                    importc: "LLVMInt64Type".}
+proc LLVMIntType*(NumBits: dword): LLVMTypeRef{.cdecl, dynlib: libname, 
+    importc: "LLVMIntType".}
+proc LLVMGetIntTypeWidth*(IntegerTy: LLVMTypeRef): dword{.cdecl, 
+    dynlib: libname, importc: "LLVMGetIntTypeWidth".}
+  # Operations on real types  
+proc LLVMFloatTypeInContext*(C: LLVMContextRef): LLVMTypeRef{.cdecl, 
+    dynlib: libname, importc: "LLVMFloatTypeInContext".}
+proc LLVMDoubleTypeInContext*(C: LLVMContextRef): LLVMTypeRef{.cdecl, 
+    dynlib: libname, importc: "LLVMDoubleTypeInContext".}
+proc LLVMX86FP80TypeInContext*(C: LLVMContextRef): LLVMTypeRef{.cdecl, 
+    dynlib: libname, importc: "LLVMX86FP80TypeInContext".}
+proc LLVMFP128TypeInContext*(C: LLVMContextRef): LLVMTypeRef{.cdecl, 
+    dynlib: libname, importc: "LLVMFP128TypeInContext".}
+proc LLVMPPCFP128TypeInContext*(C: LLVMContextRef): LLVMTypeRef{.cdecl, 
+    dynlib: libname, importc: "LLVMPPCFP128TypeInContext".}
+proc LLVMFloatType*(): LLVMTypeRef{.cdecl, dynlib: libname, 
+                                    importc: "LLVMFloatType".}
+proc LLVMDoubleType*(): LLVMTypeRef{.cdecl, dynlib: libname, 
+                                     importc: "LLVMDoubleType".}
+proc LLVMX86FP80Type*(): LLVMTypeRef{.cdecl, dynlib: libname, 
+                                      importc: "LLVMX86FP80Type".}
+proc LLVMFP128Type*(): LLVMTypeRef{.cdecl, dynlib: libname, 
+                                    importc: "LLVMFP128Type".}
+proc LLVMPPCFP128Type*(): LLVMTypeRef{.cdecl, dynlib: libname, 
+                                       importc: "LLVMPPCFP128Type".}
+  # Operations on function types  
+proc LLVMFunctionType*(ReturnType: LLVMTypeRef, ParamTypes: pLLVMTypeRef, 
+                       ParamCount: dword, IsVarArg: int32): LLVMTypeRef{.cdecl, 
+    dynlib: libname, importc: "LLVMFunctionType".}
+proc LLVMIsFunctionVarArg*(FunctionTy: LLVMTypeRef): int32{.cdecl, 
+    dynlib: libname, importc: "LLVMIsFunctionVarArg".}
+proc LLVMGetReturnType*(FunctionTy: LLVMTypeRef): LLVMTypeRef{.cdecl, 
+    dynlib: libname, importc: "LLVMGetReturnType".}
+proc LLVMCountParamTypes*(FunctionTy: LLVMTypeRef): dword{.cdecl, 
+    dynlib: libname, importc: "LLVMCountParamTypes".}
+proc LLVMGetParamTypes*(FunctionTy: LLVMTypeRef, Dest: pLLVMTypeRef){.cdecl, 
+    dynlib: libname, importc: "LLVMGetParamTypes".}
+  # Operations on struct types  
+proc LLVMStructTypeInContext*(C: LLVMContextRef, ElementTypes: pLLVMTypeRef, 
+                              ElementCount: dword, isPacked: int32): LLVMTypeRef{.
+    cdecl, dynlib: libname, importc: "LLVMStructTypeInContext".}
+proc LLVMStructType*(ElementTypes: pLLVMTypeRef, ElementCount: dword, 
+                     isPacked: int32): LLVMTypeRef{.cdecl, dynlib: libname, 
+    importc: "LLVMStructType".}
+proc LLVMCountStructElementTypes*(StructTy: LLVMTypeRef): dword{.cdecl, 
+    dynlib: libname, importc: "LLVMCountStructElementTypes".}
+proc LLVMGetStructElementTypes*(StructTy: LLVMTypeRef, Dest: pLLVMTypeRef){.
+    cdecl, dynlib: libname, importc: "LLVMGetStructElementTypes".}
+proc LLVMIsPackedStruct*(StructTy: LLVMTypeRef): int32{.cdecl, dynlib: libname, 
+    importc: "LLVMIsPackedStruct".}
+  # Operations on array, pointer, and vector types (sequence types)  
+proc LLVMArrayType*(ElementType: LLVMTypeRef, ElementCount: dword): LLVMTypeRef{.
+    cdecl, dynlib: libname, importc: "LLVMArrayType".}
+proc LLVMPointerType*(ElementType: LLVMTypeRef, AddressSpace: dword): LLVMTypeRef{.
+    cdecl, dynlib: libname, importc: "LLVMPointerType".}
+proc LLVMVectorType*(ElementType: LLVMTypeRef, ElementCount: dword): LLVMTypeRef{.
+    cdecl, dynlib: libname, importc: "LLVMVectorType".}
+proc LLVMGetElementType*(Ty: LLVMTypeRef): LLVMTypeRef{.cdecl, dynlib: libname, 
+    importc: "LLVMGetElementType".}
+proc LLVMGetArrayLength*(ArrayTy: LLVMTypeRef): dword{.cdecl, dynlib: libname, 
+    importc: "LLVMGetArrayLength".}
+proc LLVMGetPointerAddressSpace*(PointerTy: LLVMTypeRef): dword{.cdecl, 
+    dynlib: libname, importc: "LLVMGetPointerAddressSpace".}
+proc LLVMGetVectorSize*(VectorTy: LLVMTypeRef): dword{.cdecl, dynlib: libname, 
+    importc: "LLVMGetVectorSize".}
+  # Operations on other types  
+proc LLVMVoidTypeInContext*(C: LLVMContextRef): LLVMTypeRef{.cdecl, 
+    dynlib: libname, importc: "LLVMVoidTypeInContext".}
+proc LLVMLabelTypeInContext*(C: LLVMContextRef): LLVMTypeRef{.cdecl, 
+    dynlib: libname, importc: "LLVMLabelTypeInContext".}
+proc LLVMOpaqueTypeInContext*(C: LLVMContextRef): LLVMTypeRef{.cdecl, 
+    dynlib: libname, importc: "LLVMOpaqueTypeInContext".}
+proc LLVMVoidType*(): LLVMTypeRef{.cdecl, dynlib: libname, 
+                                   importc: "LLVMVoidType".}
+proc LLVMLabelType*(): LLVMTypeRef{.cdecl, dynlib: libname, 
+                                    importc: "LLVMLabelType".}
+proc LLVMOpaqueType*(): LLVMTypeRef{.cdecl, dynlib: libname, 
+                                     importc: "LLVMOpaqueType".}
+  # Operations on type handles  
+proc LLVMCreateTypeHandle*(PotentiallyAbstractTy: LLVMTypeRef): LLVMTypeHandleRef{.
+    cdecl, dynlib: libname, importc: "LLVMCreateTypeHandle".}
+proc LLVMRefineType*(AbstractTy: LLVMTypeRef, ConcreteTy: LLVMTypeRef){.cdecl, 
+    dynlib: libname, importc: "LLVMRefineType".}
+proc LLVMResolveTypeHandle*(TypeHandle: LLVMTypeHandleRef): LLVMTypeRef{.cdecl, 
+    dynlib: libname, importc: "LLVMResolveTypeHandle".}
+proc LLVMDisposeTypeHandle*(TypeHandle: LLVMTypeHandleRef){.cdecl, 
+    dynlib: libname, importc: "LLVMDisposeTypeHandle".}
+  # Operations on all values  
+proc LLVMTypeOf*(Val: LLVMValueRef): LLVMTypeRef{.cdecl, dynlib: libname, 
+    importc: "LLVMTypeOf".}
+proc LLVMGetValueName*(Val: LLVMValueRef): cstring{.cdecl, dynlib: libname, 
+    importc: "LLVMGetValueName".}
+proc LLVMSetValueName*(Val: LLVMValueRef, Name: cstring){.cdecl, 
+    dynlib: libname, importc: "LLVMSetValueName".}
+proc LLVMDumpValue*(Val: LLVMValueRef){.cdecl, dynlib: libname, 
+                                        importc: "LLVMDumpValue".}
+proc LLVMReplaceAllUsesWith*(OldVal: LLVMValueRef, NewVal: LLVMValueRef){.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 LLVMIsAArgument*(Val: LLVMValueRef): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMIsAArgument".}
+proc LLVMIsABasicBlock*(Val: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMIsABasicBlock".}
+proc LLVMIsAInlineAsm*(Val: LLVMValueRef): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMIsAInlineAsm".}
+proc LLVMIsAUser*(Val: LLVMValueRef): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMIsAUser".}
+proc LLVMIsAConstant*(Val: LLVMValueRef): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMIsAConstant".}
+proc LLVMIsAConstantAggregateZero*(Val: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMIsAConstantAggregateZero".}
+proc LLVMIsAConstantArray*(Val: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMIsAConstantArray".}
+proc LLVMIsAConstantExpr*(Val: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMIsAConstantExpr".}
+proc LLVMIsAConstantFP*(Val: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMIsAConstantFP".}
+proc LLVMIsAConstantInt*(Val: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMIsAConstantInt".}
+proc LLVMIsAConstantPointerNull*(Val: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMIsAConstantPointerNull".}
+proc LLVMIsAConstantStruct*(Val: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMIsAConstantStruct".}
+proc LLVMIsAConstantVector*(Val: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMIsAConstantVector".}
+proc LLVMIsAGlobalValue*(Val: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMIsAGlobalValue".}
+proc LLVMIsAFunction*(Val: LLVMValueRef): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMIsAFunction".}
+proc LLVMIsAGlobalAlias*(Val: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMIsAGlobalAlias".}
+proc LLVMIsAGlobalVariable*(Val: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMIsAGlobalVariable".}
+proc LLVMIsAUndefValue*(Val: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMIsAUndefValue".}
+proc LLVMIsAInstruction*(Val: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMIsAInstruction".}
+proc LLVMIsABinaryOperator*(Val: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMIsABinaryOperator".}
+proc LLVMIsACallInst*(Val: LLVMValueRef): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMIsACallInst".}
+proc LLVMIsAIntrinsicInst*(Val: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMIsAIntrinsicInst".}
+proc LLVMIsADbgInfoIntrinsic*(Val: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMIsADbgInfoIntrinsic".}
+proc LLVMIsADbgDeclareInst*(Val: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMIsADbgDeclareInst".}
+proc LLVMIsADbgFuncStartInst*(Val: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMIsADbgFuncStartInst".}
+proc LLVMIsADbgRegionEndInst*(Val: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMIsADbgRegionEndInst".}
+proc LLVMIsADbgRegionStartInst*(Val: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMIsADbgRegionStartInst".}
+proc LLVMIsADbgStopPointInst*(Val: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMIsADbgStopPointInst".}
+proc LLVMIsAEHSelectorInst*(Val: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMIsAEHSelectorInst".}
+proc LLVMIsAMemIntrinsic*(Val: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMIsAMemIntrinsic".}
+proc LLVMIsAMemCpyInst*(Val: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMIsAMemCpyInst".}
+proc LLVMIsAMemMoveInst*(Val: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMIsAMemMoveInst".}
+proc LLVMIsAMemSetInst*(Val: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMIsAMemSetInst".}
+proc LLVMIsACmpInst*(Val: LLVMValueRef): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMIsACmpInst".}
+proc LLVMIsAFCmpInst*(Val: LLVMValueRef): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMIsAFCmpInst".}
+proc LLVMIsAICmpInst*(Val: LLVMValueRef): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMIsAICmpInst".}
+proc LLVMIsAExtractElementInst*(Val: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMIsAExtractElementInst".}
+proc LLVMIsAGetElementPtrInst*(Val: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMIsAGetElementPtrInst".}
+proc LLVMIsAInsertElementInst*(Val: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMIsAInsertElementInst".}
+proc LLVMIsAInsertValueInst*(Val: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMIsAInsertValueInst".}
+proc LLVMIsAPHINode*(Val: LLVMValueRef): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMIsAPHINode".}
+proc LLVMIsASelectInst*(Val: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMIsASelectInst".}
+proc LLVMIsAShuffleVectorInst*(Val: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMIsAShuffleVectorInst".}
+proc LLVMIsAStoreInst*(Val: LLVMValueRef): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMIsAStoreInst".}
+proc LLVMIsATerminatorInst*(Val: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMIsATerminatorInst".}
+proc LLVMIsABranchInst*(Val: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMIsABranchInst".}
+proc LLVMIsAInvokeInst*(Val: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMIsAInvokeInst".}
+proc LLVMIsAReturnInst*(Val: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMIsAReturnInst".}
+proc LLVMIsASwitchInst*(Val: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMIsASwitchInst".}
+proc LLVMIsAUnreachableInst*(Val: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMIsAUnreachableInst".}
+proc LLVMIsAUnwindInst*(Val: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMIsAUnwindInst".}
+proc LLVMIsAUnaryInstruction*(Val: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMIsAUnaryInstruction".}
+proc LLVMIsAAllocationInst*(Val: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMIsAAllocationInst".}
+proc LLVMIsAAllocaInst*(Val: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMIsAAllocaInst".}
+proc LLVMIsACastInst*(Val: LLVMValueRef): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMIsACastInst".}
+proc LLVMIsABitCastInst*(Val: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMIsABitCastInst".}
+proc LLVMIsAFPExtInst*(Val: LLVMValueRef): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMIsAFPExtInst".}
+proc LLVMIsAFPToSIInst*(Val: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMIsAFPToSIInst".}
+proc LLVMIsAFPToUIInst*(Val: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMIsAFPToUIInst".}
+proc LLVMIsAFPTruncInst*(Val: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMIsAFPTruncInst".}
+proc LLVMIsAIntToPtrInst*(Val: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMIsAIntToPtrInst".}
+proc LLVMIsAPtrToIntInst*(Val: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMIsAPtrToIntInst".}
+proc LLVMIsASExtInst*(Val: LLVMValueRef): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMIsASExtInst".}
+proc LLVMIsASIToFPInst*(Val: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMIsASIToFPInst".}
+proc LLVMIsATruncInst*(Val: LLVMValueRef): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMIsATruncInst".}
+proc LLVMIsAUIToFPInst*(Val: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMIsAUIToFPInst".}
+proc LLVMIsAZExtInst*(Val: LLVMValueRef): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMIsAZExtInst".}
+proc LLVMIsAExtractValueInst*(Val: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMIsAExtractValueInst".}
+proc LLVMIsAFreeInst*(Val: LLVMValueRef): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMIsAFreeInst".}
+proc LLVMIsALoadInst*(Val: LLVMValueRef): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMIsALoadInst".}
+proc LLVMIsAVAArgInst*(Val: LLVMValueRef): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMIsAVAArgInst".}
+  # Operations on Uses  
+proc LLVMGetFirstUse*(Val: LLVMValueRef): LLVMUseIteratorRef{.cdecl, 
+    dynlib: libname, importc: "LLVMGetFirstUse".}
+proc LLVMGetNextUse*(U: LLVMUseIteratorRef): LLVMUseIteratorRef{.cdecl, 
+    dynlib: libname, importc: "LLVMGetNextUse".}
+proc LLVMGetUser*(U: LLVMUseIteratorRef): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMGetUser".}
+proc LLVMGetUsedValue*(U: LLVMUseIteratorRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMGetUsedValue".}
+  # Operations on Users  
+proc LLVMGetOperand*(Val: LLVMValueRef, Index: dword): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMGetOperand".}
+  # Operations on constants of any type  
+proc LLVMConstNull*(Ty: LLVMTypeRef): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMConstNull".}
+  # all zeroes  
+proc LLVMConstAllOnes*(Ty: LLVMTypeRef): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMConstAllOnes".}
+  # only for int/vector  
+proc LLVMGetUndef*(Ty: LLVMTypeRef): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMGetUndef".}
+proc LLVMIsConstant*(Val: LLVMValueRef): int32{.cdecl, dynlib: libname, 
+    importc: "LLVMIsConstant".}
+proc LLVMIsNull*(Val: LLVMValueRef): int32{.cdecl, dynlib: libname, 
+    importc: "LLVMIsNull".}
+proc LLVMIsUndef*(Val: LLVMValueRef): int32{.cdecl, dynlib: libname, 
+    importc: "LLVMIsUndef".}
+proc LLVMConstPointerNull*(Ty: LLVMTypeRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMConstPointerNull".}
+  # Operations on scalar constants  
+proc LLVMConstInt*(IntTy: LLVMTypeRef, N: qword, SignExtend: int32): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMConstInt".}
+proc LLVMConstIntOfString*(IntTy: LLVMTypeRef, Text: cstring, Radix: uint8_t): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMConstIntOfString".}
+proc LLVMConstIntOfStringAndSize*(IntTy: LLVMTypeRef, Text: cstring, 
+                                  SLen: dword, Radix: uint8_t): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMConstIntOfStringAndSize".}
+proc LLVMConstReal*(RealTy: LLVMTypeRef, N: float64): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMConstReal".}
+proc LLVMConstRealOfString*(RealTy: LLVMTypeRef, Text: cstring): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMConstRealOfString".}
+proc LLVMConstRealOfStringAndSize*(RealTy: LLVMTypeRef, Text: cstring, 
+                                   SLen: dword): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMConstRealOfStringAndSize".}
+proc LLVMConstIntGetZExtValue*(ConstantVal: LLVMValueRef): qword{.cdecl, 
+    dynlib: libname, importc: "LLVMConstIntGetZExtValue".}
+proc LLVMConstIntGetSExtValue*(ConstantVal: LLVMValueRef): int64{.cdecl, 
+    dynlib: libname, importc: "LLVMConstIntGetSExtValue".}
+  # Operations on composite constants  
+proc LLVMConstStringInContext*(C: LLVMContextRef, Str: cstring, len: dword, 
+                               DontNullTerminate: int32): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMConstStringInContext".}
+proc LLVMConstStructInContext*(C: LLVMContextRef, ConstantVals: pLLVMValueRef, 
+                               Count: dword, isPacked: int32): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMConstStructInContext".}
+proc LLVMConstString*(Str: cstring, len: dword, DontNullTerminate: int32): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMConstString".}
+proc LLVMConstArray*(ElementTy: LLVMTypeRef, ConstantVals: pLLVMValueRef, 
+                     len: dword): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMConstArray".}
+proc LLVMConstStruct*(ConstantVals: pLLVMValueRef, Count: dword, isPacked: int32): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMConstStruct".}
+proc LLVMConstVector*(ScalarConstantVals: pLLVMValueRef, Size: dword): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMConstVector".}
+  # Constant expressions  
+proc LLVMGetConstOpcode*(ConstantVal: LLVMValueRef): LLVMOpcode{.cdecl, 
+    dynlib: libname, importc: "LLVMGetConstOpcode".}
+proc LLVMAlignOf*(Ty: LLVMTypeRef): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMAlignOf".}
+proc LLVMSizeOf*(Ty: LLVMTypeRef): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMSizeOf".}
+proc LLVMConstNeg*(ConstantVal: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMConstNeg".}
+proc LLVMConstFNeg*(ConstantVal: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMConstFNeg".}
+proc LLVMConstNot*(ConstantVal: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMConstNot".}
+proc LLVMConstAdd*(LHSConstant: LLVMValueRef, RHSConstant: LLVMValueRef): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMConstAdd".}
+proc LLVMConstNSWAdd*(LHSConstant: LLVMValueRef, RHSConstant: LLVMValueRef): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMConstNSWAdd".}
+proc LLVMConstFAdd*(LHSConstant: LLVMValueRef, RHSConstant: LLVMValueRef): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMConstFAdd".}
+proc LLVMConstSub*(LHSConstant: LLVMValueRef, RHSConstant: LLVMValueRef): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMConstSub".}
+proc LLVMConstFSub*(LHSConstant: LLVMValueRef, RHSConstant: LLVMValueRef): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMConstFSub".}
+proc LLVMConstMul*(LHSConstant: LLVMValueRef, RHSConstant: LLVMValueRef): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMConstMul".}
+proc LLVMConstFMul*(LHSConstant: LLVMValueRef, RHSConstant: LLVMValueRef): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMConstFMul".}
+proc LLVMConstUDiv*(LHSConstant: LLVMValueRef, RHSConstant: LLVMValueRef): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMConstUDiv".}
+proc LLVMConstSDiv*(LHSConstant: LLVMValueRef, RHSConstant: LLVMValueRef): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMConstSDiv".}
+proc LLVMConstExactSDiv*(LHSConstant: LLVMValueRef, RHSConstant: LLVMValueRef): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMConstExactSDiv".}
+proc LLVMConstFDiv*(LHSConstant: LLVMValueRef, RHSConstant: LLVMValueRef): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMConstFDiv".}
+proc LLVMConstURem*(LHSConstant: LLVMValueRef, RHSConstant: LLVMValueRef): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMConstURem".}
+proc LLVMConstSRem*(LHSConstant: LLVMValueRef, RHSConstant: LLVMValueRef): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMConstSRem".}
+proc LLVMConstFRem*(LHSConstant: LLVMValueRef, RHSConstant: LLVMValueRef): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMConstFRem".}
+proc LLVMConstAnd*(LHSConstant: LLVMValueRef, RHSConstant: LLVMValueRef): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMConstAnd".}
+proc LLVMConstOr*(LHSConstant: LLVMValueRef, RHSConstant: LLVMValueRef): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMConstOr".}
+proc LLVMConstXor*(LHSConstant: LLVMValueRef, RHSConstant: LLVMValueRef): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMConstXor".}
+proc LLVMConstICmp*(Predicate: LLVMIntPredicate, LHSConstant: LLVMValueRef, 
+                    RHSConstant: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMConstICmp".}
+proc LLVMConstFCmp*(Predicate: LLVMRealPredicate, LHSConstant: LLVMValueRef, 
+                    RHSConstant: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMConstFCmp".}
+proc LLVMConstShl*(LHSConstant: LLVMValueRef, RHSConstant: LLVMValueRef): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMConstShl".}
+proc LLVMConstLShr*(LHSConstant: LLVMValueRef, RHSConstant: LLVMValueRef): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMConstLShr".}
+proc LLVMConstAShr*(LHSConstant: LLVMValueRef, RHSConstant: LLVMValueRef): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMConstAShr".}
+proc LLVMConstGEP*(ConstantVal: LLVMValueRef, ConstantIndices: pLLVMValueRef, 
+                   NumIndices: dword): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMConstGEP".}
+proc LLVMConstInBoundsGEP*(ConstantVal: LLVMValueRef, 
+                           ConstantIndices: pLLVMValueRef, NumIndices: dword): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMConstInBoundsGEP".}
+proc LLVMConstTrunc*(ConstantVal: LLVMValueRef, ToType: LLVMTypeRef): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMConstTrunc".}
+proc LLVMConstSExt*(ConstantVal: LLVMValueRef, ToType: LLVMTypeRef): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMConstSExt".}
+proc LLVMConstZExt*(ConstantVal: LLVMValueRef, ToType: LLVMTypeRef): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMConstZExt".}
+proc LLVMConstFPTrunc*(ConstantVal: LLVMValueRef, ToType: LLVMTypeRef): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMConstFPTrunc".}
+proc LLVMConstFPExt*(ConstantVal: LLVMValueRef, ToType: LLVMTypeRef): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMConstFPExt".}
+proc LLVMConstUIToFP*(ConstantVal: LLVMValueRef, ToType: LLVMTypeRef): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMConstUIToFP".}
+proc LLVMConstSIToFP*(ConstantVal: LLVMValueRef, ToType: LLVMTypeRef): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMConstSIToFP".}
+proc LLVMConstFPToUI*(ConstantVal: LLVMValueRef, ToType: LLVMTypeRef): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMConstFPToUI".}
+proc LLVMConstFPToSI*(ConstantVal: LLVMValueRef, ToType: LLVMTypeRef): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMConstFPToSI".}
+proc LLVMConstPtrToInt*(ConstantVal: LLVMValueRef, ToType: LLVMTypeRef): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMConstPtrToInt".}
+proc LLVMConstIntToPtr*(ConstantVal: LLVMValueRef, ToType: LLVMTypeRef): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMConstIntToPtr".}
+proc LLVMConstBitCast*(ConstantVal: LLVMValueRef, ToType: LLVMTypeRef): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMConstBitCast".}
+proc LLVMConstZExtOrBitCast*(ConstantVal: LLVMValueRef, ToType: LLVMTypeRef): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMConstZExtOrBitCast".}
+proc LLVMConstSExtOrBitCast*(ConstantVal: LLVMValueRef, ToType: LLVMTypeRef): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMConstSExtOrBitCast".}
+proc LLVMConstTruncOrBitCast*(ConstantVal: LLVMValueRef, ToType: LLVMTypeRef): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMConstTruncOrBitCast".}
+proc LLVMConstPointerCast*(ConstantVal: LLVMValueRef, ToType: LLVMTypeRef): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMConstPointerCast".}
+proc LLVMConstIntCast*(ConstantVal: LLVMValueRef, ToType: LLVMTypeRef, 
+                       isSigned: dword): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMConstIntCast".}
+proc LLVMConstFPCast*(ConstantVal: LLVMValueRef, ToType: LLVMTypeRef): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMConstFPCast".}
+proc LLVMConstSelect*(ConstantCondition: LLVMValueRef, 
+                      ConstantIfTrue: LLVMValueRef, 
+                      ConstantIfFalse: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMConstSelect".}
+proc LLVMConstExtractElement*(VectorConstant: LLVMValueRef, 
+                              IndexConstant: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMConstExtractElement".}
+proc LLVMConstInsertElement*(VectorConstant: LLVMValueRef, 
+                             ElementValueConstant: LLVMValueRef, 
+                             IndexConstant: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMConstInsertElement".}
+proc LLVMConstShuffleVector*(VectorAConstant: LLVMValueRef, 
+                             VectorBConstant: LLVMValueRef, 
+                             MaskConstant: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMConstShuffleVector".}
+proc LLVMConstExtractValue*(AggConstant: LLVMValueRef, IdxList: pdword, 
+                            NumIdx: dword): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMConstExtractValue".}
+proc LLVMConstInsertValue*(AggConstant: LLVMValueRef, 
+                           ElementValueConstant: LLVMValueRef, IdxList: pdword, 
+                           NumIdx: dword): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMConstInsertValue".}
+proc LLVMConstInlineAsm*(Ty: LLVMTypeRef, AsmString: cstring, 
+                         Constraints: cstring, HasSideEffects: int32): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMConstInlineAsm".}
+  # Operations on global variables, functions, and aliases (globals)  
+proc LLVMGetGlobalParent*(Global: LLVMValueRef): LLVMModuleRef{.cdecl, 
+    dynlib: libname, importc: "LLVMGetGlobalParent".}
+proc LLVMIsDeclaration*(Global: LLVMValueRef): int32{.cdecl, dynlib: libname, 
+    importc: "LLVMIsDeclaration".}
+proc LLVMGetLinkage*(Global: LLVMValueRef): LLVMLinkage{.cdecl, dynlib: libname, 
+    importc: "LLVMGetLinkage".}
+proc LLVMSetLinkage*(Global: LLVMValueRef, Linkage: LLVMLinkage){.cdecl, 
+    dynlib: libname, importc: "LLVMSetLinkage".}
+proc LLVMGetSection*(Global: LLVMValueRef): cstring{.cdecl, dynlib: libname, 
+    importc: "LLVMGetSection".}
+proc LLVMSetSection*(Global: LLVMValueRef, Section: cstring){.cdecl, 
+    dynlib: libname, importc: "LLVMSetSection".}
+proc LLVMGetVisibility*(Global: LLVMValueRef): LLVMVisibility{.cdecl, 
+    dynlib: libname, importc: "LLVMGetVisibility".}
+proc LLVMSetVisibility*(Global: LLVMValueRef, Viz: LLVMVisibility){.cdecl, 
+    dynlib: libname, importc: "LLVMSetVisibility".}
+proc LLVMGetAlignment*(Global: LLVMValueRef): dword{.cdecl, dynlib: libname, 
+    importc: "LLVMGetAlignment".}
+proc LLVMSetAlignment*(Global: LLVMValueRef, Bytes: dword){.cdecl, 
+    dynlib: libname, importc: "LLVMSetAlignment".}
+  # Operations on global variables  
+proc LLVMAddGlobal*(M: LLVMModuleRef, Ty: LLVMTypeRef, Name: cstring): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMAddGlobal".}
+proc LLVMGetNamedGlobal*(M: LLVMModuleRef, Name: cstring): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMGetNamedGlobal".}
+proc LLVMGetFirstGlobal*(M: LLVMModuleRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMGetFirstGlobal".}
+proc LLVMGetLastGlobal*(M: LLVMModuleRef): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMGetLastGlobal".}
+proc LLVMGetNextGlobal*(GlobalVar: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMGetNextGlobal".}
+proc LLVMGetPreviousGlobal*(GlobalVar: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMGetPreviousGlobal".}
+proc LLVMDeleteGlobal*(GlobalVar: LLVMValueRef){.cdecl, dynlib: libname, 
+    importc: "LLVMDeleteGlobal".}
+proc LLVMGetInitializer*(GlobalVar: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMGetInitializer".}
+proc LLVMSetInitializer*(GlobalVar: LLVMValueRef, ConstantVal: LLVMValueRef){.
+    cdecl, dynlib: libname, importc: "LLVMSetInitializer".}
+proc LLVMIsThreadLocal*(GlobalVar: LLVMValueRef): int32{.cdecl, dynlib: libname, 
+    importc: "LLVMIsThreadLocal".}
+proc LLVMSetThreadLocal*(GlobalVar: LLVMValueRef, IsThreadLocal: int32){.cdecl, 
+    dynlib: libname, importc: "LLVMSetThreadLocal".}
+proc LLVMIsGlobalConstant*(GlobalVar: LLVMValueRef): int32{.cdecl, 
+    dynlib: libname, importc: "LLVMIsGlobalConstant".}
+proc LLVMSetGlobalConstant*(GlobalVar: LLVMValueRef, IsConstant: int32){.cdecl, 
+    dynlib: libname, importc: "LLVMSetGlobalConstant".}
+  # Operations on aliases  
+proc LLVMAddAlias*(M: LLVMModuleRef, Ty: LLVMTypeRef, Aliasee: LLVMValueRef, 
+                   Name: cstring): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMAddAlias".}
+  # Operations on functions  
+proc LLVMAddFunction*(M: LLVMModuleRef, Name: cstring, FunctionTy: LLVMTypeRef): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMAddFunction".}
+proc LLVMGetNamedFunction*(M: LLVMModuleRef, Name: cstring): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMGetNamedFunction".}
+proc LLVMGetFirstFunction*(M: LLVMModuleRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMGetFirstFunction".}
+proc LLVMGetLastFunction*(M: LLVMModuleRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMGetLastFunction".}
+proc LLVMGetNextFunction*(Fn: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMGetNextFunction".}
+proc LLVMGetPreviousFunction*(Fn: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMGetPreviousFunction".}
+proc LLVMDeleteFunction*(Fn: LLVMValueRef){.cdecl, dynlib: libname, 
+    importc: "LLVMDeleteFunction".}
+proc LLVMGetIntrinsicID*(Fn: LLVMValueRef): dword{.cdecl, dynlib: libname, 
+    importc: "LLVMGetIntrinsicID".}
+proc LLVMGetFunctionCallConv*(Fn: LLVMValueRef): dword{.cdecl, dynlib: libname, 
+    importc: "LLVMGetFunctionCallConv".}
+proc LLVMSetFunctionCallConv*(Fn: LLVMValueRef, CC: dword){.cdecl, 
+    dynlib: libname, importc: "LLVMSetFunctionCallConv".}
+proc LLVMGetGC*(Fn: LLVMValueRef): cstring{.cdecl, dynlib: libname, 
+    importc: "LLVMGetGC".}
+proc LLVMSetGC*(Fn: LLVMValueRef, Name: cstring){.cdecl, dynlib: libname, 
+    importc: "LLVMSetGC".}
+proc LLVMAddFunctionAttr*(Fn: LLVMValueRef, PA: LLVMAttribute){.cdecl, 
+    dynlib: libname, importc: "LLVMAddFunctionAttr".}
+proc LLVMGetFunctionAttr*(Fn: LLVMValueRef): LLVMAttribute{.cdecl, 
+    dynlib: libname, importc: "LLVMGetFunctionAttr".}
+proc LLVMRemoveFunctionAttr*(Fn: LLVMValueRef, PA: LLVMAttribute){.cdecl, 
+    dynlib: libname, importc: "LLVMRemoveFunctionAttr".}
+  # Operations on parameters  
+proc LLVMCountParams*(Fn: LLVMValueRef): dword{.cdecl, dynlib: libname, 
+    importc: "LLVMCountParams".}
+proc LLVMGetParams*(Fn: LLVMValueRef, Params: pLLVMValueRef){.cdecl, 
+    dynlib: libname, importc: "LLVMGetParams".}
+proc LLVMGetParam*(Fn: LLVMValueRef, Index: dword): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMGetParam".}
+proc LLVMGetParamParent*(Inst: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMGetParamParent".}
+proc LLVMGetFirstParam*(Fn: LLVMValueRef): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMGetFirstParam".}
+proc LLVMGetLastParam*(Fn: LLVMValueRef): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMGetLastParam".}
+proc LLVMGetNextParam*(Arg: LLVMValueRef): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMGetNextParam".}
+proc LLVMGetPreviousParam*(Arg: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMGetPreviousParam".}
+proc LLVMAddAttribute*(Arg: LLVMValueRef, PA: LLVMAttribute){.cdecl, 
+    dynlib: libname, importc: "LLVMAddAttribute".}
+proc LLVMRemoveAttribute*(Arg: LLVMValueRef, PA: LLVMAttribute){.cdecl, 
+    dynlib: libname, importc: "LLVMRemoveAttribute".}
+proc LLVMGetAttribute*(Arg: LLVMValueRef): LLVMAttribute{.cdecl, 
+    dynlib: libname, importc: "LLVMGetAttribute".}
+proc LLVMSetParamAlignment*(Arg: LLVMValueRef, align: dword){.cdecl, 
+    dynlib: libname, importc: "LLVMSetParamAlignment".}
+  # Operations on basic blocks  
+proc LLVMBasicBlockAsValue*(BB: LLVMBasicBlockRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMBasicBlockAsValue".}
+proc LLVMValueIsBasicBlock*(Val: LLVMValueRef): int32{.cdecl, dynlib: libname, 
+    importc: "LLVMValueIsBasicBlock".}
+proc LLVMValueAsBasicBlock*(Val: LLVMValueRef): LLVMBasicBlockRef{.cdecl, 
+    dynlib: libname, importc: "LLVMValueAsBasicBlock".}
+proc LLVMGetBasicBlockParent*(BB: LLVMBasicBlockRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMGetBasicBlockParent".}
+proc LLVMCountBasicBlocks*(Fn: LLVMValueRef): dword{.cdecl, dynlib: libname, 
+    importc: "LLVMCountBasicBlocks".}
+proc LLVMGetBasicBlocks*(Fn: LLVMValueRef, BasicBlocks: pLLVMBasicBlockRef){.
+    cdecl, dynlib: libname, importc: "LLVMGetBasicBlocks".}
+proc LLVMGetFirstBasicBlock*(Fn: LLVMValueRef): LLVMBasicBlockRef{.cdecl, 
+    dynlib: libname, importc: "LLVMGetFirstBasicBlock".}
+proc LLVMGetLastBasicBlock*(Fn: LLVMValueRef): LLVMBasicBlockRef{.cdecl, 
+    dynlib: libname, importc: "LLVMGetLastBasicBlock".}
+proc LLVMGetNextBasicBlock*(BB: LLVMBasicBlockRef): LLVMBasicBlockRef{.cdecl, 
+    dynlib: libname, importc: "LLVMGetNextBasicBlock".}
+proc LLVMGetPreviousBasicBlock*(BB: LLVMBasicBlockRef): LLVMBasicBlockRef{.
+    cdecl, dynlib: libname, importc: "LLVMGetPreviousBasicBlock".}
+proc LLVMGetEntryBasicBlock*(Fn: LLVMValueRef): LLVMBasicBlockRef{.cdecl, 
+    dynlib: libname, importc: "LLVMGetEntryBasicBlock".}
+proc LLVMAppendBasicBlockInContext*(C: LLVMContextRef, Fn: LLVMValueRef, 
+                                    Name: cstring): LLVMBasicBlockRef{.cdecl, 
+    dynlib: libname, importc: "LLVMAppendBasicBlockInContext".}
+proc LLVMInsertBasicBlockInContext*(C: LLVMContextRef, BB: LLVMBasicBlockRef, 
+                                    Name: cstring): LLVMBasicBlockRef{.cdecl, 
+    dynlib: libname, importc: "LLVMInsertBasicBlockInContext".}
+proc LLVMAppendBasicBlock*(Fn: LLVMValueRef, Name: cstring): LLVMBasicBlockRef{.
+    cdecl, dynlib: libname, importc: "LLVMAppendBasicBlock".}
+proc LLVMInsertBasicBlock*(InsertBeforeBB: LLVMBasicBlockRef, Name: cstring): LLVMBasicBlockRef{.
+    cdecl, dynlib: libname, importc: "LLVMInsertBasicBlock".}
+proc LLVMDeleteBasicBlock*(BB: LLVMBasicBlockRef){.cdecl, dynlib: libname, 
+    importc: "LLVMDeleteBasicBlock".}
+  # Operations on instructions  
+proc LLVMGetInstructionParent*(Inst: LLVMValueRef): LLVMBasicBlockRef{.cdecl, 
+    dynlib: libname, importc: "LLVMGetInstructionParent".}
+proc LLVMGetFirstInstruction*(BB: LLVMBasicBlockRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMGetFirstInstruction".}
+proc LLVMGetLastInstruction*(BB: LLVMBasicBlockRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMGetLastInstruction".}
+proc LLVMGetNextInstruction*(Inst: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMGetNextInstruction".}
+proc LLVMGetPreviousInstruction*(Inst: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMGetPreviousInstruction".}
+  # Operations on call sites  
+proc LLVMSetInstructionCallConv*(Instr: LLVMValueRef, CC: dword){.cdecl, 
+    dynlib: libname, importc: "LLVMSetInstructionCallConv".}
+proc LLVMGetInstructionCallConv*(Instr: LLVMValueRef): dword{.cdecl, 
+    dynlib: libname, importc: "LLVMGetInstructionCallConv".}
+proc LLVMAddInstrAttribute*(Instr: LLVMValueRef, index: dword, 
+                            para3: LLVMAttribute){.cdecl, dynlib: libname, 
+    importc: "LLVMAddInstrAttribute".}
+proc LLVMRemoveInstrAttribute*(Instr: LLVMValueRef, index: dword, 
+                               para3: LLVMAttribute){.cdecl, dynlib: libname, 
+    importc: "LLVMRemoveInstrAttribute".}
+proc LLVMSetInstrParamAlignment*(Instr: LLVMValueRef, index: dword, align: dword){.
+    cdecl, dynlib: libname, importc: "LLVMSetInstrParamAlignment".}
+  # Operations on call instructions (only)  
+proc LLVMIsTailCall*(CallInst: LLVMValueRef): int32{.cdecl, dynlib: libname, 
+    importc: "LLVMIsTailCall".}
+proc LLVMSetTailCall*(CallInst: LLVMValueRef, IsTailCall: int32){.cdecl, 
+    dynlib: libname, importc: "LLVMSetTailCall".}
+  # Operations on phi nodes  
+proc LLVMAddIncoming*(PhiNode: LLVMValueRef, IncomingValues: pLLVMValueRef, 
+                      IncomingBlocks: pLLVMBasicBlockRef, Count: dword){.cdecl, 
+    dynlib: libname, importc: "LLVMAddIncoming".}
+proc LLVMCountIncoming*(PhiNode: LLVMValueRef): dword{.cdecl, dynlib: libname, 
+    importc: "LLVMCountIncoming".}
+proc LLVMGetIncomingValue*(PhiNode: LLVMValueRef, Index: dword): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMGetIncomingValue".}
+proc LLVMGetIncomingBlock*(PhiNode: LLVMValueRef, Index: dword): LLVMBasicBlockRef{.
+    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 LLVMCreateBuilderInContext*(C: LLVMContextRef): LLVMBuilderRef{.cdecl, 
+    dynlib: libname, importc: "LLVMCreateBuilderInContext".}
+proc LLVMCreateBuilder*(): LLVMBuilderRef{.cdecl, dynlib: libname, 
+    importc: "LLVMCreateBuilder".}
+proc LLVMPositionBuilder*(Builder: LLVMBuilderRef, theBlock: LLVMBasicBlockRef, 
+                          Instr: LLVMValueRef){.cdecl, dynlib: libname, 
+    importc: "LLVMPositionBuilder".}
+proc LLVMPositionBuilderBefore*(Builder: LLVMBuilderRef, Instr: LLVMValueRef){.
+    cdecl, dynlib: libname, importc: "LLVMPositionBuilderBefore".}
+proc LLVMPositionBuilderAtEnd*(Builder: LLVMBuilderRef, theBlock: LLVMBasicBlockRef){.
+    cdecl, dynlib: libname, importc: "LLVMPositionBuilderAtEnd".}
+proc LLVMGetInsertBlock*(Builder: LLVMBuilderRef): LLVMBasicBlockRef{.cdecl, 
+    dynlib: libname, importc: "LLVMGetInsertBlock".}
+proc LLVMClearInsertionPosition*(Builder: LLVMBuilderRef){.cdecl, 
+    dynlib: libname, importc: "LLVMClearInsertionPosition".}
+proc LLVMInsertIntoBuilder*(Builder: LLVMBuilderRef, Instr: LLVMValueRef){.
+    cdecl, dynlib: libname, importc: "LLVMInsertIntoBuilder".}
+proc LLVMInsertIntoBuilderWithName*(Builder: LLVMBuilderRef, 
+                                    Instr: LLVMValueRef, Name: cstring){.cdecl, 
+    dynlib: libname, importc: "LLVMInsertIntoBuilderWithName".}
+proc LLVMDisposeBuilder*(Builder: LLVMBuilderRef){.cdecl, dynlib: libname, 
+    importc: "LLVMDisposeBuilder".}
+  # Terminators  
+proc LLVMBuildRetVoid*(para1: LLVMBuilderRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMBuildRetVoid".}
+proc LLVMBuildRet*(para1: LLVMBuilderRef, V: LLVMValueRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMBuildRet".}
+proc LLVMBuildAggregateRet*(para1: LLVMBuilderRef, RetVals: pLLVMValueRef, 
+                            N: dword): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMBuildAggregateRet".}
+proc LLVMBuildBr*(para1: LLVMBuilderRef, Dest: LLVMBasicBlockRef): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMBuildBr".}
+proc LLVMBuildCondBr*(para1: LLVMBuilderRef, Cond: LLVMValueRef, 
+                      ThenBranch: LLVMBasicBlockRef, 
+                      ElseBranch: LLVMBasicBlockRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMBuildCondBr".}
+proc LLVMBuildSwitch*(para1: LLVMBuilderRef, V: LLVMValueRef, 
+                      ElseBranch: LLVMBasicBlockRef, NumCases: dword): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMBuildSwitch".}
+proc LLVMBuildInvoke*(para1: LLVMBuilderRef, Fn: LLVMValueRef, 
+                      Args: pLLVMValueRef, NumArgs: dword, 
+                      ThenBranch: LLVMBasicBlockRef, Catch: LLVMBasicBlockRef, 
+                      Name: cstring): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMBuildInvoke".}
+proc LLVMBuildUnwind*(para1: LLVMBuilderRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMBuildUnwind".}
+proc LLVMBuildUnreachable*(para1: LLVMBuilderRef): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMBuildUnreachable".}
+  # Add a case to the switch instruction  
+proc LLVMAddCase*(Switch: LLVMValueRef, OnVal: LLVMValueRef, 
+                  Dest: LLVMBasicBlockRef){.cdecl, dynlib: libname, 
+    importc: "LLVMAddCase".}
+  # Arithmetic  
+proc LLVMBuildAdd*(para1: LLVMBuilderRef, LHS: LLVMValueRef, RHS: LLVMValueRef, 
+                   Name: cstring): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMBuildAdd".}
+proc LLVMBuildNSWAdd*(para1: LLVMBuilderRef, LHS: LLVMValueRef, 
+                      RHS: LLVMValueRef, Name: cstring): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMBuildNSWAdd".}
+proc LLVMBuildFAdd*(para1: LLVMBuilderRef, LHS: LLVMValueRef, RHS: LLVMValueRef, 
+                    Name: cstring): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMBuildFAdd".}
+proc LLVMBuildSub*(para1: LLVMBuilderRef, LHS: LLVMValueRef, RHS: LLVMValueRef, 
+                   Name: cstring): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMBuildSub".}
+proc LLVMBuildFSub*(para1: LLVMBuilderRef, LHS: LLVMValueRef, RHS: LLVMValueRef, 
+                    Name: cstring): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMBuildFSub".}
+proc LLVMBuildMul*(para1: LLVMBuilderRef, LHS: LLVMValueRef, RHS: LLVMValueRef, 
+                   Name: cstring): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMBuildMul".}
+proc LLVMBuildFMul*(para1: LLVMBuilderRef, LHS: LLVMValueRef, RHS: LLVMValueRef, 
+                    Name: cstring): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMBuildFMul".}
+proc LLVMBuildUDiv*(para1: LLVMBuilderRef, LHS: LLVMValueRef, RHS: LLVMValueRef, 
+                    Name: cstring): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMBuildUDiv".}
+proc LLVMBuildSDiv*(para1: LLVMBuilderRef, LHS: LLVMValueRef, RHS: LLVMValueRef, 
+                    Name: cstring): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMBuildSDiv".}
+proc LLVMBuildExactSDiv*(para1: LLVMBuilderRef, LHS: LLVMValueRef, 
+                         RHS: LLVMValueRef, Name: cstring): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMBuildExactSDiv".}
+proc LLVMBuildFDiv*(para1: LLVMBuilderRef, LHS: LLVMValueRef, RHS: LLVMValueRef, 
+                    Name: cstring): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMBuildFDiv".}
+proc LLVMBuildURem*(para1: LLVMBuilderRef, LHS: LLVMValueRef, RHS: LLVMValueRef, 
+                    Name: cstring): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMBuildURem".}
+proc LLVMBuildSRem*(para1: LLVMBuilderRef, LHS: LLVMValueRef, RHS: LLVMValueRef, 
+                    Name: cstring): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMBuildSRem".}
+proc LLVMBuildFRem*(para1: LLVMBuilderRef, LHS: LLVMValueRef, RHS: LLVMValueRef, 
+                    Name: cstring): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMBuildFRem".}
+proc LLVMBuildShl*(para1: LLVMBuilderRef, LHS: LLVMValueRef, RHS: LLVMValueRef, 
+                   Name: cstring): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMBuildShl".}
+proc LLVMBuildLShr*(para1: LLVMBuilderRef, LHS: LLVMValueRef, RHS: LLVMValueRef, 
+                    Name: cstring): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMBuildLShr".}
+proc LLVMBuildAShr*(para1: LLVMBuilderRef, LHS: LLVMValueRef, RHS: LLVMValueRef, 
+                    Name: cstring): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMBuildAShr".}
+proc LLVMBuildAnd*(para1: LLVMBuilderRef, LHS: LLVMValueRef, RHS: LLVMValueRef, 
+                   Name: cstring): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMBuildAnd".}
+proc LLVMBuildOr*(para1: LLVMBuilderRef, LHS: LLVMValueRef, RHS: LLVMValueRef, 
+                  Name: cstring): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMBuildOr".}
+proc LLVMBuildXor*(para1: LLVMBuilderRef, LHS: LLVMValueRef, RHS: LLVMValueRef, 
+                   Name: cstring): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMBuildXor".}
+proc LLVMBuildNeg*(para1: LLVMBuilderRef, V: LLVMValueRef, Name: cstring): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMBuildNeg".}
+proc LLVMBuildFNeg*(para1: LLVMBuilderRef, V: LLVMValueRef, Name: cstring): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMBuildFNeg".}
+proc LLVMBuildNot*(para1: LLVMBuilderRef, V: LLVMValueRef, Name: cstring): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMBuildNot".}
+  # Memory  
+proc LLVMBuildMalloc*(para1: LLVMBuilderRef, Ty: LLVMTypeRef, Name: cstring): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMBuildMalloc".}
+proc LLVMBuildArrayMalloc*(para1: LLVMBuilderRef, Ty: LLVMTypeRef, 
+                           Val: LLVMValueRef, Name: cstring): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMBuildArrayMalloc".}
+proc LLVMBuildAlloca*(para1: LLVMBuilderRef, Ty: LLVMTypeRef, Name: cstring): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMBuildAlloca".}
+proc LLVMBuildArrayAlloca*(para1: LLVMBuilderRef, Ty: LLVMTypeRef, 
+                           Val: LLVMValueRef, Name: cstring): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMBuildArrayAlloca".}
+proc LLVMBuildFree*(para1: LLVMBuilderRef, PointerVal: LLVMValueRef): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMBuildFree".}
+proc LLVMBuildLoad*(para1: LLVMBuilderRef, PointerVal: LLVMValueRef, 
+                    Name: cstring): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMBuildLoad".}
+proc LLVMBuildStore*(para1: LLVMBuilderRef, Val: LLVMValueRef,
+                     thePtr: LLVMValueRef): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMBuildStore".}
+proc LLVMBuildGEP*(B: LLVMBuilderRef, Pointer: LLVMValueRef, 
+                   Indices: pLLVMValueRef, NumIndices: dword, Name: cstring): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMBuildGEP".}
+proc LLVMBuildInBoundsGEP*(B: LLVMBuilderRef, Pointer: LLVMValueRef, 
+                           Indices: pLLVMValueRef, NumIndices: dword, 
+                           Name: cstring): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMBuildInBoundsGEP".}
+proc LLVMBuildStructGEP*(B: LLVMBuilderRef, Pointer: LLVMValueRef, Idx: dword, 
+                         Name: cstring): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMBuildStructGEP".}
+proc LLVMBuildGlobalString*(B: LLVMBuilderRef, Str: cstring, Name: cstring): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMBuildGlobalString".}
+proc LLVMBuildGlobalStringPtr*(B: LLVMBuilderRef, Str: cstring, Name: cstring): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMBuildGlobalStringPtr".}
+  # Casts  
+proc LLVMBuildTrunc*(para1: LLVMBuilderRef, Val: LLVMValueRef, 
+                     DestTy: LLVMTypeRef, Name: cstring): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMBuildTrunc".}
+proc LLVMBuildZExt*(para1: LLVMBuilderRef, Val: LLVMValueRef, 
+                    DestTy: LLVMTypeRef, Name: cstring): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMBuildZExt".}
+proc LLVMBuildSExt*(para1: LLVMBuilderRef, Val: LLVMValueRef, 
+                    DestTy: LLVMTypeRef, Name: cstring): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMBuildSExt".}
+proc LLVMBuildFPToUI*(para1: LLVMBuilderRef, Val: LLVMValueRef, 
+                      DestTy: LLVMTypeRef, Name: cstring): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMBuildFPToUI".}
+proc LLVMBuildFPToSI*(para1: LLVMBuilderRef, Val: LLVMValueRef, 
+                      DestTy: LLVMTypeRef, Name: cstring): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMBuildFPToSI".}
+proc LLVMBuildUIToFP*(para1: LLVMBuilderRef, Val: LLVMValueRef, 
+                      DestTy: LLVMTypeRef, Name: cstring): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMBuildUIToFP".}
+proc LLVMBuildSIToFP*(para1: LLVMBuilderRef, Val: LLVMValueRef, 
+                      DestTy: LLVMTypeRef, Name: cstring): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMBuildSIToFP".}
+proc LLVMBuildFPTrunc*(para1: LLVMBuilderRef, Val: LLVMValueRef, 
+                       DestTy: LLVMTypeRef, Name: cstring): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMBuildFPTrunc".}
+proc LLVMBuildFPExt*(para1: LLVMBuilderRef, Val: LLVMValueRef, 
+                     DestTy: LLVMTypeRef, Name: cstring): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMBuildFPExt".}
+proc LLVMBuildPtrToInt*(para1: LLVMBuilderRef, Val: LLVMValueRef, 
+                        DestTy: LLVMTypeRef, Name: cstring): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMBuildPtrToInt".}
+proc LLVMBuildIntToPtr*(para1: LLVMBuilderRef, Val: LLVMValueRef, 
+                        DestTy: LLVMTypeRef, Name: cstring): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMBuildIntToPtr".}
+proc LLVMBuildBitCast*(para1: LLVMBuilderRef, Val: LLVMValueRef, 
+                       DestTy: LLVMTypeRef, Name: cstring): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMBuildBitCast".}
+proc LLVMBuildZExtOrBitCast*(para1: LLVMBuilderRef, Val: LLVMValueRef, 
+                             DestTy: LLVMTypeRef, Name: cstring): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMBuildZExtOrBitCast".}
+proc LLVMBuildSExtOrBitCast*(para1: LLVMBuilderRef, Val: LLVMValueRef, 
+                             DestTy: LLVMTypeRef, Name: cstring): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMBuildSExtOrBitCast".}
+proc LLVMBuildTruncOrBitCast*(para1: LLVMBuilderRef, Val: LLVMValueRef, 
+                              DestTy: LLVMTypeRef, Name: cstring): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMBuildTruncOrBitCast".}
+proc LLVMBuildPointerCast*(para1: LLVMBuilderRef, Val: LLVMValueRef, 
+                           DestTy: LLVMTypeRef, Name: cstring): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMBuildPointerCast".}
+proc LLVMBuildIntCast*(para1: LLVMBuilderRef, Val: LLVMValueRef, 
+                       DestTy: LLVMTypeRef, Name: cstring): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMBuildIntCast".}
+proc LLVMBuildFPCast*(para1: LLVMBuilderRef, Val: LLVMValueRef, 
+                      DestTy: LLVMTypeRef, Name: cstring): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMBuildFPCast".}
+  # Comparisons  
+proc LLVMBuildICmp*(para1: LLVMBuilderRef, Op: LLVMIntPredicate, 
+                    LHS: LLVMValueRef, RHS: LLVMValueRef, Name: cstring): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMBuildICmp".}
+proc LLVMBuildFCmp*(para1: LLVMBuilderRef, Op: LLVMRealPredicate, 
+                    LHS: LLVMValueRef, RHS: LLVMValueRef, Name: cstring): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMBuildFCmp".}
+  # Miscellaneous instructions  
+proc LLVMBuildPhi*(para1: LLVMBuilderRef, Ty: LLVMTypeRef, Name: cstring): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMBuildPhi".}
+proc LLVMBuildCall*(para1: LLVMBuilderRef, Fn: LLVMValueRef, 
+                    Args: pLLVMValueRef, NumArgs: dword, Name: cstring): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMBuildCall".}
+proc LLVMBuildSelect*(para1: LLVMBuilderRef, Cond: LLVMValueRef, 
+                      ThenBranch: LLVMValueRef, ElseBranch: LLVMValueRef, 
+                      Name: cstring): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMBuildSelect".}
+proc LLVMBuildVAArg*(para1: LLVMBuilderRef, List: LLVMValueRef, Ty: LLVMTypeRef, 
+                     Name: cstring): LLVMValueRef{.cdecl, dynlib: libname, 
+    importc: "LLVMBuildVAArg".}
+proc LLVMBuildExtractElement*(para1: LLVMBuilderRef, VecVal: LLVMValueRef, 
+                              Index: LLVMValueRef, Name: cstring): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMBuildExtractElement".}
+proc LLVMBuildInsertElement*(para1: LLVMBuilderRef, VecVal: LLVMValueRef, 
+                             EltVal: LLVMValueRef, Index: LLVMValueRef, 
+                             Name: cstring): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMBuildInsertElement".}
+proc LLVMBuildShuffleVector*(para1: LLVMBuilderRef, V1: LLVMValueRef, 
+                             V2: LLVMValueRef, Mask: LLVMValueRef, Name: cstring): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMBuildShuffleVector".}
+proc LLVMBuildExtractValue*(para1: LLVMBuilderRef, AggVal: LLVMValueRef, 
+                            Index: dword, Name: cstring): LLVMValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMBuildExtractValue".}
+proc LLVMBuildInsertValue*(para1: LLVMBuilderRef, AggVal: LLVMValueRef, 
+                           EltVal: LLVMValueRef, Index: dword, Name: cstring): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMBuildInsertValue".}
+proc LLVMBuildIsNull*(para1: LLVMBuilderRef, Val: LLVMValueRef, Name: cstring): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMBuildIsNull".}
+proc LLVMBuildIsNotNull*(para1: LLVMBuilderRef, Val: LLVMValueRef, Name: cstring): LLVMValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMBuildIsNotNull".}
+proc LLVMBuildPtrDiff*(para1: LLVMBuilderRef, LHS: LLVMValueRef, 
+                       RHS: LLVMValueRef, Name: cstring): LLVMValueRef{.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 LLVMCreateModuleProviderForExistingModule*(M: LLVMModuleRef): LLVMModuleProviderRef{.
+    cdecl, dynlib: libname, importc: "LLVMCreateModuleProviderForExistingModule".}
+  # Destroys the module provider MP as well as the contained module.
+  # * See the destructor llvm::ModuleProvider::~ModuleProvider.
+  #  
+proc LLVMDisposeModuleProvider*(MP: LLVMModuleProviderRef){.cdecl, 
+    dynlib: libname, importc: "LLVMDisposeModuleProvider".}
+  #===-- Memory buffers ----------------------------------------------------=== 
+proc LLVMCreateMemoryBufferWithContentsOfFile*(Path: cstring, 
+    OutMemBuf: pLLVMMemoryBufferRef, OutMessage: Ppchar): int32{.cdecl, 
+    dynlib: libname, importc: "LLVMCreateMemoryBufferWithContentsOfFile".}
+proc LLVMCreateMemoryBufferWithSTDIN*(OutMemBuf: pLLVMMemoryBufferRef, 
+                                      OutMessage: Ppchar): int32{.cdecl, 
+    dynlib: libname, importc: "LLVMCreateMemoryBufferWithSTDIN".}
+proc LLVMDisposeMemoryBuffer*(MemBuf: LLVMMemoryBufferRef){.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 LLVMCreatePassManager*(): LLVMPassManagerRef{.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 LLVMCreateFunctionPassManager*(MP: LLVMModuleProviderRef): LLVMPassManagerRef{.
+    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 LLVMRunPassManager*(PM: LLVMPassManagerRef, M: LLVMModuleRef): 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 LLVMInitializeFunctionPassManager*(FPM: LLVMPassManagerRef): 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 LLVMRunFunctionPassManager*(FPM: LLVMPassManagerRef, F: LLVMValueRef): 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 LLVMFinalizeFunctionPassManager*(FPM: LLVMPassManagerRef): 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 LLVMDisposePassManager*(PM: LLVMPassManagerRef){.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 
+  LLVMVerifierFailureAction* = 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.  
+    LLVMAbortProcessAction, LLVMPrintMessageAction, LLVMReturnStatusAction
+
+proc LLVMVerifyModule*(M: LLVMModuleRef, Action: LLVMVerifierFailureAction, 
+                       OutMessage: Ppchar): int32{.cdecl, dynlib: libname, 
+    importc: "LLVMVerifyModule".}
+  # Verifies that a single function is valid, taking the specified action. Useful
+  #   for debugging.  
+proc LLVMVerifyFunction*(Fn: LLVMValueRef, Action: LLVMVerifierFailureAction): int32{.
+    cdecl, dynlib: libname, importc: "LLVMVerifyFunction".}
+  # Open up a ghostview window that displays the CFG of the current function.
+  #   Useful for debugging.  
+proc LLVMViewFunctionCFG*(Fn: LLVMValueRef){.cdecl, dynlib: libname, 
+    importc: "LLVMViewFunctionCFG".}
+proc LLVMViewFunctionCFGOnly*(Fn: LLVMValueRef){.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 LLVMParseBitcode*(MemBuf: LLVMMemoryBufferRef, OutModule: pLLVMModuleRef, 
+                       OutMessage: Ppchar): int32{.cdecl, dynlib: libname, 
+    importc: "LLVMParseBitcode".}
+proc LLVMParseBitcodeInContext*(ContextRef: LLVMContextRef, 
+                                MemBuf: LLVMMemoryBufferRef, 
+                                OutModule: pLLVMModuleRef, OutMessage: Ppchar): 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 LLVMGetBitcodeModuleProvider*(MemBuf: LLVMMemoryBufferRef, 
+                                   OutMP: pLLVMModuleProviderRef, 
+                                   OutMessage: Ppchar): int32{.cdecl, 
+    dynlib: libname, importc: "LLVMGetBitcodeModuleProvider".}
+proc LLVMGetBitcodeModuleProviderInContext*(ContextRef: LLVMContextRef, 
+    MemBuf: LLVMMemoryBufferRef, OutMP: pLLVMModuleProviderRef, 
+    OutMessage: Ppchar): 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 LLVMWriteBitcodeToFileHandle*(M: LLVMModuleRef, Handle: int32): int32{.
+    cdecl, dynlib: libname, importc: "LLVMWriteBitcodeToFileHandle".}
+  # Writes a module to the specified path. Returns 0 on success.  
+proc LLVMWriteBitcodeToFile*(M: LLVMModuleRef, Path: cstring): int32{.cdecl, 
+    dynlib: libname, importc: "LLVMWriteBitcodeToFile".}
+  # Target.h  
+const 
+  LLVMBigEndian* = 0
+  LLVMLittleEndian* = 1
+
+type 
+  LLVMByteOrdering* = int32
+  LLVMTargetDataRef* = LLVMOpaqueTargetData
+  LLVMStructLayoutRef* = LLVMStructLayout #===-- Target Data -------------------------------------------------------=== 
+                                          #* Creates target data from a target layout string.
+                                          #    See the constructor llvm::TargetData::TargetData.  
+
+proc LLVMCreateTargetData*(StringRep: cstring): LLVMTargetDataRef{.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 LLVMAddTargetData*(para1: LLVMTargetDataRef, para2: LLVMPassManagerRef){.
+    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 LLVMCopyStringRepOfTargetData*(para1: LLVMTargetDataRef): cstring{.cdecl, 
+    dynlib: libname, importc: "LLVMCopyStringRepOfTargetData".}
+  #* Returns the byte order of a target, either LLVMBigEndian or
+  #    LLVMLittleEndian.
+  #    See the method llvm::TargetData::isLittleEndian.  
+proc LLVMByteOrder*(para1: LLVMTargetDataRef): LLVMByteOrdering{.cdecl, 
+    dynlib: libname, importc: "LLVMByteOrder".}
+  #* Returns the pointer size in bytes for a target.
+  #    See the method llvm::TargetData::getPointerSize.  
+proc LLVMPointerSize*(para1: LLVMTargetDataRef): dword{.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 LLVMIntPtrType*(para1: LLVMTargetDataRef): LLVMTypeRef{.cdecl, 
+    dynlib: libname, importc: "LLVMIntPtrType".}
+  #* Computes the size of a type in bytes for a target.
+  #    See the method llvm::TargetData::getTypeSizeInBits.  
+proc LLVMSizeOfTypeInBits*(para1: LLVMTargetDataRef, para2: LLVMTypeRef): qword{.
+    cdecl, dynlib: libname, importc: "LLVMSizeOfTypeInBits".}
+  #* Computes the storage size of a type in bytes for a target.
+  #    See the method llvm::TargetData::getTypeStoreSize.  
+proc LLVMStoreSizeOfType*(para1: LLVMTargetDataRef, para2: LLVMTypeRef): qword{.
+    cdecl, dynlib: libname, importc: "LLVMStoreSizeOfType".}
+  #* Computes the ABI size of a type in bytes for a target.
+  #    See the method llvm::TargetData::getTypeAllocSize.  
+proc LLVMABISizeOfType*(para1: LLVMTargetDataRef, para2: LLVMTypeRef): qword{.
+    cdecl, dynlib: libname, importc: "LLVMABISizeOfType".}
+  #* Computes the ABI alignment of a type in bytes for a target.
+  #    See the method llvm::TargetData::getTypeABISize.  
+proc LLVMABIAlignmentOfType*(para1: LLVMTargetDataRef, para2: LLVMTypeRef): dword{.
+    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 LLVMCallFrameAlignmentOfType*(para1: LLVMTargetDataRef, para2: LLVMTypeRef): dword{.
+    cdecl, dynlib: libname, importc: "LLVMCallFrameAlignmentOfType".}
+  #* Computes the preferred alignment of a type in bytes for a target.
+  #    See the method llvm::TargetData::getTypeABISize.  
+proc LLVMPreferredAlignmentOfType*(para1: LLVMTargetDataRef, para2: LLVMTypeRef): dword{.
+    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 LLVMPreferredAlignmentOfGlobal*(para1: LLVMTargetDataRef, 
+                                     GlobalVar: LLVMValueRef): dword{.cdecl, 
+    dynlib: libname, importc: "LLVMPreferredAlignmentOfGlobal".}
+  #* Computes the structure element that contains the byte offset for a target.
+  #    See the method llvm::StructLayout::getElementContainingOffset.  
+proc LLVMElementAtOffset*(para1: LLVMTargetDataRef, StructTy: LLVMTypeRef, 
+                          Offset: qword): dword{.cdecl, dynlib: libname, 
+    importc: "LLVMElementAtOffset".}
+  #* Computes the byte offset of the indexed struct element for a target.
+  #    See the method llvm::StructLayout::getElementContainingOffset.  
+proc LLVMOffsetOfElement*(para1: LLVMTargetDataRef, StructTy: LLVMTypeRef, 
+                          Element: dword): qword{.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 LLVMInvalidateStructLayout*(para1: LLVMTargetDataRef, StructTy: LLVMTypeRef){.
+    cdecl, dynlib: libname, importc: "LLVMInvalidateStructLayout".}
+  #* Deallocates a TargetData.
+  #    See the destructor llvm::TargetData::~TargetData.  
+proc LLVMDisposeTargetData*(para1: LLVMTargetDataRef){.cdecl, dynlib: libname, 
+    importc: "LLVMDisposeTargetData".}
+  # ExecutionEngine.h  
+proc LLVMLinkInJIT*(){.cdecl, dynlib: libname, importc: "LLVMLinkInJIT".}
+proc LLVMLinkInInterpreter*(){.cdecl, dynlib: libname, 
+                               importc: "LLVMLinkInInterpreter".}
+type 
+  LLVMGenericValueRef* = LLVMOpaqueGenericValue
+  LLVMExecutionEngineRef* = LLVMOpaqueExecutionEngine #===-- Operations on generic values --------------------------------------=== 
+
+proc LLVMCreateGenericValueOfInt*(Ty: LLVMTypeRef, N: qword, IsSigned: int32): LLVMGenericValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMCreateGenericValueOfInt".}
+proc LLVMCreateGenericValueOfPointer*(P: pointer): LLVMGenericValueRef{.cdecl, 
+    dynlib: libname, importc: "LLVMCreateGenericValueOfPointer".}
+proc LLVMCreateGenericValueOfFloat*(Ty: LLVMTypeRef, N: float64): LLVMGenericValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMCreateGenericValueOfFloat".}
+proc LLVMGenericValueIntWidth*(GenValRef: LLVMGenericValueRef): dword{.cdecl, 
+    dynlib: libname, importc: "LLVMGenericValueIntWidth".}
+proc LLVMGenericValueToInt*(GenVal: LLVMGenericValueRef, IsSigned: int32): qword{.
+    cdecl, dynlib: libname, importc: "LLVMGenericValueToInt".}
+proc LLVMGenericValueToPointer*(GenVal: LLVMGenericValueRef): pointer{.cdecl, 
+    dynlib: libname, importc: "LLVMGenericValueToPointer".}
+proc LLVMGenericValueToFloat*(TyRef: LLVMTypeRef, GenVal: LLVMGenericValueRef): float64{.
+    cdecl, dynlib: libname, importc: "LLVMGenericValueToFloat".}
+proc LLVMDisposeGenericValue*(GenVal: LLVMGenericValueRef){.cdecl, 
+    dynlib: libname, importc: "LLVMDisposeGenericValue".}
+  #===-- Operations on execution engines -----------------------------------=== 
+proc LLVMCreateExecutionEngine*(OutEE: pLLVMExecutionEngineRef, 
+                                MP: LLVMModuleProviderRef, OutError: Ppchar): int32{.
+    cdecl, dynlib: libname, importc: "LLVMCreateExecutionEngine".}
+proc LLVMCreateInterpreter*(OutInterp: pLLVMExecutionEngineRef, 
+                            MP: LLVMModuleProviderRef, OutError: Ppchar): int32{.
+    cdecl, dynlib: libname, importc: "LLVMCreateInterpreter".}
+proc LLVMCreateJITCompiler*(OutJIT: pLLVMExecutionEngineRef, 
+                            MP: LLVMModuleProviderRef, OptLevel: dword, 
+                            OutError: Ppchar): int32{.cdecl, dynlib: libname, 
+    importc: "LLVMCreateJITCompiler".}
+proc LLVMDisposeExecutionEngine*(EE: LLVMExecutionEngineRef){.cdecl, 
+    dynlib: libname, importc: "LLVMDisposeExecutionEngine".}
+proc LLVMRunStaticConstructors*(EE: LLVMExecutionEngineRef){.cdecl, 
+    dynlib: libname, importc: "LLVMRunStaticConstructors".}
+proc LLVMRunStaticDestructors*(EE: LLVMExecutionEngineRef){.cdecl, 
+    dynlib: libname, importc: "LLVMRunStaticDestructors".}
+  # Const before declarator ignored 
+  # Const before declarator ignored 
+proc LLVMRunFunctionAsMain*(EE: LLVMExecutionEngineRef, F: LLVMValueRef, 
+                            ArgC: dword, ArgV: Ppchar, EnvP: Ppchar): int32{.
+    cdecl, dynlib: libname, importc: "LLVMRunFunctionAsMain".}
+proc LLVMRunFunction*(EE: LLVMExecutionEngineRef, F: LLVMValueRef, 
+                      NumArgs: dword, Args: pLLVMGenericValueRef): LLVMGenericValueRef{.
+    cdecl, dynlib: libname, importc: "LLVMRunFunction".}
+proc LLVMFreeMachineCodeForFunction*(EE: LLVMExecutionEngineRef, F: LLVMValueRef){.
+    cdecl, dynlib: libname, importc: "LLVMFreeMachineCodeForFunction".}
+proc LLVMAddModuleProvider*(EE: LLVMExecutionEngineRef, 
+                            MP: LLVMModuleProviderRef){.cdecl, dynlib: libname, 
+    importc: "LLVMAddModuleProvider".}
+proc LLVMRemoveModuleProvider*(EE: LLVMExecutionEngineRef, 
+                               MP: LLVMModuleProviderRef, 
+                               OutMod: pLLVMModuleRef, OutError: Ppchar): int32{.
+    cdecl, dynlib: libname, importc: "LLVMRemoveModuleProvider".}
+proc LLVMFindFunction*(EE: LLVMExecutionEngineRef, Name: cstring, 
+                       OutFn: pLLVMValueRef): int32{.cdecl, dynlib: libname, 
+    importc: "LLVMFindFunction".}
+proc LLVMGetExecutionEngineTargetData*(EE: LLVMExecutionEngineRef): LLVMTargetDataRef{.
+    cdecl, dynlib: libname, importc: "LLVMGetExecutionEngineTargetData".}
+proc LLVMAddGlobalMapping*(EE: LLVMExecutionEngineRef, Global: LLVMValueRef, 
+                           theAddr: pointer){.cdecl, dynlib: libname, 
+    importc: "LLVMAddGlobalMapping".}
+proc LLVMGetPointerToGlobal*(EE: LLVMExecutionEngineRef, Global: LLVMValueRef): pointer{.
+    cdecl, dynlib: libname, importc: "LLVMGetPointerToGlobal".}
+  # LinkTimeOptimizer.h  
+  #/ This provides a dummy type for pointers to the LTO object. 
+type 
+  llvm_lto_t* = pointer #/ This provides a C-visible enumerator to manage status codes. 
+                        #/ This should map exactly onto the C++ enumerator LTOStatus. 
+                        #  Added C-specific error codes 
+  llvm_lto_status* = enum 
+    LLVM_LTO_UNKNOWN, LLVM_LTO_OPT_SUCCESS, LLVM_LTO_READ_SUCCESS, 
+    LLVM_LTO_READ_FAILURE, LLVM_LTO_WRITE_FAILURE, LLVM_LTO_NO_TARGET, 
+    LLVM_LTO_NO_WORK, LLVM_LTO_MODULE_MERGE_FAILURE, LLVM_LTO_ASM_FAILURE, 
+    LLVM_LTO_NULL_OBJECT
+  llvm_lto_status_t* = llvm_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 llvm_create_optimizer*(): llvm_lto_t{.cdecl, dynlib: libname, 
+    importc: "llvm_create_optimizer".}
+proc llvm_destroy_optimizer*(lto: llvm_lto_t){.cdecl, dynlib: libname, 
+    importc: "llvm_destroy_optimizer".}
+proc llvm_read_object_file*(lto: llvm_lto_t, input_filename: cstring): llvm_lto_status_t{.
+    cdecl, dynlib: libname, importc: "llvm_read_object_file".}
+proc llvm_optimize_modules*(lto: llvm_lto_t, output_filename: cstring): llvm_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 
+    LTO_SYMBOL_ALIGNMENT_MASK = 0x0000001F, 
+    LTO_SYMBOL_PERMISSIONS_MASK = 0x000000E0, 
+    LTO_SYMBOL_PERMISSIONS_CODE = 0x000000A0, 
+    LTO_SYMBOL_PERMISSIONS_DATA = 0x000000C0, 
+    LTO_SYMBOL_PERMISSIONS_RODATA = 0x00000080, 
+    LTO_SYMBOL_DEFINITION_MASK = 0x00000700, 
+    LTO_SYMBOL_DEFINITION_REGULAR = 0x00000100, 
+    LTO_SYMBOL_DEFINITION_TENTATIVE = 0x00000200, 
+    LTO_SYMBOL_DEFINITION_WEAK = 0x00000300, 
+    LTO_SYMBOL_DEFINITION_UNDEFINED = 0x00000400, 
+    LTO_SYMBOL_DEFINITION_WEAKUNDEF = 0x00000500, 
+    LTO_SYMBOL_SCOPE_MASK = 0x00003800, LTO_SYMBOL_SCOPE_INTERNAL = 0x00000800, 
+    LTO_SYMBOL_SCOPE_HIDDEN = 0x00001000, 
+    LTO_SYMBOL_SCOPE_PROTECTED = 0x00002000, 
+    LTO_SYMBOL_SCOPE_DEFAULT = 0x00001800
+  lto_debug_model* = enum 
+    LTO_DEBUG_MODEL_NONE = 0, LTO_DEBUG_MODEL_DWARF = 1
+  lto_codegen_model* = enum   #* opaque reference to a loaded object module  
+    LTO_CODEGEN_PIC_MODEL_STATIC = 0, LTO_CODEGEN_PIC_MODEL_DYNAMIC = 1, 
+    LTO_CODEGEN_PIC_MODEL_DYNAMIC_NO_PIC = 2
+  lto_module_t* = LTOModule   #* opaque reference to a code generator  
+  lto_code_gen_t* = LTOCodeGenerator #*
+                                     # * Returns a printable string.
+                                     #  
+
+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: size_t): 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: size_t, 
+    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: size_t): 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): dword{.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: dword): 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: dword): 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".}
+# implementation