summary refs log tree commit diff stats
path: root/nim/llvmstat.pas
diff options
context:
space:
mode:
Diffstat (limited to 'nim/llvmstat.pas')
-rwxr-xr-xnim/llvmstat.pas445
1 files changed, 445 insertions, 0 deletions
diff --git a/nim/llvmstat.pas b/nim/llvmstat.pas
new file mode 100755
index 000000000..e7d06a284
--- /dev/null
+++ b/nim/llvmstat.pas
@@ -0,0 +1,445 @@
+//
+//
+//           The Nimrod Compiler
+//        (c) Copyright 2008 Andreas Rumpf
+//
+//    See the file "copying.txt", included in this
+//    distribution, for details about the copyright.
+//
+unit llvmstat;
+
+// this module implements the interface to LLVM.
+
+interface
+
+{$include 'config.inc'}
+
+uses
+  nsystem, ropes;
+
+{ Opaque types.  }
+{
+  The top-level container for all other LLVM Intermediate Representation (IR)
+  objects. See the llvm::Module class.
+}
+type
+  cuint = int32;
+
+  TLLVMTypeKind = (
+    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 = (
+    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 = (
+    LLVMDefaultVisibility, // The GV is visible
+    LLVMHiddenVisibility, // The GV is hidden
+    LLVMProtectedVisibility // The GV is protected
+  );
+
+  TLLVMCallConv = (
+    LLVMCCallConv = 0,
+    LLVMFastCallConv = 8,
+    LLVMColdCallConv = 9,
+    LLVMX86StdcallCallConv = 64,
+    LLVMX86FastcallCallConv = 65
+  );
+
+  TLLVMIntPredicate = (
+    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 = (
+    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)
+  );
+
+  PLLVMBasicBlockRef = ^TLLVMBasicBlockRef;
+  PLLVMMemoryBufferRef = ^TLLVMMemoryBufferRef;
+  PLLVMTypeRef = ^TLLVMTypeRef;
+  PLLVMValueRef = ^TLLVMValueRef;
+
+  TLLVMOpaqueModule = record
+    code: PRope;
+  end;
+  TLLVMModuleRef = ^TLLVMOpaqueModule;
+{
+  Each value in the LLVM IR has a type, an instance of [lltype]. See the
+  llvm::Type class.
+}
+  TLLVMOpaqueType = record
+    kind: TLLVMTypeKind;
+
+  end;
+  TLLVMTypeRef = ^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 = record end;
+  TLLVMTypeHandleRef = ^TLLVMOpaqueTypeHandle;
+  TLLVMOpaqueValue = record end;
+  TLLVMValueRef = ^TLLVMOpaqueValue;
+  TLLVMOpaqueBasicBlock = record end;
+  TLLVMBasicBlockRef = ^TLLVMOpaqueBasicBlock;
+
+  TLLVMOpaqueBuilder = record end;
+  TLLVMBuilderRef = ^TLLVMOpaqueBuilder;
+{ Used to provide a module to JIT or interpreter.
+  See the llvm::ModuleProvider class.
+}
+  TLLVMOpaqueModuleProvider = record end;
+  TLLVMModuleProviderRef = ^TLLVMOpaqueModuleProvider;
+{ Used to provide a module to JIT or interpreter.
+  See the llvm: : MemoryBuffer class.
+}
+  TLLVMOpaqueMemoryBuffer = record end;
+  TLLVMMemoryBufferRef = ^TLLVMOpaqueMemoryBuffer;
+
+{===-- Error handling ----------------------------------------------------=== }
+procedure LLVMDisposeMessage(msg: pchar); cdecl;
+{===-- Modules -----------------------------------------------------------=== }
+{ Create and destroy modules.  }
+function LLVMModuleCreateWithName(ModuleID: pchar): TLLVMModuleRef; cdecl;
+procedure LLVMDisposeModule(M: TLLVMModuleRef);cdecl;
+{ Data layout  }
+function LLVMGetDataLayout(M: TLLVMModuleRef): pchar;cdecl;
+procedure LLVMSetDataLayout(M: TLLVMModuleRef; Triple: pchar);cdecl;
+{ Target triple  }
+function LLVMGetTarget(M: TLLVMModuleRef): pchar;cdecl;
+procedure LLVMSetTarget(M: TLLVMModuleRef; Triple: pchar);cdecl;
+{ Same as Module: : addTypeName.  }
+function LLVMAddTypeName(M: TLLVMModuleRef; Name: pchar; Ty: TLLVMTypeRef): longint;cdecl;
+procedure LLVMDeleteTypeName(M: TLLVMModuleRef; Name: pchar);cdecl;
+{===-- 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
+  }
+function LLVMGetTypeKind(Ty: TLLVMTypeRef): TLLVMTypeKind; cdecl;
+procedure LLVMRefineAbstractType(AbstractType: TLLVMTypeRef; ConcreteType: TLLVMTypeRef); cdecl;
+{ Operations on integer types  }
+function LLVMInt1Type: TLLVMTypeRef;cdecl;
+function LLVMInt8Type: TLLVMTypeRef;cdecl;
+function LLVMInt16Type: TLLVMTypeRef;cdecl;
+function LLVMInt32Type: TLLVMTypeRef;cdecl;
+function LLVMInt64Type: TLLVMTypeRef;cdecl;
+function LLVMIntType(NumBits: cuint): TLLVMTypeRef;cdecl;
+function LLVMGetIntTypeWidth(IntegerTy: TLLVMTypeRef): cuint;cdecl;
+{ Operations on real types  }
+function LLVMFloatType: TLLVMTypeRef;cdecl;
+function LLVMDoubleType: TLLVMTypeRef;cdecl;
+function LLVMX86FP80Type: TLLVMTypeRef;cdecl;
+function LLVMFP128Type: TLLVMTypeRef;cdecl;
+function LLVMPPCFP128Type: TLLVMTypeRef;cdecl;
+{ Operations on function types  }
+function LLVMFunctionType(ReturnType: TLLVMTypeRef; ParamTypes: PLLVMTypeRef; ParamCount: cuint; IsVarArg: longint): TLLVMTypeRef;cdecl;
+function LLVMIsFunctionVarArg(FunctionTy: TLLVMTypeRef): longint;cdecl;
+function LLVMGetReturnType(FunctionTy: TLLVMTypeRef): TLLVMTypeRef;cdecl;
+function LLVMCountParamTypes(FunctionTy: TLLVMTypeRef): cuint;cdecl;
+procedure LLVMGetParamTypes(FunctionTy: TLLVMTypeRef; Dest: PLLVMTypeRef);cdecl;
+{ Operations on struct types  }
+function LLVMStructType(ElementTypes: PLLVMTypeRef; ElementCount: cuint; isPacked: longint): TLLVMTypeRef;cdecl;
+function LLVMCountStructElementTypes(StructTy: TLLVMTypeRef): cuint;cdecl;
+procedure LLVMGetStructElementTypes(StructTy: TLLVMTypeRef; Dest: pLLVMTypeRef);cdecl;
+function LLVMIsPackedStruct(StructTy: TLLVMTypeRef): longint;cdecl;
+{ Operations on array, pointer, and vector types (sequence types)  }
+function LLVMArrayType(ElementType: TLLVMTypeRef; ElementCount: cuint): TLLVMTypeRef;cdecl;
+function LLVMPointerType(ElementType: TLLVMTypeRef; AddressSpace: cuint): TLLVMTypeRef;cdecl;
+function LLVMVectorType(ElementType: TLLVMTypeRef; ElementCount: cuint): TLLVMTypeRef;cdecl;
+function LLVMGetElementType(Ty: TLLVMTypeRef): TLLVMTypeRef;cdecl;
+function LLVMGetArrayLength(ArrayTy: TLLVMTypeRef): cuint;cdecl;
+function LLVMGetPointerAddressSpace(PointerTy: TLLVMTypeRef): cuint;cdecl;
+function LLVMGetVectorSize(VectorTy: TLLVMTypeRef): cuint;cdecl;
+{ Operations on other types  }
+function LLVMVoidType: TLLVMTypeRef;cdecl;
+function LLVMLabelType: TLLVMTypeRef;cdecl;
+function LLVMOpaqueType: TLLVMTypeRef;cdecl;
+{ Operations on type handles  }
+function LLVMCreateTypeHandle(PotentiallyAbstractTy: TLLVMTypeRef): TLLVMTypeHandleRef;cdecl;
+procedure LLVMRefineType(AbstractTy: TLLVMTypeRef; ConcreteTy: TLLVMTypeRef);cdecl;
+function LLVMResolveTypeHandle(TypeHandle: TLLVMTypeHandleRef): TLLVMTypeRef;cdecl;
+procedure LLVMDisposeTypeHandle(TypeHandle: TLLVMTypeHandleRef);cdecl;
+{===-- 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  }
+function LLVMTypeOf(Val: TLLVMValueRef): TLLVMTypeRef;cdecl;
+function LLVMGetValueName(Val: TLLVMValueRef): pchar;cdecl;
+procedure LLVMSetValueName(Val: TLLVMValueRef; Name: pchar);cdecl;
+procedure LLVMDumpValue(Val: TLLVMValueRef);cdecl;
+{ Operations on constants of any type  }
+function LLVMConstNull(Ty: TLLVMTypeRef): TLLVMValueRef;cdecl;
+{ all zeroes  }
+function LLVMConstAllOnes(Ty: TLLVMTypeRef): TLLVMValueRef;cdecl;
+{ only for int/vector  }
+function LLVMGetUndef(Ty: TLLVMTypeRef): TLLVMValueRef;cdecl;
+function LLVMIsConstant(Val: TLLVMValueRef): longint;cdecl;
+function LLVMIsNull(Val: TLLVMValueRef): longint;cdecl;
+function LLVMIsUndef(Val: TLLVMValueRef): longint;cdecl;
+{ Operations on scalar constants  }
+function LLVMConstInt(IntTy: TLLVMTypeRef; N: qword; SignExtend: longint): TLLVMValueRef;cdecl;
+function LLVMConstReal(RealTy: TLLVMTypeRef; N: double): TLLVMValueRef;cdecl;
+{ Operations on composite constants  }
+function LLVMConstString(Str: pchar; Length: cuint; DontNullTerminate: longint): TLLVMValueRef;cdecl;
+function LLVMConstArray(ArrayTy: TLLVMTypeRef; ConstantVals: pLLVMValueRef; Length: cuint): TLLVMValueRef;cdecl;
+function LLVMConstStruct(ConstantVals: pLLVMValueRef; Count: cuint; ispacked: longint): TLLVMValueRef;cdecl;
+function LLVMConstVector(ScalarConstantVals: pLLVMValueRef; Size: cuint): TLLVMValueRef;cdecl;
+{ Constant expressions  }
+function LLVMSizeOf(Ty: TLLVMTypeRef): TLLVMValueRef;cdecl;
+function LLVMConstNeg(ConstantVal: TLLVMValueRef): TLLVMValueRef;cdecl;
+function LLVMConstNot(ConstantVal: TLLVMValueRef): TLLVMValueRef;cdecl;
+function LLVMConstAdd(LHSConstant: TLLVMValueRef; RHSConstant: TLLVMValueRef): TLLVMValueRef;cdecl;
+function LLVMConstSub(LHSConstant: TLLVMValueRef; RHSConstant: TLLVMValueRef): TLLVMValueRef;cdecl;
+function LLVMConstMul(LHSConstant: TLLVMValueRef; RHSConstant: TLLVMValueRef): TLLVMValueRef;cdecl;
+function LLVMConstUDiv(LHSConstant: TLLVMValueRef; RHSConstant: TLLVMValueRef): TLLVMValueRef;cdecl;
+function LLVMConstSDiv(LHSConstant: TLLVMValueRef; RHSConstant: TLLVMValueRef): TLLVMValueRef;cdecl;
+function LLVMConstFDiv(LHSConstant: TLLVMValueRef; RHSConstant: TLLVMValueRef): TLLVMValueRef;cdecl;
+function LLVMConstURem(LHSConstant: TLLVMValueRef; RHSConstant: TLLVMValueRef): TLLVMValueRef;cdecl;
+function LLVMConstSRem(LHSConstant: TLLVMValueRef; RHSConstant: TLLVMValueRef): TLLVMValueRef;cdecl;
+function LLVMConstFRem(LHSConstant: TLLVMValueRef; RHSConstant: TLLVMValueRef): TLLVMValueRef;cdecl;
+function LLVMConstAnd(LHSConstant: TLLVMValueRef; RHSConstant: TLLVMValueRef): TLLVMValueRef;cdecl;
+function LLVMConstOr(LHSConstant: TLLVMValueRef; RHSConstant: TLLVMValueRef): TLLVMValueRef;cdecl;
+function LLVMConstXor(LHSConstant: TLLVMValueRef; RHSConstant: TLLVMValueRef): TLLVMValueRef;cdecl;
+function LLVMConstICmp(Predicate: TLLVMIntPredicate; LHSConstant: TLLVMValueRef; RHSConstant: TLLVMValueRef): TLLVMValueRef;cdecl;
+function LLVMConstFCmp(Predicate: TLLVMRealPredicate; LHSConstant: TLLVMValueRef; RHSConstant: TLLVMValueRef): TLLVMValueRef;cdecl;
+function LLVMConstShl(LHSConstant: TLLVMValueRef; RHSConstant: TLLVMValueRef): TLLVMValueRef;cdecl;
+function LLVMConstLShr(LHSConstant: TLLVMValueRef; RHSConstant: TLLVMValueRef): TLLVMValueRef;cdecl;
+function LLVMConstAShr(LHSConstant: TLLVMValueRef; RHSConstant: TLLVMValueRef): TLLVMValueRef;cdecl;
+function LLVMConstGEP(ConstantVal: TLLVMValueRef; ConstantIndices: PLLVMValueRef; NumIndices: cuint): TLLVMValueRef;cdecl;
+function LLVMConstTrunc(ConstantVal: TLLVMValueRef; ToType: TLLVMTypeRef): TLLVMValueRef;cdecl;
+function LLVMConstSExt(ConstantVal: TLLVMValueRef; ToType: TLLVMTypeRef): TLLVMValueRef;cdecl;
+function LLVMConstZExt(ConstantVal: TLLVMValueRef; ToType: TLLVMTypeRef): TLLVMValueRef;cdecl;
+function LLVMConstFPTrunc(ConstantVal: TLLVMValueRef; ToType: TLLVMTypeRef): TLLVMValueRef;cdecl;
+function LLVMConstFPExt(ConstantVal: TLLVMValueRef; ToType: TLLVMTypeRef): TLLVMValueRef;cdecl;
+function LLVMConstUIToFP(ConstantVal: TLLVMValueRef; ToType: TLLVMTypeRef): TLLVMValueRef;cdecl;
+function LLVMConstSIToFP(ConstantVal: TLLVMValueRef; ToType: TLLVMTypeRef): TLLVMValueRef;cdecl;
+function LLVMConstFPToUI(ConstantVal: TLLVMValueRef; ToType: TLLVMTypeRef): TLLVMValueRef;cdecl;
+function LLVMConstFPToSI(ConstantVal: TLLVMValueRef; ToType: TLLVMTypeRef): TLLVMValueRef;cdecl;
+function LLVMConstPtrToInt(ConstantVal: TLLVMValueRef; ToType: TLLVMTypeRef): TLLVMValueRef;cdecl;
+function LLVMConstIntToPtr(ConstantVal: TLLVMValueRef; ToType: TLLVMTypeRef): TLLVMValueRef;cdecl;
+function LLVMConstBitCast(ConstantVal: TLLVMValueRef; ToType: TLLVMTypeRef): TLLVMValueRef;cdecl;
+function LLVMConstSelect(ConstantCondition: TLLVMValueRef; ConstantIfTrue: TLLVMValueRef; ConstantIfFalse: TLLVMValueRef): TLLVMValueRef;cdecl;
+function LLVMConstExtractElement(VectorConstant: TLLVMValueRef; IndexConstant: TLLVMValueRef): TLLVMValueRef;cdecl;
+function LLVMConstInsertElement(VectorConstant: TLLVMValueRef; ElementValueConstant: TLLVMValueRef; IndexConstant: TLLVMValueRef): TLLVMValueRef;cdecl;
+function LLVMConstShuffleVector(VectorAConstant: TLLVMValueRef; VectorBConstant: TLLVMValueRef; MaskConstant: TLLVMValueRef): TLLVMValueRef;cdecl;
+{ Operations on global variables, functions, and aliases (globals)  }
+function LLVMIsDeclaration(Global: TLLVMValueRef): longint;cdecl;
+function LLVMGetLinkage(Global: TLLVMValueRef): TLLVMLinkage;cdecl;
+procedure LLVMSetLinkage(Global: TLLVMValueRef; Linkage: TLLVMLinkage);cdecl;
+function LLVMGetSection(Global: TLLVMValueRef): pchar;cdecl;
+procedure LLVMSetSection(Global: TLLVMValueRef; Section: pchar);cdecl;
+function LLVMGetVisibility(Global: TLLVMValueRef): TLLVMVisibility;cdecl;
+procedure LLVMSetVisibility(Global: TLLVMValueRef; Viz: TLLVMVisibility);cdecl;
+function LLVMGetAlignment(Global: TLLVMValueRef): cuint;cdecl;
+procedure LLVMSetAlignment(Global: TLLVMValueRef; Bytes: cuint);cdecl;
+{ Operations on global variables  }
+(* Const before type ignored *)
+function LLVMAddGlobal(M: TLLVMModuleRef; Ty: TLLVMTypeRef; Name: pchar): TLLVMValueRef;cdecl;
+(* Const before type ignored *)
+function LLVMGetNamedGlobal(M: TLLVMModuleRef; Name: pchar): TLLVMValueRef;cdecl;
+procedure LLVMDeleteGlobal(GlobalVar: TLLVMValueRef);cdecl;
+function LLVMHasInitializer(GlobalVar: TLLVMValueRef): longint;cdecl;
+function LLVMGetInitializer(GlobalVar: TLLVMValueRef): TLLVMValueRef;cdecl;
+procedure LLVMSetInitializer(GlobalVar: TLLVMValueRef; ConstantVal: TLLVMValueRef);cdecl;
+function LLVMIsThreadLocal(GlobalVar: TLLVMValueRef): longint;cdecl;
+procedure LLVMSetThreadLocal(GlobalVar: TLLVMValueRef; IsThreadLocal: longint);cdecl;
+function LLVMIsGlobalConstant(GlobalVar: TLLVMValueRef): longint;cdecl;
+procedure LLVMSetGlobalConstant(GlobalVar: TLLVMValueRef; IsConstant: longint);cdecl;
+{ Operations on functions  }
+(* Const before type ignored *)
+function LLVMAddFunction(M: TLLVMModuleRef; Name: pchar; FunctionTy: TLLVMTypeRef): TLLVMValueRef;cdecl;
+(* Const before type ignored *)
+function LLVMGetNamedFunction(M: TLLVMModuleRef; Name: pchar): TLLVMValueRef;cdecl;
+procedure LLVMDeleteFunction(Fn: TLLVMValueRef);cdecl;
+function LLVMCountParams(Fn: TLLVMValueRef): cuint;cdecl;
+procedure LLVMGetParams(Fn: TLLVMValueRef; Params: PLLVMValueRef);cdecl;
+function LLVMGetParam(Fn: TLLVMValueRef; Index: cuint): TLLVMValueRef;cdecl;
+function LLVMGetIntrinsicID(Fn: TLLVMValueRef): cuint;cdecl;
+function LLVMGetFunctionCallConv(Fn: TLLVMValueRef): cuint;cdecl;
+procedure LLVMSetFunctionCallConv(Fn: TLLVMValueRef; CC: cuint);cdecl;
+(* Const before type ignored *)
+function LLVMGetCollector(Fn: TLLVMValueRef): pchar;cdecl;
+(* Const before type ignored *)
+procedure LLVMSetCollector(Fn: TLLVMValueRef; Coll: pchar);cdecl;
+{ Operations on basic blocks  }
+function LLVMBasicBlockAsValue(Bb: TLLVMBasicBlockRef): TLLVMValueRef;cdecl;
+function LLVMValueIsBasicBlock(Val: TLLVMValueRef): longint;cdecl;
+function LLVMValueAsBasicBlock(Val: TLLVMValueRef): TLLVMBasicBlockRef;cdecl;
+function LLVMCountBasicBlocks(Fn: TLLVMValueRef): cuint;cdecl;
+procedure LLVMGetBasicBlocks(Fn: TLLVMValueRef; BasicBlocks: PLLVMBasicBlockRef);cdecl;
+function LLVMGetEntryBasicBlock(Fn: TLLVMValueRef): TLLVMBasicBlockRef;cdecl;
+(* Const before type ignored *)
+function LLVMAppendBasicBlock(Fn: TLLVMValueRef; Name: pchar): TLLVMBasicBlockRef;cdecl;
+(* Const before type ignored *)
+function LLVMInsertBasicBlock(InsertBeforeBB: TLLVMBasicBlockRef; Name: pchar): TLLVMBasicBlockRef;cdecl;
+procedure LLVMDeleteBasicBlock(BB: TLLVMBasicBlockRef);cdecl;
+{ Operations on call sites  }
+procedure LLVMSetInstructionCallConv(Instr: TLLVMValueRef; CC: cuint);cdecl;
+function LLVMGetInstructionCallConv(Instr: TLLVMValueRef): cuint;cdecl;
+{ Operations on phi nodes  }
+procedure LLVMAddIncoming(PhiNode: TLLVMValueRef; IncomingValues: PLLVMValueRef; IncomingBlocks: PLLVMBasicBlockRef; Count: cuint);cdecl;
+function LLVMCountIncoming(PhiNode: TLLVMValueRef): cuint;cdecl;
+function LLVMGetIncomingValue(PhiNode: TLLVMValueRef; Index: cuint): TLLVMValueRef;cdecl;
+function LLVMGetIncomingBlock(PhiNode: TLLVMValueRef; Index: cuint): TLLVMBasicBlockRef;cdecl;
+{===-- Instruction builders ----------------------------------------------=== }
+{ An instruction builder represents a point within a basic block, and is the
+ * exclusive means of building instructions using the C interface.
+  }
+function LLVMCreateBuilder: TLLVMBuilderRef;cdecl;
+procedure LLVMPositionBuilderBefore(Builder: TLLVMBuilderRef; Instr: TLLVMValueRef);cdecl;
+procedure LLVMPositionBuilderAtEnd(Builder: TLLVMBuilderRef; theBlock: TLLVMBasicBlockRef);cdecl;
+procedure LLVMDisposeBuilder(Builder: TLLVMBuilderRef);cdecl;
+{ Terminators  }
+function LLVMBuildRetVoid(para1: TLLVMBuilderRef): TLLVMValueRef;cdecl;
+function LLVMBuildRet(para1: TLLVMBuilderRef; V: TLLVMValueRef): TLLVMValueRef;cdecl;
+function LLVMBuildBr(para1: TLLVMBuilderRef; Dest: TLLVMBasicBlockRef): TLLVMValueRef;cdecl;
+function LLVMBuildCondBr(para1: TLLVMBuilderRef; IfCond: TLLVMValueRef; ThenBranch: TLLVMBasicBlockRef; ElseBranch: TLLVMBasicBlockRef): TLLVMValueRef;cdecl;
+function LLVMBuildSwitch(para1: TLLVMBuilderRef; V: TLLVMValueRef; ElseBranch: TLLVMBasicBlockRef; NumCases: cuint): TLLVMValueRef;cdecl;
+(* Const before type ignored *)
+function LLVMBuildInvoke(para1: TLLVMBuilderRef; Fn: TLLVMValueRef; Args: PLLVMValueRef; NumArgs: cuint; ThenBranch: TLLVMBasicBlockRef;
+           Catch: TLLVMBasicBlockRef; Name: pchar): TLLVMValueRef;cdecl;
+function LLVMBuildUnwind(para1: TLLVMBuilderRef): TLLVMValueRef;cdecl;
+function LLVMBuildUnreachable(para1: TLLVMBuilderRef): TLLVMValueRef;cdecl;
+{ Add a case to the switch instruction  }
+procedure LLVMAddCase(Switch: TLLVMValueRef; OnVal: TLLVMValueRef; Dest: TLLVMBasicBlockRef);cdecl;
+{ Arithmetic  }
+function LLVMBuildAdd(para1: TLLVMBuilderRef; LHS: TLLVMValueRef; RHS: TLLVMValueRef; Name: pchar): TLLVMValueRef;cdecl;
+function LLVMBuildSub(para1: TLLVMBuilderRef; LHS: TLLVMValueRef; RHS: TLLVMValueRef; Name: pchar): TLLVMValueRef;cdecl;
+function LLVMBuildMul(para1: TLLVMBuilderRef; LHS: TLLVMValueRef; RHS: TLLVMValueRef; Name: pchar): TLLVMValueRef;cdecl;
+function LLVMBuildUDiv(para1: TLLVMBuilderRef; LHS: TLLVMValueRef; RHS: TLLVMValueRef; Name: pchar): TLLVMValueRef;cdecl;
+function LLVMBuildSDiv(para1: TLLVMBuilderRef; LHS: TLLVMValueRef; RHS: TLLVMValueRef; Name: pchar): TLLVMValueRef;cdecl;
+function LLVMBuildFDiv(para1: TLLVMBuilderRef; LHS: TLLVMValueRef; RHS: TLLVMValueRef; Name: pchar): TLLVMValueRef;cdecl;
+function LLVMBuildURem(para1: TLLVMBuilderRef; LHS: TLLVMValueRef; RHS: TLLVMValueRef; Name: pchar): TLLVMValueRef;cdecl;
+function LLVMBuildSRem(para1: TLLVMBuilderRef; LHS: TLLVMValueRef; RHS: TLLVMValueRef; Name: pchar): TLLVMValueRef;cdecl;
+function LLVMBuildFRem(para1: TLLVMBuilderRef; LHS: TLLVMValueRef; RHS: TLLVMValueRef; Name: pchar): TLLVMValueRef;cdecl;
+function LLVMBuildShl(para1: TLLVMBuilderRef; LHS: TLLVMValueRef; RHS: TLLVMValueRef; Name: pchar): TLLVMValueRef;cdecl;
+function LLVMBuildLShr(para1: TLLVMBuilderRef; LHS: TLLVMValueRef; RHS: TLLVMValueRef; Name: pchar): TLLVMValueRef;cdecl;
+function LLVMBuildAShr(para1: TLLVMBuilderRef; LHS: TLLVMValueRef; RHS: TLLVMValueRef; Name: pchar): TLLVMValueRef;cdecl;
+function LLVMBuildAnd(para1: TLLVMBuilderRef; LHS: TLLVMValueRef; RHS: TLLVMValueRef; Name: pchar): TLLVMValueRef;cdecl;
+function LLVMBuildOr(para1: TLLVMBuilderRef; LHS: TLLVMValueRef; RHS: TLLVMValueRef; Name: pchar): TLLVMValueRef;cdecl;
+function LLVMBuildXor(para1: TLLVMBuilderRef; LHS: TLLVMValueRef; RHS: TLLVMValueRef; Name: pchar): TLLVMValueRef;cdecl;
+function LLVMBuildNeg(para1: TLLVMBuilderRef; V: TLLVMValueRef; Name: pchar): TLLVMValueRef;cdecl;
+function LLVMBuildNot(para1: TLLVMBuilderRef; V: TLLVMValueRef; Name: pchar): TLLVMValueRef;cdecl;
+{ Memory  }
+function LLVMBuildMalloc(para1: TLLVMBuilderRef; Ty: TLLVMTypeRef; Name: pchar): TLLVMValueRef;cdecl;
+function LLVMBuildArrayMalloc(para1: TLLVMBuilderRef; Ty: TLLVMTypeRef; Val: TLLVMValueRef; Name: pchar): TLLVMValueRef;cdecl;
+function LLVMBuildAlloca(para1: TLLVMBuilderRef; Ty: TLLVMTypeRef; Name: pchar): TLLVMValueRef;cdecl;
+function LLVMBuildArrayAlloca(para1: TLLVMBuilderRef; Ty: TLLVMTypeRef; Val: TLLVMValueRef; Name: pchar): TLLVMValueRef;cdecl;
+function LLVMBuildFree(para1: TLLVMBuilderRef; PointerVal: TLLVMValueRef): TLLVMValueRef;cdecl;
+function LLVMBuildLoad(para1: TLLVMBuilderRef; PointerVal: TLLVMValueRef; Name: pchar): TLLVMValueRef;cdecl;
+function LLVMBuildStore(para1: TLLVMBuilderRef; Val: TLLVMValueRef; thePtr: TLLVMValueRef): TLLVMValueRef;cdecl;
+function LLVMBuildGEP(B: TLLVMBuilderRef; Pointer: TLLVMValueRef; Indices: PLLVMValueRef; NumIndices: cuint; Name: pchar): TLLVMValueRef;cdecl;
+{ Casts  }
+function LLVMBuildTrunc(para1: TLLVMBuilderRef; Val: TLLVMValueRef; DestTy: TLLVMTypeRef; Name: pchar): TLLVMValueRef;cdecl;
+function LLVMBuildZExt(para1: TLLVMBuilderRef; Val: TLLVMValueRef; DestTy: TLLVMTypeRef; Name: pchar): TLLVMValueRef;cdecl;
+function LLVMBuildSExt(para1: TLLVMBuilderRef; Val: TLLVMValueRef; DestTy: TLLVMTypeRef; Name: pchar): TLLVMValueRef;cdecl;
+function LLVMBuildFPToUI(para1: TLLVMBuilderRef; Val: TLLVMValueRef; DestTy: TLLVMTypeRef; Name: pchar): TLLVMValueRef;cdecl;
+function LLVMBuildFPToSI(para1: TLLVMBuilderRef; Val: TLLVMValueRef; DestTy: TLLVMTypeRef; Name: pchar): TLLVMValueRef;cdecl;
+function LLVMBuildUIToFP(para1: TLLVMBuilderRef; Val: TLLVMValueRef; DestTy: TLLVMTypeRef; Name: pchar): TLLVMValueRef;cdecl;
+function LLVMBuildSIToFP(para1: TLLVMBuilderRef; Val: TLLVMValueRef; DestTy: TLLVMTypeRef; Name: pchar): TLLVMValueRef;cdecl;
+function LLVMBuildFPTrunc(para1: TLLVMBuilderRef; Val: TLLVMValueRef; DestTy: TLLVMTypeRef; Name: pchar): TLLVMValueRef;cdecl;
+function LLVMBuildFPExt(para1: TLLVMBuilderRef; Val: TLLVMValueRef; DestTy: TLLVMTypeRef; Name: pchar): TLLVMValueRef;cdecl;
+function LLVMBuildPtrToInt(para1: TLLVMBuilderRef; Val: TLLVMValueRef; DestTy: TLLVMTypeRef; Name: pchar): TLLVMValueRef;cdecl;
+function LLVMBuildIntToPtr(para1: TLLVMBuilderRef; Val: TLLVMValueRef; DestTy: TLLVMTypeRef; Name: pchar): TLLVMValueRef;cdecl;
+function LLVMBuildBitCast(para1: TLLVMBuilderRef; Val: TLLVMValueRef; DestTy: TLLVMTypeRef; Name: pchar): TLLVMValueRef;cdecl;
+{ Comparisons  }
+function LLVMBuildICmp(para1: TLLVMBuilderRef; Op: TLLVMIntPredicate; LHS: TLLVMValueRef; RHS: TLLVMValueRef; Name: pchar): TLLVMValueRef;cdecl;
+function LLVMBuildFCmp(para1: TLLVMBuilderRef; Op: TLLVMRealPredicate; LHS: TLLVMValueRef; RHS: TLLVMValueRef; Name: pchar): TLLVMValueRef;cdecl;
+{ Miscellaneous instructions  }
+function LLVMBuildPhi(para1: TLLVMBuilderRef; Ty: TLLVMTypeRef; Name: pchar): TLLVMValueRef;cdecl;
+function LLVMBuildCall(para1: TLLVMBuilderRef; Fn: TLLVMValueRef; Args: PLLVMValueRef; NumArgs: cuint; Name: pchar): TLLVMValueRef;cdecl;
+function LLVMBuildSelect(para1: TLLVMBuilderRef; IfCond: TLLVMValueRef; ThenBranch: TLLVMValueRef; ElseBranch: TLLVMValueRef; Name: pchar): TLLVMValueRef;cdecl;
+function LLVMBuildVAArg(para1: TLLVMBuilderRef; List: TLLVMValueRef; Ty: TLLVMTypeRef; Name: pchar): TLLVMValueRef;cdecl;
+function LLVMBuildExtractElement(para1: TLLVMBuilderRef; VecVal: TLLVMValueRef; Index: TLLVMValueRef; Name: pchar): TLLVMValueRef;cdecl;
+function LLVMBuildInsertElement(para1: TLLVMBuilderRef; VecVal: TLLVMValueRef; EltVal: TLLVMValueRef; Index: TLLVMValueRef; Name: pchar): TLLVMValueRef;cdecl;
+function LLVMBuildShuffleVector(para1: TLLVMBuilderRef; V1: TLLVMValueRef; V2: TLLVMValueRef; Mask: TLLVMValueRef; Name: pchar): TLLVMValueRef;cdecl;
+{===-- Module providers --------------------------------------------------=== }
+{ Encapsulates the module M in a module provider, taking ownership of the
+  module.
+  See the constructor llvm: : ExistingModuleProvider: : ExistingModuleProvider.
+}
+function LLVMCreateModuleProviderForExistingModule(M: TLLVMModuleRef): TLLVMModuleProviderRef;cdecl;
+{ Destroys the module provider MP as well as the contained module.
+  See the destructor llvm: : ModuleProvider: : ~ModuleProvider.
+}
+procedure LLVMDisposeModuleProvider(MP: TLLVMModuleProviderRef);cdecl;
+{===-- Memory buffers ----------------------------------------------------=== }
+function LLVMCreateMemoryBufferWithContentsOfFile(Path: pchar; OutMemBuf: pLLVMMemoryBufferRef; var OutMessage: pchar): longint;cdecl;
+function LLVMCreateMemoryBufferWithSTDIN(OutMemBuf: pLLVMMemoryBufferRef; var OutMessage: pchar): longint;cdecl;
+procedure LLVMDisposeMemoryBuffer(MemBuf: TLLVMMemoryBufferRef);cdecl;
+
+function LLVMWriteBitcodeToFile(M: TLLVMModuleRef; path: pchar): int; cdecl;
+// Writes a module to the specified path. Returns 0 on success.
+
+implementation
+
+end.