diff options
Diffstat (limited to 'rod/llvmdyn.nim')
-rwxr-xr-x | rod/llvmdyn.nim | 658 |
1 files changed, 658 insertions, 0 deletions
diff --git a/rod/llvmdyn.nim b/rod/llvmdyn.nim new file mode 100755 index 000000000..09bc48ce2 --- /dev/null +++ b/rod/llvmdyn.nim @@ -0,0 +1,658 @@ +# +# +# The Nimrod Compiler +# (c) Copyright 2009 Andreas Rumpf +# +# See the file "copying.txt", included in this +# distribution, for details about the copyright. +# + +# this module implements the interface to LLVM. + +const + llvmdll* = "llvm.dll" # Opaque types. + # + # The top-level container for all other LLVM Intermediate Representation (IR) + # objects. See the llvm::Module class. + # + +type + cuint* = int32 + PLLVMBasicBlockRef* = ref TLLVMBasicBlockRef + PLLVMMemoryBufferRef* = ref TLLVMMemoryBufferRef + PLLVMTypeRef* = ref TLLVMTypeRef + PLLVMValueRef* = ref TLLVMValueRef + TLLVMOpaqueModule*{.final.} = object + TLLVMModuleRef* = ref TLLVMOpaqueModule # + # Each value in the LLVM IR has a type, an instance of [lltype]. See the + # llvm: : Type class. + # + TLLVMOpaqueType*{.final.} = object + TLLVMTypeRef* = ref TLLVMOpaqueType # + # When building recursive types using [refine_type], [lltype] values may become + # invalid; use [lltypehandle] to resolve this problem. See the + # llvm: : AbstractTypeHolder] class. + # + TLLVMOpaqueTypeHandle*{.final.} = object + TLLVMTypeHandleRef* = ref TLLVMOpaqueTypeHandle + TLLVMOpaqueValue*{.final.} = object + TLLVMValueRef* = ref TLLVMOpaqueValue + TLLVMOpaqueBasicBlock*{.final.} = object + TLLVMBasicBlockRef* = ref TLLVMOpaqueBasicBlock + TLLVMOpaqueBuilder*{.final.} = object + TLLVMBuilderRef* = ref TLLVMOpaqueBuilder # Used to provide a module to JIT or interpreter. + # See the llvm: : ModuleProvider class. + # + TLLVMOpaqueModuleProvider*{.final.} = object + TLLVMModuleProviderRef* = ref TLLVMOpaqueModuleProvider # Used to provide a module to JIT or interpreter. + # See the llvm: : MemoryBuffer class. + # + TLLVMOpaqueMemoryBuffer*{.final.} = object + TLLVMMemoryBufferRef* = ref TLLVMOpaqueMemoryBuffer + TLLVMTypeKind* = enum + LLVMVoidTypeKind, # type with no size + LLVMFloatTypeKind, # 32 bit floating point type + LLVMDoubleTypeKind, # 64 bit floating point type + LLVMX86_FP80TypeKind, # 80 bit floating point type (X87) + LLVMFP128TypeKind, # 128 bit floating point type (112-bit mantissa) + LLVMPPC_FP128TypeKind, # 128 bit floating point type (two 64-bits) + LLVMLabelTypeKind, # Labels + LLVMIntegerTypeKind, # Arbitrary bit width integers + LLVMFunctionTypeKind, # Functions + LLVMStructTypeKind, # Structures + LLVMArrayTypeKind, # Arrays + LLVMPointerTypeKind, # Pointers + LLVMOpaqueTypeKind, # Opaque: type with unknown structure + LLVMVectorTypeKind # SIMD 'packed' format, or other vector type + TLLVMLinkage* = enum + LLVMExternalLinkage, # Externally visible function + LLVMLinkOnceLinkage, # Keep one copy of function when linking (inline) + LLVMWeakLinkage, # Keep one copy of function when linking (weak) + LLVMAppendingLinkage, # Special purpose, only applies to global arrays + LLVMInternalLinkage, # Rename collisions when linking (static functions) + LLVMDLLImportLinkage, # Function to be imported from DLL + LLVMDLLExportLinkage, # Function to be accessible from DLL + LLVMExternalWeakLinkage, # ExternalWeak linkage description + LLVMGhostLinkage # Stand-in functions for streaming fns from bitcode + TLLVMVisibility* = enum + LLVMDefaultVisibility, # The GV is visible + LLVMHiddenVisibility, # The GV is hidden + LLVMProtectedVisibility # The GV is protected + TLLVMCallConv* = enum + LLVMCCallConv = 0, LLVMFastCallConv = 8, LLVMColdCallConv = 9, + LLVMX86StdcallCallConv = 64, LLVMX86FastcallCallConv = 65 + TLLVMIntPredicate* = enum + LLVMIntEQ = 32, # equal + LLVMIntNE, # not equal + LLVMIntUGT, # unsigned greater than + LLVMIntUGE, # unsigned greater or equal + LLVMIntULT, # unsigned less than + LLVMIntULE, # unsigned less or equal + LLVMIntSGT, # signed greater than + LLVMIntSGE, # signed greater or equal + LLVMIntSLT, # signed less than + LLVMIntSLE # signed less or equal + TLLVMRealPredicate* = enum #===-- Error handling ----------------------------------------------------=== + LLVMRealPredicateFalse, # Always false (always folded) + LLVMRealOEQ, # True if ordered and equal + LLVMRealOGT, # True if ordered and greater than + LLVMRealOGE, # True if ordered and greater than or equal + LLVMRealOLT, # True if ordered and less than + LLVMRealOLE, # True if ordered and less than or equal + LLVMRealONE, # True if ordered and operands are unequal + LLVMRealORD, # True if ordered (no nans) + LLVMRealUNO, # True if unordered: isnan(X) | isnan(Y) + LLVMRealUEQ, # True if unordered or equal + LLVMRealUGT, # True if unordered or greater than + LLVMRealUGE, # True if unordered, greater than, or equal + LLVMRealULT, # True if unordered or less than + LLVMRealULE, # True if unordered, less than, or equal + LLVMRealUNE, # True if unordered or not equal + LLVMRealPredicateTrue # Always true (always folded) + +proc LLVMDisposeMessage*(msg: cstring){.cdecl, dynlib: llvmdll, importc.} + #===-- Modules -----------------------------------------------------------=== + # Create and destroy modules. +proc LLVMModuleCreateWithName*(ModuleID: cstring): TLLVMModuleRef{.cdecl, + dynlib: llvmdll, importc.} +proc LLVMDisposeModule*(M: TLLVMModuleRef){.cdecl, dynlib: llvmdll, importc.} + # Data layout +proc LLVMGetDataLayout*(M: TLLVMModuleRef): cstring{.cdecl, dynlib: llvmdll, + importc.} +proc LLVMSetDataLayout*(M: TLLVMModuleRef, Triple: cstring){.cdecl, + dynlib: llvmdll, importc.} + # Target triple +proc LLVMGetTarget*(M: TLLVMModuleRef): cstring{.cdecl, dynlib: llvmdll, importc.} + # Const before type ignored +proc LLVMSetTarget*(M: TLLVMModuleRef, Triple: cstring){.cdecl, dynlib: llvmdll, + importc.} + # Same as Module: : addTypeName. +proc LLVMAddTypeName*(M: TLLVMModuleRef, Name: cstring, Ty: TLLVMTypeRef): int32{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMDeleteTypeName*(M: TLLVMModuleRef, Name: cstring){.cdecl, + dynlib: llvmdll, importc.} + #===-- 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 + # +proc LLVMGetTypeKind*(Ty: TLLVMTypeRef): TLLVMTypeKind{.cdecl, dynlib: llvmdll, + importc.} +proc LLVMRefineAbstractType*(AbstractType: TLLVMTypeRef, + ConcreteType: TLLVMTypeRef){.cdecl, + dynlib: llvmdll, importc.} + # Operations on integer types +proc LLVMInt1Type*(): TLLVMTypeRef{.cdecl, dynlib: llvmdll, importc.} +proc LLVMInt8Type*(): TLLVMTypeRef{.cdecl, dynlib: llvmdll, importc.} +proc LLVMInt16Type*(): TLLVMTypeRef{.cdecl, dynlib: llvmdll, importc.} +proc LLVMInt32Type*(): TLLVMTypeRef{.cdecl, dynlib: llvmdll, importc.} +proc LLVMInt64Type*(): TLLVMTypeRef{.cdecl, dynlib: llvmdll, importc.} +proc LLVMIntType*(NumBits: cuint): TLLVMTypeRef{.cdecl, dynlib: llvmdll, importc.} +proc LLVMGetIntTypeWidth*(IntegerTy: TLLVMTypeRef): cuint{.cdecl, + dynlib: llvmdll, importc.} + # Operations on real types +proc LLVMFloatType*(): TLLVMTypeRef{.cdecl, dynlib: llvmdll, importc.} +proc LLVMDoubleType*(): TLLVMTypeRef{.cdecl, dynlib: llvmdll, importc.} +proc LLVMX86FP80Type*(): TLLVMTypeRef{.cdecl, dynlib: llvmdll, importc.} +proc LLVMFP128Type*(): TLLVMTypeRef{.cdecl, dynlib: llvmdll, importc.} +proc LLVMPPCFP128Type*(): TLLVMTypeRef{.cdecl, dynlib: llvmdll, importc.} + # Operations on function types +proc LLVMFunctionType*(ReturnType: TLLVMTypeRef, ParamTypes: PLLVMTypeRef, + ParamCount: cuint, IsVarArg: int32): TLLVMTypeRef{.cdecl, + dynlib: llvmdll, importc.} +proc LLVMIsFunctionVarArg*(FunctionTy: TLLVMTypeRef): int32{.cdecl, + dynlib: llvmdll, importc.} +proc LLVMGetReturnType*(FunctionTy: TLLVMTypeRef): TLLVMTypeRef{.cdecl, + dynlib: llvmdll, importc.} +proc LLVMCountParamTypes*(FunctionTy: TLLVMTypeRef): cuint{.cdecl, + dynlib: llvmdll, importc.} +proc LLVMGetParamTypes*(FunctionTy: TLLVMTypeRef, Dest: PLLVMTypeRef){.cdecl, + dynlib: llvmdll, importc.} + # Operations on struct types +proc LLVMStructType*(ElementTypes: PLLVMTypeRef, ElementCount: cuint, + isPacked: int32): TLLVMTypeRef{.cdecl, dynlib: llvmdll, + importc.} +proc LLVMCountStructElementTypes*(StructTy: TLLVMTypeRef): cuint{.cdecl, + dynlib: llvmdll, importc.} +proc LLVMGetStructElementTypes*(StructTy: TLLVMTypeRef, Dest: pLLVMTypeRef){. + cdecl, dynlib: llvmdll, importc.} +proc LLVMIsPackedStruct*(StructTy: TLLVMTypeRef): int32{.cdecl, dynlib: llvmdll, + importc.} + # Operations on array, pointer, and vector types (sequence types) +proc LLVMArrayType*(ElementType: TLLVMTypeRef, ElementCount: cuint): TLLVMTypeRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMPointerType*(ElementType: TLLVMTypeRef, AddressSpace: cuint): TLLVMTypeRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMVectorType*(ElementType: TLLVMTypeRef, ElementCount: cuint): TLLVMTypeRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMGetElementType*(Ty: TLLVMTypeRef): TLLVMTypeRef{.cdecl, + dynlib: llvmdll, importc.} +proc LLVMGetArrayLength*(ArrayTy: TLLVMTypeRef): cuint{.cdecl, dynlib: llvmdll, + importc.} +proc LLVMGetPointerAddressSpace*(PointerTy: TLLVMTypeRef): cuint{.cdecl, + dynlib: llvmdll, importc.} +proc LLVMGetVectorSize*(VectorTy: TLLVMTypeRef): cuint{.cdecl, dynlib: llvmdll, + importc.} + # Operations on other types +proc LLVMVoidType*(): TLLVMTypeRef{.cdecl, dynlib: llvmdll, importc.} +proc LLVMLabelType*(): TLLVMTypeRef{.cdecl, dynlib: llvmdll, importc.} +proc LLVMOpaqueType*(): TLLVMTypeRef{.cdecl, dynlib: llvmdll, importc.} + # Operations on type handles +proc LLVMCreateTypeHandle*(PotentiallyAbstractTy: TLLVMTypeRef): TLLVMTypeHandleRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMRefineType*(AbstractTy: TLLVMTypeRef, ConcreteTy: TLLVMTypeRef){.cdecl, + dynlib: llvmdll, importc.} +proc LLVMResolveTypeHandle*(TypeHandle: TLLVMTypeHandleRef): TLLVMTypeRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMDisposeTypeHandle*(TypeHandle: TLLVMTypeHandleRef){.cdecl, + dynlib: llvmdll, importc.} + #===-- Values ------------------------------------------------------------=== + # The bulk of LLVM's object model consists of values, which comprise a very + # * rich type hierarchy. + # * + # * values: + # * constants: + # * scalar constants + # * composite contants + # * globals: + # * global variable + # * function + # * alias + # * basic blocks + # + # Operations on all values +proc LLVMTypeOf*(Val: TLLVMValueRef): TLLVMTypeRef{.cdecl, dynlib: llvmdll, + importc.} +proc LLVMGetValueName*(Val: TLLVMValueRef): cstring{.cdecl, dynlib: llvmdll, + importc.} +proc LLVMSetValueName*(Val: TLLVMValueRef, Name: cstring){.cdecl, + dynlib: llvmdll, importc.} +proc LLVMDumpValue*(Val: TLLVMValueRef){.cdecl, dynlib: llvmdll, importc.} + # Operations on constants of any type +proc LLVMConstNull*(Ty: TLLVMTypeRef): TLLVMValueRef{.cdecl, dynlib: llvmdll, + importc.} + # all zeroes +proc LLVMConstAllOnes*(Ty: TLLVMTypeRef): TLLVMValueRef{.cdecl, dynlib: llvmdll, + importc.} + # only for int/vector +proc LLVMGetUndef*(Ty: TLLVMTypeRef): TLLVMValueRef{.cdecl, dynlib: llvmdll, + importc.} +proc LLVMIsConstant*(Val: TLLVMValueRef): int32{.cdecl, dynlib: llvmdll, importc.} +proc LLVMIsNull*(Val: TLLVMValueRef): int32{.cdecl, dynlib: llvmdll, importc.} +proc LLVMIsUndef*(Val: TLLVMValueRef): int32{.cdecl, dynlib: llvmdll, importc.} + # Operations on scalar constants +proc LLVMConstInt*(IntTy: TLLVMTypeRef, N: qword, SignExtend: int32): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMConstReal*(RealTy: TLLVMTypeRef, N: float64): TLLVMValueRef{.cdecl, + dynlib: llvmdll, importc.} + # Operations on composite constants +proc LLVMConstString*(Str: cstring, len: cuint, DontNullTerminate: int32): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMConstArray*(ArrayTy: TLLVMTypeRef, ConstantVals: pLLVMValueRef, + len: cuint): TLLVMValueRef{.cdecl, dynlib: llvmdll, importc.} +proc LLVMConstStruct*(ConstantVals: pLLVMValueRef, Count: cuint, ispacked: int32): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMConstVector*(ScalarConstantVals: pLLVMValueRef, Size: cuint): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} + # Constant expressions +proc LLVMSizeOf*(Ty: TLLVMTypeRef): TLLVMValueRef{.cdecl, dynlib: llvmdll, + importc.} +proc LLVMConstNeg*(ConstantVal: TLLVMValueRef): TLLVMValueRef{.cdecl, + dynlib: llvmdll, importc.} +proc LLVMConstNot*(ConstantVal: TLLVMValueRef): TLLVMValueRef{.cdecl, + dynlib: llvmdll, importc.} +proc LLVMConstAdd*(LHSConstant: TLLVMValueRef, RHSConstant: TLLVMValueRef): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMConstSub*(LHSConstant: TLLVMValueRef, RHSConstant: TLLVMValueRef): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMConstMul*(LHSConstant: TLLVMValueRef, RHSConstant: TLLVMValueRef): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMConstUDiv*(LHSConstant: TLLVMValueRef, RHSConstant: TLLVMValueRef): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMConstSDiv*(LHSConstant: TLLVMValueRef, RHSConstant: TLLVMValueRef): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMConstFDiv*(LHSConstant: TLLVMValueRef, RHSConstant: TLLVMValueRef): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMConstURem*(LHSConstant: TLLVMValueRef, RHSConstant: TLLVMValueRef): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMConstSRem*(LHSConstant: TLLVMValueRef, RHSConstant: TLLVMValueRef): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMConstFRem*(LHSConstant: TLLVMValueRef, RHSConstant: TLLVMValueRef): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMConstAnd*(LHSConstant: TLLVMValueRef, RHSConstant: TLLVMValueRef): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMConstOr*(LHSConstant: TLLVMValueRef, RHSConstant: TLLVMValueRef): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMConstXor*(LHSConstant: TLLVMValueRef, RHSConstant: TLLVMValueRef): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMConstICmp*(Predicate: TLLVMIntPredicate, LHSConstant: TLLVMValueRef, + RHSConstant: TLLVMValueRef): TLLVMValueRef{.cdecl, + dynlib: llvmdll, importc.} +proc LLVMConstFCmp*(Predicate: TLLVMRealPredicate, LHSConstant: TLLVMValueRef, + RHSConstant: TLLVMValueRef): TLLVMValueRef{.cdecl, + dynlib: llvmdll, importc.} +proc LLVMConstShl*(LHSConstant: TLLVMValueRef, RHSConstant: TLLVMValueRef): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMConstLShr*(LHSConstant: TLLVMValueRef, RHSConstant: TLLVMValueRef): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMConstAShr*(LHSConstant: TLLVMValueRef, RHSConstant: TLLVMValueRef): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMConstGEP*(ConstantVal: TLLVMValueRef, ConstantIndices: PLLVMValueRef, + NumIndices: cuint): TLLVMValueRef{.cdecl, dynlib: llvmdll, + importc.} +proc LLVMConstTrunc*(ConstantVal: TLLVMValueRef, ToType: TLLVMTypeRef): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMConstSExt*(ConstantVal: TLLVMValueRef, ToType: TLLVMTypeRef): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMConstZExt*(ConstantVal: TLLVMValueRef, ToType: TLLVMTypeRef): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMConstFPTrunc*(ConstantVal: TLLVMValueRef, ToType: TLLVMTypeRef): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMConstFPExt*(ConstantVal: TLLVMValueRef, ToType: TLLVMTypeRef): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMConstUIToFP*(ConstantVal: TLLVMValueRef, ToType: TLLVMTypeRef): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMConstSIToFP*(ConstantVal: TLLVMValueRef, ToType: TLLVMTypeRef): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMConstFPToUI*(ConstantVal: TLLVMValueRef, ToType: TLLVMTypeRef): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMConstFPToSI*(ConstantVal: TLLVMValueRef, ToType: TLLVMTypeRef): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMConstPtrToInt*(ConstantVal: TLLVMValueRef, ToType: TLLVMTypeRef): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMConstIntToPtr*(ConstantVal: TLLVMValueRef, ToType: TLLVMTypeRef): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMConstBitCast*(ConstantVal: TLLVMValueRef, ToType: TLLVMTypeRef): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMConstSelect*(ConstantCondition: TLLVMValueRef, + ConstantIfTrue: TLLVMValueRef, + ConstantIfFalse: TLLVMValueRef): TLLVMValueRef{.cdecl, + dynlib: llvmdll, importc.} +proc LLVMConstExtractElement*(VectorConstant: TLLVMValueRef, + IndexConstant: TLLVMValueRef): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMConstInsertElement*(VectorConstant: TLLVMValueRef, + ElementValueConstant: TLLVMValueRef, + IndexConstant: TLLVMValueRef): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMConstShuffleVector*(VectorAConstant: TLLVMValueRef, + VectorBConstant: TLLVMValueRef, + MaskConstant: TLLVMValueRef): TLLVMValueRef{.cdecl, + dynlib: llvmdll, importc.} + # Operations on global variables, functions, and aliases (globals) +proc LLVMIsDeclaration*(Global: TLLVMValueRef): int32{.cdecl, dynlib: llvmdll, + importc.} +proc LLVMGetLinkage*(Global: TLLVMValueRef): TLLVMLinkage{.cdecl, + dynlib: llvmdll, importc.} +proc LLVMSetLinkage*(Global: TLLVMValueRef, Linkage: TLLVMLinkage){.cdecl, + dynlib: llvmdll, importc.} +proc LLVMGetSection*(Global: TLLVMValueRef): cstring{.cdecl, dynlib: llvmdll, + importc.} +proc LLVMSetSection*(Global: TLLVMValueRef, Section: cstring){.cdecl, + dynlib: llvmdll, importc.} +proc LLVMGetVisibility*(Global: TLLVMValueRef): TLLVMVisibility{.cdecl, + dynlib: llvmdll, importc.} +proc LLVMSetVisibility*(Global: TLLVMValueRef, Viz: TLLVMVisibility){.cdecl, + dynlib: llvmdll, importc.} +proc LLVMGetAlignment*(Global: TLLVMValueRef): cuint{.cdecl, dynlib: llvmdll, + importc.} +proc LLVMSetAlignment*(Global: TLLVMValueRef, Bytes: cuint){.cdecl, + dynlib: llvmdll, importc.} + # Operations on global variables + # Const before type ignored +proc LLVMAddGlobal*(M: TLLVMModuleRef, Ty: TLLVMTypeRef, Name: cstring): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} + # Const before type ignored +proc LLVMGetNamedGlobal*(M: TLLVMModuleRef, Name: cstring): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMDeleteGlobal*(GlobalVar: TLLVMValueRef){.cdecl, dynlib: llvmdll, + importc.} +proc LLVMHasInitializer*(GlobalVar: TLLVMValueRef): int32{.cdecl, + dynlib: llvmdll, importc.} +proc LLVMGetInitializer*(GlobalVar: TLLVMValueRef): TLLVMValueRef{.cdecl, + dynlib: llvmdll, importc.} +proc LLVMSetInitializer*(GlobalVar: TLLVMValueRef, ConstantVal: TLLVMValueRef){. + cdecl, dynlib: llvmdll, importc.} +proc LLVMIsThreadLocal*(GlobalVar: TLLVMValueRef): int32{.cdecl, + dynlib: llvmdll, importc.} +proc LLVMSetThreadLocal*(GlobalVar: TLLVMValueRef, IsThreadLocal: int32){.cdecl, + dynlib: llvmdll, importc.} +proc LLVMIsGlobalConstant*(GlobalVar: TLLVMValueRef): int32{.cdecl, + dynlib: llvmdll, importc.} +proc LLVMSetGlobalConstant*(GlobalVar: TLLVMValueRef, IsConstant: int32){.cdecl, + dynlib: llvmdll, importc.} + # Operations on functions + # Const before type ignored +proc LLVMAddFunction*(M: TLLVMModuleRef, Name: cstring, FunctionTy: TLLVMTypeRef): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} + # Const before type ignored +proc LLVMGetNamedFunction*(M: TLLVMModuleRef, Name: cstring): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMDeleteFunction*(Fn: TLLVMValueRef){.cdecl, dynlib: llvmdll, importc.} +proc LLVMCountParams*(Fn: TLLVMValueRef): cuint{.cdecl, dynlib: llvmdll, importc.} +proc LLVMGetParams*(Fn: TLLVMValueRef, Params: PLLVMValueRef){.cdecl, + dynlib: llvmdll, importc.} +proc LLVMGetParam*(Fn: TLLVMValueRef, Index: cuint): TLLVMValueRef{.cdecl, + dynlib: llvmdll, importc.} +proc LLVMGetIntrinsicID*(Fn: TLLVMValueRef): cuint{.cdecl, dynlib: llvmdll, + importc.} +proc LLVMGetFunctionCallConv*(Fn: TLLVMValueRef): cuint{.cdecl, dynlib: llvmdll, + importc.} +proc LLVMSetFunctionCallConv*(Fn: TLLVMValueRef, CC: cuint){.cdecl, + dynlib: llvmdll, importc.} + # Const before type ignored +proc LLVMGetCollector*(Fn: TLLVMValueRef): cstring{.cdecl, dynlib: llvmdll, + importc.} + # Const before type ignored +proc LLVMSetCollector*(Fn: TLLVMValueRef, Coll: cstring){.cdecl, + dynlib: llvmdll, importc.} + # Operations on basic blocks +proc LLVMBasicBlockAsValue*(Bb: TLLVMBasicBlockRef): TLLVMValueRef{.cdecl, + dynlib: llvmdll, importc.} +proc LLVMValueIsBasicBlock*(Val: TLLVMValueRef): int32{.cdecl, dynlib: llvmdll, + importc.} +proc LLVMValueAsBasicBlock*(Val: TLLVMValueRef): TLLVMBasicBlockRef{.cdecl, + dynlib: llvmdll, importc.} +proc LLVMCountBasicBlocks*(Fn: TLLVMValueRef): cuint{.cdecl, dynlib: llvmdll, + importc.} +proc LLVMGetBasicBlocks*(Fn: TLLVMValueRef, BasicBlocks: PLLVMBasicBlockRef){. + cdecl, dynlib: llvmdll, importc.} +proc LLVMGetEntryBasicBlock*(Fn: TLLVMValueRef): TLLVMBasicBlockRef{.cdecl, + dynlib: llvmdll, importc.} + # Const before type ignored +proc LLVMAppendBasicBlock*(Fn: TLLVMValueRef, Name: cstring): TLLVMBasicBlockRef{. + cdecl, dynlib: llvmdll, importc.} + # Const before type ignored +proc LLVMInsertBasicBlock*(InsertBeforeBB: TLLVMBasicBlockRef, Name: cstring): TLLVMBasicBlockRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMDeleteBasicBlock*(BB: TLLVMBasicBlockRef){.cdecl, dynlib: llvmdll, + importc.} + # Operations on call sites +proc LLVMSetInstructionCallConv*(Instr: TLLVMValueRef, CC: cuint){.cdecl, + dynlib: llvmdll, importc.} +proc LLVMGetInstructionCallConv*(Instr: TLLVMValueRef): cuint{.cdecl, + dynlib: llvmdll, importc.} + # Operations on phi nodes +proc LLVMAddIncoming*(PhiNode: TLLVMValueRef, IncomingValues: PLLVMValueRef, + IncomingBlocks: PLLVMBasicBlockRef, Count: cuint){.cdecl, + dynlib: llvmdll, importc.} +proc LLVMCountIncoming*(PhiNode: TLLVMValueRef): cuint{.cdecl, dynlib: llvmdll, + importc.} +proc LLVMGetIncomingValue*(PhiNode: TLLVMValueRef, Index: cuint): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMGetIncomingBlock*(PhiNode: TLLVMValueRef, Index: cuint): TLLVMBasicBlockRef{. + cdecl, dynlib: llvmdll, importc.} + #===-- 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 LLVMCreateBuilder*(): TLLVMBuilderRef{.cdecl, dynlib: llvmdll, importc.} +proc LLVMPositionBuilderBefore*(Builder: TLLVMBuilderRef, Instr: TLLVMValueRef){. + cdecl, dynlib: llvmdll, importc.} +proc LLVMPositionBuilderAtEnd*(Builder: TLLVMBuilderRef, + theBlock: TLLVMBasicBlockRef){.cdecl, + dynlib: llvmdll, importc.} +proc LLVMDisposeBuilder*(Builder: TLLVMBuilderRef){.cdecl, dynlib: llvmdll, + importc.} + # Terminators +proc LLVMBuildRetVoid*(para1: TLLVMBuilderRef): TLLVMValueRef{.cdecl, + dynlib: llvmdll, importc.} +proc LLVMBuildRet*(para1: TLLVMBuilderRef, V: TLLVMValueRef): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMBuildBr*(para1: TLLVMBuilderRef, Dest: TLLVMBasicBlockRef): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMBuildCondBr*(para1: TLLVMBuilderRef, IfCond: TLLVMValueRef, + ThenBranch: TLLVMBasicBlockRef, + ElseBranch: TLLVMBasicBlockRef): TLLVMValueRef{.cdecl, + dynlib: llvmdll, importc.} +proc LLVMBuildSwitch*(para1: TLLVMBuilderRef, V: TLLVMValueRef, + ElseBranch: TLLVMBasicBlockRef, NumCases: cuint): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} + # Const before type ignored +proc LLVMBuildInvoke*(para1: TLLVMBuilderRef, Fn: TLLVMValueRef, + Args: PLLVMValueRef, NumArgs: cuint, + ThenBranch: TLLVMBasicBlockRef, Catch: TLLVMBasicBlockRef, + Name: cstring): TLLVMValueRef{.cdecl, dynlib: llvmdll, + importc.} +proc LLVMBuildUnwind*(para1: TLLVMBuilderRef): TLLVMValueRef{.cdecl, + dynlib: llvmdll, importc.} +proc LLVMBuildUnreachable*(para1: TLLVMBuilderRef): TLLVMValueRef{.cdecl, + dynlib: llvmdll, importc.} + # Add a case to the switch instruction +proc LLVMAddCase*(Switch: TLLVMValueRef, OnVal: TLLVMValueRef, + Dest: TLLVMBasicBlockRef){.cdecl, dynlib: llvmdll, importc.} + # Arithmetic +proc LLVMBuildAdd*(para1: TLLVMBuilderRef, LHS: TLLVMValueRef, + RHS: TLLVMValueRef, Name: cstring): TLLVMValueRef{.cdecl, + dynlib: llvmdll, importc.} +proc LLVMBuildSub*(para1: TLLVMBuilderRef, LHS: TLLVMValueRef, + RHS: TLLVMValueRef, Name: cstring): TLLVMValueRef{.cdecl, + dynlib: llvmdll, importc.} +proc LLVMBuildMul*(para1: TLLVMBuilderRef, LHS: TLLVMValueRef, + RHS: TLLVMValueRef, Name: cstring): TLLVMValueRef{.cdecl, + dynlib: llvmdll, importc.} +proc LLVMBuildUDiv*(para1: TLLVMBuilderRef, LHS: TLLVMValueRef, + RHS: TLLVMValueRef, Name: cstring): TLLVMValueRef{.cdecl, + dynlib: llvmdll, importc.} +proc LLVMBuildSDiv*(para1: TLLVMBuilderRef, LHS: TLLVMValueRef, + RHS: TLLVMValueRef, Name: cstring): TLLVMValueRef{.cdecl, + dynlib: llvmdll, importc.} +proc LLVMBuildFDiv*(para1: TLLVMBuilderRef, LHS: TLLVMValueRef, + RHS: TLLVMValueRef, Name: cstring): TLLVMValueRef{.cdecl, + dynlib: llvmdll, importc.} +proc LLVMBuildURem*(para1: TLLVMBuilderRef, LHS: TLLVMValueRef, + RHS: TLLVMValueRef, Name: cstring): TLLVMValueRef{.cdecl, + dynlib: llvmdll, importc.} +proc LLVMBuildSRem*(para1: TLLVMBuilderRef, LHS: TLLVMValueRef, + RHS: TLLVMValueRef, Name: cstring): TLLVMValueRef{.cdecl, + dynlib: llvmdll, importc.} +proc LLVMBuildFRem*(para1: TLLVMBuilderRef, LHS: TLLVMValueRef, + RHS: TLLVMValueRef, Name: cstring): TLLVMValueRef{.cdecl, + dynlib: llvmdll, importc.} +proc LLVMBuildShl*(para1: TLLVMBuilderRef, LHS: TLLVMValueRef, + RHS: TLLVMValueRef, Name: cstring): TLLVMValueRef{.cdecl, + dynlib: llvmdll, importc.} +proc LLVMBuildLShr*(para1: TLLVMBuilderRef, LHS: TLLVMValueRef, + RHS: TLLVMValueRef, Name: cstring): TLLVMValueRef{.cdecl, + dynlib: llvmdll, importc.} +proc LLVMBuildAShr*(para1: TLLVMBuilderRef, LHS: TLLVMValueRef, + RHS: TLLVMValueRef, Name: cstring): TLLVMValueRef{.cdecl, + dynlib: llvmdll, importc.} +proc LLVMBuildAnd*(para1: TLLVMBuilderRef, LHS: TLLVMValueRef, + RHS: TLLVMValueRef, Name: cstring): TLLVMValueRef{.cdecl, + dynlib: llvmdll, importc.} +proc LLVMBuildOr*(para1: TLLVMBuilderRef, LHS: TLLVMValueRef, + RHS: TLLVMValueRef, Name: cstring): TLLVMValueRef{.cdecl, + dynlib: llvmdll, importc.} +proc LLVMBuildXor*(para1: TLLVMBuilderRef, LHS: TLLVMValueRef, + RHS: TLLVMValueRef, Name: cstring): TLLVMValueRef{.cdecl, + dynlib: llvmdll, importc.} +proc LLVMBuildNeg*(para1: TLLVMBuilderRef, V: TLLVMValueRef, Name: cstring): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMBuildNot*(para1: TLLVMBuilderRef, V: TLLVMValueRef, Name: cstring): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} + # Memory +proc LLVMBuildMalloc*(para1: TLLVMBuilderRef, Ty: TLLVMTypeRef, Name: cstring): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMBuildArrayMalloc*(para1: TLLVMBuilderRef, Ty: TLLVMTypeRef, + Val: TLLVMValueRef, Name: cstring): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMBuildAlloca*(para1: TLLVMBuilderRef, Ty: TLLVMTypeRef, Name: cstring): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMBuildArrayAlloca*(para1: TLLVMBuilderRef, Ty: TLLVMTypeRef, + Val: TLLVMValueRef, Name: cstring): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMBuildFree*(para1: TLLVMBuilderRef, PointerVal: TLLVMValueRef): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMBuildLoad*(para1: TLLVMBuilderRef, PointerVal: TLLVMValueRef, + Name: cstring): TLLVMValueRef{.cdecl, dynlib: llvmdll, + importc.} +proc LLVMBuildStore*(para1: TLLVMBuilderRef, Val: TLLVMValueRef, + thePtr: TLLVMValueRef): TLLVMValueRef{.cdecl, + dynlib: llvmdll, importc.} +proc LLVMBuildGEP*(B: TLLVMBuilderRef, Pointer: TLLVMValueRef, + Indices: PLLVMValueRef, NumIndices: cuint, Name: cstring): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} + # Casts +proc LLVMBuildTrunc*(para1: TLLVMBuilderRef, Val: TLLVMValueRef, + DestTy: TLLVMTypeRef, Name: cstring): TLLVMValueRef{.cdecl, + dynlib: llvmdll, importc.} +proc LLVMBuildZExt*(para1: TLLVMBuilderRef, Val: TLLVMValueRef, + DestTy: TLLVMTypeRef, Name: cstring): TLLVMValueRef{.cdecl, + dynlib: llvmdll, importc.} +proc LLVMBuildSExt*(para1: TLLVMBuilderRef, Val: TLLVMValueRef, + DestTy: TLLVMTypeRef, Name: cstring): TLLVMValueRef{.cdecl, + dynlib: llvmdll, importc.} +proc LLVMBuildFPToUI*(para1: TLLVMBuilderRef, Val: TLLVMValueRef, + DestTy: TLLVMTypeRef, Name: cstring): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMBuildFPToSI*(para1: TLLVMBuilderRef, Val: TLLVMValueRef, + DestTy: TLLVMTypeRef, Name: cstring): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMBuildUIToFP*(para1: TLLVMBuilderRef, Val: TLLVMValueRef, + DestTy: TLLVMTypeRef, Name: cstring): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMBuildSIToFP*(para1: TLLVMBuilderRef, Val: TLLVMValueRef, + DestTy: TLLVMTypeRef, Name: cstring): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMBuildFPTrunc*(para1: TLLVMBuilderRef, Val: TLLVMValueRef, + DestTy: TLLVMTypeRef, Name: cstring): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMBuildFPExt*(para1: TLLVMBuilderRef, Val: TLLVMValueRef, + DestTy: TLLVMTypeRef, Name: cstring): TLLVMValueRef{.cdecl, + dynlib: llvmdll, importc.} +proc LLVMBuildPtrToInt*(para1: TLLVMBuilderRef, Val: TLLVMValueRef, + DestTy: TLLVMTypeRef, Name: cstring): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMBuildIntToPtr*(para1: TLLVMBuilderRef, Val: TLLVMValueRef, + DestTy: TLLVMTypeRef, Name: cstring): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMBuildBitCast*(para1: TLLVMBuilderRef, Val: TLLVMValueRef, + DestTy: TLLVMTypeRef, Name: cstring): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} + # Comparisons +proc LLVMBuildICmp*(para1: TLLVMBuilderRef, Op: TLLVMIntPredicate, + LHS: TLLVMValueRef, RHS: TLLVMValueRef, Name: cstring): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMBuildFCmp*(para1: TLLVMBuilderRef, Op: TLLVMRealPredicate, + LHS: TLLVMValueRef, RHS: TLLVMValueRef, Name: cstring): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} + # Miscellaneous instructions +proc LLVMBuildPhi*(para1: TLLVMBuilderRef, Ty: TLLVMTypeRef, Name: cstring): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMBuildCall*(para1: TLLVMBuilderRef, Fn: TLLVMValueRef, + Args: PLLVMValueRef, NumArgs: cuint, Name: cstring): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMBuildSelect*(para1: TLLVMBuilderRef, IfCond: TLLVMValueRef, + ThenBranch: TLLVMValueRef, ElseBranch: TLLVMValueRef, + Name: cstring): TLLVMValueRef{.cdecl, dynlib: llvmdll, + importc.} +proc LLVMBuildVAArg*(para1: TLLVMBuilderRef, List: TLLVMValueRef, + Ty: TLLVMTypeRef, Name: cstring): TLLVMValueRef{.cdecl, + dynlib: llvmdll, importc.} +proc LLVMBuildExtractElement*(para1: TLLVMBuilderRef, VecVal: TLLVMValueRef, + Index: TLLVMValueRef, Name: cstring): TLLVMValueRef{. + cdecl, dynlib: llvmdll, importc.} +proc LLVMBuildInsertElement*(para1: TLLVMBuilderRef, VecVal: TLLVMValueRef, + EltVal: TLLVMValueRef, Index: TLLVMValueRef, + Name: cstring): TLLVMValueRef{.cdecl, + dynlib: llvmdll, importc.} +proc LLVMBuildShuffleVector*(para1: TLLVMBuilderRef, V1: TLLVMValueRef, + V2: TLLVMValueRef, Mask: TLLVMValueRef, + Name: cstring): TLLVMValueRef{.cdecl, + dynlib: llvmdll, importc.} + #===-- Module providers --------------------------------------------------=== + # Encapsulates the module M in a module provider, taking ownership of the + # module. + # See the constructor llvm: : ExistingModuleProvider: : ExistingModuleProvider. + # +proc LLVMCreateModuleProviderForExistingModule*(M: TLLVMModuleRef): TLLVMModuleProviderRef{. + cdecl, dynlib: llvmdll, importc.} + # Destroys the module provider MP as well as the contained module. + # See the destructor llvm: : ModuleProvider: : ~ModuleProvider. + # +proc LLVMDisposeModuleProvider*(MP: TLLVMModuleProviderRef){.cdecl, + dynlib: llvmdll, importc.} + #===-- Memory buffers ----------------------------------------------------=== +proc LLVMCreateMemoryBufferWithContentsOfFile*(Path: cstring, + OutMemBuf: pLLVMMemoryBufferRef, OutMessage: var cstring): int32{.cdecl, + dynlib: llvmdll, importc.} +proc LLVMCreateMemoryBufferWithSTDIN*(OutMemBuf: pLLVMMemoryBufferRef, + OutMessage: var cstring): int32{.cdecl, + dynlib: llvmdll, importc.} +proc LLVMDisposeMemoryBuffer*(MemBuf: TLLVMMemoryBufferRef){.cdecl, + dynlib: llvmdll, importc.} +proc LLVMWriteBitcodeToFile*(M: TLLVMModuleRef, path: cstring): int{.cdecl, + dynlib: llvmdll, importc.} + # Writes a module to the specified path. Returns 0 on success. +# implementation |