diff --git a/example/JIT.hs b/example/JIT.hs
--- a/example/JIT.hs
+++ b/example/JIT.hs
@@ -142,7 +142,7 @@
             EE.createExecutionEngineForModuleCPU execEngineRef modul errorMsgRef
          when (err/=Core.false) $ do
             noResult $
-               printf "Core.createExecutionEngine: %s\n"
+               printf "createExecutionEngine: %s\n"
                   =<< CStr.peekCString =<< peek errorMsgRef
             Exit.exitFailure
 
diff --git a/llvm-ffi.cabal b/llvm-ffi.cabal
--- a/llvm-ffi.cabal
+++ b/llvm-ffi.cabal
@@ -1,6 +1,6 @@
 Cabal-Version: 2.2
 Name:          llvm-ffi
-Version:       9.0.0
+Version:       9.1.0
 License:       BSD-3-Clause
 License-File:  LICENSE
 Synopsis:      FFI bindings to the LLVM compiler toolkit.
@@ -102,7 +102,7 @@
   Location: http://hub.darcs.net/thielema/llvm-ffi/
 
 Source-Repository this
-  Tag:      9.0.0
+  Tag:      9.1.0
   Type:     darcs
   Location: http://hub.darcs.net/thielema/llvm-ffi/
 
@@ -146,6 +146,7 @@
       LLVM.Target.Sparc
       LLVM.Target.X86
       LLVM.Target.XCore
+      LLVM.Raw.Core
 
   If flag(llvm309)
     If flag(pkgConfig)
@@ -155,6 +156,7 @@
         PkgConfig-Depends: llvm == 3.9.*
     Else
       Extra-Libraries: LLVM-3.9
+    Hs-Source-Dirs: src/3.9
     CC-Options: -DHS_LLVM_VERSION=309
     Cxx-Options: -DHS_LLVM_VERSION=309
     CPP-Options: -DHS_LLVM_VERSION=309
@@ -167,6 +169,7 @@
           PkgConfig-Depends: llvm == 4.0.*
       Else
         Extra-Libraries: LLVM-4.0
+      Hs-Source-Dirs: src/4.0
       CC-Options: -DHS_LLVM_VERSION=400
       Cxx-Options: -DHS_LLVM_VERSION=400
       CPP-Options: -DHS_LLVM_VERSION=400
@@ -179,6 +182,7 @@
             PkgConfig-Depends: llvm == 5.0.*
         Else
           Extra-Libraries: LLVM-5.0
+        Hs-Source-Dirs: src/5.0
         CC-Options: -DHS_LLVM_VERSION=500
         Cxx-Options: -DHS_LLVM_VERSION=500
         CPP-Options: -DHS_LLVM_VERSION=500
@@ -191,6 +195,7 @@
               PkgConfig-Depends: llvm == 6.0.*
           Else
             Extra-Libraries: LLVM-6.0
+          Hs-Source-Dirs: src/6.0
           CC-Options: -DHS_LLVM_VERSION=600
           Cxx-Options: -DHS_LLVM_VERSION=600
           CPP-Options: -DHS_LLVM_VERSION=600
@@ -203,6 +208,7 @@
                 PkgConfig-Depends: llvm == 7.*
             Else
               Extra-Libraries: LLVM-7
+            Hs-Source-Dirs: src/7
             CC-Options: -DHS_LLVM_VERSION=700
             Cxx-Options: -DHS_LLVM_VERSION=700
             CPP-Options: -DHS_LLVM_VERSION=700
@@ -215,6 +221,7 @@
                   PkgConfig-Depends: llvm == 8.*
               Else
                 Extra-Libraries: LLVM-8
+              Hs-Source-Dirs: src/8
               CC-Options: -DHS_LLVM_VERSION=800
               Cxx-Options: -DHS_LLVM_VERSION=800
               CPP-Options: -DHS_LLVM_VERSION=800
@@ -226,13 +233,13 @@
                   PkgConfig-Depends: llvm == 9.*
               Else
                 Extra-Libraries: LLVM-9
+              Hs-Source-Dirs: src/9
               CC-Options: -DHS_LLVM_VERSION=900
               Cxx-Options: -DHS_LLVM_VERSION=900
               CPP-Options: -DHS_LLVM_VERSION=900
 
   CC-Options: -DHAVE_LLVM_SUPPORT_DYNAMICLIBRARY_H=1
   CPP-Options: -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS
-  CPP-Options: -D__STDC_LIMIT_MACROS
   Include-Dirs: include
   Extra-Libraries: stdc++
   Cxx-Options: -std=c++0x -std=c++11
diff --git a/src/3.9/LLVM/Raw/Core.hsc b/src/3.9/LLVM/Raw/Core.hsc
new file mode 100644
--- /dev/null
+++ b/src/3.9/LLVM/Raw/Core.hsc
@@ -0,0 +1,1636 @@
+{-# LANGUAGE Safe #-}
+{-# LANGUAGE ForeignFunctionInterface #-}
+{-# LANGUAGE EmptyDataDecls #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+module LLVM.Raw.Core where
+
+import qualified LLVM.FFI.Base as LLVM
+
+import qualified Foreign.C.Types as C
+import Foreign.C.String (CString)
+import Foreign.Ptr (Ptr, FunPtr)
+
+import Data.Typeable (Typeable)
+
+import Data.Word (Word8, Word32, Word64)
+
+
+type CDouble  = C.CDouble
+type CInt     = C.CInt
+type CUInt    = C.CUInt
+type CLLong   = C.CLLong
+type CULLong  = C.CULLong
+type CSize    = C.CSize
+
+
+#include <llvm/Config/llvm-config.h>
+#include <llvm-c/Core.h>
+
+
+data Module
+    deriving (Typeable)
+type ModuleRef = Ptr Module
+
+data ModuleProvider
+    deriving (Typeable)
+type ModuleProviderRef = Ptr ModuleProvider
+
+data Type
+    deriving (Typeable)
+type TypeRef = Ptr Type
+
+data BasicBlock
+    deriving (Typeable)
+type BasicBlockRef = Ptr BasicBlock
+
+data Value
+    deriving (Typeable)
+type ValueRef = Ptr Value
+
+data OpaqueUse
+    deriving (Typeable)
+type UseRef = Ptr OpaqueUse
+
+data Builder
+    deriving (Typeable)
+type BuilderRef = Ptr Builder
+
+data MemoryBuffer
+    deriving (Typeable)
+type MemoryBufferRef = Ptr MemoryBuffer
+
+data PassManager
+    deriving (Typeable)
+type PassManagerRef = Ptr PassManager
+
+data PassRegistry
+    deriving (Typeable)
+type PassRegistryRef = Ptr PassRegistry
+
+data Context
+    deriving (Typeable)
+type ContextRef = Ptr Context
+
+{-
+data Attribute
+    deriving (Typeable)
+-}
+-- until 3.9
+newtype Attribute = Attribute Word32
+type AttributeRef = Ptr Attribute
+
+newtype AttributeIndex = AttributeIndex #{type LLVMAttributeIndex}
+
+attributeReturnIndex, attributeFunctionIndex :: AttributeIndex
+attributeReturnIndex   = AttributeIndex (#const LLVMAttributeReturnIndex)
+attributeFunctionIndex = AttributeIndex (#const LLVMAttributeFunctionIndex)
+
+
+data Metadata
+    deriving (Typeable)
+type MetadataRef = Ptr Metadata
+
+data DiagnosticInfo
+    deriving (Typeable)
+type DiagnosticInfoRef = Ptr DiagnosticInfo
+
+data NamedMDNode
+    deriving (Typeable)
+type NamedMDNodeRef = Ptr NamedMDNode
+
+
+data ModuleFlagEntry
+    deriving (Typeable)
+data ValueMetadataEntry
+    deriving (Typeable)
+
+type DiagnosticHandler = FunPtr (DiagnosticInfoRef -> Ptr () -> IO ())
+type YieldCallback = FunPtr (ContextRef -> Ptr () -> IO ())
+
+newtype CallingConvention = CallingConvention {unCallingConvention :: CUInt}
+
+newtype AtomicOrdering = AtomicOrdering #{type LLVMAtomicOrdering}
+newtype AtomicRMWBinOp = AtomicRMWBinOp #{type LLVMAtomicRMWBinOp}
+newtype DiagnosticSeverity = DiagnosticSeverity #{type LLVMDiagnosticSeverity}
+newtype DLLStorageClass = DLLStorageClass #{type LLVMDLLStorageClass}
+-- newtype InlineAsmDialect = InlineAsmDialect #{type LLVMInlineAsmDialect}
+newtype InlineAsmDialect = InlineAsmDialect Word32
+newtype IntPredicate = IntPredicate #{type LLVMIntPredicate}
+newtype Linkage = Linkage #{type LLVMLinkage}
+-- newtype ModuleFlagBehavior = ModuleFlagBehavior #{type LLVMModuleFlagBehavior}
+newtype ModuleFlagBehavior = ModuleFlagBehavior Word32
+newtype Opcode = Opcode #{type LLVMOpcode}
+newtype RealPredicate = RealPredicate #{type LLVMRealPredicate}
+newtype ThreadLocalMode = ThreadLocalMode #{type LLVMThreadLocalMode}
+newtype TypeKind = TypeKind {unTypeKind :: #{type LLVMTypeKind}}
+-- newtype UnnamedAddr = UnnamedAddr #{type LLVMUnnamedAddr}
+newtype UnnamedAddr = UnnamedAddr Word32
+newtype ValueKind = ValueKind #{type LLVMValueKind}
+newtype Visibility = Visibility #{type LLVMVisibility}
+
+
+foreign import ccall unsafe "LLVMInitializeCore" initializeCore
+    :: PassRegistryRef -> IO ()
+
+foreign import ccall unsafe "LLVMShutdown" shutdown
+    :: IO ()
+
+foreign import ccall unsafe "LLVMCreateMessage" createMessage
+    :: CString -> IO CString
+
+foreign import ccall unsafe "LLVMDisposeMessage" disposeMessage
+    :: CString -> IO ()
+
+foreign import ccall unsafe "LLVMContextCreate" contextCreate
+    :: IO ContextRef
+
+foreign import ccall unsafe "LLVMGetGlobalContext" getGlobalContext
+    :: IO ContextRef
+
+foreign import ccall unsafe "LLVMContextSetDiagnosticHandler" contextSetDiagnosticHandler
+    :: ContextRef -> DiagnosticHandler -> (Ptr ()) -> IO ()
+
+foreign import ccall unsafe "LLVMContextGetDiagnosticHandler" contextGetDiagnosticHandler
+    :: ContextRef -> IO DiagnosticHandler
+
+foreign import ccall unsafe "LLVMContextGetDiagnosticContext" contextGetDiagnosticContext
+    :: ContextRef -> IO (Ptr ())
+
+foreign import ccall unsafe "LLVMContextSetYieldCallback" contextSetYieldCallback
+    :: ContextRef -> YieldCallback -> (Ptr ()) -> IO ()
+
+foreign import ccall unsafe "LLVMContextDispose" contextDispose
+    :: ContextRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetDiagInfoDescription" getDiagInfoDescription
+    :: DiagnosticInfoRef -> IO CString
+
+foreign import ccall unsafe "LLVMGetDiagInfoSeverity" getDiagInfoSeverity
+    :: DiagnosticInfoRef -> IO DiagnosticSeverity
+
+foreign import ccall unsafe "LLVMGetMDKindIDInContext" getMDKindIDInContext
+    :: ContextRef -> CString -> CUInt -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetMDKindID" getMDKindID
+    :: CString -> CUInt -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetEnumAttributeKindForName" getEnumAttributeKindForName
+    :: CString -> CSize -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetLastEnumAttributeKind" getLastEnumAttributeKind
+    :: IO CUInt
+
+foreign import ccall unsafe "LLVMCreateEnumAttribute" createEnumAttribute
+    :: ContextRef -> CUInt -> Word64 -> IO AttributeRef
+
+foreign import ccall unsafe "LLVMGetEnumAttributeKind" getEnumAttributeKind
+    :: AttributeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetEnumAttributeValue" getEnumAttributeValue
+    :: AttributeRef -> IO Word64
+
+foreign import ccall unsafe "LLVMCreateStringAttribute" createStringAttribute
+    :: ContextRef -> CString -> CUInt -> CString -> CUInt -> IO AttributeRef
+
+foreign import ccall unsafe "LLVMGetStringAttributeKind" getStringAttributeKind
+    :: AttributeRef -> (Ptr CUInt) -> IO CString
+
+foreign import ccall unsafe "LLVMGetStringAttributeValue" getStringAttributeValue
+    :: AttributeRef -> (Ptr CUInt) -> IO CString
+
+foreign import ccall unsafe "LLVMIsEnumAttribute" isEnumAttribute
+    :: AttributeRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMIsStringAttribute" isStringAttribute
+    :: AttributeRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMModuleCreateWithName" moduleCreateWithName
+    :: CString -> IO ModuleRef
+
+foreign import ccall unsafe "LLVMModuleCreateWithNameInContext" moduleCreateWithNameInContext
+    :: CString -> ContextRef -> IO ModuleRef
+
+foreign import ccall unsafe "LLVMCloneModule" cloneModule
+    :: ModuleRef -> IO ModuleRef
+
+foreign import ccall unsafe "LLVMDisposeModule" disposeModule
+    :: ModuleRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetModuleIdentifier" getModuleIdentifier
+    :: ModuleRef -> (Ptr CSize) -> IO CString
+
+foreign import ccall unsafe "LLVMSetModuleIdentifier" setModuleIdentifier
+    :: ModuleRef -> CString -> CSize -> IO ()
+
+foreign import ccall unsafe "LLVMGetDataLayoutStr" getDataLayoutStr
+    :: ModuleRef -> IO CString
+
+foreign import ccall unsafe "LLVMGetDataLayout" getDataLayout
+    :: ModuleRef -> IO CString
+
+foreign import ccall unsafe "LLVMSetDataLayout" setDataLayout
+    :: ModuleRef -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMGetTarget" getTarget
+    :: ModuleRef -> IO CString
+
+foreign import ccall unsafe "LLVMSetTarget" setTarget
+    :: ModuleRef -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMDumpModule" dumpModule
+    :: ModuleRef -> IO ()
+
+foreign import ccall unsafe "LLVMPrintModuleToFile" printModuleToFile
+    :: ModuleRef -> CString -> (Ptr CString) -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMPrintModuleToString" printModuleToString
+    :: ModuleRef -> IO CString
+
+foreign import ccall unsafe "LLVMSetModuleInlineAsm" setModuleInlineAsm
+    :: ModuleRef -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMGetModuleContext" getModuleContext
+    :: ModuleRef -> IO ContextRef
+
+foreign import ccall unsafe "LLVMGetTypeByName" getTypeByName
+    :: ModuleRef -> CString -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetNamedMetadataNumOperands" getNamedMetadataNumOperands
+    :: ModuleRef -> CString -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetNamedMetadataOperands" getNamedMetadataOperands
+    :: ModuleRef -> CString -> (Ptr ValueRef) -> IO ()
+
+foreign import ccall unsafe "LLVMAddNamedMetadataOperand" addNamedMetadataOperand
+    :: ModuleRef -> CString -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMAddFunction" addFunction
+    :: ModuleRef -> CString -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetNamedFunction" getNamedFunction
+    :: ModuleRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetFirstFunction" getFirstFunction
+    :: ModuleRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetLastFunction" getLastFunction
+    :: ModuleRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetNextFunction" getNextFunction
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetPreviousFunction" getPreviousFunction
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetTypeKind" getTypeKind
+    :: TypeRef -> IO TypeKind
+
+foreign import ccall unsafe "LLVMTypeIsSized" typeIsSized
+    :: TypeRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMGetTypeContext" getTypeContext
+    :: TypeRef -> IO ContextRef
+
+foreign import ccall unsafe "LLVMPrintTypeToString" printTypeToString
+    :: TypeRef -> IO CString
+
+foreign import ccall unsafe "LLVMInt1TypeInContext" int1TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMInt8TypeInContext" int8TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMInt16TypeInContext" int16TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMInt32TypeInContext" int32TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMInt64TypeInContext" int64TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMInt128TypeInContext" int128TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMIntTypeInContext" intTypeInContext
+    :: ContextRef -> CUInt -> IO TypeRef
+
+foreign import ccall unsafe "LLVMInt1Type" int1Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMInt8Type" int8Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMInt16Type" int16Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMInt32Type" int32Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMInt64Type" int64Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMInt128Type" int128Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMIntType" intType
+    :: CUInt -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetIntTypeWidth" getIntTypeWidth
+    :: TypeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMHalfTypeInContext" halfTypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMFloatTypeInContext" floatTypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMDoubleTypeInContext" doubleTypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMX86FP80TypeInContext" x86FP80TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMFP128TypeInContext" fP128TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMPPCFP128TypeInContext" pPCFP128TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMHalfType" halfType
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMFloatType" floatType
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMDoubleType" doubleType
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMX86FP80Type" x86FP80Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMFP128Type" fP128Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMPPCFP128Type" pPCFP128Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMFunctionType" functionType
+    :: TypeRef -> (Ptr TypeRef) -> CUInt -> LLVM.Bool -> IO TypeRef
+
+foreign import ccall unsafe "LLVMIsFunctionVarArg" isFunctionVarArg
+    :: TypeRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMGetReturnType" getReturnType
+    :: TypeRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMCountParamTypes" countParamTypes
+    :: TypeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetParamTypes" getParamTypes
+    :: TypeRef -> (Ptr TypeRef) -> IO ()
+
+foreign import ccall unsafe "LLVMStructTypeInContext" structTypeInContext
+    :: ContextRef -> (Ptr TypeRef) -> CUInt -> LLVM.Bool -> IO TypeRef
+
+foreign import ccall unsafe "LLVMStructType" structType
+    :: (Ptr TypeRef) -> CUInt -> LLVM.Bool -> IO TypeRef
+
+foreign import ccall unsafe "LLVMStructCreateNamed" structCreateNamed
+    :: ContextRef -> CString -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetStructName" getStructName
+    :: TypeRef -> IO CString
+
+foreign import ccall unsafe "LLVMStructSetBody" structSetBody
+    :: TypeRef -> (Ptr TypeRef) -> CUInt -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMCountStructElementTypes" countStructElementTypes
+    :: TypeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetStructElementTypes" getStructElementTypes
+    :: TypeRef -> (Ptr TypeRef) -> IO ()
+
+foreign import ccall unsafe "LLVMStructGetTypeAtIndex" structGetTypeAtIndex
+    :: TypeRef -> CUInt -> IO TypeRef
+
+foreign import ccall unsafe "LLVMIsPackedStruct" isPackedStruct
+    :: TypeRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMIsOpaqueStruct" isOpaqueStruct
+    :: TypeRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMGetElementType" getElementType
+    :: TypeRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMArrayType" arrayType
+    :: TypeRef -> CUInt -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetArrayLength" getArrayLength
+    :: TypeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMPointerType" pointerType
+    :: TypeRef -> CUInt -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetPointerAddressSpace" getPointerAddressSpace
+    :: TypeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMVectorType" vectorType
+    :: TypeRef -> CUInt -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetVectorSize" getVectorSize
+    :: TypeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMVoidTypeInContext" voidTypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMLabelTypeInContext" labelTypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMX86MMXTypeInContext" x86MMXTypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMVoidType" voidType
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMLabelType" labelType
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMX86MMXType" x86MMXType
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMTypeOf" typeOf
+    :: ValueRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetValueKind" getValueKind
+    :: ValueRef -> IO ValueKind
+
+foreign import ccall unsafe "LLVMGetValueName" getValueName
+    :: ValueRef -> IO CString
+
+foreign import ccall unsafe "LLVMSetValueName" setValueName
+    :: ValueRef -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMDumpValue" dumpValue
+    :: ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMPrintValueToString" printValueToString
+    :: ValueRef -> IO CString
+
+foreign import ccall unsafe "LLVMReplaceAllUsesWith" replaceAllUsesWith
+    :: ValueRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMIsConstant" isConstant
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMIsUndef" isUndef
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMIsAMDNode" isAMDNode
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMIsAMDString" isAMDString
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetFirstUse" getFirstUse
+    :: ValueRef -> IO UseRef
+
+foreign import ccall unsafe "LLVMGetNextUse" getNextUse
+    :: UseRef -> IO UseRef
+
+foreign import ccall unsafe "LLVMGetUser" getUser
+    :: UseRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetUsedValue" getUsedValue
+    :: UseRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetOperand" getOperand
+    :: ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetOperandUse" getOperandUse
+    :: ValueRef -> CUInt -> IO UseRef
+
+foreign import ccall unsafe "LLVMSetOperand" setOperand
+    :: ValueRef -> CUInt -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetNumOperands" getNumOperands
+    :: ValueRef -> IO CInt
+
+foreign import ccall unsafe "LLVMConstNull" constNull
+    :: TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstAllOnes" constAllOnes
+    :: TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetUndef" getUndef
+    :: TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMIsNull" isNull
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMConstPointerNull" constPointerNull
+    :: TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstInt" constInt
+    :: TypeRef -> CULLong -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstIntOfArbitraryPrecision" constIntOfArbitraryPrecision
+    :: TypeRef -> CUInt -> Ptr Word64 -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstIntOfString" constIntOfString
+    :: TypeRef -> CString -> Word8 -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstIntOfStringAndSize" constIntOfStringAndSize
+    :: TypeRef -> CString -> CUInt -> Word8 -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstReal" constReal
+    :: TypeRef -> CDouble -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstRealOfString" constRealOfString
+    :: TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstRealOfStringAndSize" constRealOfStringAndSize
+    :: TypeRef -> CString -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstIntGetZExtValue" constIntGetZExtValue
+    :: ValueRef -> IO CULLong
+
+foreign import ccall unsafe "LLVMConstIntGetSExtValue" constIntGetSExtValue
+    :: ValueRef -> IO CLLong
+
+foreign import ccall unsafe "LLVMConstRealGetDouble" constRealGetDouble
+    :: ValueRef -> (Ptr LLVM.Bool) -> IO CDouble
+
+foreign import ccall unsafe "LLVMConstStringInContext" constStringInContext
+    :: ContextRef -> CString -> CUInt -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstString" constString
+    :: CString -> CUInt -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMIsConstantString" isConstantString
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMGetAsString" getAsString
+    :: ValueRef -> (Ptr CSize) -> IO CString
+
+foreign import ccall unsafe "LLVMConstStructInContext" constStructInContext
+    :: ContextRef -> (Ptr ValueRef) -> CUInt -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstStruct" constStruct
+    :: (Ptr ValueRef) -> CUInt -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstArray" constArray
+    :: TypeRef -> (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNamedStruct" constNamedStruct
+    :: TypeRef -> (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetElementAsConstant" getElementAsConstant
+    :: ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstVector" constVector
+    :: (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetConstOpcode" getConstOpcode
+    :: ValueRef -> IO Opcode
+
+foreign import ccall unsafe "LLVMAlignOf" alignOf
+    :: TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSizeOf" sizeOf
+    :: TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNeg" constNeg
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNSWNeg" constNSWNeg
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNUWNeg" constNUWNeg
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFNeg" constFNeg
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNot" constNot
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstAdd" constAdd
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNSWAdd" constNSWAdd
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNUWAdd" constNUWAdd
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFAdd" constFAdd
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstSub" constSub
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNSWSub" constNSWSub
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNUWSub" constNUWSub
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFSub" constFSub
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstMul" constMul
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNSWMul" constNSWMul
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNUWMul" constNUWMul
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFMul" constFMul
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstUDiv" constUDiv
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstSDiv" constSDiv
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstExactSDiv" constExactSDiv
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFDiv" constFDiv
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstURem" constURem
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstSRem" constSRem
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFRem" constFRem
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstAnd" constAnd
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstOr" constOr
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstXor" constXor
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstICmp" constICmp
+    :: IntPredicate -> ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFCmp" constFCmp
+    :: RealPredicate -> ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstShl" constShl
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstLShr" constLShr
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstAShr" constAShr
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstGEP" constGEP
+    :: ValueRef -> (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstInBoundsGEP" constInBoundsGEP
+    :: ValueRef -> (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstTrunc" constTrunc
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstSExt" constSExt
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstZExt" constZExt
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFPTrunc" constFPTrunc
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFPExt" constFPExt
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstUIToFP" constUIToFP
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstSIToFP" constSIToFP
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFPToUI" constFPToUI
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFPToSI" constFPToSI
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstPtrToInt" constPtrToInt
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstIntToPtr" constIntToPtr
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstBitCast" constBitCast
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstAddrSpaceCast" constAddrSpaceCast
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstZExtOrBitCast" constZExtOrBitCast
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstSExtOrBitCast" constSExtOrBitCast
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstTruncOrBitCast" constTruncOrBitCast
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstPointerCast" constPointerCast
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstIntCast" constIntCast
+    :: ValueRef -> TypeRef -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFPCast" constFPCast
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstSelect" constSelect
+    :: ValueRef -> ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstExtractElement" constExtractElement
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstInsertElement" constInsertElement
+    :: ValueRef -> ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstShuffleVector" constShuffleVector
+    :: ValueRef -> ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstExtractValue" constExtractValue
+    :: ValueRef -> (Ptr CUInt) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstInsertValue" constInsertValue
+    :: ValueRef -> ValueRef -> (Ptr CUInt) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstInlineAsm" constInlineAsm
+    :: TypeRef -> CString -> CString -> LLVM.Bool -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBlockAddress" blockAddress
+    :: ValueRef -> BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetGlobalParent" getGlobalParent
+    :: ValueRef -> IO ModuleRef
+
+foreign import ccall unsafe "LLVMIsDeclaration" isDeclaration
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMGetLinkage" getLinkage
+    :: ValueRef -> IO Linkage
+
+foreign import ccall unsafe "LLVMSetLinkage" setLinkage
+    :: ValueRef -> Linkage -> IO ()
+
+foreign import ccall unsafe "LLVMGetSection" getSection
+    :: ValueRef -> IO CString
+
+foreign import ccall unsafe "LLVMSetSection" setSection
+    :: ValueRef -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMGetVisibility" getVisibility
+    :: ValueRef -> IO Visibility
+
+foreign import ccall unsafe "LLVMSetVisibility" setVisibility
+    :: ValueRef -> Visibility -> IO ()
+
+foreign import ccall unsafe "LLVMGetDLLStorageClass" getDLLStorageClass
+    :: ValueRef -> IO DLLStorageClass
+
+foreign import ccall unsafe "LLVMSetDLLStorageClass" setDLLStorageClass
+    :: ValueRef -> DLLStorageClass -> IO ()
+
+foreign import ccall unsafe "LLVMHasUnnamedAddr" hasUnnamedAddr
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetUnnamedAddr" setUnnamedAddr
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMGetAlignment" getAlignment
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMSetAlignment" setAlignment
+    :: ValueRef -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMAddGlobal" addGlobal
+    :: ModuleRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMAddGlobalInAddressSpace" addGlobalInAddressSpace
+    :: ModuleRef -> TypeRef -> CString -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetNamedGlobal" getNamedGlobal
+    :: ModuleRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetFirstGlobal" getFirstGlobal
+    :: ModuleRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetLastGlobal" getLastGlobal
+    :: ModuleRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetNextGlobal" getNextGlobal
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetPreviousGlobal" getPreviousGlobal
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMDeleteGlobal" deleteGlobal
+    :: ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetInitializer" getInitializer
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSetInitializer" setInitializer
+    :: ValueRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMIsThreadLocal" isThreadLocal
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetThreadLocal" setThreadLocal
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMIsGlobalConstant" isGlobalConstant
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetGlobalConstant" setGlobalConstant
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMGetThreadLocalMode" getThreadLocalMode
+    :: ValueRef -> IO ThreadLocalMode
+
+foreign import ccall unsafe "LLVMSetThreadLocalMode" setThreadLocalMode
+    :: ValueRef -> ThreadLocalMode -> IO ()
+
+foreign import ccall unsafe "LLVMIsExternallyInitialized" isExternallyInitialized
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetExternallyInitialized" setExternallyInitialized
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMAddAlias" addAlias
+    :: ModuleRef -> TypeRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMDeleteFunction" deleteFunction
+    :: ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMHasPersonalityFn" hasPersonalityFn
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMGetPersonalityFn" getPersonalityFn
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSetPersonalityFn" setPersonalityFn
+    :: ValueRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetIntrinsicID" getIntrinsicID
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetFunctionCallConv" getFunctionCallConv
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMSetFunctionCallConv" setFunctionCallConv
+    :: ValueRef -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMGetGC" getGC
+    :: ValueRef -> IO CString
+
+foreign import ccall unsafe "LLVMSetGC" setGC
+    :: ValueRef -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMAddFunctionAttr" addFunctionAttr
+    :: ValueRef -> Attribute -> IO ()
+
+foreign import ccall unsafe "LLVMAddAttributeAtIndex" addAttributeAtIndex
+    :: ValueRef -> AttributeIndex -> AttributeRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetAttributeCountAtIndex" getAttributeCountAtIndex
+    :: ValueRef -> AttributeIndex -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetAttributesAtIndex" getAttributesAtIndex
+    :: ValueRef -> AttributeIndex -> (Ptr AttributeRef) -> IO ()
+
+foreign import ccall unsafe "LLVMGetEnumAttributeAtIndex" getEnumAttributeAtIndex
+    :: ValueRef -> AttributeIndex -> CUInt -> IO AttributeRef
+
+foreign import ccall unsafe "LLVMGetStringAttributeAtIndex" getStringAttributeAtIndex
+    :: ValueRef -> AttributeIndex -> CString -> CUInt -> IO AttributeRef
+
+foreign import ccall unsafe "LLVMRemoveEnumAttributeAtIndex" removeEnumAttributeAtIndex
+    :: ValueRef -> AttributeIndex -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMRemoveStringAttributeAtIndex" removeStringAttributeAtIndex
+    :: ValueRef -> AttributeIndex -> CString -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMAddTargetDependentFunctionAttr" addTargetDependentFunctionAttr
+    :: ValueRef -> CString -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMGetFunctionAttr" getFunctionAttr
+    :: ValueRef -> IO Attribute
+
+foreign import ccall unsafe "LLVMRemoveFunctionAttr" removeFunctionAttr
+    :: ValueRef -> Attribute -> IO ()
+
+foreign import ccall unsafe "LLVMCountParams" countParams
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetParams" getParams
+    :: ValueRef -> (Ptr ValueRef) -> IO ()
+
+foreign import ccall unsafe "LLVMGetParam" getParam
+    :: ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetParamParent" getParamParent
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetFirstParam" getFirstParam
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetLastParam" getLastParam
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetNextParam" getNextParam
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetPreviousParam" getPreviousParam
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMAddAttribute" addAttribute
+    :: ValueRef -> Attribute -> IO ()
+
+foreign import ccall unsafe "LLVMRemoveAttribute" removeAttribute
+    :: ValueRef -> Attribute -> IO ()
+
+foreign import ccall unsafe "LLVMGetAttribute" getAttribute
+    :: ValueRef -> IO Attribute
+
+foreign import ccall unsafe "LLVMSetParamAlignment" setParamAlignment
+    :: ValueRef -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMMDStringInContext" mDStringInContext
+    :: ContextRef -> CString -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMMDString" mDString
+    :: CString -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMMDNodeInContext" mDNodeInContext
+    :: ContextRef -> (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMMDNode" mDNode
+    :: (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetMDString" getMDString
+    :: ValueRef -> (Ptr CUInt) -> IO CString
+
+foreign import ccall unsafe "LLVMGetMDNodeNumOperands" getMDNodeNumOperands
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetMDNodeOperands" getMDNodeOperands
+    :: ValueRef -> (Ptr ValueRef) -> IO ()
+
+foreign import ccall unsafe "LLVMBasicBlockAsValue" basicBlockAsValue
+    :: BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMValueIsBasicBlock" valueIsBasicBlock
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMValueAsBasicBlock" valueAsBasicBlock
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetBasicBlockName" getBasicBlockName
+    :: BasicBlockRef -> IO CString
+
+foreign import ccall unsafe "LLVMGetBasicBlockParent" getBasicBlockParent
+    :: BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetBasicBlockTerminator" getBasicBlockTerminator
+    :: BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMCountBasicBlocks" countBasicBlocks
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetBasicBlocks" getBasicBlocks
+    :: ValueRef -> (Ptr BasicBlockRef) -> IO ()
+
+foreign import ccall unsafe "LLVMGetFirstBasicBlock" getFirstBasicBlock
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetLastBasicBlock" getLastBasicBlock
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetNextBasicBlock" getNextBasicBlock
+    :: BasicBlockRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetPreviousBasicBlock" getPreviousBasicBlock
+    :: BasicBlockRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetEntryBasicBlock" getEntryBasicBlock
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMAppendBasicBlockInContext" appendBasicBlockInContext
+    :: ContextRef -> ValueRef -> CString -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMAppendBasicBlock" appendBasicBlock
+    :: ValueRef -> CString -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMInsertBasicBlockInContext" insertBasicBlockInContext
+    :: ContextRef -> BasicBlockRef -> CString -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMInsertBasicBlock" insertBasicBlock
+    :: BasicBlockRef -> CString -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMDeleteBasicBlock" deleteBasicBlock
+    :: BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMRemoveBasicBlockFromParent" removeBasicBlockFromParent
+    :: BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMMoveBasicBlockBefore" moveBasicBlockBefore
+    :: BasicBlockRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMMoveBasicBlockAfter" moveBasicBlockAfter
+    :: BasicBlockRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetFirstInstruction" getFirstInstruction
+    :: BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetLastInstruction" getLastInstruction
+    :: BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMHasMetadata" hasMetadata
+    :: ValueRef -> IO CInt
+
+foreign import ccall unsafe "LLVMGetMetadata" getMetadata
+    :: ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSetMetadata" setMetadata
+    :: ValueRef -> CUInt -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetInstructionParent" getInstructionParent
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetNextInstruction" getNextInstruction
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetPreviousInstruction" getPreviousInstruction
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMInstructionRemoveFromParent" instructionRemoveFromParent
+    :: ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMInstructionEraseFromParent" instructionEraseFromParent
+    :: ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetInstructionOpcode" getInstructionOpcode
+    :: ValueRef -> IO Opcode
+
+foreign import ccall unsafe "LLVMGetICmpPredicate" getICmpPredicate
+    :: ValueRef -> IO IntPredicate
+
+foreign import ccall unsafe "LLVMGetFCmpPredicate" getFCmpPredicate
+    :: ValueRef -> IO RealPredicate
+
+foreign import ccall unsafe "LLVMInstructionClone" instructionClone
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetNumArgOperands" getNumArgOperands
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMSetInstructionCallConv" setInstructionCallConv
+    :: ValueRef -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMGetInstructionCallConv" getInstructionCallConv
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMAddInstrAttribute" addInstrAttribute
+    :: ValueRef -> CUInt -> Attribute -> IO ()
+
+foreign import ccall unsafe "LLVMRemoveInstrAttribute" removeInstrAttribute
+    :: ValueRef -> CUInt -> Attribute -> IO ()
+
+foreign import ccall unsafe "LLVMSetInstrParamAlignment" setInstrParamAlignment
+    :: ValueRef -> CUInt -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMAddCallSiteAttribute" addCallSiteAttribute
+    :: ValueRef -> AttributeIndex -> AttributeRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetCallSiteAttributeCount" getCallSiteAttributeCount
+    :: ValueRef -> AttributeIndex -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetCallSiteAttributes" getCallSiteAttributes
+    :: ValueRef -> AttributeIndex -> (Ptr AttributeRef) -> IO ()
+
+foreign import ccall unsafe "LLVMGetCallSiteEnumAttribute" getCallSiteEnumAttribute
+    :: ValueRef -> AttributeIndex -> CUInt -> IO AttributeRef
+
+foreign import ccall unsafe "LLVMGetCallSiteStringAttribute" getCallSiteStringAttribute
+    :: ValueRef -> AttributeIndex -> CString -> CUInt -> IO AttributeRef
+
+foreign import ccall unsafe "LLVMRemoveCallSiteEnumAttribute" removeCallSiteEnumAttribute
+    :: ValueRef -> AttributeIndex -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMRemoveCallSiteStringAttribute" removeCallSiteStringAttribute
+    :: ValueRef -> AttributeIndex -> CString -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMGetCalledValue" getCalledValue
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMIsTailCall" isTailCall
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetTailCall" setTailCall
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMGetNormalDest" getNormalDest
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetUnwindDest" getUnwindDest
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMSetNormalDest" setNormalDest
+    :: ValueRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMSetUnwindDest" setUnwindDest
+    :: ValueRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetNumSuccessors" getNumSuccessors
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetSuccessor" getSuccessor
+    :: ValueRef -> CUInt -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMSetSuccessor" setSuccessor
+    :: ValueRef -> CUInt -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMIsConditional" isConditional
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMGetCondition" getCondition
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSetCondition" setCondition
+    :: ValueRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetSwitchDefaultDest" getSwitchDefaultDest
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetAllocatedType" getAllocatedType
+    :: ValueRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMIsInBounds" isInBounds
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetIsInBounds" setIsInBounds
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMAddIncoming" addIncoming
+    :: ValueRef -> (Ptr ValueRef) -> (Ptr BasicBlockRef) -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMCountIncoming" countIncoming
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetIncomingValue" getIncomingValue
+    :: ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetIncomingBlock" getIncomingBlock
+    :: ValueRef -> CUInt -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetNumIndices" getNumIndices
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetIndices" getIndices
+    :: ValueRef -> IO (Ptr CUInt)
+
+foreign import ccall unsafe "LLVMCreateBuilderInContext" createBuilderInContext
+    :: ContextRef -> IO BuilderRef
+
+foreign import ccall unsafe "LLVMCreateBuilder" createBuilder
+    :: IO BuilderRef
+
+foreign import ccall unsafe "LLVMPositionBuilder" positionBuilder
+    :: BuilderRef -> BasicBlockRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMPositionBuilderBefore" positionBuilderBefore
+    :: BuilderRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMPositionBuilderAtEnd" positionBuilderAtEnd
+    :: BuilderRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetInsertBlock" getInsertBlock
+    :: BuilderRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMClearInsertionPosition" clearInsertionPosition
+    :: BuilderRef -> IO ()
+
+foreign import ccall unsafe "LLVMInsertIntoBuilder" insertIntoBuilder
+    :: BuilderRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMInsertIntoBuilderWithName" insertIntoBuilderWithName
+    :: BuilderRef -> ValueRef -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMDisposeBuilder" disposeBuilder
+    :: BuilderRef -> IO ()
+
+foreign import ccall unsafe "LLVMSetCurrentDebugLocation" setCurrentDebugLocation
+    :: BuilderRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetCurrentDebugLocation" getCurrentDebugLocation
+    :: BuilderRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSetInstDebugLocation" setInstDebugLocation
+    :: BuilderRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMBuildRetVoid" buildRetVoid
+    :: BuilderRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildRet" buildRet
+    :: BuilderRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildAggregateRet" buildAggregateRet
+    :: BuilderRef -> (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildBr" buildBr
+    :: BuilderRef -> BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildCondBr" buildCondBr
+    :: BuilderRef -> ValueRef -> BasicBlockRef -> BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSwitch" buildSwitch
+    :: BuilderRef -> ValueRef -> BasicBlockRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildIndirectBr" buildIndirectBr
+    :: BuilderRef -> ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildInvoke" buildInvoke
+    :: BuilderRef -> ValueRef -> (Ptr ValueRef) -> CUInt -> BasicBlockRef -> BasicBlockRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildLandingPad" buildLandingPad
+    :: BuilderRef -> TypeRef -> ValueRef -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildResume" buildResume
+    :: BuilderRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildUnreachable" buildUnreachable
+    :: BuilderRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMAddCase" addCase
+    :: ValueRef -> ValueRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMAddDestination" addDestination
+    :: ValueRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetNumClauses" getNumClauses
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetClause" getClause
+    :: ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMAddClause" addClause
+    :: ValueRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMIsCleanup" isCleanup
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetCleanup" setCleanup
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMBuildAdd" buildAdd
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNSWAdd" buildNSWAdd
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNUWAdd" buildNUWAdd
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFAdd" buildFAdd
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSub" buildSub
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNSWSub" buildNSWSub
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNUWSub" buildNUWSub
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFSub" buildFSub
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildMul" buildMul
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNSWMul" buildNSWMul
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNUWMul" buildNUWMul
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFMul" buildFMul
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildUDiv" buildUDiv
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSDiv" buildSDiv
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildExactSDiv" buildExactSDiv
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFDiv" buildFDiv
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildURem" buildURem
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSRem" buildSRem
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFRem" buildFRem
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildShl" buildShl
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildLShr" buildLShr
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildAShr" buildAShr
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildAnd" buildAnd
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildOr" buildOr
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildXor" buildXor
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildBinOp" buildBinOp
+    :: BuilderRef -> Opcode -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNeg" buildNeg
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNSWNeg" buildNSWNeg
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNUWNeg" buildNUWNeg
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFNeg" buildFNeg
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNot" buildNot
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildMalloc" buildMalloc
+    :: BuilderRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildArrayMalloc" buildArrayMalloc
+    :: BuilderRef -> TypeRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildAlloca" buildAlloca
+    :: BuilderRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildArrayAlloca" buildArrayAlloca
+    :: BuilderRef -> TypeRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFree" buildFree
+    :: BuilderRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildLoad" buildLoad
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildStore" buildStore
+    :: BuilderRef -> ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildGEP" buildGEP
+    :: BuilderRef -> ValueRef -> (Ptr ValueRef) -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildInBoundsGEP" buildInBoundsGEP
+    :: BuilderRef -> ValueRef -> (Ptr ValueRef) -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildStructGEP" buildStructGEP
+    :: BuilderRef -> ValueRef -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildGlobalString" buildGlobalString
+    :: BuilderRef -> CString -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildGlobalStringPtr" buildGlobalStringPtr
+    :: BuilderRef -> CString -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetVolatile" getVolatile
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetVolatile" setVolatile
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMGetOrdering" getOrdering
+    :: ValueRef -> IO AtomicOrdering
+
+foreign import ccall unsafe "LLVMSetOrdering" setOrdering
+    :: ValueRef -> AtomicOrdering -> IO ()
+
+foreign import ccall unsafe "LLVMBuildTrunc" buildTrunc
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildZExt" buildZExt
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSExt" buildSExt
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFPToUI" buildFPToUI
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFPToSI" buildFPToSI
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildUIToFP" buildUIToFP
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSIToFP" buildSIToFP
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFPTrunc" buildFPTrunc
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFPExt" buildFPExt
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildPtrToInt" buildPtrToInt
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildIntToPtr" buildIntToPtr
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildBitCast" buildBitCast
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildAddrSpaceCast" buildAddrSpaceCast
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildZExtOrBitCast" buildZExtOrBitCast
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSExtOrBitCast" buildSExtOrBitCast
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildTruncOrBitCast" buildTruncOrBitCast
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildCast" buildCast
+    :: BuilderRef -> Opcode -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildPointerCast" buildPointerCast
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFPCast" buildFPCast
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildICmp" buildICmp
+    :: BuilderRef -> IntPredicate -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFCmp" buildFCmp
+    :: BuilderRef -> RealPredicate -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildPhi" buildPhi
+    :: BuilderRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildCall" buildCall
+    :: BuilderRef -> ValueRef -> (Ptr ValueRef) -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSelect" buildSelect
+    :: BuilderRef -> ValueRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildVAArg" buildVAArg
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildExtractElement" buildExtractElement
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildInsertElement" buildInsertElement
+    :: BuilderRef -> ValueRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildShuffleVector" buildShuffleVector
+    :: BuilderRef -> ValueRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildExtractValue" buildExtractValue
+    :: BuilderRef -> ValueRef -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildInsertValue" buildInsertValue
+    :: BuilderRef -> ValueRef -> ValueRef -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildIsNull" buildIsNull
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildIsNotNull" buildIsNotNull
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildPtrDiff" buildPtrDiff
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFence" buildFence
+    :: BuilderRef -> AtomicOrdering -> LLVM.Bool -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildAtomicRMW" buildAtomicRMW
+    :: BuilderRef -> AtomicRMWBinOp -> ValueRef -> ValueRef -> AtomicOrdering -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildAtomicCmpXchg" buildAtomicCmpXchg
+    :: BuilderRef -> ValueRef -> ValueRef -> ValueRef -> AtomicOrdering -> AtomicOrdering -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMIsAtomicSingleThread" isAtomicSingleThread
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetAtomicSingleThread" setAtomicSingleThread
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMGetCmpXchgSuccessOrdering" getCmpXchgSuccessOrdering
+    :: ValueRef -> IO AtomicOrdering
+
+foreign import ccall unsafe "LLVMSetCmpXchgSuccessOrdering" setCmpXchgSuccessOrdering
+    :: ValueRef -> AtomicOrdering -> IO ()
+
+foreign import ccall unsafe "LLVMGetCmpXchgFailureOrdering" getCmpXchgFailureOrdering
+    :: ValueRef -> IO AtomicOrdering
+
+foreign import ccall unsafe "LLVMSetCmpXchgFailureOrdering" setCmpXchgFailureOrdering
+    :: ValueRef -> AtomicOrdering -> IO ()
+
+foreign import ccall unsafe "LLVMCreateModuleProviderForExistingModule" createModuleProviderForExistingModule
+    :: ModuleRef -> IO ModuleProviderRef
+
+foreign import ccall unsafe "LLVMDisposeModuleProvider" disposeModuleProvider
+    :: ModuleProviderRef -> IO ()
+
+foreign import ccall unsafe "LLVMCreateMemoryBufferWithContentsOfFile" createMemoryBufferWithContentsOfFile
+    :: CString -> (Ptr MemoryBufferRef) -> (Ptr CString) -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMCreateMemoryBufferWithSTDIN" createMemoryBufferWithSTDIN
+    :: (Ptr MemoryBufferRef) -> (Ptr CString) -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMCreateMemoryBufferWithMemoryRange" createMemoryBufferWithMemoryRange
+    :: CString -> CSize -> CString -> LLVM.Bool -> IO MemoryBufferRef
+
+foreign import ccall unsafe "LLVMCreateMemoryBufferWithMemoryRangeCopy" createMemoryBufferWithMemoryRangeCopy
+    :: CString -> CSize -> CString -> IO MemoryBufferRef
+
+foreign import ccall unsafe "LLVMGetBufferStart" getBufferStart
+    :: MemoryBufferRef -> IO CString
+
+foreign import ccall unsafe "LLVMGetBufferSize" getBufferSize
+    :: MemoryBufferRef -> IO CSize
+
+foreign import ccall unsafe "LLVMDisposeMemoryBuffer" disposeMemoryBuffer
+    :: MemoryBufferRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetGlobalPassRegistry" getGlobalPassRegistry
+    :: IO PassRegistryRef
+
+foreign import ccall unsafe "LLVMCreatePassManager" createPassManager
+    :: IO PassManagerRef
+
+foreign import ccall unsafe "LLVMCreateFunctionPassManagerForModule" createFunctionPassManagerForModule
+    :: ModuleRef -> IO PassManagerRef
+
+foreign import ccall unsafe "LLVMCreateFunctionPassManager" createFunctionPassManager
+    :: ModuleProviderRef -> IO PassManagerRef
+
+foreign import ccall unsafe "LLVMRunPassManager" runPassManager
+    :: PassManagerRef -> ModuleRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMInitializeFunctionPassManager" initializeFunctionPassManager
+    :: PassManagerRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMRunFunctionPassManager" runFunctionPassManager
+    :: PassManagerRef -> ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMFinalizeFunctionPassManager" finalizeFunctionPassManager
+    :: PassManagerRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMDisposePassManager" disposePassManager
+    :: PassManagerRef -> IO ()
+
+foreign import ccall unsafe "LLVMStartMultithreaded" startMultithreaded
+    :: IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMStopMultithreaded" stopMultithreaded
+    :: IO ()
+
+foreign import ccall unsafe "LLVMIsMultithreaded" isMultithreaded
+    :: IO LLVM.Bool
diff --git a/src/4.0/LLVM/Raw/Core.hsc b/src/4.0/LLVM/Raw/Core.hsc
new file mode 100644
--- /dev/null
+++ b/src/4.0/LLVM/Raw/Core.hsc
@@ -0,0 +1,1618 @@
+{-# LANGUAGE Safe #-}
+{-# LANGUAGE ForeignFunctionInterface #-}
+{-# LANGUAGE EmptyDataDecls #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+module LLVM.Raw.Core where
+
+import qualified LLVM.FFI.Base as LLVM
+
+import qualified Foreign.C.Types as C
+import Foreign.C.String (CString)
+import Foreign.Ptr (Ptr, FunPtr)
+
+import Data.Typeable (Typeable)
+
+import Data.Word (Word8, Word32, Word64)
+
+
+type CDouble  = C.CDouble
+type CInt     = C.CInt
+type CUInt    = C.CUInt
+type CLLong   = C.CLLong
+type CULLong  = C.CULLong
+type CSize    = C.CSize
+
+
+#include <llvm/Config/llvm-config.h>
+#include <llvm-c/Core.h>
+
+
+data Module
+    deriving (Typeable)
+type ModuleRef = Ptr Module
+
+data ModuleProvider
+    deriving (Typeable)
+type ModuleProviderRef = Ptr ModuleProvider
+
+data Type
+    deriving (Typeable)
+type TypeRef = Ptr Type
+
+data BasicBlock
+    deriving (Typeable)
+type BasicBlockRef = Ptr BasicBlock
+
+data Value
+    deriving (Typeable)
+type ValueRef = Ptr Value
+
+data OpaqueUse
+    deriving (Typeable)
+type UseRef = Ptr OpaqueUse
+
+data Builder
+    deriving (Typeable)
+type BuilderRef = Ptr Builder
+
+data MemoryBuffer
+    deriving (Typeable)
+type MemoryBufferRef = Ptr MemoryBuffer
+
+data PassManager
+    deriving (Typeable)
+type PassManagerRef = Ptr PassManager
+
+data PassRegistry
+    deriving (Typeable)
+type PassRegistryRef = Ptr PassRegistry
+
+data Context
+    deriving (Typeable)
+type ContextRef = Ptr Context
+
+{-
+data Attribute
+    deriving (Typeable)
+-}
+-- until 3.9
+newtype Attribute = Attribute Word32
+type AttributeRef = Ptr Attribute
+
+newtype AttributeIndex = AttributeIndex #{type LLVMAttributeIndex}
+
+attributeReturnIndex, attributeFunctionIndex :: AttributeIndex
+attributeReturnIndex   = AttributeIndex (#const LLVMAttributeReturnIndex)
+attributeFunctionIndex = AttributeIndex (#const LLVMAttributeFunctionIndex)
+
+
+data Metadata
+    deriving (Typeable)
+type MetadataRef = Ptr Metadata
+
+data DiagnosticInfo
+    deriving (Typeable)
+type DiagnosticInfoRef = Ptr DiagnosticInfo
+
+data NamedMDNode
+    deriving (Typeable)
+type NamedMDNodeRef = Ptr NamedMDNode
+
+
+data ModuleFlagEntry
+    deriving (Typeable)
+data ValueMetadataEntry
+    deriving (Typeable)
+
+type DiagnosticHandler = FunPtr (DiagnosticInfoRef -> Ptr () -> IO ())
+type YieldCallback = FunPtr (ContextRef -> Ptr () -> IO ())
+
+newtype CallingConvention = CallingConvention {unCallingConvention :: CUInt}
+
+newtype AtomicOrdering = AtomicOrdering #{type LLVMAtomicOrdering}
+newtype AtomicRMWBinOp = AtomicRMWBinOp #{type LLVMAtomicRMWBinOp}
+newtype DiagnosticSeverity = DiagnosticSeverity #{type LLVMDiagnosticSeverity}
+newtype DLLStorageClass = DLLStorageClass #{type LLVMDLLStorageClass}
+-- newtype InlineAsmDialect = InlineAsmDialect #{type LLVMInlineAsmDialect}
+newtype InlineAsmDialect = InlineAsmDialect Word32
+newtype IntPredicate = IntPredicate #{type LLVMIntPredicate}
+newtype Linkage = Linkage #{type LLVMLinkage}
+-- newtype ModuleFlagBehavior = ModuleFlagBehavior #{type LLVMModuleFlagBehavior}
+newtype ModuleFlagBehavior = ModuleFlagBehavior Word32
+newtype Opcode = Opcode #{type LLVMOpcode}
+newtype RealPredicate = RealPredicate #{type LLVMRealPredicate}
+newtype ThreadLocalMode = ThreadLocalMode #{type LLVMThreadLocalMode}
+newtype TypeKind = TypeKind {unTypeKind :: #{type LLVMTypeKind}}
+-- newtype UnnamedAddr = UnnamedAddr #{type LLVMUnnamedAddr}
+newtype UnnamedAddr = UnnamedAddr Word32
+newtype ValueKind = ValueKind #{type LLVMValueKind}
+newtype Visibility = Visibility #{type LLVMVisibility}
+
+
+foreign import ccall unsafe "LLVMInitializeCore" initializeCore
+    :: PassRegistryRef -> IO ()
+
+foreign import ccall unsafe "LLVMShutdown" shutdown
+    :: IO ()
+
+foreign import ccall unsafe "LLVMCreateMessage" createMessage
+    :: CString -> IO CString
+
+foreign import ccall unsafe "LLVMDisposeMessage" disposeMessage
+    :: CString -> IO ()
+
+foreign import ccall unsafe "LLVMContextCreate" contextCreate
+    :: IO ContextRef
+
+foreign import ccall unsafe "LLVMGetGlobalContext" getGlobalContext
+    :: IO ContextRef
+
+foreign import ccall unsafe "LLVMContextSetDiagnosticHandler" contextSetDiagnosticHandler
+    :: ContextRef -> DiagnosticHandler -> (Ptr ()) -> IO ()
+
+foreign import ccall unsafe "LLVMContextGetDiagnosticHandler" contextGetDiagnosticHandler
+    :: ContextRef -> IO DiagnosticHandler
+
+foreign import ccall unsafe "LLVMContextGetDiagnosticContext" contextGetDiagnosticContext
+    :: ContextRef -> IO (Ptr ())
+
+foreign import ccall unsafe "LLVMContextSetYieldCallback" contextSetYieldCallback
+    :: ContextRef -> YieldCallback -> (Ptr ()) -> IO ()
+
+foreign import ccall unsafe "LLVMContextDispose" contextDispose
+    :: ContextRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetDiagInfoDescription" getDiagInfoDescription
+    :: DiagnosticInfoRef -> IO CString
+
+foreign import ccall unsafe "LLVMGetDiagInfoSeverity" getDiagInfoSeverity
+    :: DiagnosticInfoRef -> IO DiagnosticSeverity
+
+foreign import ccall unsafe "LLVMGetMDKindIDInContext" getMDKindIDInContext
+    :: ContextRef -> CString -> CUInt -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetMDKindID" getMDKindID
+    :: CString -> CUInt -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetEnumAttributeKindForName" getEnumAttributeKindForName
+    :: CString -> CSize -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetLastEnumAttributeKind" getLastEnumAttributeKind
+    :: IO CUInt
+
+foreign import ccall unsafe "LLVMCreateEnumAttribute" createEnumAttribute
+    :: ContextRef -> CUInt -> Word64 -> IO AttributeRef
+
+foreign import ccall unsafe "LLVMGetEnumAttributeKind" getEnumAttributeKind
+    :: AttributeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetEnumAttributeValue" getEnumAttributeValue
+    :: AttributeRef -> IO Word64
+
+foreign import ccall unsafe "LLVMCreateStringAttribute" createStringAttribute
+    :: ContextRef -> CString -> CUInt -> CString -> CUInt -> IO AttributeRef
+
+foreign import ccall unsafe "LLVMGetStringAttributeKind" getStringAttributeKind
+    :: AttributeRef -> (Ptr CUInt) -> IO CString
+
+foreign import ccall unsafe "LLVMGetStringAttributeValue" getStringAttributeValue
+    :: AttributeRef -> (Ptr CUInt) -> IO CString
+
+foreign import ccall unsafe "LLVMIsEnumAttribute" isEnumAttribute
+    :: AttributeRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMIsStringAttribute" isStringAttribute
+    :: AttributeRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMModuleCreateWithName" moduleCreateWithName
+    :: CString -> IO ModuleRef
+
+foreign import ccall unsafe "LLVMModuleCreateWithNameInContext" moduleCreateWithNameInContext
+    :: CString -> ContextRef -> IO ModuleRef
+
+foreign import ccall unsafe "LLVMCloneModule" cloneModule
+    :: ModuleRef -> IO ModuleRef
+
+foreign import ccall unsafe "LLVMDisposeModule" disposeModule
+    :: ModuleRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetModuleIdentifier" getModuleIdentifier
+    :: ModuleRef -> (Ptr CSize) -> IO CString
+
+foreign import ccall unsafe "LLVMSetModuleIdentifier" setModuleIdentifier
+    :: ModuleRef -> CString -> CSize -> IO ()
+
+foreign import ccall unsafe "LLVMGetDataLayoutStr" getDataLayoutStr
+    :: ModuleRef -> IO CString
+
+foreign import ccall unsafe "LLVMGetDataLayout" getDataLayout
+    :: ModuleRef -> IO CString
+
+foreign import ccall unsafe "LLVMSetDataLayout" setDataLayout
+    :: ModuleRef -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMGetTarget" getTarget
+    :: ModuleRef -> IO CString
+
+foreign import ccall unsafe "LLVMSetTarget" setTarget
+    :: ModuleRef -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMDumpModule" dumpModule
+    :: ModuleRef -> IO ()
+
+foreign import ccall unsafe "LLVMPrintModuleToFile" printModuleToFile
+    :: ModuleRef -> CString -> (Ptr CString) -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMPrintModuleToString" printModuleToString
+    :: ModuleRef -> IO CString
+
+foreign import ccall unsafe "LLVMSetModuleInlineAsm" setModuleInlineAsm
+    :: ModuleRef -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMGetModuleContext" getModuleContext
+    :: ModuleRef -> IO ContextRef
+
+foreign import ccall unsafe "LLVMGetTypeByName" getTypeByName
+    :: ModuleRef -> CString -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetNamedMetadataNumOperands" getNamedMetadataNumOperands
+    :: ModuleRef -> CString -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetNamedMetadataOperands" getNamedMetadataOperands
+    :: ModuleRef -> CString -> (Ptr ValueRef) -> IO ()
+
+foreign import ccall unsafe "LLVMAddNamedMetadataOperand" addNamedMetadataOperand
+    :: ModuleRef -> CString -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMAddFunction" addFunction
+    :: ModuleRef -> CString -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetNamedFunction" getNamedFunction
+    :: ModuleRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetFirstFunction" getFirstFunction
+    :: ModuleRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetLastFunction" getLastFunction
+    :: ModuleRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetNextFunction" getNextFunction
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetPreviousFunction" getPreviousFunction
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetTypeKind" getTypeKind
+    :: TypeRef -> IO TypeKind
+
+foreign import ccall unsafe "LLVMTypeIsSized" typeIsSized
+    :: TypeRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMGetTypeContext" getTypeContext
+    :: TypeRef -> IO ContextRef
+
+foreign import ccall unsafe "LLVMPrintTypeToString" printTypeToString
+    :: TypeRef -> IO CString
+
+foreign import ccall unsafe "LLVMInt1TypeInContext" int1TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMInt8TypeInContext" int8TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMInt16TypeInContext" int16TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMInt32TypeInContext" int32TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMInt64TypeInContext" int64TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMInt128TypeInContext" int128TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMIntTypeInContext" intTypeInContext
+    :: ContextRef -> CUInt -> IO TypeRef
+
+foreign import ccall unsafe "LLVMInt1Type" int1Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMInt8Type" int8Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMInt16Type" int16Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMInt32Type" int32Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMInt64Type" int64Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMInt128Type" int128Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMIntType" intType
+    :: CUInt -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetIntTypeWidth" getIntTypeWidth
+    :: TypeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMHalfTypeInContext" halfTypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMFloatTypeInContext" floatTypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMDoubleTypeInContext" doubleTypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMX86FP80TypeInContext" x86FP80TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMFP128TypeInContext" fP128TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMPPCFP128TypeInContext" pPCFP128TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMHalfType" halfType
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMFloatType" floatType
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMDoubleType" doubleType
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMX86FP80Type" x86FP80Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMFP128Type" fP128Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMPPCFP128Type" pPCFP128Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMFunctionType" functionType
+    :: TypeRef -> (Ptr TypeRef) -> CUInt -> LLVM.Bool -> IO TypeRef
+
+foreign import ccall unsafe "LLVMIsFunctionVarArg" isFunctionVarArg
+    :: TypeRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMGetReturnType" getReturnType
+    :: TypeRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMCountParamTypes" countParamTypes
+    :: TypeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetParamTypes" getParamTypes
+    :: TypeRef -> (Ptr TypeRef) -> IO ()
+
+foreign import ccall unsafe "LLVMStructTypeInContext" structTypeInContext
+    :: ContextRef -> (Ptr TypeRef) -> CUInt -> LLVM.Bool -> IO TypeRef
+
+foreign import ccall unsafe "LLVMStructType" structType
+    :: (Ptr TypeRef) -> CUInt -> LLVM.Bool -> IO TypeRef
+
+foreign import ccall unsafe "LLVMStructCreateNamed" structCreateNamed
+    :: ContextRef -> CString -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetStructName" getStructName
+    :: TypeRef -> IO CString
+
+foreign import ccall unsafe "LLVMStructSetBody" structSetBody
+    :: TypeRef -> (Ptr TypeRef) -> CUInt -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMCountStructElementTypes" countStructElementTypes
+    :: TypeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetStructElementTypes" getStructElementTypes
+    :: TypeRef -> (Ptr TypeRef) -> IO ()
+
+foreign import ccall unsafe "LLVMStructGetTypeAtIndex" structGetTypeAtIndex
+    :: TypeRef -> CUInt -> IO TypeRef
+
+foreign import ccall unsafe "LLVMIsPackedStruct" isPackedStruct
+    :: TypeRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMIsOpaqueStruct" isOpaqueStruct
+    :: TypeRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMGetElementType" getElementType
+    :: TypeRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMArrayType" arrayType
+    :: TypeRef -> CUInt -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetArrayLength" getArrayLength
+    :: TypeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMPointerType" pointerType
+    :: TypeRef -> CUInt -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetPointerAddressSpace" getPointerAddressSpace
+    :: TypeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMVectorType" vectorType
+    :: TypeRef -> CUInt -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetVectorSize" getVectorSize
+    :: TypeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMVoidTypeInContext" voidTypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMLabelTypeInContext" labelTypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMX86MMXTypeInContext" x86MMXTypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMVoidType" voidType
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMLabelType" labelType
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMX86MMXType" x86MMXType
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMTypeOf" typeOf
+    :: ValueRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetValueKind" getValueKind
+    :: ValueRef -> IO ValueKind
+
+foreign import ccall unsafe "LLVMGetValueName" getValueName
+    :: ValueRef -> IO CString
+
+foreign import ccall unsafe "LLVMSetValueName" setValueName
+    :: ValueRef -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMDumpValue" dumpValue
+    :: ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMPrintValueToString" printValueToString
+    :: ValueRef -> IO CString
+
+foreign import ccall unsafe "LLVMReplaceAllUsesWith" replaceAllUsesWith
+    :: ValueRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMIsConstant" isConstant
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMIsUndef" isUndef
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMIsAMDNode" isAMDNode
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMIsAMDString" isAMDString
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetFirstUse" getFirstUse
+    :: ValueRef -> IO UseRef
+
+foreign import ccall unsafe "LLVMGetNextUse" getNextUse
+    :: UseRef -> IO UseRef
+
+foreign import ccall unsafe "LLVMGetUser" getUser
+    :: UseRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetUsedValue" getUsedValue
+    :: UseRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetOperand" getOperand
+    :: ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetOperandUse" getOperandUse
+    :: ValueRef -> CUInt -> IO UseRef
+
+foreign import ccall unsafe "LLVMSetOperand" setOperand
+    :: ValueRef -> CUInt -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetNumOperands" getNumOperands
+    :: ValueRef -> IO CInt
+
+foreign import ccall unsafe "LLVMConstNull" constNull
+    :: TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstAllOnes" constAllOnes
+    :: TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetUndef" getUndef
+    :: TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMIsNull" isNull
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMConstPointerNull" constPointerNull
+    :: TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstInt" constInt
+    :: TypeRef -> CULLong -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstIntOfArbitraryPrecision" constIntOfArbitraryPrecision
+    :: TypeRef -> CUInt -> Ptr Word64 -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstIntOfString" constIntOfString
+    :: TypeRef -> CString -> Word8 -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstIntOfStringAndSize" constIntOfStringAndSize
+    :: TypeRef -> CString -> CUInt -> Word8 -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstReal" constReal
+    :: TypeRef -> CDouble -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstRealOfString" constRealOfString
+    :: TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstRealOfStringAndSize" constRealOfStringAndSize
+    :: TypeRef -> CString -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstIntGetZExtValue" constIntGetZExtValue
+    :: ValueRef -> IO CULLong
+
+foreign import ccall unsafe "LLVMConstIntGetSExtValue" constIntGetSExtValue
+    :: ValueRef -> IO CLLong
+
+foreign import ccall unsafe "LLVMConstRealGetDouble" constRealGetDouble
+    :: ValueRef -> (Ptr LLVM.Bool) -> IO CDouble
+
+foreign import ccall unsafe "LLVMConstStringInContext" constStringInContext
+    :: ContextRef -> CString -> CUInt -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstString" constString
+    :: CString -> CUInt -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMIsConstantString" isConstantString
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMGetAsString" getAsString
+    :: ValueRef -> (Ptr CSize) -> IO CString
+
+foreign import ccall unsafe "LLVMConstStructInContext" constStructInContext
+    :: ContextRef -> (Ptr ValueRef) -> CUInt -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstStruct" constStruct
+    :: (Ptr ValueRef) -> CUInt -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstArray" constArray
+    :: TypeRef -> (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNamedStruct" constNamedStruct
+    :: TypeRef -> (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetElementAsConstant" getElementAsConstant
+    :: ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstVector" constVector
+    :: (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetConstOpcode" getConstOpcode
+    :: ValueRef -> IO Opcode
+
+foreign import ccall unsafe "LLVMAlignOf" alignOf
+    :: TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSizeOf" sizeOf
+    :: TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNeg" constNeg
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNSWNeg" constNSWNeg
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNUWNeg" constNUWNeg
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFNeg" constFNeg
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNot" constNot
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstAdd" constAdd
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNSWAdd" constNSWAdd
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNUWAdd" constNUWAdd
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFAdd" constFAdd
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstSub" constSub
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNSWSub" constNSWSub
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNUWSub" constNUWSub
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFSub" constFSub
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstMul" constMul
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNSWMul" constNSWMul
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNUWMul" constNUWMul
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFMul" constFMul
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstUDiv" constUDiv
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstExactUDiv" constExactUDiv
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstSDiv" constSDiv
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstExactSDiv" constExactSDiv
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFDiv" constFDiv
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstURem" constURem
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstSRem" constSRem
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFRem" constFRem
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstAnd" constAnd
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstOr" constOr
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstXor" constXor
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstICmp" constICmp
+    :: IntPredicate -> ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFCmp" constFCmp
+    :: RealPredicate -> ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstShl" constShl
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstLShr" constLShr
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstAShr" constAShr
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstGEP" constGEP
+    :: ValueRef -> (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstInBoundsGEP" constInBoundsGEP
+    :: ValueRef -> (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstTrunc" constTrunc
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstSExt" constSExt
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstZExt" constZExt
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFPTrunc" constFPTrunc
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFPExt" constFPExt
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstUIToFP" constUIToFP
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstSIToFP" constSIToFP
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFPToUI" constFPToUI
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFPToSI" constFPToSI
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstPtrToInt" constPtrToInt
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstIntToPtr" constIntToPtr
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstBitCast" constBitCast
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstAddrSpaceCast" constAddrSpaceCast
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstZExtOrBitCast" constZExtOrBitCast
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstSExtOrBitCast" constSExtOrBitCast
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstTruncOrBitCast" constTruncOrBitCast
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstPointerCast" constPointerCast
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstIntCast" constIntCast
+    :: ValueRef -> TypeRef -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFPCast" constFPCast
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstSelect" constSelect
+    :: ValueRef -> ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstExtractElement" constExtractElement
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstInsertElement" constInsertElement
+    :: ValueRef -> ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstShuffleVector" constShuffleVector
+    :: ValueRef -> ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstExtractValue" constExtractValue
+    :: ValueRef -> (Ptr CUInt) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstInsertValue" constInsertValue
+    :: ValueRef -> ValueRef -> (Ptr CUInt) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstInlineAsm" constInlineAsm
+    :: TypeRef -> CString -> CString -> LLVM.Bool -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBlockAddress" blockAddress
+    :: ValueRef -> BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetGlobalParent" getGlobalParent
+    :: ValueRef -> IO ModuleRef
+
+foreign import ccall unsafe "LLVMIsDeclaration" isDeclaration
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMGetLinkage" getLinkage
+    :: ValueRef -> IO Linkage
+
+foreign import ccall unsafe "LLVMSetLinkage" setLinkage
+    :: ValueRef -> Linkage -> IO ()
+
+foreign import ccall unsafe "LLVMGetSection" getSection
+    :: ValueRef -> IO CString
+
+foreign import ccall unsafe "LLVMSetSection" setSection
+    :: ValueRef -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMGetVisibility" getVisibility
+    :: ValueRef -> IO Visibility
+
+foreign import ccall unsafe "LLVMSetVisibility" setVisibility
+    :: ValueRef -> Visibility -> IO ()
+
+foreign import ccall unsafe "LLVMGetDLLStorageClass" getDLLStorageClass
+    :: ValueRef -> IO DLLStorageClass
+
+foreign import ccall unsafe "LLVMSetDLLStorageClass" setDLLStorageClass
+    :: ValueRef -> DLLStorageClass -> IO ()
+
+foreign import ccall unsafe "LLVMHasUnnamedAddr" hasUnnamedAddr
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetUnnamedAddr" setUnnamedAddr
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMGetAlignment" getAlignment
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMSetAlignment" setAlignment
+    :: ValueRef -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMAddGlobal" addGlobal
+    :: ModuleRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMAddGlobalInAddressSpace" addGlobalInAddressSpace
+    :: ModuleRef -> TypeRef -> CString -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetNamedGlobal" getNamedGlobal
+    :: ModuleRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetFirstGlobal" getFirstGlobal
+    :: ModuleRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetLastGlobal" getLastGlobal
+    :: ModuleRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetNextGlobal" getNextGlobal
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetPreviousGlobal" getPreviousGlobal
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMDeleteGlobal" deleteGlobal
+    :: ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetInitializer" getInitializer
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSetInitializer" setInitializer
+    :: ValueRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMIsThreadLocal" isThreadLocal
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetThreadLocal" setThreadLocal
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMIsGlobalConstant" isGlobalConstant
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetGlobalConstant" setGlobalConstant
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMGetThreadLocalMode" getThreadLocalMode
+    :: ValueRef -> IO ThreadLocalMode
+
+foreign import ccall unsafe "LLVMSetThreadLocalMode" setThreadLocalMode
+    :: ValueRef -> ThreadLocalMode -> IO ()
+
+foreign import ccall unsafe "LLVMIsExternallyInitialized" isExternallyInitialized
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetExternallyInitialized" setExternallyInitialized
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMAddAlias" addAlias
+    :: ModuleRef -> TypeRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMDeleteFunction" deleteFunction
+    :: ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMHasPersonalityFn" hasPersonalityFn
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMGetPersonalityFn" getPersonalityFn
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSetPersonalityFn" setPersonalityFn
+    :: ValueRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetIntrinsicID" getIntrinsicID
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetFunctionCallConv" getFunctionCallConv
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMSetFunctionCallConv" setFunctionCallConv
+    :: ValueRef -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMGetGC" getGC
+    :: ValueRef -> IO CString
+
+foreign import ccall unsafe "LLVMSetGC" setGC
+    :: ValueRef -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMAddAttributeAtIndex" addAttributeAtIndex
+    :: ValueRef -> AttributeIndex -> AttributeRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetAttributeCountAtIndex" getAttributeCountAtIndex
+    :: ValueRef -> AttributeIndex -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetAttributesAtIndex" getAttributesAtIndex
+    :: ValueRef -> AttributeIndex -> (Ptr AttributeRef) -> IO ()
+
+foreign import ccall unsafe "LLVMGetEnumAttributeAtIndex" getEnumAttributeAtIndex
+    :: ValueRef -> AttributeIndex -> CUInt -> IO AttributeRef
+
+foreign import ccall unsafe "LLVMGetStringAttributeAtIndex" getStringAttributeAtIndex
+    :: ValueRef -> AttributeIndex -> CString -> CUInt -> IO AttributeRef
+
+foreign import ccall unsafe "LLVMRemoveEnumAttributeAtIndex" removeEnumAttributeAtIndex
+    :: ValueRef -> AttributeIndex -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMRemoveStringAttributeAtIndex" removeStringAttributeAtIndex
+    :: ValueRef -> AttributeIndex -> CString -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMAddTargetDependentFunctionAttr" addTargetDependentFunctionAttr
+    :: ValueRef -> CString -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMCountParams" countParams
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetParams" getParams
+    :: ValueRef -> (Ptr ValueRef) -> IO ()
+
+foreign import ccall unsafe "LLVMGetParam" getParam
+    :: ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetParamParent" getParamParent
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetFirstParam" getFirstParam
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetLastParam" getLastParam
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetNextParam" getNextParam
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetPreviousParam" getPreviousParam
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSetParamAlignment" setParamAlignment
+    :: ValueRef -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMMDStringInContext" mDStringInContext
+    :: ContextRef -> CString -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMMDString" mDString
+    :: CString -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMMDNodeInContext" mDNodeInContext
+    :: ContextRef -> (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMMDNode" mDNode
+    :: (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetMDString" getMDString
+    :: ValueRef -> (Ptr CUInt) -> IO CString
+
+foreign import ccall unsafe "LLVMGetMDNodeNumOperands" getMDNodeNumOperands
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetMDNodeOperands" getMDNodeOperands
+    :: ValueRef -> (Ptr ValueRef) -> IO ()
+
+foreign import ccall unsafe "LLVMBasicBlockAsValue" basicBlockAsValue
+    :: BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMValueIsBasicBlock" valueIsBasicBlock
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMValueAsBasicBlock" valueAsBasicBlock
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetBasicBlockName" getBasicBlockName
+    :: BasicBlockRef -> IO CString
+
+foreign import ccall unsafe "LLVMGetBasicBlockParent" getBasicBlockParent
+    :: BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetBasicBlockTerminator" getBasicBlockTerminator
+    :: BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMCountBasicBlocks" countBasicBlocks
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetBasicBlocks" getBasicBlocks
+    :: ValueRef -> (Ptr BasicBlockRef) -> IO ()
+
+foreign import ccall unsafe "LLVMGetFirstBasicBlock" getFirstBasicBlock
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetLastBasicBlock" getLastBasicBlock
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetNextBasicBlock" getNextBasicBlock
+    :: BasicBlockRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetPreviousBasicBlock" getPreviousBasicBlock
+    :: BasicBlockRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetEntryBasicBlock" getEntryBasicBlock
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMAppendBasicBlockInContext" appendBasicBlockInContext
+    :: ContextRef -> ValueRef -> CString -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMAppendBasicBlock" appendBasicBlock
+    :: ValueRef -> CString -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMInsertBasicBlockInContext" insertBasicBlockInContext
+    :: ContextRef -> BasicBlockRef -> CString -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMInsertBasicBlock" insertBasicBlock
+    :: BasicBlockRef -> CString -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMDeleteBasicBlock" deleteBasicBlock
+    :: BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMRemoveBasicBlockFromParent" removeBasicBlockFromParent
+    :: BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMMoveBasicBlockBefore" moveBasicBlockBefore
+    :: BasicBlockRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMMoveBasicBlockAfter" moveBasicBlockAfter
+    :: BasicBlockRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetFirstInstruction" getFirstInstruction
+    :: BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetLastInstruction" getLastInstruction
+    :: BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMHasMetadata" hasMetadata
+    :: ValueRef -> IO CInt
+
+foreign import ccall unsafe "LLVMGetMetadata" getMetadata
+    :: ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSetMetadata" setMetadata
+    :: ValueRef -> CUInt -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetInstructionParent" getInstructionParent
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetNextInstruction" getNextInstruction
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetPreviousInstruction" getPreviousInstruction
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMInstructionRemoveFromParent" instructionRemoveFromParent
+    :: ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMInstructionEraseFromParent" instructionEraseFromParent
+    :: ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetInstructionOpcode" getInstructionOpcode
+    :: ValueRef -> IO Opcode
+
+foreign import ccall unsafe "LLVMGetICmpPredicate" getICmpPredicate
+    :: ValueRef -> IO IntPredicate
+
+foreign import ccall unsafe "LLVMGetFCmpPredicate" getFCmpPredicate
+    :: ValueRef -> IO RealPredicate
+
+foreign import ccall unsafe "LLVMInstructionClone" instructionClone
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetNumArgOperands" getNumArgOperands
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMSetInstructionCallConv" setInstructionCallConv
+    :: ValueRef -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMGetInstructionCallConv" getInstructionCallConv
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMSetInstrParamAlignment" setInstrParamAlignment
+    :: ValueRef -> CUInt -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMAddCallSiteAttribute" addCallSiteAttribute
+    :: ValueRef -> AttributeIndex -> AttributeRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetCallSiteAttributeCount" getCallSiteAttributeCount
+    :: ValueRef -> AttributeIndex -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetCallSiteAttributes" getCallSiteAttributes
+    :: ValueRef -> AttributeIndex -> (Ptr AttributeRef) -> IO ()
+
+foreign import ccall unsafe "LLVMGetCallSiteEnumAttribute" getCallSiteEnumAttribute
+    :: ValueRef -> AttributeIndex -> CUInt -> IO AttributeRef
+
+foreign import ccall unsafe "LLVMGetCallSiteStringAttribute" getCallSiteStringAttribute
+    :: ValueRef -> AttributeIndex -> CString -> CUInt -> IO AttributeRef
+
+foreign import ccall unsafe "LLVMRemoveCallSiteEnumAttribute" removeCallSiteEnumAttribute
+    :: ValueRef -> AttributeIndex -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMRemoveCallSiteStringAttribute" removeCallSiteStringAttribute
+    :: ValueRef -> AttributeIndex -> CString -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMGetCalledValue" getCalledValue
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMIsTailCall" isTailCall
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetTailCall" setTailCall
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMGetNormalDest" getNormalDest
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetUnwindDest" getUnwindDest
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMSetNormalDest" setNormalDest
+    :: ValueRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMSetUnwindDest" setUnwindDest
+    :: ValueRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetNumSuccessors" getNumSuccessors
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetSuccessor" getSuccessor
+    :: ValueRef -> CUInt -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMSetSuccessor" setSuccessor
+    :: ValueRef -> CUInt -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMIsConditional" isConditional
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMGetCondition" getCondition
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSetCondition" setCondition
+    :: ValueRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetSwitchDefaultDest" getSwitchDefaultDest
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetAllocatedType" getAllocatedType
+    :: ValueRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMIsInBounds" isInBounds
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetIsInBounds" setIsInBounds
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMAddIncoming" addIncoming
+    :: ValueRef -> (Ptr ValueRef) -> (Ptr BasicBlockRef) -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMCountIncoming" countIncoming
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetIncomingValue" getIncomingValue
+    :: ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetIncomingBlock" getIncomingBlock
+    :: ValueRef -> CUInt -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetNumIndices" getNumIndices
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetIndices" getIndices
+    :: ValueRef -> IO (Ptr CUInt)
+
+foreign import ccall unsafe "LLVMCreateBuilderInContext" createBuilderInContext
+    :: ContextRef -> IO BuilderRef
+
+foreign import ccall unsafe "LLVMCreateBuilder" createBuilder
+    :: IO BuilderRef
+
+foreign import ccall unsafe "LLVMPositionBuilder" positionBuilder
+    :: BuilderRef -> BasicBlockRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMPositionBuilderBefore" positionBuilderBefore
+    :: BuilderRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMPositionBuilderAtEnd" positionBuilderAtEnd
+    :: BuilderRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetInsertBlock" getInsertBlock
+    :: BuilderRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMClearInsertionPosition" clearInsertionPosition
+    :: BuilderRef -> IO ()
+
+foreign import ccall unsafe "LLVMInsertIntoBuilder" insertIntoBuilder
+    :: BuilderRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMInsertIntoBuilderWithName" insertIntoBuilderWithName
+    :: BuilderRef -> ValueRef -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMDisposeBuilder" disposeBuilder
+    :: BuilderRef -> IO ()
+
+foreign import ccall unsafe "LLVMSetCurrentDebugLocation" setCurrentDebugLocation
+    :: BuilderRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetCurrentDebugLocation" getCurrentDebugLocation
+    :: BuilderRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSetInstDebugLocation" setInstDebugLocation
+    :: BuilderRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMBuildRetVoid" buildRetVoid
+    :: BuilderRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildRet" buildRet
+    :: BuilderRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildAggregateRet" buildAggregateRet
+    :: BuilderRef -> (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildBr" buildBr
+    :: BuilderRef -> BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildCondBr" buildCondBr
+    :: BuilderRef -> ValueRef -> BasicBlockRef -> BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSwitch" buildSwitch
+    :: BuilderRef -> ValueRef -> BasicBlockRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildIndirectBr" buildIndirectBr
+    :: BuilderRef -> ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildInvoke" buildInvoke
+    :: BuilderRef -> ValueRef -> (Ptr ValueRef) -> CUInt -> BasicBlockRef -> BasicBlockRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildLandingPad" buildLandingPad
+    :: BuilderRef -> TypeRef -> ValueRef -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildResume" buildResume
+    :: BuilderRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildUnreachable" buildUnreachable
+    :: BuilderRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMAddCase" addCase
+    :: ValueRef -> ValueRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMAddDestination" addDestination
+    :: ValueRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetNumClauses" getNumClauses
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetClause" getClause
+    :: ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMAddClause" addClause
+    :: ValueRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMIsCleanup" isCleanup
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetCleanup" setCleanup
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMBuildAdd" buildAdd
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNSWAdd" buildNSWAdd
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNUWAdd" buildNUWAdd
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFAdd" buildFAdd
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSub" buildSub
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNSWSub" buildNSWSub
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNUWSub" buildNUWSub
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFSub" buildFSub
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildMul" buildMul
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNSWMul" buildNSWMul
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNUWMul" buildNUWMul
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFMul" buildFMul
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildUDiv" buildUDiv
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildExactUDiv" buildExactUDiv
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSDiv" buildSDiv
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildExactSDiv" buildExactSDiv
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFDiv" buildFDiv
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildURem" buildURem
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSRem" buildSRem
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFRem" buildFRem
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildShl" buildShl
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildLShr" buildLShr
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildAShr" buildAShr
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildAnd" buildAnd
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildOr" buildOr
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildXor" buildXor
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildBinOp" buildBinOp
+    :: BuilderRef -> Opcode -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNeg" buildNeg
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNSWNeg" buildNSWNeg
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNUWNeg" buildNUWNeg
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFNeg" buildFNeg
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNot" buildNot
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildMalloc" buildMalloc
+    :: BuilderRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildArrayMalloc" buildArrayMalloc
+    :: BuilderRef -> TypeRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildAlloca" buildAlloca
+    :: BuilderRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildArrayAlloca" buildArrayAlloca
+    :: BuilderRef -> TypeRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFree" buildFree
+    :: BuilderRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildLoad" buildLoad
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildStore" buildStore
+    :: BuilderRef -> ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildGEP" buildGEP
+    :: BuilderRef -> ValueRef -> (Ptr ValueRef) -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildInBoundsGEP" buildInBoundsGEP
+    :: BuilderRef -> ValueRef -> (Ptr ValueRef) -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildStructGEP" buildStructGEP
+    :: BuilderRef -> ValueRef -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildGlobalString" buildGlobalString
+    :: BuilderRef -> CString -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildGlobalStringPtr" buildGlobalStringPtr
+    :: BuilderRef -> CString -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetVolatile" getVolatile
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetVolatile" setVolatile
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMGetOrdering" getOrdering
+    :: ValueRef -> IO AtomicOrdering
+
+foreign import ccall unsafe "LLVMSetOrdering" setOrdering
+    :: ValueRef -> AtomicOrdering -> IO ()
+
+foreign import ccall unsafe "LLVMBuildTrunc" buildTrunc
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildZExt" buildZExt
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSExt" buildSExt
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFPToUI" buildFPToUI
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFPToSI" buildFPToSI
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildUIToFP" buildUIToFP
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSIToFP" buildSIToFP
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFPTrunc" buildFPTrunc
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFPExt" buildFPExt
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildPtrToInt" buildPtrToInt
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildIntToPtr" buildIntToPtr
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildBitCast" buildBitCast
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildAddrSpaceCast" buildAddrSpaceCast
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildZExtOrBitCast" buildZExtOrBitCast
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSExtOrBitCast" buildSExtOrBitCast
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildTruncOrBitCast" buildTruncOrBitCast
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildCast" buildCast
+    :: BuilderRef -> Opcode -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildPointerCast" buildPointerCast
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFPCast" buildFPCast
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildICmp" buildICmp
+    :: BuilderRef -> IntPredicate -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFCmp" buildFCmp
+    :: BuilderRef -> RealPredicate -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildPhi" buildPhi
+    :: BuilderRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildCall" buildCall
+    :: BuilderRef -> ValueRef -> (Ptr ValueRef) -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSelect" buildSelect
+    :: BuilderRef -> ValueRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildVAArg" buildVAArg
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildExtractElement" buildExtractElement
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildInsertElement" buildInsertElement
+    :: BuilderRef -> ValueRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildShuffleVector" buildShuffleVector
+    :: BuilderRef -> ValueRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildExtractValue" buildExtractValue
+    :: BuilderRef -> ValueRef -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildInsertValue" buildInsertValue
+    :: BuilderRef -> ValueRef -> ValueRef -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildIsNull" buildIsNull
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildIsNotNull" buildIsNotNull
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildPtrDiff" buildPtrDiff
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFence" buildFence
+    :: BuilderRef -> AtomicOrdering -> LLVM.Bool -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildAtomicRMW" buildAtomicRMW
+    :: BuilderRef -> AtomicRMWBinOp -> ValueRef -> ValueRef -> AtomicOrdering -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildAtomicCmpXchg" buildAtomicCmpXchg
+    :: BuilderRef -> ValueRef -> ValueRef -> ValueRef -> AtomicOrdering -> AtomicOrdering -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMIsAtomicSingleThread" isAtomicSingleThread
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetAtomicSingleThread" setAtomicSingleThread
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMGetCmpXchgSuccessOrdering" getCmpXchgSuccessOrdering
+    :: ValueRef -> IO AtomicOrdering
+
+foreign import ccall unsafe "LLVMSetCmpXchgSuccessOrdering" setCmpXchgSuccessOrdering
+    :: ValueRef -> AtomicOrdering -> IO ()
+
+foreign import ccall unsafe "LLVMGetCmpXchgFailureOrdering" getCmpXchgFailureOrdering
+    :: ValueRef -> IO AtomicOrdering
+
+foreign import ccall unsafe "LLVMSetCmpXchgFailureOrdering" setCmpXchgFailureOrdering
+    :: ValueRef -> AtomicOrdering -> IO ()
+
+foreign import ccall unsafe "LLVMCreateModuleProviderForExistingModule" createModuleProviderForExistingModule
+    :: ModuleRef -> IO ModuleProviderRef
+
+foreign import ccall unsafe "LLVMDisposeModuleProvider" disposeModuleProvider
+    :: ModuleProviderRef -> IO ()
+
+foreign import ccall unsafe "LLVMCreateMemoryBufferWithContentsOfFile" createMemoryBufferWithContentsOfFile
+    :: CString -> (Ptr MemoryBufferRef) -> (Ptr CString) -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMCreateMemoryBufferWithSTDIN" createMemoryBufferWithSTDIN
+    :: (Ptr MemoryBufferRef) -> (Ptr CString) -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMCreateMemoryBufferWithMemoryRange" createMemoryBufferWithMemoryRange
+    :: CString -> CSize -> CString -> LLVM.Bool -> IO MemoryBufferRef
+
+foreign import ccall unsafe "LLVMCreateMemoryBufferWithMemoryRangeCopy" createMemoryBufferWithMemoryRangeCopy
+    :: CString -> CSize -> CString -> IO MemoryBufferRef
+
+foreign import ccall unsafe "LLVMGetBufferStart" getBufferStart
+    :: MemoryBufferRef -> IO CString
+
+foreign import ccall unsafe "LLVMGetBufferSize" getBufferSize
+    :: MemoryBufferRef -> IO CSize
+
+foreign import ccall unsafe "LLVMDisposeMemoryBuffer" disposeMemoryBuffer
+    :: MemoryBufferRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetGlobalPassRegistry" getGlobalPassRegistry
+    :: IO PassRegistryRef
+
+foreign import ccall unsafe "LLVMCreatePassManager" createPassManager
+    :: IO PassManagerRef
+
+foreign import ccall unsafe "LLVMCreateFunctionPassManagerForModule" createFunctionPassManagerForModule
+    :: ModuleRef -> IO PassManagerRef
+
+foreign import ccall unsafe "LLVMCreateFunctionPassManager" createFunctionPassManager
+    :: ModuleProviderRef -> IO PassManagerRef
+
+foreign import ccall unsafe "LLVMRunPassManager" runPassManager
+    :: PassManagerRef -> ModuleRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMInitializeFunctionPassManager" initializeFunctionPassManager
+    :: PassManagerRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMRunFunctionPassManager" runFunctionPassManager
+    :: PassManagerRef -> ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMFinalizeFunctionPassManager" finalizeFunctionPassManager
+    :: PassManagerRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMDisposePassManager" disposePassManager
+    :: PassManagerRef -> IO ()
+
+foreign import ccall unsafe "LLVMStartMultithreaded" startMultithreaded
+    :: IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMStopMultithreaded" stopMultithreaded
+    :: IO ()
+
+foreign import ccall unsafe "LLVMIsMultithreaded" isMultithreaded
+    :: IO LLVM.Bool
diff --git a/src/5.0/LLVM/Raw/Core.hsc b/src/5.0/LLVM/Raw/Core.hsc
new file mode 100644
--- /dev/null
+++ b/src/5.0/LLVM/Raw/Core.hsc
@@ -0,0 +1,1630 @@
+{-# LANGUAGE Safe #-}
+{-# LANGUAGE ForeignFunctionInterface #-}
+{-# LANGUAGE EmptyDataDecls #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+module LLVM.Raw.Core where
+
+import qualified LLVM.FFI.Base as LLVM
+
+import qualified Foreign.C.Types as C
+import Foreign.C.String (CString)
+import Foreign.Ptr (Ptr, FunPtr)
+
+import Data.Typeable (Typeable)
+
+import Data.Word (Word8, Word32, Word64)
+
+
+type CDouble  = C.CDouble
+type CInt     = C.CInt
+type CUInt    = C.CUInt
+type CLLong   = C.CLLong
+type CULLong  = C.CULLong
+type CSize    = C.CSize
+
+
+#include <llvm/Config/llvm-config.h>
+#include <llvm-c/Core.h>
+
+
+data Module
+    deriving (Typeable)
+type ModuleRef = Ptr Module
+
+data ModuleProvider
+    deriving (Typeable)
+type ModuleProviderRef = Ptr ModuleProvider
+
+data Type
+    deriving (Typeable)
+type TypeRef = Ptr Type
+
+data BasicBlock
+    deriving (Typeable)
+type BasicBlockRef = Ptr BasicBlock
+
+data Value
+    deriving (Typeable)
+type ValueRef = Ptr Value
+
+data OpaqueUse
+    deriving (Typeable)
+type UseRef = Ptr OpaqueUse
+
+data Builder
+    deriving (Typeable)
+type BuilderRef = Ptr Builder
+
+data MemoryBuffer
+    deriving (Typeable)
+type MemoryBufferRef = Ptr MemoryBuffer
+
+data PassManager
+    deriving (Typeable)
+type PassManagerRef = Ptr PassManager
+
+data PassRegistry
+    deriving (Typeable)
+type PassRegistryRef = Ptr PassRegistry
+
+data Context
+    deriving (Typeable)
+type ContextRef = Ptr Context
+
+{-
+data Attribute
+    deriving (Typeable)
+-}
+-- until 3.9
+newtype Attribute = Attribute Word32
+type AttributeRef = Ptr Attribute
+
+newtype AttributeIndex = AttributeIndex #{type LLVMAttributeIndex}
+
+attributeReturnIndex, attributeFunctionIndex :: AttributeIndex
+attributeReturnIndex   = AttributeIndex (#const LLVMAttributeReturnIndex)
+attributeFunctionIndex = AttributeIndex (#const LLVMAttributeFunctionIndex)
+
+
+data Metadata
+    deriving (Typeable)
+type MetadataRef = Ptr Metadata
+
+data DiagnosticInfo
+    deriving (Typeable)
+type DiagnosticInfoRef = Ptr DiagnosticInfo
+
+data NamedMDNode
+    deriving (Typeable)
+type NamedMDNodeRef = Ptr NamedMDNode
+
+
+data ModuleFlagEntry
+    deriving (Typeable)
+data ValueMetadataEntry
+    deriving (Typeable)
+
+type DiagnosticHandler = FunPtr (DiagnosticInfoRef -> Ptr () -> IO ())
+type YieldCallback = FunPtr (ContextRef -> Ptr () -> IO ())
+
+newtype CallingConvention = CallingConvention {unCallingConvention :: CUInt}
+
+newtype AtomicOrdering = AtomicOrdering #{type LLVMAtomicOrdering}
+newtype AtomicRMWBinOp = AtomicRMWBinOp #{type LLVMAtomicRMWBinOp}
+newtype DiagnosticSeverity = DiagnosticSeverity #{type LLVMDiagnosticSeverity}
+newtype DLLStorageClass = DLLStorageClass #{type LLVMDLLStorageClass}
+-- newtype InlineAsmDialect = InlineAsmDialect #{type LLVMInlineAsmDialect}
+newtype InlineAsmDialect = InlineAsmDialect Word32
+newtype IntPredicate = IntPredicate #{type LLVMIntPredicate}
+newtype Linkage = Linkage #{type LLVMLinkage}
+-- newtype ModuleFlagBehavior = ModuleFlagBehavior #{type LLVMModuleFlagBehavior}
+newtype ModuleFlagBehavior = ModuleFlagBehavior Word32
+newtype Opcode = Opcode #{type LLVMOpcode}
+newtype RealPredicate = RealPredicate #{type LLVMRealPredicate}
+newtype ThreadLocalMode = ThreadLocalMode #{type LLVMThreadLocalMode}
+newtype TypeKind = TypeKind {unTypeKind :: #{type LLVMTypeKind}}
+-- newtype UnnamedAddr = UnnamedAddr #{type LLVMUnnamedAddr}
+newtype UnnamedAddr = UnnamedAddr Word32
+newtype ValueKind = ValueKind #{type LLVMValueKind}
+newtype Visibility = Visibility #{type LLVMVisibility}
+
+
+foreign import ccall unsafe "LLVMInitializeCore" initializeCore
+    :: PassRegistryRef -> IO ()
+
+foreign import ccall unsafe "LLVMShutdown" shutdown
+    :: IO ()
+
+foreign import ccall unsafe "LLVMCreateMessage" createMessage
+    :: CString -> IO CString
+
+foreign import ccall unsafe "LLVMDisposeMessage" disposeMessage
+    :: CString -> IO ()
+
+foreign import ccall unsafe "LLVMContextCreate" contextCreate
+    :: IO ContextRef
+
+foreign import ccall unsafe "LLVMGetGlobalContext" getGlobalContext
+    :: IO ContextRef
+
+foreign import ccall unsafe "LLVMContextSetDiagnosticHandler" contextSetDiagnosticHandler
+    :: ContextRef -> DiagnosticHandler -> (Ptr ()) -> IO ()
+
+foreign import ccall unsafe "LLVMContextGetDiagnosticHandler" contextGetDiagnosticHandler
+    :: ContextRef -> IO DiagnosticHandler
+
+foreign import ccall unsafe "LLVMContextGetDiagnosticContext" contextGetDiagnosticContext
+    :: ContextRef -> IO (Ptr ())
+
+foreign import ccall unsafe "LLVMContextSetYieldCallback" contextSetYieldCallback
+    :: ContextRef -> YieldCallback -> (Ptr ()) -> IO ()
+
+foreign import ccall unsafe "LLVMContextDispose" contextDispose
+    :: ContextRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetDiagInfoDescription" getDiagInfoDescription
+    :: DiagnosticInfoRef -> IO CString
+
+foreign import ccall unsafe "LLVMGetDiagInfoSeverity" getDiagInfoSeverity
+    :: DiagnosticInfoRef -> IO DiagnosticSeverity
+
+foreign import ccall unsafe "LLVMGetMDKindIDInContext" getMDKindIDInContext
+    :: ContextRef -> CString -> CUInt -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetMDKindID" getMDKindID
+    :: CString -> CUInt -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetEnumAttributeKindForName" getEnumAttributeKindForName
+    :: CString -> CSize -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetLastEnumAttributeKind" getLastEnumAttributeKind
+    :: IO CUInt
+
+foreign import ccall unsafe "LLVMCreateEnumAttribute" createEnumAttribute
+    :: ContextRef -> CUInt -> Word64 -> IO AttributeRef
+
+foreign import ccall unsafe "LLVMGetEnumAttributeKind" getEnumAttributeKind
+    :: AttributeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetEnumAttributeValue" getEnumAttributeValue
+    :: AttributeRef -> IO Word64
+
+foreign import ccall unsafe "LLVMCreateStringAttribute" createStringAttribute
+    :: ContextRef -> CString -> CUInt -> CString -> CUInt -> IO AttributeRef
+
+foreign import ccall unsafe "LLVMGetStringAttributeKind" getStringAttributeKind
+    :: AttributeRef -> (Ptr CUInt) -> IO CString
+
+foreign import ccall unsafe "LLVMGetStringAttributeValue" getStringAttributeValue
+    :: AttributeRef -> (Ptr CUInt) -> IO CString
+
+foreign import ccall unsafe "LLVMIsEnumAttribute" isEnumAttribute
+    :: AttributeRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMIsStringAttribute" isStringAttribute
+    :: AttributeRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMModuleCreateWithName" moduleCreateWithName
+    :: CString -> IO ModuleRef
+
+foreign import ccall unsafe "LLVMModuleCreateWithNameInContext" moduleCreateWithNameInContext
+    :: CString -> ContextRef -> IO ModuleRef
+
+foreign import ccall unsafe "LLVMCloneModule" cloneModule
+    :: ModuleRef -> IO ModuleRef
+
+foreign import ccall unsafe "LLVMDisposeModule" disposeModule
+    :: ModuleRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetModuleIdentifier" getModuleIdentifier
+    :: ModuleRef -> (Ptr CSize) -> IO CString
+
+foreign import ccall unsafe "LLVMSetModuleIdentifier" setModuleIdentifier
+    :: ModuleRef -> CString -> CSize -> IO ()
+
+foreign import ccall unsafe "LLVMGetDataLayoutStr" getDataLayoutStr
+    :: ModuleRef -> IO CString
+
+foreign import ccall unsafe "LLVMGetDataLayout" getDataLayout
+    :: ModuleRef -> IO CString
+
+foreign import ccall unsafe "LLVMSetDataLayout" setDataLayout
+    :: ModuleRef -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMGetTarget" getTarget
+    :: ModuleRef -> IO CString
+
+foreign import ccall unsafe "LLVMSetTarget" setTarget
+    :: ModuleRef -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMDumpModule" dumpModule
+    :: ModuleRef -> IO ()
+
+foreign import ccall unsafe "LLVMPrintModuleToFile" printModuleToFile
+    :: ModuleRef -> CString -> (Ptr CString) -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMPrintModuleToString" printModuleToString
+    :: ModuleRef -> IO CString
+
+foreign import ccall unsafe "LLVMSetModuleInlineAsm" setModuleInlineAsm
+    :: ModuleRef -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMGetModuleContext" getModuleContext
+    :: ModuleRef -> IO ContextRef
+
+foreign import ccall unsafe "LLVMGetTypeByName" getTypeByName
+    :: ModuleRef -> CString -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetNamedMetadataNumOperands" getNamedMetadataNumOperands
+    :: ModuleRef -> CString -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetNamedMetadataOperands" getNamedMetadataOperands
+    :: ModuleRef -> CString -> (Ptr ValueRef) -> IO ()
+
+foreign import ccall unsafe "LLVMAddNamedMetadataOperand" addNamedMetadataOperand
+    :: ModuleRef -> CString -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMAddFunction" addFunction
+    :: ModuleRef -> CString -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetNamedFunction" getNamedFunction
+    :: ModuleRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetFirstFunction" getFirstFunction
+    :: ModuleRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetLastFunction" getLastFunction
+    :: ModuleRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetNextFunction" getNextFunction
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetPreviousFunction" getPreviousFunction
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetTypeKind" getTypeKind
+    :: TypeRef -> IO TypeKind
+
+foreign import ccall unsafe "LLVMTypeIsSized" typeIsSized
+    :: TypeRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMGetTypeContext" getTypeContext
+    :: TypeRef -> IO ContextRef
+
+foreign import ccall unsafe "LLVMPrintTypeToString" printTypeToString
+    :: TypeRef -> IO CString
+
+foreign import ccall unsafe "LLVMInt1TypeInContext" int1TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMInt8TypeInContext" int8TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMInt16TypeInContext" int16TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMInt32TypeInContext" int32TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMInt64TypeInContext" int64TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMInt128TypeInContext" int128TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMIntTypeInContext" intTypeInContext
+    :: ContextRef -> CUInt -> IO TypeRef
+
+foreign import ccall unsafe "LLVMInt1Type" int1Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMInt8Type" int8Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMInt16Type" int16Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMInt32Type" int32Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMInt64Type" int64Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMInt128Type" int128Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMIntType" intType
+    :: CUInt -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetIntTypeWidth" getIntTypeWidth
+    :: TypeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMHalfTypeInContext" halfTypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMFloatTypeInContext" floatTypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMDoubleTypeInContext" doubleTypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMX86FP80TypeInContext" x86FP80TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMFP128TypeInContext" fP128TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMPPCFP128TypeInContext" pPCFP128TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMHalfType" halfType
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMFloatType" floatType
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMDoubleType" doubleType
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMX86FP80Type" x86FP80Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMFP128Type" fP128Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMPPCFP128Type" pPCFP128Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMFunctionType" functionType
+    :: TypeRef -> (Ptr TypeRef) -> CUInt -> LLVM.Bool -> IO TypeRef
+
+foreign import ccall unsafe "LLVMIsFunctionVarArg" isFunctionVarArg
+    :: TypeRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMGetReturnType" getReturnType
+    :: TypeRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMCountParamTypes" countParamTypes
+    :: TypeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetParamTypes" getParamTypes
+    :: TypeRef -> (Ptr TypeRef) -> IO ()
+
+foreign import ccall unsafe "LLVMStructTypeInContext" structTypeInContext
+    :: ContextRef -> (Ptr TypeRef) -> CUInt -> LLVM.Bool -> IO TypeRef
+
+foreign import ccall unsafe "LLVMStructType" structType
+    :: (Ptr TypeRef) -> CUInt -> LLVM.Bool -> IO TypeRef
+
+foreign import ccall unsafe "LLVMStructCreateNamed" structCreateNamed
+    :: ContextRef -> CString -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetStructName" getStructName
+    :: TypeRef -> IO CString
+
+foreign import ccall unsafe "LLVMStructSetBody" structSetBody
+    :: TypeRef -> (Ptr TypeRef) -> CUInt -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMCountStructElementTypes" countStructElementTypes
+    :: TypeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetStructElementTypes" getStructElementTypes
+    :: TypeRef -> (Ptr TypeRef) -> IO ()
+
+foreign import ccall unsafe "LLVMStructGetTypeAtIndex" structGetTypeAtIndex
+    :: TypeRef -> CUInt -> IO TypeRef
+
+foreign import ccall unsafe "LLVMIsPackedStruct" isPackedStruct
+    :: TypeRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMIsOpaqueStruct" isOpaqueStruct
+    :: TypeRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMGetElementType" getElementType
+    :: TypeRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetSubtypes" getSubtypes
+    :: TypeRef -> (Ptr TypeRef) -> IO ()
+
+foreign import ccall unsafe "LLVMGetNumContainedTypes" getNumContainedTypes
+    :: TypeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMArrayType" arrayType
+    :: TypeRef -> CUInt -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetArrayLength" getArrayLength
+    :: TypeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMPointerType" pointerType
+    :: TypeRef -> CUInt -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetPointerAddressSpace" getPointerAddressSpace
+    :: TypeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMVectorType" vectorType
+    :: TypeRef -> CUInt -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetVectorSize" getVectorSize
+    :: TypeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMVoidTypeInContext" voidTypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMLabelTypeInContext" labelTypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMX86MMXTypeInContext" x86MMXTypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMVoidType" voidType
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMLabelType" labelType
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMX86MMXType" x86MMXType
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMTypeOf" typeOf
+    :: ValueRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetValueKind" getValueKind
+    :: ValueRef -> IO ValueKind
+
+foreign import ccall unsafe "LLVMGetValueName" getValueName
+    :: ValueRef -> IO CString
+
+foreign import ccall unsafe "LLVMSetValueName" setValueName
+    :: ValueRef -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMDumpValue" dumpValue
+    :: ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMPrintValueToString" printValueToString
+    :: ValueRef -> IO CString
+
+foreign import ccall unsafe "LLVMReplaceAllUsesWith" replaceAllUsesWith
+    :: ValueRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMIsConstant" isConstant
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMIsUndef" isUndef
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMIsAMDNode" isAMDNode
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMIsAMDString" isAMDString
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetFirstUse" getFirstUse
+    :: ValueRef -> IO UseRef
+
+foreign import ccall unsafe "LLVMGetNextUse" getNextUse
+    :: UseRef -> IO UseRef
+
+foreign import ccall unsafe "LLVMGetUser" getUser
+    :: UseRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetUsedValue" getUsedValue
+    :: UseRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetOperand" getOperand
+    :: ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetOperandUse" getOperandUse
+    :: ValueRef -> CUInt -> IO UseRef
+
+foreign import ccall unsafe "LLVMSetOperand" setOperand
+    :: ValueRef -> CUInt -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetNumOperands" getNumOperands
+    :: ValueRef -> IO CInt
+
+foreign import ccall unsafe "LLVMConstNull" constNull
+    :: TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstAllOnes" constAllOnes
+    :: TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetUndef" getUndef
+    :: TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMIsNull" isNull
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMConstPointerNull" constPointerNull
+    :: TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstInt" constInt
+    :: TypeRef -> CULLong -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstIntOfArbitraryPrecision" constIntOfArbitraryPrecision
+    :: TypeRef -> CUInt -> Ptr Word64 -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstIntOfString" constIntOfString
+    :: TypeRef -> CString -> Word8 -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstIntOfStringAndSize" constIntOfStringAndSize
+    :: TypeRef -> CString -> CUInt -> Word8 -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstReal" constReal
+    :: TypeRef -> CDouble -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstRealOfString" constRealOfString
+    :: TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstRealOfStringAndSize" constRealOfStringAndSize
+    :: TypeRef -> CString -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstIntGetZExtValue" constIntGetZExtValue
+    :: ValueRef -> IO CULLong
+
+foreign import ccall unsafe "LLVMConstIntGetSExtValue" constIntGetSExtValue
+    :: ValueRef -> IO CLLong
+
+foreign import ccall unsafe "LLVMConstRealGetDouble" constRealGetDouble
+    :: ValueRef -> (Ptr LLVM.Bool) -> IO CDouble
+
+foreign import ccall unsafe "LLVMConstStringInContext" constStringInContext
+    :: ContextRef -> CString -> CUInt -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstString" constString
+    :: CString -> CUInt -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMIsConstantString" isConstantString
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMGetAsString" getAsString
+    :: ValueRef -> (Ptr CSize) -> IO CString
+
+foreign import ccall unsafe "LLVMConstStructInContext" constStructInContext
+    :: ContextRef -> (Ptr ValueRef) -> CUInt -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstStruct" constStruct
+    :: (Ptr ValueRef) -> CUInt -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstArray" constArray
+    :: TypeRef -> (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNamedStruct" constNamedStruct
+    :: TypeRef -> (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetElementAsConstant" getElementAsConstant
+    :: ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstVector" constVector
+    :: (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetConstOpcode" getConstOpcode
+    :: ValueRef -> IO Opcode
+
+foreign import ccall unsafe "LLVMAlignOf" alignOf
+    :: TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSizeOf" sizeOf
+    :: TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNeg" constNeg
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNSWNeg" constNSWNeg
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNUWNeg" constNUWNeg
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFNeg" constFNeg
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNot" constNot
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstAdd" constAdd
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNSWAdd" constNSWAdd
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNUWAdd" constNUWAdd
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFAdd" constFAdd
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstSub" constSub
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNSWSub" constNSWSub
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNUWSub" constNUWSub
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFSub" constFSub
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstMul" constMul
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNSWMul" constNSWMul
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNUWMul" constNUWMul
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFMul" constFMul
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstUDiv" constUDiv
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstExactUDiv" constExactUDiv
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstSDiv" constSDiv
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstExactSDiv" constExactSDiv
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFDiv" constFDiv
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstURem" constURem
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstSRem" constSRem
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFRem" constFRem
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstAnd" constAnd
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstOr" constOr
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstXor" constXor
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstICmp" constICmp
+    :: IntPredicate -> ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFCmp" constFCmp
+    :: RealPredicate -> ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstShl" constShl
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstLShr" constLShr
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstAShr" constAShr
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstGEP" constGEP
+    :: ValueRef -> (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstInBoundsGEP" constInBoundsGEP
+    :: ValueRef -> (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstTrunc" constTrunc
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstSExt" constSExt
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstZExt" constZExt
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFPTrunc" constFPTrunc
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFPExt" constFPExt
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstUIToFP" constUIToFP
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstSIToFP" constSIToFP
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFPToUI" constFPToUI
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFPToSI" constFPToSI
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstPtrToInt" constPtrToInt
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstIntToPtr" constIntToPtr
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstBitCast" constBitCast
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstAddrSpaceCast" constAddrSpaceCast
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstZExtOrBitCast" constZExtOrBitCast
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstSExtOrBitCast" constSExtOrBitCast
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstTruncOrBitCast" constTruncOrBitCast
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstPointerCast" constPointerCast
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstIntCast" constIntCast
+    :: ValueRef -> TypeRef -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFPCast" constFPCast
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstSelect" constSelect
+    :: ValueRef -> ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstExtractElement" constExtractElement
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstInsertElement" constInsertElement
+    :: ValueRef -> ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstShuffleVector" constShuffleVector
+    :: ValueRef -> ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstExtractValue" constExtractValue
+    :: ValueRef -> (Ptr CUInt) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstInsertValue" constInsertValue
+    :: ValueRef -> ValueRef -> (Ptr CUInt) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstInlineAsm" constInlineAsm
+    :: TypeRef -> CString -> CString -> LLVM.Bool -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBlockAddress" blockAddress
+    :: ValueRef -> BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetGlobalParent" getGlobalParent
+    :: ValueRef -> IO ModuleRef
+
+foreign import ccall unsafe "LLVMIsDeclaration" isDeclaration
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMGetLinkage" getLinkage
+    :: ValueRef -> IO Linkage
+
+foreign import ccall unsafe "LLVMSetLinkage" setLinkage
+    :: ValueRef -> Linkage -> IO ()
+
+foreign import ccall unsafe "LLVMGetSection" getSection
+    :: ValueRef -> IO CString
+
+foreign import ccall unsafe "LLVMSetSection" setSection
+    :: ValueRef -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMGetVisibility" getVisibility
+    :: ValueRef -> IO Visibility
+
+foreign import ccall unsafe "LLVMSetVisibility" setVisibility
+    :: ValueRef -> Visibility -> IO ()
+
+foreign import ccall unsafe "LLVMGetDLLStorageClass" getDLLStorageClass
+    :: ValueRef -> IO DLLStorageClass
+
+foreign import ccall unsafe "LLVMSetDLLStorageClass" setDLLStorageClass
+    :: ValueRef -> DLLStorageClass -> IO ()
+
+foreign import ccall unsafe "LLVMHasUnnamedAddr" hasUnnamedAddr
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetUnnamedAddr" setUnnamedAddr
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMGetAlignment" getAlignment
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMSetAlignment" setAlignment
+    :: ValueRef -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMAddGlobal" addGlobal
+    :: ModuleRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMAddGlobalInAddressSpace" addGlobalInAddressSpace
+    :: ModuleRef -> TypeRef -> CString -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetNamedGlobal" getNamedGlobal
+    :: ModuleRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetFirstGlobal" getFirstGlobal
+    :: ModuleRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetLastGlobal" getLastGlobal
+    :: ModuleRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetNextGlobal" getNextGlobal
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetPreviousGlobal" getPreviousGlobal
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMDeleteGlobal" deleteGlobal
+    :: ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetInitializer" getInitializer
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSetInitializer" setInitializer
+    :: ValueRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMIsThreadLocal" isThreadLocal
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetThreadLocal" setThreadLocal
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMIsGlobalConstant" isGlobalConstant
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetGlobalConstant" setGlobalConstant
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMGetThreadLocalMode" getThreadLocalMode
+    :: ValueRef -> IO ThreadLocalMode
+
+foreign import ccall unsafe "LLVMSetThreadLocalMode" setThreadLocalMode
+    :: ValueRef -> ThreadLocalMode -> IO ()
+
+foreign import ccall unsafe "LLVMIsExternallyInitialized" isExternallyInitialized
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetExternallyInitialized" setExternallyInitialized
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMAddAlias" addAlias
+    :: ModuleRef -> TypeRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMDeleteFunction" deleteFunction
+    :: ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMHasPersonalityFn" hasPersonalityFn
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMGetPersonalityFn" getPersonalityFn
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSetPersonalityFn" setPersonalityFn
+    :: ValueRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetIntrinsicID" getIntrinsicID
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetFunctionCallConv" getFunctionCallConv
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMSetFunctionCallConv" setFunctionCallConv
+    :: ValueRef -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMGetGC" getGC
+    :: ValueRef -> IO CString
+
+foreign import ccall unsafe "LLVMSetGC" setGC
+    :: ValueRef -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMAddAttributeAtIndex" addAttributeAtIndex
+    :: ValueRef -> AttributeIndex -> AttributeRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetAttributeCountAtIndex" getAttributeCountAtIndex
+    :: ValueRef -> AttributeIndex -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetAttributesAtIndex" getAttributesAtIndex
+    :: ValueRef -> AttributeIndex -> (Ptr AttributeRef) -> IO ()
+
+foreign import ccall unsafe "LLVMGetEnumAttributeAtIndex" getEnumAttributeAtIndex
+    :: ValueRef -> AttributeIndex -> CUInt -> IO AttributeRef
+
+foreign import ccall unsafe "LLVMGetStringAttributeAtIndex" getStringAttributeAtIndex
+    :: ValueRef -> AttributeIndex -> CString -> CUInt -> IO AttributeRef
+
+foreign import ccall unsafe "LLVMRemoveEnumAttributeAtIndex" removeEnumAttributeAtIndex
+    :: ValueRef -> AttributeIndex -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMRemoveStringAttributeAtIndex" removeStringAttributeAtIndex
+    :: ValueRef -> AttributeIndex -> CString -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMAddTargetDependentFunctionAttr" addTargetDependentFunctionAttr
+    :: ValueRef -> CString -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMCountParams" countParams
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetParams" getParams
+    :: ValueRef -> (Ptr ValueRef) -> IO ()
+
+foreign import ccall unsafe "LLVMGetParam" getParam
+    :: ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetParamParent" getParamParent
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetFirstParam" getFirstParam
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetLastParam" getLastParam
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetNextParam" getNextParam
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetPreviousParam" getPreviousParam
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSetParamAlignment" setParamAlignment
+    :: ValueRef -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMMDStringInContext" mDStringInContext
+    :: ContextRef -> CString -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMMDString" mDString
+    :: CString -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMMDNodeInContext" mDNodeInContext
+    :: ContextRef -> (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMMDNode" mDNode
+    :: (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMMetadataAsValue" metadataAsValue
+    :: ContextRef -> MetadataRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMValueAsMetadata" valueAsMetadata
+    :: ValueRef -> IO MetadataRef
+
+foreign import ccall unsafe "LLVMGetMDString" getMDString
+    :: ValueRef -> (Ptr CUInt) -> IO CString
+
+foreign import ccall unsafe "LLVMGetMDNodeNumOperands" getMDNodeNumOperands
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetMDNodeOperands" getMDNodeOperands
+    :: ValueRef -> (Ptr ValueRef) -> IO ()
+
+foreign import ccall unsafe "LLVMBasicBlockAsValue" basicBlockAsValue
+    :: BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMValueIsBasicBlock" valueIsBasicBlock
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMValueAsBasicBlock" valueAsBasicBlock
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetBasicBlockName" getBasicBlockName
+    :: BasicBlockRef -> IO CString
+
+foreign import ccall unsafe "LLVMGetBasicBlockParent" getBasicBlockParent
+    :: BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetBasicBlockTerminator" getBasicBlockTerminator
+    :: BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMCountBasicBlocks" countBasicBlocks
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetBasicBlocks" getBasicBlocks
+    :: ValueRef -> (Ptr BasicBlockRef) -> IO ()
+
+foreign import ccall unsafe "LLVMGetFirstBasicBlock" getFirstBasicBlock
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetLastBasicBlock" getLastBasicBlock
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetNextBasicBlock" getNextBasicBlock
+    :: BasicBlockRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetPreviousBasicBlock" getPreviousBasicBlock
+    :: BasicBlockRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetEntryBasicBlock" getEntryBasicBlock
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMAppendBasicBlockInContext" appendBasicBlockInContext
+    :: ContextRef -> ValueRef -> CString -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMAppendBasicBlock" appendBasicBlock
+    :: ValueRef -> CString -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMInsertBasicBlockInContext" insertBasicBlockInContext
+    :: ContextRef -> BasicBlockRef -> CString -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMInsertBasicBlock" insertBasicBlock
+    :: BasicBlockRef -> CString -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMDeleteBasicBlock" deleteBasicBlock
+    :: BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMRemoveBasicBlockFromParent" removeBasicBlockFromParent
+    :: BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMMoveBasicBlockBefore" moveBasicBlockBefore
+    :: BasicBlockRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMMoveBasicBlockAfter" moveBasicBlockAfter
+    :: BasicBlockRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetFirstInstruction" getFirstInstruction
+    :: BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetLastInstruction" getLastInstruction
+    :: BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMHasMetadata" hasMetadata
+    :: ValueRef -> IO CInt
+
+foreign import ccall unsafe "LLVMGetMetadata" getMetadata
+    :: ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSetMetadata" setMetadata
+    :: ValueRef -> CUInt -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetInstructionParent" getInstructionParent
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetNextInstruction" getNextInstruction
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetPreviousInstruction" getPreviousInstruction
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMInstructionRemoveFromParent" instructionRemoveFromParent
+    :: ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMInstructionEraseFromParent" instructionEraseFromParent
+    :: ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetInstructionOpcode" getInstructionOpcode
+    :: ValueRef -> IO Opcode
+
+foreign import ccall unsafe "LLVMGetICmpPredicate" getICmpPredicate
+    :: ValueRef -> IO IntPredicate
+
+foreign import ccall unsafe "LLVMGetFCmpPredicate" getFCmpPredicate
+    :: ValueRef -> IO RealPredicate
+
+foreign import ccall unsafe "LLVMInstructionClone" instructionClone
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetNumArgOperands" getNumArgOperands
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMSetInstructionCallConv" setInstructionCallConv
+    :: ValueRef -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMGetInstructionCallConv" getInstructionCallConv
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMSetInstrParamAlignment" setInstrParamAlignment
+    :: ValueRef -> CUInt -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMAddCallSiteAttribute" addCallSiteAttribute
+    :: ValueRef -> AttributeIndex -> AttributeRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetCallSiteAttributeCount" getCallSiteAttributeCount
+    :: ValueRef -> AttributeIndex -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetCallSiteAttributes" getCallSiteAttributes
+    :: ValueRef -> AttributeIndex -> (Ptr AttributeRef) -> IO ()
+
+foreign import ccall unsafe "LLVMGetCallSiteEnumAttribute" getCallSiteEnumAttribute
+    :: ValueRef -> AttributeIndex -> CUInt -> IO AttributeRef
+
+foreign import ccall unsafe "LLVMGetCallSiteStringAttribute" getCallSiteStringAttribute
+    :: ValueRef -> AttributeIndex -> CString -> CUInt -> IO AttributeRef
+
+foreign import ccall unsafe "LLVMRemoveCallSiteEnumAttribute" removeCallSiteEnumAttribute
+    :: ValueRef -> AttributeIndex -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMRemoveCallSiteStringAttribute" removeCallSiteStringAttribute
+    :: ValueRef -> AttributeIndex -> CString -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMGetCalledValue" getCalledValue
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMIsTailCall" isTailCall
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetTailCall" setTailCall
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMGetNormalDest" getNormalDest
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetUnwindDest" getUnwindDest
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMSetNormalDest" setNormalDest
+    :: ValueRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMSetUnwindDest" setUnwindDest
+    :: ValueRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetNumSuccessors" getNumSuccessors
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetSuccessor" getSuccessor
+    :: ValueRef -> CUInt -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMSetSuccessor" setSuccessor
+    :: ValueRef -> CUInt -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMIsConditional" isConditional
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMGetCondition" getCondition
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSetCondition" setCondition
+    :: ValueRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetSwitchDefaultDest" getSwitchDefaultDest
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetAllocatedType" getAllocatedType
+    :: ValueRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMIsInBounds" isInBounds
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetIsInBounds" setIsInBounds
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMAddIncoming" addIncoming
+    :: ValueRef -> (Ptr ValueRef) -> (Ptr BasicBlockRef) -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMCountIncoming" countIncoming
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetIncomingValue" getIncomingValue
+    :: ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetIncomingBlock" getIncomingBlock
+    :: ValueRef -> CUInt -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetNumIndices" getNumIndices
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetIndices" getIndices
+    :: ValueRef -> IO (Ptr CUInt)
+
+foreign import ccall unsafe "LLVMCreateBuilderInContext" createBuilderInContext
+    :: ContextRef -> IO BuilderRef
+
+foreign import ccall unsafe "LLVMCreateBuilder" createBuilder
+    :: IO BuilderRef
+
+foreign import ccall unsafe "LLVMPositionBuilder" positionBuilder
+    :: BuilderRef -> BasicBlockRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMPositionBuilderBefore" positionBuilderBefore
+    :: BuilderRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMPositionBuilderAtEnd" positionBuilderAtEnd
+    :: BuilderRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetInsertBlock" getInsertBlock
+    :: BuilderRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMClearInsertionPosition" clearInsertionPosition
+    :: BuilderRef -> IO ()
+
+foreign import ccall unsafe "LLVMInsertIntoBuilder" insertIntoBuilder
+    :: BuilderRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMInsertIntoBuilderWithName" insertIntoBuilderWithName
+    :: BuilderRef -> ValueRef -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMDisposeBuilder" disposeBuilder
+    :: BuilderRef -> IO ()
+
+foreign import ccall unsafe "LLVMSetCurrentDebugLocation" setCurrentDebugLocation
+    :: BuilderRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetCurrentDebugLocation" getCurrentDebugLocation
+    :: BuilderRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSetInstDebugLocation" setInstDebugLocation
+    :: BuilderRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMBuildRetVoid" buildRetVoid
+    :: BuilderRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildRet" buildRet
+    :: BuilderRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildAggregateRet" buildAggregateRet
+    :: BuilderRef -> (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildBr" buildBr
+    :: BuilderRef -> BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildCondBr" buildCondBr
+    :: BuilderRef -> ValueRef -> BasicBlockRef -> BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSwitch" buildSwitch
+    :: BuilderRef -> ValueRef -> BasicBlockRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildIndirectBr" buildIndirectBr
+    :: BuilderRef -> ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildInvoke" buildInvoke
+    :: BuilderRef -> ValueRef -> (Ptr ValueRef) -> CUInt -> BasicBlockRef -> BasicBlockRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildLandingPad" buildLandingPad
+    :: BuilderRef -> TypeRef -> ValueRef -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildResume" buildResume
+    :: BuilderRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildUnreachable" buildUnreachable
+    :: BuilderRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMAddCase" addCase
+    :: ValueRef -> ValueRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMAddDestination" addDestination
+    :: ValueRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetNumClauses" getNumClauses
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetClause" getClause
+    :: ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMAddClause" addClause
+    :: ValueRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMIsCleanup" isCleanup
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetCleanup" setCleanup
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMBuildAdd" buildAdd
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNSWAdd" buildNSWAdd
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNUWAdd" buildNUWAdd
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFAdd" buildFAdd
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSub" buildSub
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNSWSub" buildNSWSub
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNUWSub" buildNUWSub
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFSub" buildFSub
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildMul" buildMul
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNSWMul" buildNSWMul
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNUWMul" buildNUWMul
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFMul" buildFMul
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildUDiv" buildUDiv
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildExactUDiv" buildExactUDiv
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSDiv" buildSDiv
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildExactSDiv" buildExactSDiv
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFDiv" buildFDiv
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildURem" buildURem
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSRem" buildSRem
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFRem" buildFRem
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildShl" buildShl
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildLShr" buildLShr
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildAShr" buildAShr
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildAnd" buildAnd
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildOr" buildOr
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildXor" buildXor
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildBinOp" buildBinOp
+    :: BuilderRef -> Opcode -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNeg" buildNeg
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNSWNeg" buildNSWNeg
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNUWNeg" buildNUWNeg
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFNeg" buildFNeg
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNot" buildNot
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildMalloc" buildMalloc
+    :: BuilderRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildArrayMalloc" buildArrayMalloc
+    :: BuilderRef -> TypeRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildAlloca" buildAlloca
+    :: BuilderRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildArrayAlloca" buildArrayAlloca
+    :: BuilderRef -> TypeRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFree" buildFree
+    :: BuilderRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildLoad" buildLoad
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildStore" buildStore
+    :: BuilderRef -> ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildGEP" buildGEP
+    :: BuilderRef -> ValueRef -> (Ptr ValueRef) -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildInBoundsGEP" buildInBoundsGEP
+    :: BuilderRef -> ValueRef -> (Ptr ValueRef) -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildStructGEP" buildStructGEP
+    :: BuilderRef -> ValueRef -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildGlobalString" buildGlobalString
+    :: BuilderRef -> CString -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildGlobalStringPtr" buildGlobalStringPtr
+    :: BuilderRef -> CString -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetVolatile" getVolatile
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetVolatile" setVolatile
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMGetOrdering" getOrdering
+    :: ValueRef -> IO AtomicOrdering
+
+foreign import ccall unsafe "LLVMSetOrdering" setOrdering
+    :: ValueRef -> AtomicOrdering -> IO ()
+
+foreign import ccall unsafe "LLVMBuildTrunc" buildTrunc
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildZExt" buildZExt
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSExt" buildSExt
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFPToUI" buildFPToUI
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFPToSI" buildFPToSI
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildUIToFP" buildUIToFP
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSIToFP" buildSIToFP
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFPTrunc" buildFPTrunc
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFPExt" buildFPExt
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildPtrToInt" buildPtrToInt
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildIntToPtr" buildIntToPtr
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildBitCast" buildBitCast
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildAddrSpaceCast" buildAddrSpaceCast
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildZExtOrBitCast" buildZExtOrBitCast
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSExtOrBitCast" buildSExtOrBitCast
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildTruncOrBitCast" buildTruncOrBitCast
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildCast" buildCast
+    :: BuilderRef -> Opcode -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildPointerCast" buildPointerCast
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFPCast" buildFPCast
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildICmp" buildICmp
+    :: BuilderRef -> IntPredicate -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFCmp" buildFCmp
+    :: BuilderRef -> RealPredicate -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildPhi" buildPhi
+    :: BuilderRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildCall" buildCall
+    :: BuilderRef -> ValueRef -> (Ptr ValueRef) -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSelect" buildSelect
+    :: BuilderRef -> ValueRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildVAArg" buildVAArg
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildExtractElement" buildExtractElement
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildInsertElement" buildInsertElement
+    :: BuilderRef -> ValueRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildShuffleVector" buildShuffleVector
+    :: BuilderRef -> ValueRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildExtractValue" buildExtractValue
+    :: BuilderRef -> ValueRef -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildInsertValue" buildInsertValue
+    :: BuilderRef -> ValueRef -> ValueRef -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildIsNull" buildIsNull
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildIsNotNull" buildIsNotNull
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildPtrDiff" buildPtrDiff
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFence" buildFence
+    :: BuilderRef -> AtomicOrdering -> LLVM.Bool -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildAtomicRMW" buildAtomicRMW
+    :: BuilderRef -> AtomicRMWBinOp -> ValueRef -> ValueRef -> AtomicOrdering -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildAtomicCmpXchg" buildAtomicCmpXchg
+    :: BuilderRef -> ValueRef -> ValueRef -> ValueRef -> AtomicOrdering -> AtomicOrdering -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMIsAtomicSingleThread" isAtomicSingleThread
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetAtomicSingleThread" setAtomicSingleThread
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMGetCmpXchgSuccessOrdering" getCmpXchgSuccessOrdering
+    :: ValueRef -> IO AtomicOrdering
+
+foreign import ccall unsafe "LLVMSetCmpXchgSuccessOrdering" setCmpXchgSuccessOrdering
+    :: ValueRef -> AtomicOrdering -> IO ()
+
+foreign import ccall unsafe "LLVMGetCmpXchgFailureOrdering" getCmpXchgFailureOrdering
+    :: ValueRef -> IO AtomicOrdering
+
+foreign import ccall unsafe "LLVMSetCmpXchgFailureOrdering" setCmpXchgFailureOrdering
+    :: ValueRef -> AtomicOrdering -> IO ()
+
+foreign import ccall unsafe "LLVMCreateModuleProviderForExistingModule" createModuleProviderForExistingModule
+    :: ModuleRef -> IO ModuleProviderRef
+
+foreign import ccall unsafe "LLVMDisposeModuleProvider" disposeModuleProvider
+    :: ModuleProviderRef -> IO ()
+
+foreign import ccall unsafe "LLVMCreateMemoryBufferWithContentsOfFile" createMemoryBufferWithContentsOfFile
+    :: CString -> (Ptr MemoryBufferRef) -> (Ptr CString) -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMCreateMemoryBufferWithSTDIN" createMemoryBufferWithSTDIN
+    :: (Ptr MemoryBufferRef) -> (Ptr CString) -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMCreateMemoryBufferWithMemoryRange" createMemoryBufferWithMemoryRange
+    :: CString -> CSize -> CString -> LLVM.Bool -> IO MemoryBufferRef
+
+foreign import ccall unsafe "LLVMCreateMemoryBufferWithMemoryRangeCopy" createMemoryBufferWithMemoryRangeCopy
+    :: CString -> CSize -> CString -> IO MemoryBufferRef
+
+foreign import ccall unsafe "LLVMGetBufferStart" getBufferStart
+    :: MemoryBufferRef -> IO CString
+
+foreign import ccall unsafe "LLVMGetBufferSize" getBufferSize
+    :: MemoryBufferRef -> IO CSize
+
+foreign import ccall unsafe "LLVMDisposeMemoryBuffer" disposeMemoryBuffer
+    :: MemoryBufferRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetGlobalPassRegistry" getGlobalPassRegistry
+    :: IO PassRegistryRef
+
+foreign import ccall unsafe "LLVMCreatePassManager" createPassManager
+    :: IO PassManagerRef
+
+foreign import ccall unsafe "LLVMCreateFunctionPassManagerForModule" createFunctionPassManagerForModule
+    :: ModuleRef -> IO PassManagerRef
+
+foreign import ccall unsafe "LLVMCreateFunctionPassManager" createFunctionPassManager
+    :: ModuleProviderRef -> IO PassManagerRef
+
+foreign import ccall unsafe "LLVMRunPassManager" runPassManager
+    :: PassManagerRef -> ModuleRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMInitializeFunctionPassManager" initializeFunctionPassManager
+    :: PassManagerRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMRunFunctionPassManager" runFunctionPassManager
+    :: PassManagerRef -> ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMFinalizeFunctionPassManager" finalizeFunctionPassManager
+    :: PassManagerRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMDisposePassManager" disposePassManager
+    :: PassManagerRef -> IO ()
+
+foreign import ccall unsafe "LLVMStartMultithreaded" startMultithreaded
+    :: IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMStopMultithreaded" stopMultithreaded
+    :: IO ()
+
+foreign import ccall unsafe "LLVMIsMultithreaded" isMultithreaded
+    :: IO LLVM.Bool
diff --git a/src/6.0/LLVM/Raw/Core.hsc b/src/6.0/LLVM/Raw/Core.hsc
new file mode 100644
--- /dev/null
+++ b/src/6.0/LLVM/Raw/Core.hsc
@@ -0,0 +1,1636 @@
+{-# LANGUAGE Safe #-}
+{-# LANGUAGE ForeignFunctionInterface #-}
+{-# LANGUAGE EmptyDataDecls #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+module LLVM.Raw.Core where
+
+import qualified LLVM.FFI.Base as LLVM
+
+import qualified Foreign.C.Types as C
+import Foreign.C.String (CString)
+import Foreign.Ptr (Ptr, FunPtr)
+
+import Data.Typeable (Typeable)
+
+import Data.Word (Word8, Word32, Word64)
+
+
+type CDouble  = C.CDouble
+type CInt     = C.CInt
+type CUInt    = C.CUInt
+type CLLong   = C.CLLong
+type CULLong  = C.CULLong
+type CSize    = C.CSize
+
+
+#include <llvm/Config/llvm-config.h>
+#include <llvm-c/Core.h>
+
+
+data Module
+    deriving (Typeable)
+type ModuleRef = Ptr Module
+
+data ModuleProvider
+    deriving (Typeable)
+type ModuleProviderRef = Ptr ModuleProvider
+
+data Type
+    deriving (Typeable)
+type TypeRef = Ptr Type
+
+data BasicBlock
+    deriving (Typeable)
+type BasicBlockRef = Ptr BasicBlock
+
+data Value
+    deriving (Typeable)
+type ValueRef = Ptr Value
+
+data OpaqueUse
+    deriving (Typeable)
+type UseRef = Ptr OpaqueUse
+
+data Builder
+    deriving (Typeable)
+type BuilderRef = Ptr Builder
+
+data MemoryBuffer
+    deriving (Typeable)
+type MemoryBufferRef = Ptr MemoryBuffer
+
+data PassManager
+    deriving (Typeable)
+type PassManagerRef = Ptr PassManager
+
+data PassRegistry
+    deriving (Typeable)
+type PassRegistryRef = Ptr PassRegistry
+
+data Context
+    deriving (Typeable)
+type ContextRef = Ptr Context
+
+{-
+data Attribute
+    deriving (Typeable)
+-}
+-- until 3.9
+newtype Attribute = Attribute Word32
+type AttributeRef = Ptr Attribute
+
+newtype AttributeIndex = AttributeIndex #{type LLVMAttributeIndex}
+
+attributeReturnIndex, attributeFunctionIndex :: AttributeIndex
+attributeReturnIndex   = AttributeIndex (#const LLVMAttributeReturnIndex)
+attributeFunctionIndex = AttributeIndex (#const LLVMAttributeFunctionIndex)
+
+
+data Metadata
+    deriving (Typeable)
+type MetadataRef = Ptr Metadata
+
+data DiagnosticInfo
+    deriving (Typeable)
+type DiagnosticInfoRef = Ptr DiagnosticInfo
+
+data NamedMDNode
+    deriving (Typeable)
+type NamedMDNodeRef = Ptr NamedMDNode
+
+
+data ModuleFlagEntry
+    deriving (Typeable)
+data ValueMetadataEntry
+    deriving (Typeable)
+
+type DiagnosticHandler = FunPtr (DiagnosticInfoRef -> Ptr () -> IO ())
+type YieldCallback = FunPtr (ContextRef -> Ptr () -> IO ())
+
+newtype CallingConvention = CallingConvention {unCallingConvention :: CUInt}
+
+newtype AtomicOrdering = AtomicOrdering #{type LLVMAtomicOrdering}
+newtype AtomicRMWBinOp = AtomicRMWBinOp #{type LLVMAtomicRMWBinOp}
+newtype DiagnosticSeverity = DiagnosticSeverity #{type LLVMDiagnosticSeverity}
+newtype DLLStorageClass = DLLStorageClass #{type LLVMDLLStorageClass}
+-- newtype InlineAsmDialect = InlineAsmDialect #{type LLVMInlineAsmDialect}
+newtype InlineAsmDialect = InlineAsmDialect Word32
+newtype IntPredicate = IntPredicate #{type LLVMIntPredicate}
+newtype Linkage = Linkage #{type LLVMLinkage}
+-- newtype ModuleFlagBehavior = ModuleFlagBehavior #{type LLVMModuleFlagBehavior}
+newtype ModuleFlagBehavior = ModuleFlagBehavior Word32
+newtype Opcode = Opcode #{type LLVMOpcode}
+newtype RealPredicate = RealPredicate #{type LLVMRealPredicate}
+newtype ThreadLocalMode = ThreadLocalMode #{type LLVMThreadLocalMode}
+newtype TypeKind = TypeKind {unTypeKind :: #{type LLVMTypeKind}}
+-- newtype UnnamedAddr = UnnamedAddr #{type LLVMUnnamedAddr}
+newtype UnnamedAddr = UnnamedAddr Word32
+newtype ValueKind = ValueKind #{type LLVMValueKind}
+newtype Visibility = Visibility #{type LLVMVisibility}
+
+
+foreign import ccall unsafe "LLVMInitializeCore" initializeCore
+    :: PassRegistryRef -> IO ()
+
+foreign import ccall unsafe "LLVMShutdown" shutdown
+    :: IO ()
+
+foreign import ccall unsafe "LLVMCreateMessage" createMessage
+    :: CString -> IO CString
+
+foreign import ccall unsafe "LLVMDisposeMessage" disposeMessage
+    :: CString -> IO ()
+
+foreign import ccall unsafe "LLVMContextCreate" contextCreate
+    :: IO ContextRef
+
+foreign import ccall unsafe "LLVMGetGlobalContext" getGlobalContext
+    :: IO ContextRef
+
+foreign import ccall unsafe "LLVMContextSetDiagnosticHandler" contextSetDiagnosticHandler
+    :: ContextRef -> DiagnosticHandler -> (Ptr ()) -> IO ()
+
+foreign import ccall unsafe "LLVMContextGetDiagnosticHandler" contextGetDiagnosticHandler
+    :: ContextRef -> IO DiagnosticHandler
+
+foreign import ccall unsafe "LLVMContextGetDiagnosticContext" contextGetDiagnosticContext
+    :: ContextRef -> IO (Ptr ())
+
+foreign import ccall unsafe "LLVMContextSetYieldCallback" contextSetYieldCallback
+    :: ContextRef -> YieldCallback -> (Ptr ()) -> IO ()
+
+foreign import ccall unsafe "LLVMContextDispose" contextDispose
+    :: ContextRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetDiagInfoDescription" getDiagInfoDescription
+    :: DiagnosticInfoRef -> IO CString
+
+foreign import ccall unsafe "LLVMGetDiagInfoSeverity" getDiagInfoSeverity
+    :: DiagnosticInfoRef -> IO DiagnosticSeverity
+
+foreign import ccall unsafe "LLVMGetMDKindIDInContext" getMDKindIDInContext
+    :: ContextRef -> CString -> CUInt -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetMDKindID" getMDKindID
+    :: CString -> CUInt -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetEnumAttributeKindForName" getEnumAttributeKindForName
+    :: CString -> CSize -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetLastEnumAttributeKind" getLastEnumAttributeKind
+    :: IO CUInt
+
+foreign import ccall unsafe "LLVMCreateEnumAttribute" createEnumAttribute
+    :: ContextRef -> CUInt -> Word64 -> IO AttributeRef
+
+foreign import ccall unsafe "LLVMGetEnumAttributeKind" getEnumAttributeKind
+    :: AttributeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetEnumAttributeValue" getEnumAttributeValue
+    :: AttributeRef -> IO Word64
+
+foreign import ccall unsafe "LLVMCreateStringAttribute" createStringAttribute
+    :: ContextRef -> CString -> CUInt -> CString -> CUInt -> IO AttributeRef
+
+foreign import ccall unsafe "LLVMGetStringAttributeKind" getStringAttributeKind
+    :: AttributeRef -> (Ptr CUInt) -> IO CString
+
+foreign import ccall unsafe "LLVMGetStringAttributeValue" getStringAttributeValue
+    :: AttributeRef -> (Ptr CUInt) -> IO CString
+
+foreign import ccall unsafe "LLVMIsEnumAttribute" isEnumAttribute
+    :: AttributeRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMIsStringAttribute" isStringAttribute
+    :: AttributeRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMModuleCreateWithName" moduleCreateWithName
+    :: CString -> IO ModuleRef
+
+foreign import ccall unsafe "LLVMModuleCreateWithNameInContext" moduleCreateWithNameInContext
+    :: CString -> ContextRef -> IO ModuleRef
+
+foreign import ccall unsafe "LLVMCloneModule" cloneModule
+    :: ModuleRef -> IO ModuleRef
+
+foreign import ccall unsafe "LLVMDisposeModule" disposeModule
+    :: ModuleRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetModuleIdentifier" getModuleIdentifier
+    :: ModuleRef -> (Ptr CSize) -> IO CString
+
+foreign import ccall unsafe "LLVMSetModuleIdentifier" setModuleIdentifier
+    :: ModuleRef -> CString -> CSize -> IO ()
+
+foreign import ccall unsafe "LLVMGetDataLayoutStr" getDataLayoutStr
+    :: ModuleRef -> IO CString
+
+foreign import ccall unsafe "LLVMGetDataLayout" getDataLayout
+    :: ModuleRef -> IO CString
+
+foreign import ccall unsafe "LLVMSetDataLayout" setDataLayout
+    :: ModuleRef -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMGetTarget" getTarget
+    :: ModuleRef -> IO CString
+
+foreign import ccall unsafe "LLVMSetTarget" setTarget
+    :: ModuleRef -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMDumpModule" dumpModule
+    :: ModuleRef -> IO ()
+
+foreign import ccall unsafe "LLVMPrintModuleToFile" printModuleToFile
+    :: ModuleRef -> CString -> (Ptr CString) -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMPrintModuleToString" printModuleToString
+    :: ModuleRef -> IO CString
+
+foreign import ccall unsafe "LLVMSetModuleInlineAsm" setModuleInlineAsm
+    :: ModuleRef -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMGetModuleContext" getModuleContext
+    :: ModuleRef -> IO ContextRef
+
+foreign import ccall unsafe "LLVMGetTypeByName" getTypeByName
+    :: ModuleRef -> CString -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetNamedMetadataNumOperands" getNamedMetadataNumOperands
+    :: ModuleRef -> CString -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetNamedMetadataOperands" getNamedMetadataOperands
+    :: ModuleRef -> CString -> (Ptr ValueRef) -> IO ()
+
+foreign import ccall unsafe "LLVMAddNamedMetadataOperand" addNamedMetadataOperand
+    :: ModuleRef -> CString -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMAddFunction" addFunction
+    :: ModuleRef -> CString -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetNamedFunction" getNamedFunction
+    :: ModuleRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetFirstFunction" getFirstFunction
+    :: ModuleRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetLastFunction" getLastFunction
+    :: ModuleRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetNextFunction" getNextFunction
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetPreviousFunction" getPreviousFunction
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetTypeKind" getTypeKind
+    :: TypeRef -> IO TypeKind
+
+foreign import ccall unsafe "LLVMTypeIsSized" typeIsSized
+    :: TypeRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMGetTypeContext" getTypeContext
+    :: TypeRef -> IO ContextRef
+
+foreign import ccall unsafe "LLVMPrintTypeToString" printTypeToString
+    :: TypeRef -> IO CString
+
+foreign import ccall unsafe "LLVMInt1TypeInContext" int1TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMInt8TypeInContext" int8TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMInt16TypeInContext" int16TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMInt32TypeInContext" int32TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMInt64TypeInContext" int64TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMInt128TypeInContext" int128TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMIntTypeInContext" intTypeInContext
+    :: ContextRef -> CUInt -> IO TypeRef
+
+foreign import ccall unsafe "LLVMInt1Type" int1Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMInt8Type" int8Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMInt16Type" int16Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMInt32Type" int32Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMInt64Type" int64Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMInt128Type" int128Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMIntType" intType
+    :: CUInt -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetIntTypeWidth" getIntTypeWidth
+    :: TypeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMHalfTypeInContext" halfTypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMFloatTypeInContext" floatTypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMDoubleTypeInContext" doubleTypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMX86FP80TypeInContext" x86FP80TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMFP128TypeInContext" fP128TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMPPCFP128TypeInContext" pPCFP128TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMHalfType" halfType
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMFloatType" floatType
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMDoubleType" doubleType
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMX86FP80Type" x86FP80Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMFP128Type" fP128Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMPPCFP128Type" pPCFP128Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMFunctionType" functionType
+    :: TypeRef -> (Ptr TypeRef) -> CUInt -> LLVM.Bool -> IO TypeRef
+
+foreign import ccall unsafe "LLVMIsFunctionVarArg" isFunctionVarArg
+    :: TypeRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMGetReturnType" getReturnType
+    :: TypeRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMCountParamTypes" countParamTypes
+    :: TypeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetParamTypes" getParamTypes
+    :: TypeRef -> (Ptr TypeRef) -> IO ()
+
+foreign import ccall unsafe "LLVMStructTypeInContext" structTypeInContext
+    :: ContextRef -> (Ptr TypeRef) -> CUInt -> LLVM.Bool -> IO TypeRef
+
+foreign import ccall unsafe "LLVMStructType" structType
+    :: (Ptr TypeRef) -> CUInt -> LLVM.Bool -> IO TypeRef
+
+foreign import ccall unsafe "LLVMStructCreateNamed" structCreateNamed
+    :: ContextRef -> CString -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetStructName" getStructName
+    :: TypeRef -> IO CString
+
+foreign import ccall unsafe "LLVMStructSetBody" structSetBody
+    :: TypeRef -> (Ptr TypeRef) -> CUInt -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMCountStructElementTypes" countStructElementTypes
+    :: TypeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetStructElementTypes" getStructElementTypes
+    :: TypeRef -> (Ptr TypeRef) -> IO ()
+
+foreign import ccall unsafe "LLVMStructGetTypeAtIndex" structGetTypeAtIndex
+    :: TypeRef -> CUInt -> IO TypeRef
+
+foreign import ccall unsafe "LLVMIsPackedStruct" isPackedStruct
+    :: TypeRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMIsOpaqueStruct" isOpaqueStruct
+    :: TypeRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMGetElementType" getElementType
+    :: TypeRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetSubtypes" getSubtypes
+    :: TypeRef -> (Ptr TypeRef) -> IO ()
+
+foreign import ccall unsafe "LLVMGetNumContainedTypes" getNumContainedTypes
+    :: TypeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMArrayType" arrayType
+    :: TypeRef -> CUInt -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetArrayLength" getArrayLength
+    :: TypeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMPointerType" pointerType
+    :: TypeRef -> CUInt -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetPointerAddressSpace" getPointerAddressSpace
+    :: TypeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMVectorType" vectorType
+    :: TypeRef -> CUInt -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetVectorSize" getVectorSize
+    :: TypeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMVoidTypeInContext" voidTypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMLabelTypeInContext" labelTypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMX86MMXTypeInContext" x86MMXTypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMTokenTypeInContext" tokenTypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMMetadataTypeInContext" metadataTypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMVoidType" voidType
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMLabelType" labelType
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMX86MMXType" x86MMXType
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMTypeOf" typeOf
+    :: ValueRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetValueKind" getValueKind
+    :: ValueRef -> IO ValueKind
+
+foreign import ccall unsafe "LLVMGetValueName" getValueName
+    :: ValueRef -> IO CString
+
+foreign import ccall unsafe "LLVMSetValueName" setValueName
+    :: ValueRef -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMDumpValue" dumpValue
+    :: ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMPrintValueToString" printValueToString
+    :: ValueRef -> IO CString
+
+foreign import ccall unsafe "LLVMReplaceAllUsesWith" replaceAllUsesWith
+    :: ValueRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMIsConstant" isConstant
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMIsUndef" isUndef
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMIsAMDNode" isAMDNode
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMIsAMDString" isAMDString
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetFirstUse" getFirstUse
+    :: ValueRef -> IO UseRef
+
+foreign import ccall unsafe "LLVMGetNextUse" getNextUse
+    :: UseRef -> IO UseRef
+
+foreign import ccall unsafe "LLVMGetUser" getUser
+    :: UseRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetUsedValue" getUsedValue
+    :: UseRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetOperand" getOperand
+    :: ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetOperandUse" getOperandUse
+    :: ValueRef -> CUInt -> IO UseRef
+
+foreign import ccall unsafe "LLVMSetOperand" setOperand
+    :: ValueRef -> CUInt -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetNumOperands" getNumOperands
+    :: ValueRef -> IO CInt
+
+foreign import ccall unsafe "LLVMConstNull" constNull
+    :: TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstAllOnes" constAllOnes
+    :: TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetUndef" getUndef
+    :: TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMIsNull" isNull
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMConstPointerNull" constPointerNull
+    :: TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstInt" constInt
+    :: TypeRef -> CULLong -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstIntOfArbitraryPrecision" constIntOfArbitraryPrecision
+    :: TypeRef -> CUInt -> Ptr Word64 -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstIntOfString" constIntOfString
+    :: TypeRef -> CString -> Word8 -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstIntOfStringAndSize" constIntOfStringAndSize
+    :: TypeRef -> CString -> CUInt -> Word8 -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstReal" constReal
+    :: TypeRef -> CDouble -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstRealOfString" constRealOfString
+    :: TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstRealOfStringAndSize" constRealOfStringAndSize
+    :: TypeRef -> CString -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstIntGetZExtValue" constIntGetZExtValue
+    :: ValueRef -> IO CULLong
+
+foreign import ccall unsafe "LLVMConstIntGetSExtValue" constIntGetSExtValue
+    :: ValueRef -> IO CLLong
+
+foreign import ccall unsafe "LLVMConstRealGetDouble" constRealGetDouble
+    :: ValueRef -> (Ptr LLVM.Bool) -> IO CDouble
+
+foreign import ccall unsafe "LLVMConstStringInContext" constStringInContext
+    :: ContextRef -> CString -> CUInt -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstString" constString
+    :: CString -> CUInt -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMIsConstantString" isConstantString
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMGetAsString" getAsString
+    :: ValueRef -> (Ptr CSize) -> IO CString
+
+foreign import ccall unsafe "LLVMConstStructInContext" constStructInContext
+    :: ContextRef -> (Ptr ValueRef) -> CUInt -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstStruct" constStruct
+    :: (Ptr ValueRef) -> CUInt -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstArray" constArray
+    :: TypeRef -> (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNamedStruct" constNamedStruct
+    :: TypeRef -> (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetElementAsConstant" getElementAsConstant
+    :: ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstVector" constVector
+    :: (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetConstOpcode" getConstOpcode
+    :: ValueRef -> IO Opcode
+
+foreign import ccall unsafe "LLVMAlignOf" alignOf
+    :: TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSizeOf" sizeOf
+    :: TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNeg" constNeg
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNSWNeg" constNSWNeg
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNUWNeg" constNUWNeg
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFNeg" constFNeg
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNot" constNot
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstAdd" constAdd
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNSWAdd" constNSWAdd
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNUWAdd" constNUWAdd
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFAdd" constFAdd
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstSub" constSub
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNSWSub" constNSWSub
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNUWSub" constNUWSub
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFSub" constFSub
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstMul" constMul
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNSWMul" constNSWMul
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNUWMul" constNUWMul
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFMul" constFMul
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstUDiv" constUDiv
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstExactUDiv" constExactUDiv
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstSDiv" constSDiv
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstExactSDiv" constExactSDiv
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFDiv" constFDiv
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstURem" constURem
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstSRem" constSRem
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFRem" constFRem
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstAnd" constAnd
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstOr" constOr
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstXor" constXor
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstICmp" constICmp
+    :: IntPredicate -> ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFCmp" constFCmp
+    :: RealPredicate -> ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstShl" constShl
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstLShr" constLShr
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstAShr" constAShr
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstGEP" constGEP
+    :: ValueRef -> (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstInBoundsGEP" constInBoundsGEP
+    :: ValueRef -> (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstTrunc" constTrunc
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstSExt" constSExt
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstZExt" constZExt
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFPTrunc" constFPTrunc
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFPExt" constFPExt
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstUIToFP" constUIToFP
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstSIToFP" constSIToFP
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFPToUI" constFPToUI
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFPToSI" constFPToSI
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstPtrToInt" constPtrToInt
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstIntToPtr" constIntToPtr
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstBitCast" constBitCast
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstAddrSpaceCast" constAddrSpaceCast
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstZExtOrBitCast" constZExtOrBitCast
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstSExtOrBitCast" constSExtOrBitCast
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstTruncOrBitCast" constTruncOrBitCast
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstPointerCast" constPointerCast
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstIntCast" constIntCast
+    :: ValueRef -> TypeRef -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFPCast" constFPCast
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstSelect" constSelect
+    :: ValueRef -> ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstExtractElement" constExtractElement
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstInsertElement" constInsertElement
+    :: ValueRef -> ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstShuffleVector" constShuffleVector
+    :: ValueRef -> ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstExtractValue" constExtractValue
+    :: ValueRef -> (Ptr CUInt) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstInsertValue" constInsertValue
+    :: ValueRef -> ValueRef -> (Ptr CUInt) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstInlineAsm" constInlineAsm
+    :: TypeRef -> CString -> CString -> LLVM.Bool -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBlockAddress" blockAddress
+    :: ValueRef -> BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetGlobalParent" getGlobalParent
+    :: ValueRef -> IO ModuleRef
+
+foreign import ccall unsafe "LLVMIsDeclaration" isDeclaration
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMGetLinkage" getLinkage
+    :: ValueRef -> IO Linkage
+
+foreign import ccall unsafe "LLVMSetLinkage" setLinkage
+    :: ValueRef -> Linkage -> IO ()
+
+foreign import ccall unsafe "LLVMGetSection" getSection
+    :: ValueRef -> IO CString
+
+foreign import ccall unsafe "LLVMSetSection" setSection
+    :: ValueRef -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMGetVisibility" getVisibility
+    :: ValueRef -> IO Visibility
+
+foreign import ccall unsafe "LLVMSetVisibility" setVisibility
+    :: ValueRef -> Visibility -> IO ()
+
+foreign import ccall unsafe "LLVMGetDLLStorageClass" getDLLStorageClass
+    :: ValueRef -> IO DLLStorageClass
+
+foreign import ccall unsafe "LLVMSetDLLStorageClass" setDLLStorageClass
+    :: ValueRef -> DLLStorageClass -> IO ()
+
+foreign import ccall unsafe "LLVMHasUnnamedAddr" hasUnnamedAddr
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetUnnamedAddr" setUnnamedAddr
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMGetAlignment" getAlignment
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMSetAlignment" setAlignment
+    :: ValueRef -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMAddGlobal" addGlobal
+    :: ModuleRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMAddGlobalInAddressSpace" addGlobalInAddressSpace
+    :: ModuleRef -> TypeRef -> CString -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetNamedGlobal" getNamedGlobal
+    :: ModuleRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetFirstGlobal" getFirstGlobal
+    :: ModuleRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetLastGlobal" getLastGlobal
+    :: ModuleRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetNextGlobal" getNextGlobal
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetPreviousGlobal" getPreviousGlobal
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMDeleteGlobal" deleteGlobal
+    :: ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetInitializer" getInitializer
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSetInitializer" setInitializer
+    :: ValueRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMIsThreadLocal" isThreadLocal
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetThreadLocal" setThreadLocal
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMIsGlobalConstant" isGlobalConstant
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetGlobalConstant" setGlobalConstant
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMGetThreadLocalMode" getThreadLocalMode
+    :: ValueRef -> IO ThreadLocalMode
+
+foreign import ccall unsafe "LLVMSetThreadLocalMode" setThreadLocalMode
+    :: ValueRef -> ThreadLocalMode -> IO ()
+
+foreign import ccall unsafe "LLVMIsExternallyInitialized" isExternallyInitialized
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetExternallyInitialized" setExternallyInitialized
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMAddAlias" addAlias
+    :: ModuleRef -> TypeRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMDeleteFunction" deleteFunction
+    :: ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMHasPersonalityFn" hasPersonalityFn
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMGetPersonalityFn" getPersonalityFn
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSetPersonalityFn" setPersonalityFn
+    :: ValueRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetIntrinsicID" getIntrinsicID
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetFunctionCallConv" getFunctionCallConv
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMSetFunctionCallConv" setFunctionCallConv
+    :: ValueRef -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMGetGC" getGC
+    :: ValueRef -> IO CString
+
+foreign import ccall unsafe "LLVMSetGC" setGC
+    :: ValueRef -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMAddAttributeAtIndex" addAttributeAtIndex
+    :: ValueRef -> AttributeIndex -> AttributeRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetAttributeCountAtIndex" getAttributeCountAtIndex
+    :: ValueRef -> AttributeIndex -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetAttributesAtIndex" getAttributesAtIndex
+    :: ValueRef -> AttributeIndex -> (Ptr AttributeRef) -> IO ()
+
+foreign import ccall unsafe "LLVMGetEnumAttributeAtIndex" getEnumAttributeAtIndex
+    :: ValueRef -> AttributeIndex -> CUInt -> IO AttributeRef
+
+foreign import ccall unsafe "LLVMGetStringAttributeAtIndex" getStringAttributeAtIndex
+    :: ValueRef -> AttributeIndex -> CString -> CUInt -> IO AttributeRef
+
+foreign import ccall unsafe "LLVMRemoveEnumAttributeAtIndex" removeEnumAttributeAtIndex
+    :: ValueRef -> AttributeIndex -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMRemoveStringAttributeAtIndex" removeStringAttributeAtIndex
+    :: ValueRef -> AttributeIndex -> CString -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMAddTargetDependentFunctionAttr" addTargetDependentFunctionAttr
+    :: ValueRef -> CString -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMCountParams" countParams
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetParams" getParams
+    :: ValueRef -> (Ptr ValueRef) -> IO ()
+
+foreign import ccall unsafe "LLVMGetParam" getParam
+    :: ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetParamParent" getParamParent
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetFirstParam" getFirstParam
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetLastParam" getLastParam
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetNextParam" getNextParam
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetPreviousParam" getPreviousParam
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSetParamAlignment" setParamAlignment
+    :: ValueRef -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMMDStringInContext" mDStringInContext
+    :: ContextRef -> CString -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMMDString" mDString
+    :: CString -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMMDNodeInContext" mDNodeInContext
+    :: ContextRef -> (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMMDNode" mDNode
+    :: (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMMetadataAsValue" metadataAsValue
+    :: ContextRef -> MetadataRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMValueAsMetadata" valueAsMetadata
+    :: ValueRef -> IO MetadataRef
+
+foreign import ccall unsafe "LLVMGetMDString" getMDString
+    :: ValueRef -> (Ptr CUInt) -> IO CString
+
+foreign import ccall unsafe "LLVMGetMDNodeNumOperands" getMDNodeNumOperands
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetMDNodeOperands" getMDNodeOperands
+    :: ValueRef -> (Ptr ValueRef) -> IO ()
+
+foreign import ccall unsafe "LLVMBasicBlockAsValue" basicBlockAsValue
+    :: BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMValueIsBasicBlock" valueIsBasicBlock
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMValueAsBasicBlock" valueAsBasicBlock
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetBasicBlockName" getBasicBlockName
+    :: BasicBlockRef -> IO CString
+
+foreign import ccall unsafe "LLVMGetBasicBlockParent" getBasicBlockParent
+    :: BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetBasicBlockTerminator" getBasicBlockTerminator
+    :: BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMCountBasicBlocks" countBasicBlocks
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetBasicBlocks" getBasicBlocks
+    :: ValueRef -> (Ptr BasicBlockRef) -> IO ()
+
+foreign import ccall unsafe "LLVMGetFirstBasicBlock" getFirstBasicBlock
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetLastBasicBlock" getLastBasicBlock
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetNextBasicBlock" getNextBasicBlock
+    :: BasicBlockRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetPreviousBasicBlock" getPreviousBasicBlock
+    :: BasicBlockRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetEntryBasicBlock" getEntryBasicBlock
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMAppendBasicBlockInContext" appendBasicBlockInContext
+    :: ContextRef -> ValueRef -> CString -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMAppendBasicBlock" appendBasicBlock
+    :: ValueRef -> CString -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMInsertBasicBlockInContext" insertBasicBlockInContext
+    :: ContextRef -> BasicBlockRef -> CString -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMInsertBasicBlock" insertBasicBlock
+    :: BasicBlockRef -> CString -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMDeleteBasicBlock" deleteBasicBlock
+    :: BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMRemoveBasicBlockFromParent" removeBasicBlockFromParent
+    :: BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMMoveBasicBlockBefore" moveBasicBlockBefore
+    :: BasicBlockRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMMoveBasicBlockAfter" moveBasicBlockAfter
+    :: BasicBlockRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetFirstInstruction" getFirstInstruction
+    :: BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetLastInstruction" getLastInstruction
+    :: BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMHasMetadata" hasMetadata
+    :: ValueRef -> IO CInt
+
+foreign import ccall unsafe "LLVMGetMetadata" getMetadata
+    :: ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSetMetadata" setMetadata
+    :: ValueRef -> CUInt -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetInstructionParent" getInstructionParent
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetNextInstruction" getNextInstruction
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetPreviousInstruction" getPreviousInstruction
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMInstructionRemoveFromParent" instructionRemoveFromParent
+    :: ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMInstructionEraseFromParent" instructionEraseFromParent
+    :: ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetInstructionOpcode" getInstructionOpcode
+    :: ValueRef -> IO Opcode
+
+foreign import ccall unsafe "LLVMGetICmpPredicate" getICmpPredicate
+    :: ValueRef -> IO IntPredicate
+
+foreign import ccall unsafe "LLVMGetFCmpPredicate" getFCmpPredicate
+    :: ValueRef -> IO RealPredicate
+
+foreign import ccall unsafe "LLVMInstructionClone" instructionClone
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetNumArgOperands" getNumArgOperands
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMSetInstructionCallConv" setInstructionCallConv
+    :: ValueRef -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMGetInstructionCallConv" getInstructionCallConv
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMSetInstrParamAlignment" setInstrParamAlignment
+    :: ValueRef -> CUInt -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMAddCallSiteAttribute" addCallSiteAttribute
+    :: ValueRef -> AttributeIndex -> AttributeRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetCallSiteAttributeCount" getCallSiteAttributeCount
+    :: ValueRef -> AttributeIndex -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetCallSiteAttributes" getCallSiteAttributes
+    :: ValueRef -> AttributeIndex -> (Ptr AttributeRef) -> IO ()
+
+foreign import ccall unsafe "LLVMGetCallSiteEnumAttribute" getCallSiteEnumAttribute
+    :: ValueRef -> AttributeIndex -> CUInt -> IO AttributeRef
+
+foreign import ccall unsafe "LLVMGetCallSiteStringAttribute" getCallSiteStringAttribute
+    :: ValueRef -> AttributeIndex -> CString -> CUInt -> IO AttributeRef
+
+foreign import ccall unsafe "LLVMRemoveCallSiteEnumAttribute" removeCallSiteEnumAttribute
+    :: ValueRef -> AttributeIndex -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMRemoveCallSiteStringAttribute" removeCallSiteStringAttribute
+    :: ValueRef -> AttributeIndex -> CString -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMGetCalledValue" getCalledValue
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMIsTailCall" isTailCall
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetTailCall" setTailCall
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMGetNormalDest" getNormalDest
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetUnwindDest" getUnwindDest
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMSetNormalDest" setNormalDest
+    :: ValueRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMSetUnwindDest" setUnwindDest
+    :: ValueRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetNumSuccessors" getNumSuccessors
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetSuccessor" getSuccessor
+    :: ValueRef -> CUInt -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMSetSuccessor" setSuccessor
+    :: ValueRef -> CUInt -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMIsConditional" isConditional
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMGetCondition" getCondition
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSetCondition" setCondition
+    :: ValueRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetSwitchDefaultDest" getSwitchDefaultDest
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetAllocatedType" getAllocatedType
+    :: ValueRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMIsInBounds" isInBounds
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetIsInBounds" setIsInBounds
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMAddIncoming" addIncoming
+    :: ValueRef -> (Ptr ValueRef) -> (Ptr BasicBlockRef) -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMCountIncoming" countIncoming
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetIncomingValue" getIncomingValue
+    :: ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetIncomingBlock" getIncomingBlock
+    :: ValueRef -> CUInt -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetNumIndices" getNumIndices
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetIndices" getIndices
+    :: ValueRef -> IO (Ptr CUInt)
+
+foreign import ccall unsafe "LLVMCreateBuilderInContext" createBuilderInContext
+    :: ContextRef -> IO BuilderRef
+
+foreign import ccall unsafe "LLVMCreateBuilder" createBuilder
+    :: IO BuilderRef
+
+foreign import ccall unsafe "LLVMPositionBuilder" positionBuilder
+    :: BuilderRef -> BasicBlockRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMPositionBuilderBefore" positionBuilderBefore
+    :: BuilderRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMPositionBuilderAtEnd" positionBuilderAtEnd
+    :: BuilderRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetInsertBlock" getInsertBlock
+    :: BuilderRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMClearInsertionPosition" clearInsertionPosition
+    :: BuilderRef -> IO ()
+
+foreign import ccall unsafe "LLVMInsertIntoBuilder" insertIntoBuilder
+    :: BuilderRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMInsertIntoBuilderWithName" insertIntoBuilderWithName
+    :: BuilderRef -> ValueRef -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMDisposeBuilder" disposeBuilder
+    :: BuilderRef -> IO ()
+
+foreign import ccall unsafe "LLVMSetCurrentDebugLocation" setCurrentDebugLocation
+    :: BuilderRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetCurrentDebugLocation" getCurrentDebugLocation
+    :: BuilderRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSetInstDebugLocation" setInstDebugLocation
+    :: BuilderRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMBuildRetVoid" buildRetVoid
+    :: BuilderRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildRet" buildRet
+    :: BuilderRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildAggregateRet" buildAggregateRet
+    :: BuilderRef -> (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildBr" buildBr
+    :: BuilderRef -> BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildCondBr" buildCondBr
+    :: BuilderRef -> ValueRef -> BasicBlockRef -> BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSwitch" buildSwitch
+    :: BuilderRef -> ValueRef -> BasicBlockRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildIndirectBr" buildIndirectBr
+    :: BuilderRef -> ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildInvoke" buildInvoke
+    :: BuilderRef -> ValueRef -> (Ptr ValueRef) -> CUInt -> BasicBlockRef -> BasicBlockRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildLandingPad" buildLandingPad
+    :: BuilderRef -> TypeRef -> ValueRef -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildResume" buildResume
+    :: BuilderRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildUnreachable" buildUnreachable
+    :: BuilderRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMAddCase" addCase
+    :: ValueRef -> ValueRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMAddDestination" addDestination
+    :: ValueRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetNumClauses" getNumClauses
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetClause" getClause
+    :: ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMAddClause" addClause
+    :: ValueRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMIsCleanup" isCleanup
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetCleanup" setCleanup
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMBuildAdd" buildAdd
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNSWAdd" buildNSWAdd
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNUWAdd" buildNUWAdd
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFAdd" buildFAdd
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSub" buildSub
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNSWSub" buildNSWSub
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNUWSub" buildNUWSub
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFSub" buildFSub
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildMul" buildMul
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNSWMul" buildNSWMul
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNUWMul" buildNUWMul
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFMul" buildFMul
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildUDiv" buildUDiv
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildExactUDiv" buildExactUDiv
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSDiv" buildSDiv
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildExactSDiv" buildExactSDiv
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFDiv" buildFDiv
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildURem" buildURem
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSRem" buildSRem
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFRem" buildFRem
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildShl" buildShl
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildLShr" buildLShr
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildAShr" buildAShr
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildAnd" buildAnd
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildOr" buildOr
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildXor" buildXor
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildBinOp" buildBinOp
+    :: BuilderRef -> Opcode -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNeg" buildNeg
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNSWNeg" buildNSWNeg
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNUWNeg" buildNUWNeg
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFNeg" buildFNeg
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNot" buildNot
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildMalloc" buildMalloc
+    :: BuilderRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildArrayMalloc" buildArrayMalloc
+    :: BuilderRef -> TypeRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildAlloca" buildAlloca
+    :: BuilderRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildArrayAlloca" buildArrayAlloca
+    :: BuilderRef -> TypeRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFree" buildFree
+    :: BuilderRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildLoad" buildLoad
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildStore" buildStore
+    :: BuilderRef -> ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildGEP" buildGEP
+    :: BuilderRef -> ValueRef -> (Ptr ValueRef) -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildInBoundsGEP" buildInBoundsGEP
+    :: BuilderRef -> ValueRef -> (Ptr ValueRef) -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildStructGEP" buildStructGEP
+    :: BuilderRef -> ValueRef -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildGlobalString" buildGlobalString
+    :: BuilderRef -> CString -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildGlobalStringPtr" buildGlobalStringPtr
+    :: BuilderRef -> CString -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetVolatile" getVolatile
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetVolatile" setVolatile
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMGetOrdering" getOrdering
+    :: ValueRef -> IO AtomicOrdering
+
+foreign import ccall unsafe "LLVMSetOrdering" setOrdering
+    :: ValueRef -> AtomicOrdering -> IO ()
+
+foreign import ccall unsafe "LLVMBuildTrunc" buildTrunc
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildZExt" buildZExt
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSExt" buildSExt
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFPToUI" buildFPToUI
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFPToSI" buildFPToSI
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildUIToFP" buildUIToFP
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSIToFP" buildSIToFP
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFPTrunc" buildFPTrunc
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFPExt" buildFPExt
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildPtrToInt" buildPtrToInt
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildIntToPtr" buildIntToPtr
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildBitCast" buildBitCast
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildAddrSpaceCast" buildAddrSpaceCast
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildZExtOrBitCast" buildZExtOrBitCast
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSExtOrBitCast" buildSExtOrBitCast
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildTruncOrBitCast" buildTruncOrBitCast
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildCast" buildCast
+    :: BuilderRef -> Opcode -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildPointerCast" buildPointerCast
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFPCast" buildFPCast
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildICmp" buildICmp
+    :: BuilderRef -> IntPredicate -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFCmp" buildFCmp
+    :: BuilderRef -> RealPredicate -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildPhi" buildPhi
+    :: BuilderRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildCall" buildCall
+    :: BuilderRef -> ValueRef -> (Ptr ValueRef) -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSelect" buildSelect
+    :: BuilderRef -> ValueRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildVAArg" buildVAArg
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildExtractElement" buildExtractElement
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildInsertElement" buildInsertElement
+    :: BuilderRef -> ValueRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildShuffleVector" buildShuffleVector
+    :: BuilderRef -> ValueRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildExtractValue" buildExtractValue
+    :: BuilderRef -> ValueRef -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildInsertValue" buildInsertValue
+    :: BuilderRef -> ValueRef -> ValueRef -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildIsNull" buildIsNull
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildIsNotNull" buildIsNotNull
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildPtrDiff" buildPtrDiff
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFence" buildFence
+    :: BuilderRef -> AtomicOrdering -> LLVM.Bool -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildAtomicRMW" buildAtomicRMW
+    :: BuilderRef -> AtomicRMWBinOp -> ValueRef -> ValueRef -> AtomicOrdering -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildAtomicCmpXchg" buildAtomicCmpXchg
+    :: BuilderRef -> ValueRef -> ValueRef -> ValueRef -> AtomicOrdering -> AtomicOrdering -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMIsAtomicSingleThread" isAtomicSingleThread
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetAtomicSingleThread" setAtomicSingleThread
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMGetCmpXchgSuccessOrdering" getCmpXchgSuccessOrdering
+    :: ValueRef -> IO AtomicOrdering
+
+foreign import ccall unsafe "LLVMSetCmpXchgSuccessOrdering" setCmpXchgSuccessOrdering
+    :: ValueRef -> AtomicOrdering -> IO ()
+
+foreign import ccall unsafe "LLVMGetCmpXchgFailureOrdering" getCmpXchgFailureOrdering
+    :: ValueRef -> IO AtomicOrdering
+
+foreign import ccall unsafe "LLVMSetCmpXchgFailureOrdering" setCmpXchgFailureOrdering
+    :: ValueRef -> AtomicOrdering -> IO ()
+
+foreign import ccall unsafe "LLVMCreateModuleProviderForExistingModule" createModuleProviderForExistingModule
+    :: ModuleRef -> IO ModuleProviderRef
+
+foreign import ccall unsafe "LLVMDisposeModuleProvider" disposeModuleProvider
+    :: ModuleProviderRef -> IO ()
+
+foreign import ccall unsafe "LLVMCreateMemoryBufferWithContentsOfFile" createMemoryBufferWithContentsOfFile
+    :: CString -> (Ptr MemoryBufferRef) -> (Ptr CString) -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMCreateMemoryBufferWithSTDIN" createMemoryBufferWithSTDIN
+    :: (Ptr MemoryBufferRef) -> (Ptr CString) -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMCreateMemoryBufferWithMemoryRange" createMemoryBufferWithMemoryRange
+    :: CString -> CSize -> CString -> LLVM.Bool -> IO MemoryBufferRef
+
+foreign import ccall unsafe "LLVMCreateMemoryBufferWithMemoryRangeCopy" createMemoryBufferWithMemoryRangeCopy
+    :: CString -> CSize -> CString -> IO MemoryBufferRef
+
+foreign import ccall unsafe "LLVMGetBufferStart" getBufferStart
+    :: MemoryBufferRef -> IO CString
+
+foreign import ccall unsafe "LLVMGetBufferSize" getBufferSize
+    :: MemoryBufferRef -> IO CSize
+
+foreign import ccall unsafe "LLVMDisposeMemoryBuffer" disposeMemoryBuffer
+    :: MemoryBufferRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetGlobalPassRegistry" getGlobalPassRegistry
+    :: IO PassRegistryRef
+
+foreign import ccall unsafe "LLVMCreatePassManager" createPassManager
+    :: IO PassManagerRef
+
+foreign import ccall unsafe "LLVMCreateFunctionPassManagerForModule" createFunctionPassManagerForModule
+    :: ModuleRef -> IO PassManagerRef
+
+foreign import ccall unsafe "LLVMCreateFunctionPassManager" createFunctionPassManager
+    :: ModuleProviderRef -> IO PassManagerRef
+
+foreign import ccall unsafe "LLVMRunPassManager" runPassManager
+    :: PassManagerRef -> ModuleRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMInitializeFunctionPassManager" initializeFunctionPassManager
+    :: PassManagerRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMRunFunctionPassManager" runFunctionPassManager
+    :: PassManagerRef -> ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMFinalizeFunctionPassManager" finalizeFunctionPassManager
+    :: PassManagerRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMDisposePassManager" disposePassManager
+    :: PassManagerRef -> IO ()
+
+foreign import ccall unsafe "LLVMStartMultithreaded" startMultithreaded
+    :: IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMStopMultithreaded" stopMultithreaded
+    :: IO ()
+
+foreign import ccall unsafe "LLVMIsMultithreaded" isMultithreaded
+    :: IO LLVM.Bool
diff --git a/src/7/LLVM/Raw/Core.hsc b/src/7/LLVM/Raw/Core.hsc
new file mode 100644
--- /dev/null
+++ b/src/7/LLVM/Raw/Core.hsc
@@ -0,0 +1,1744 @@
+{-# LANGUAGE Safe #-}
+{-# LANGUAGE ForeignFunctionInterface #-}
+{-# LANGUAGE EmptyDataDecls #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+module LLVM.Raw.Core where
+
+import qualified LLVM.FFI.Base as LLVM
+
+import qualified Foreign.C.Types as C
+import Foreign.C.String (CString)
+import Foreign.Ptr (Ptr, FunPtr)
+
+import Data.Typeable (Typeable)
+
+import Data.Word (Word8, Word32, Word64)
+
+
+type CDouble  = C.CDouble
+type CInt     = C.CInt
+type CUInt    = C.CUInt
+type CLLong   = C.CLLong
+type CULLong  = C.CULLong
+type CSize    = C.CSize
+
+
+#include <llvm/Config/llvm-config.h>
+#include <llvm-c/Core.h>
+
+
+data Module
+    deriving (Typeable)
+type ModuleRef = Ptr Module
+
+data ModuleProvider
+    deriving (Typeable)
+type ModuleProviderRef = Ptr ModuleProvider
+
+data Type
+    deriving (Typeable)
+type TypeRef = Ptr Type
+
+data BasicBlock
+    deriving (Typeable)
+type BasicBlockRef = Ptr BasicBlock
+
+data Value
+    deriving (Typeable)
+type ValueRef = Ptr Value
+
+data OpaqueUse
+    deriving (Typeable)
+type UseRef = Ptr OpaqueUse
+
+data Builder
+    deriving (Typeable)
+type BuilderRef = Ptr Builder
+
+data MemoryBuffer
+    deriving (Typeable)
+type MemoryBufferRef = Ptr MemoryBuffer
+
+data PassManager
+    deriving (Typeable)
+type PassManagerRef = Ptr PassManager
+
+data PassRegistry
+    deriving (Typeable)
+type PassRegistryRef = Ptr PassRegistry
+
+data Context
+    deriving (Typeable)
+type ContextRef = Ptr Context
+
+{-
+data Attribute
+    deriving (Typeable)
+-}
+-- until 3.9
+newtype Attribute = Attribute Word32
+type AttributeRef = Ptr Attribute
+
+newtype AttributeIndex = AttributeIndex #{type LLVMAttributeIndex}
+
+attributeReturnIndex, attributeFunctionIndex :: AttributeIndex
+attributeReturnIndex   = AttributeIndex (#const LLVMAttributeReturnIndex)
+attributeFunctionIndex = AttributeIndex (#const LLVMAttributeFunctionIndex)
+
+
+data Metadata
+    deriving (Typeable)
+type MetadataRef = Ptr Metadata
+
+data DiagnosticInfo
+    deriving (Typeable)
+type DiagnosticInfoRef = Ptr DiagnosticInfo
+
+data NamedMDNode
+    deriving (Typeable)
+type NamedMDNodeRef = Ptr NamedMDNode
+
+
+data ModuleFlagEntry
+    deriving (Typeable)
+data ValueMetadataEntry
+    deriving (Typeable)
+
+type DiagnosticHandler = FunPtr (DiagnosticInfoRef -> Ptr () -> IO ())
+type YieldCallback = FunPtr (ContextRef -> Ptr () -> IO ())
+
+newtype CallingConvention = CallingConvention {unCallingConvention :: CUInt}
+
+newtype AtomicOrdering = AtomicOrdering #{type LLVMAtomicOrdering}
+newtype AtomicRMWBinOp = AtomicRMWBinOp #{type LLVMAtomicRMWBinOp}
+newtype DiagnosticSeverity = DiagnosticSeverity #{type LLVMDiagnosticSeverity}
+newtype DLLStorageClass = DLLStorageClass #{type LLVMDLLStorageClass}
+-- newtype InlineAsmDialect = InlineAsmDialect #{type LLVMInlineAsmDialect}
+newtype InlineAsmDialect = InlineAsmDialect Word32
+newtype IntPredicate = IntPredicate #{type LLVMIntPredicate}
+newtype Linkage = Linkage #{type LLVMLinkage}
+-- newtype ModuleFlagBehavior = ModuleFlagBehavior #{type LLVMModuleFlagBehavior}
+newtype ModuleFlagBehavior = ModuleFlagBehavior Word32
+newtype Opcode = Opcode #{type LLVMOpcode}
+newtype RealPredicate = RealPredicate #{type LLVMRealPredicate}
+newtype ThreadLocalMode = ThreadLocalMode #{type LLVMThreadLocalMode}
+newtype TypeKind = TypeKind {unTypeKind :: #{type LLVMTypeKind}}
+-- newtype UnnamedAddr = UnnamedAddr #{type LLVMUnnamedAddr}
+newtype UnnamedAddr = UnnamedAddr Word32
+newtype ValueKind = ValueKind #{type LLVMValueKind}
+newtype Visibility = Visibility #{type LLVMVisibility}
+
+
+foreign import ccall unsafe "LLVMInitializeCore" initializeCore
+    :: PassRegistryRef -> IO ()
+
+foreign import ccall unsafe "LLVMShutdown" shutdown
+    :: IO ()
+
+foreign import ccall unsafe "LLVMCreateMessage" createMessage
+    :: CString -> IO CString
+
+foreign import ccall unsafe "LLVMDisposeMessage" disposeMessage
+    :: CString -> IO ()
+
+foreign import ccall unsafe "LLVMContextCreate" contextCreate
+    :: IO ContextRef
+
+foreign import ccall unsafe "LLVMGetGlobalContext" getGlobalContext
+    :: IO ContextRef
+
+foreign import ccall unsafe "LLVMContextSetDiagnosticHandler" contextSetDiagnosticHandler
+    :: ContextRef -> DiagnosticHandler -> (Ptr ()) -> IO ()
+
+foreign import ccall unsafe "LLVMContextGetDiagnosticHandler" contextGetDiagnosticHandler
+    :: ContextRef -> IO DiagnosticHandler
+
+foreign import ccall unsafe "LLVMContextGetDiagnosticContext" contextGetDiagnosticContext
+    :: ContextRef -> IO (Ptr ())
+
+foreign import ccall unsafe "LLVMContextSetYieldCallback" contextSetYieldCallback
+    :: ContextRef -> YieldCallback -> (Ptr ()) -> IO ()
+
+foreign import ccall unsafe "LLVMContextDispose" contextDispose
+    :: ContextRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetDiagInfoDescription" getDiagInfoDescription
+    :: DiagnosticInfoRef -> IO CString
+
+foreign import ccall unsafe "LLVMGetDiagInfoSeverity" getDiagInfoSeverity
+    :: DiagnosticInfoRef -> IO DiagnosticSeverity
+
+foreign import ccall unsafe "LLVMGetMDKindIDInContext" getMDKindIDInContext
+    :: ContextRef -> CString -> CUInt -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetMDKindID" getMDKindID
+    :: CString -> CUInt -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetEnumAttributeKindForName" getEnumAttributeKindForName
+    :: CString -> CSize -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetLastEnumAttributeKind" getLastEnumAttributeKind
+    :: IO CUInt
+
+foreign import ccall unsafe "LLVMCreateEnumAttribute" createEnumAttribute
+    :: ContextRef -> CUInt -> Word64 -> IO AttributeRef
+
+foreign import ccall unsafe "LLVMGetEnumAttributeKind" getEnumAttributeKind
+    :: AttributeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetEnumAttributeValue" getEnumAttributeValue
+    :: AttributeRef -> IO Word64
+
+foreign import ccall unsafe "LLVMCreateStringAttribute" createStringAttribute
+    :: ContextRef -> CString -> CUInt -> CString -> CUInt -> IO AttributeRef
+
+foreign import ccall unsafe "LLVMGetStringAttributeKind" getStringAttributeKind
+    :: AttributeRef -> (Ptr CUInt) -> IO CString
+
+foreign import ccall unsafe "LLVMGetStringAttributeValue" getStringAttributeValue
+    :: AttributeRef -> (Ptr CUInt) -> IO CString
+
+foreign import ccall unsafe "LLVMIsEnumAttribute" isEnumAttribute
+    :: AttributeRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMIsStringAttribute" isStringAttribute
+    :: AttributeRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMModuleCreateWithName" moduleCreateWithName
+    :: CString -> IO ModuleRef
+
+foreign import ccall unsafe "LLVMModuleCreateWithNameInContext" moduleCreateWithNameInContext
+    :: CString -> ContextRef -> IO ModuleRef
+
+foreign import ccall unsafe "LLVMCloneModule" cloneModule
+    :: ModuleRef -> IO ModuleRef
+
+foreign import ccall unsafe "LLVMDisposeModule" disposeModule
+    :: ModuleRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetModuleIdentifier" getModuleIdentifier
+    :: ModuleRef -> (Ptr CSize) -> IO CString
+
+foreign import ccall unsafe "LLVMSetModuleIdentifier" setModuleIdentifier
+    :: ModuleRef -> CString -> CSize -> IO ()
+
+foreign import ccall unsafe "LLVMGetSourceFileName" getSourceFileName
+    :: ModuleRef -> (Ptr CSize) -> IO CString
+
+foreign import ccall unsafe "LLVMSetSourceFileName" setSourceFileName
+    :: ModuleRef -> CString -> CSize -> IO ()
+
+foreign import ccall unsafe "LLVMGetDataLayoutStr" getDataLayoutStr
+    :: ModuleRef -> IO CString
+
+foreign import ccall unsafe "LLVMGetDataLayout" getDataLayout
+    :: ModuleRef -> IO CString
+
+foreign import ccall unsafe "LLVMSetDataLayout" setDataLayout
+    :: ModuleRef -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMGetTarget" getTarget
+    :: ModuleRef -> IO CString
+
+foreign import ccall unsafe "LLVMSetTarget" setTarget
+    :: ModuleRef -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMCopyModuleFlagsMetadata" copyModuleFlagsMetadata
+    :: ModuleRef -> (Ptr CSize) -> IO (Ptr ModuleFlagEntry)
+
+foreign import ccall unsafe "LLVMDisposeModuleFlagsMetadata" disposeModuleFlagsMetadata
+    :: (Ptr ModuleFlagEntry) -> IO ()
+
+foreign import ccall unsafe "LLVMModuleFlagEntriesGetFlagBehavior" moduleFlagEntriesGetFlagBehavior
+    :: (Ptr ModuleFlagEntry) -> CUInt -> IO ModuleFlagBehavior
+
+foreign import ccall unsafe "LLVMModuleFlagEntriesGetKey" moduleFlagEntriesGetKey
+    :: (Ptr ModuleFlagEntry) -> CUInt -> (Ptr CSize) -> IO CString
+
+foreign import ccall unsafe "LLVMModuleFlagEntriesGetMetadata" moduleFlagEntriesGetMetadata
+    :: (Ptr ModuleFlagEntry) -> CUInt -> IO MetadataRef
+
+foreign import ccall unsafe "LLVMGetModuleFlag" getModuleFlag
+    :: ModuleRef -> CString -> CSize -> IO MetadataRef
+
+foreign import ccall unsafe "LLVMAddModuleFlag" addModuleFlag
+    :: ModuleRef -> ModuleFlagBehavior -> CString -> CSize -> MetadataRef -> IO ()
+
+foreign import ccall unsafe "LLVMDumpModule" dumpModule
+    :: ModuleRef -> IO ()
+
+foreign import ccall unsafe "LLVMPrintModuleToFile" printModuleToFile
+    :: ModuleRef -> CString -> (Ptr CString) -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMPrintModuleToString" printModuleToString
+    :: ModuleRef -> IO CString
+
+foreign import ccall unsafe "LLVMGetModuleInlineAsm" getModuleInlineAsm
+    :: ModuleRef -> (Ptr CSize) -> IO CString
+
+foreign import ccall unsafe "LLVMSetModuleInlineAsm2" setModuleInlineAsm2
+    :: ModuleRef -> CString -> CSize -> IO ()
+
+foreign import ccall unsafe "LLVMAppendModuleInlineAsm" appendModuleInlineAsm
+    :: ModuleRef -> CString -> CSize -> IO ()
+
+foreign import ccall unsafe "LLVMGetInlineAsm" getInlineAsm
+    :: TypeRef -> CString -> CSize -> CString -> CSize -> LLVM.Bool -> LLVM.Bool -> InlineAsmDialect -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetModuleContext" getModuleContext
+    :: ModuleRef -> IO ContextRef
+
+foreign import ccall unsafe "LLVMGetTypeByName" getTypeByName
+    :: ModuleRef -> CString -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetNamedMetadataNumOperands" getNamedMetadataNumOperands
+    :: ModuleRef -> CString -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetNamedMetadataOperands" getNamedMetadataOperands
+    :: ModuleRef -> CString -> (Ptr ValueRef) -> IO ()
+
+foreign import ccall unsafe "LLVMAddNamedMetadataOperand" addNamedMetadataOperand
+    :: ModuleRef -> CString -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMAddFunction" addFunction
+    :: ModuleRef -> CString -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetNamedFunction" getNamedFunction
+    :: ModuleRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetFirstFunction" getFirstFunction
+    :: ModuleRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetLastFunction" getLastFunction
+    :: ModuleRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetNextFunction" getNextFunction
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetPreviousFunction" getPreviousFunction
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSetModuleInlineAsm" setModuleInlineAsm
+    :: ModuleRef -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMGetTypeKind" getTypeKind
+    :: TypeRef -> IO TypeKind
+
+foreign import ccall unsafe "LLVMTypeIsSized" typeIsSized
+    :: TypeRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMGetTypeContext" getTypeContext
+    :: TypeRef -> IO ContextRef
+
+foreign import ccall unsafe "LLVMPrintTypeToString" printTypeToString
+    :: TypeRef -> IO CString
+
+foreign import ccall unsafe "LLVMInt1TypeInContext" int1TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMInt8TypeInContext" int8TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMInt16TypeInContext" int16TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMInt32TypeInContext" int32TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMInt64TypeInContext" int64TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMInt128TypeInContext" int128TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMIntTypeInContext" intTypeInContext
+    :: ContextRef -> CUInt -> IO TypeRef
+
+foreign import ccall unsafe "LLVMInt1Type" int1Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMInt8Type" int8Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMInt16Type" int16Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMInt32Type" int32Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMInt64Type" int64Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMInt128Type" int128Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMIntType" intType
+    :: CUInt -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetIntTypeWidth" getIntTypeWidth
+    :: TypeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMHalfTypeInContext" halfTypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMFloatTypeInContext" floatTypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMDoubleTypeInContext" doubleTypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMX86FP80TypeInContext" x86FP80TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMFP128TypeInContext" fP128TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMPPCFP128TypeInContext" pPCFP128TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMHalfType" halfType
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMFloatType" floatType
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMDoubleType" doubleType
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMX86FP80Type" x86FP80Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMFP128Type" fP128Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMPPCFP128Type" pPCFP128Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMFunctionType" functionType
+    :: TypeRef -> (Ptr TypeRef) -> CUInt -> LLVM.Bool -> IO TypeRef
+
+foreign import ccall unsafe "LLVMIsFunctionVarArg" isFunctionVarArg
+    :: TypeRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMGetReturnType" getReturnType
+    :: TypeRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMCountParamTypes" countParamTypes
+    :: TypeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetParamTypes" getParamTypes
+    :: TypeRef -> (Ptr TypeRef) -> IO ()
+
+foreign import ccall unsafe "LLVMStructTypeInContext" structTypeInContext
+    :: ContextRef -> (Ptr TypeRef) -> CUInt -> LLVM.Bool -> IO TypeRef
+
+foreign import ccall unsafe "LLVMStructType" structType
+    :: (Ptr TypeRef) -> CUInt -> LLVM.Bool -> IO TypeRef
+
+foreign import ccall unsafe "LLVMStructCreateNamed" structCreateNamed
+    :: ContextRef -> CString -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetStructName" getStructName
+    :: TypeRef -> IO CString
+
+foreign import ccall unsafe "LLVMStructSetBody" structSetBody
+    :: TypeRef -> (Ptr TypeRef) -> CUInt -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMCountStructElementTypes" countStructElementTypes
+    :: TypeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetStructElementTypes" getStructElementTypes
+    :: TypeRef -> (Ptr TypeRef) -> IO ()
+
+foreign import ccall unsafe "LLVMStructGetTypeAtIndex" structGetTypeAtIndex
+    :: TypeRef -> CUInt -> IO TypeRef
+
+foreign import ccall unsafe "LLVMIsPackedStruct" isPackedStruct
+    :: TypeRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMIsOpaqueStruct" isOpaqueStruct
+    :: TypeRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMGetElementType" getElementType
+    :: TypeRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetSubtypes" getSubtypes
+    :: TypeRef -> (Ptr TypeRef) -> IO ()
+
+foreign import ccall unsafe "LLVMGetNumContainedTypes" getNumContainedTypes
+    :: TypeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMArrayType" arrayType
+    :: TypeRef -> CUInt -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetArrayLength" getArrayLength
+    :: TypeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMPointerType" pointerType
+    :: TypeRef -> CUInt -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetPointerAddressSpace" getPointerAddressSpace
+    :: TypeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMVectorType" vectorType
+    :: TypeRef -> CUInt -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetVectorSize" getVectorSize
+    :: TypeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMVoidTypeInContext" voidTypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMLabelTypeInContext" labelTypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMX86MMXTypeInContext" x86MMXTypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMTokenTypeInContext" tokenTypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMMetadataTypeInContext" metadataTypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMVoidType" voidType
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMLabelType" labelType
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMX86MMXType" x86MMXType
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMTypeOf" typeOf
+    :: ValueRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetValueKind" getValueKind
+    :: ValueRef -> IO ValueKind
+
+foreign import ccall unsafe "LLVMGetValueName2" getValueName2
+    :: ValueRef -> (Ptr CSize) -> IO CString
+
+foreign import ccall unsafe "LLVMSetValueName2" setValueName2
+    :: ValueRef -> CString -> CSize -> IO ()
+
+foreign import ccall unsafe "LLVMDumpValue" dumpValue
+    :: ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMPrintValueToString" printValueToString
+    :: ValueRef -> IO CString
+
+foreign import ccall unsafe "LLVMReplaceAllUsesWith" replaceAllUsesWith
+    :: ValueRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMIsConstant" isConstant
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMIsUndef" isUndef
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMIsAMDNode" isAMDNode
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMIsAMDString" isAMDString
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetValueName" getValueName
+    :: ValueRef -> IO CString
+
+foreign import ccall unsafe "LLVMSetValueName" setValueName
+    :: ValueRef -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMGetFirstUse" getFirstUse
+    :: ValueRef -> IO UseRef
+
+foreign import ccall unsafe "LLVMGetNextUse" getNextUse
+    :: UseRef -> IO UseRef
+
+foreign import ccall unsafe "LLVMGetUser" getUser
+    :: UseRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetUsedValue" getUsedValue
+    :: UseRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetOperand" getOperand
+    :: ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetOperandUse" getOperandUse
+    :: ValueRef -> CUInt -> IO UseRef
+
+foreign import ccall unsafe "LLVMSetOperand" setOperand
+    :: ValueRef -> CUInt -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetNumOperands" getNumOperands
+    :: ValueRef -> IO CInt
+
+foreign import ccall unsafe "LLVMConstNull" constNull
+    :: TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstAllOnes" constAllOnes
+    :: TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetUndef" getUndef
+    :: TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMIsNull" isNull
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMConstPointerNull" constPointerNull
+    :: TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstInt" constInt
+    :: TypeRef -> CULLong -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstIntOfArbitraryPrecision" constIntOfArbitraryPrecision
+    :: TypeRef -> CUInt -> Ptr Word64 -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstIntOfString" constIntOfString
+    :: TypeRef -> CString -> Word8 -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstIntOfStringAndSize" constIntOfStringAndSize
+    :: TypeRef -> CString -> CUInt -> Word8 -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstReal" constReal
+    :: TypeRef -> CDouble -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstRealOfString" constRealOfString
+    :: TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstRealOfStringAndSize" constRealOfStringAndSize
+    :: TypeRef -> CString -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstIntGetZExtValue" constIntGetZExtValue
+    :: ValueRef -> IO CULLong
+
+foreign import ccall unsafe "LLVMConstIntGetSExtValue" constIntGetSExtValue
+    :: ValueRef -> IO CLLong
+
+foreign import ccall unsafe "LLVMConstRealGetDouble" constRealGetDouble
+    :: ValueRef -> (Ptr LLVM.Bool) -> IO CDouble
+
+foreign import ccall unsafe "LLVMConstStringInContext" constStringInContext
+    :: ContextRef -> CString -> CUInt -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstString" constString
+    :: CString -> CUInt -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMIsConstantString" isConstantString
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMGetAsString" getAsString
+    :: ValueRef -> (Ptr CSize) -> IO CString
+
+foreign import ccall unsafe "LLVMConstStructInContext" constStructInContext
+    :: ContextRef -> (Ptr ValueRef) -> CUInt -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstStruct" constStruct
+    :: (Ptr ValueRef) -> CUInt -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstArray" constArray
+    :: TypeRef -> (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNamedStruct" constNamedStruct
+    :: TypeRef -> (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetElementAsConstant" getElementAsConstant
+    :: ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstVector" constVector
+    :: (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetConstOpcode" getConstOpcode
+    :: ValueRef -> IO Opcode
+
+foreign import ccall unsafe "LLVMAlignOf" alignOf
+    :: TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSizeOf" sizeOf
+    :: TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNeg" constNeg
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNSWNeg" constNSWNeg
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNUWNeg" constNUWNeg
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFNeg" constFNeg
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNot" constNot
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstAdd" constAdd
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNSWAdd" constNSWAdd
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNUWAdd" constNUWAdd
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFAdd" constFAdd
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstSub" constSub
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNSWSub" constNSWSub
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNUWSub" constNUWSub
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFSub" constFSub
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstMul" constMul
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNSWMul" constNSWMul
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNUWMul" constNUWMul
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFMul" constFMul
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstUDiv" constUDiv
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstExactUDiv" constExactUDiv
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstSDiv" constSDiv
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstExactSDiv" constExactSDiv
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFDiv" constFDiv
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstURem" constURem
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstSRem" constSRem
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFRem" constFRem
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstAnd" constAnd
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstOr" constOr
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstXor" constXor
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstICmp" constICmp
+    :: IntPredicate -> ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFCmp" constFCmp
+    :: RealPredicate -> ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstShl" constShl
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstLShr" constLShr
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstAShr" constAShr
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstGEP" constGEP
+    :: ValueRef -> (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstInBoundsGEP" constInBoundsGEP
+    :: ValueRef -> (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstTrunc" constTrunc
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstSExt" constSExt
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstZExt" constZExt
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFPTrunc" constFPTrunc
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFPExt" constFPExt
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstUIToFP" constUIToFP
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstSIToFP" constSIToFP
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFPToUI" constFPToUI
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFPToSI" constFPToSI
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstPtrToInt" constPtrToInt
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstIntToPtr" constIntToPtr
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstBitCast" constBitCast
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstAddrSpaceCast" constAddrSpaceCast
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstZExtOrBitCast" constZExtOrBitCast
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstSExtOrBitCast" constSExtOrBitCast
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstTruncOrBitCast" constTruncOrBitCast
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstPointerCast" constPointerCast
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstIntCast" constIntCast
+    :: ValueRef -> TypeRef -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFPCast" constFPCast
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstSelect" constSelect
+    :: ValueRef -> ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstExtractElement" constExtractElement
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstInsertElement" constInsertElement
+    :: ValueRef -> ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstShuffleVector" constShuffleVector
+    :: ValueRef -> ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstExtractValue" constExtractValue
+    :: ValueRef -> (Ptr CUInt) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstInsertValue" constInsertValue
+    :: ValueRef -> ValueRef -> (Ptr CUInt) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBlockAddress" blockAddress
+    :: ValueRef -> BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstInlineAsm" constInlineAsm
+    :: TypeRef -> CString -> CString -> LLVM.Bool -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetGlobalParent" getGlobalParent
+    :: ValueRef -> IO ModuleRef
+
+foreign import ccall unsafe "LLVMIsDeclaration" isDeclaration
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMGetLinkage" getLinkage
+    :: ValueRef -> IO Linkage
+
+foreign import ccall unsafe "LLVMSetLinkage" setLinkage
+    :: ValueRef -> Linkage -> IO ()
+
+foreign import ccall unsafe "LLVMGetSection" getSection
+    :: ValueRef -> IO CString
+
+foreign import ccall unsafe "LLVMSetSection" setSection
+    :: ValueRef -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMGetVisibility" getVisibility
+    :: ValueRef -> IO Visibility
+
+foreign import ccall unsafe "LLVMSetVisibility" setVisibility
+    :: ValueRef -> Visibility -> IO ()
+
+foreign import ccall unsafe "LLVMGetDLLStorageClass" getDLLStorageClass
+    :: ValueRef -> IO DLLStorageClass
+
+foreign import ccall unsafe "LLVMSetDLLStorageClass" setDLLStorageClass
+    :: ValueRef -> DLLStorageClass -> IO ()
+
+foreign import ccall unsafe "LLVMGetUnnamedAddress" getUnnamedAddress
+    :: ValueRef -> IO UnnamedAddr
+
+foreign import ccall unsafe "LLVMSetUnnamedAddress" setUnnamedAddress
+    :: ValueRef -> UnnamedAddr -> IO ()
+
+foreign import ccall unsafe "LLVMHasUnnamedAddr" hasUnnamedAddr
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetUnnamedAddr" setUnnamedAddr
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMGetAlignment" getAlignment
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMSetAlignment" setAlignment
+    :: ValueRef -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMAddGlobal" addGlobal
+    :: ModuleRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMAddGlobalInAddressSpace" addGlobalInAddressSpace
+    :: ModuleRef -> TypeRef -> CString -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetNamedGlobal" getNamedGlobal
+    :: ModuleRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetFirstGlobal" getFirstGlobal
+    :: ModuleRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetLastGlobal" getLastGlobal
+    :: ModuleRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetNextGlobal" getNextGlobal
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetPreviousGlobal" getPreviousGlobal
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMDeleteGlobal" deleteGlobal
+    :: ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetInitializer" getInitializer
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSetInitializer" setInitializer
+    :: ValueRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMIsThreadLocal" isThreadLocal
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetThreadLocal" setThreadLocal
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMIsGlobalConstant" isGlobalConstant
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetGlobalConstant" setGlobalConstant
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMGetThreadLocalMode" getThreadLocalMode
+    :: ValueRef -> IO ThreadLocalMode
+
+foreign import ccall unsafe "LLVMSetThreadLocalMode" setThreadLocalMode
+    :: ValueRef -> ThreadLocalMode -> IO ()
+
+foreign import ccall unsafe "LLVMIsExternallyInitialized" isExternallyInitialized
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetExternallyInitialized" setExternallyInitialized
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMAddAlias" addAlias
+    :: ModuleRef -> TypeRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetNamedGlobalAlias" getNamedGlobalAlias
+    :: ModuleRef -> CString -> CSize -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetFirstGlobalAlias" getFirstGlobalAlias
+    :: ModuleRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetLastGlobalAlias" getLastGlobalAlias
+    :: ModuleRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetNextGlobalAlias" getNextGlobalAlias
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetPreviousGlobalAlias" getPreviousGlobalAlias
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMAliasGetAliasee" aliasGetAliasee
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMAliasSetAliasee" aliasSetAliasee
+    :: ValueRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMDeleteFunction" deleteFunction
+    :: ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMHasPersonalityFn" hasPersonalityFn
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMGetPersonalityFn" getPersonalityFn
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSetPersonalityFn" setPersonalityFn
+    :: ValueRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetIntrinsicID" getIntrinsicID
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetFunctionCallConv" getFunctionCallConv
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMSetFunctionCallConv" setFunctionCallConv
+    :: ValueRef -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMGetGC" getGC
+    :: ValueRef -> IO CString
+
+foreign import ccall unsafe "LLVMSetGC" setGC
+    :: ValueRef -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMAddAttributeAtIndex" addAttributeAtIndex
+    :: ValueRef -> AttributeIndex -> AttributeRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetAttributeCountAtIndex" getAttributeCountAtIndex
+    :: ValueRef -> AttributeIndex -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetAttributesAtIndex" getAttributesAtIndex
+    :: ValueRef -> AttributeIndex -> (Ptr AttributeRef) -> IO ()
+
+foreign import ccall unsafe "LLVMGetEnumAttributeAtIndex" getEnumAttributeAtIndex
+    :: ValueRef -> AttributeIndex -> CUInt -> IO AttributeRef
+
+foreign import ccall unsafe "LLVMGetStringAttributeAtIndex" getStringAttributeAtIndex
+    :: ValueRef -> AttributeIndex -> CString -> CUInt -> IO AttributeRef
+
+foreign import ccall unsafe "LLVMRemoveEnumAttributeAtIndex" removeEnumAttributeAtIndex
+    :: ValueRef -> AttributeIndex -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMRemoveStringAttributeAtIndex" removeStringAttributeAtIndex
+    :: ValueRef -> AttributeIndex -> CString -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMAddTargetDependentFunctionAttr" addTargetDependentFunctionAttr
+    :: ValueRef -> CString -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMCountParams" countParams
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetParams" getParams
+    :: ValueRef -> (Ptr ValueRef) -> IO ()
+
+foreign import ccall unsafe "LLVMGetParam" getParam
+    :: ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetParamParent" getParamParent
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetFirstParam" getFirstParam
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetLastParam" getLastParam
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetNextParam" getNextParam
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetPreviousParam" getPreviousParam
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSetParamAlignment" setParamAlignment
+    :: ValueRef -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMMDStringInContext" mDStringInContext
+    :: ContextRef -> CString -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMMDString" mDString
+    :: CString -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMMDNodeInContext" mDNodeInContext
+    :: ContextRef -> (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMMDNode" mDNode
+    :: (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMMetadataAsValue" metadataAsValue
+    :: ContextRef -> MetadataRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMValueAsMetadata" valueAsMetadata
+    :: ValueRef -> IO MetadataRef
+
+foreign import ccall unsafe "LLVMGetMDString" getMDString
+    :: ValueRef -> (Ptr CUInt) -> IO CString
+
+foreign import ccall unsafe "LLVMGetMDNodeNumOperands" getMDNodeNumOperands
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetMDNodeOperands" getMDNodeOperands
+    :: ValueRef -> (Ptr ValueRef) -> IO ()
+
+foreign import ccall unsafe "LLVMBasicBlockAsValue" basicBlockAsValue
+    :: BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMValueIsBasicBlock" valueIsBasicBlock
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMValueAsBasicBlock" valueAsBasicBlock
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetBasicBlockName" getBasicBlockName
+    :: BasicBlockRef -> IO CString
+
+foreign import ccall unsafe "LLVMGetBasicBlockParent" getBasicBlockParent
+    :: BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetBasicBlockTerminator" getBasicBlockTerminator
+    :: BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMCountBasicBlocks" countBasicBlocks
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetBasicBlocks" getBasicBlocks
+    :: ValueRef -> (Ptr BasicBlockRef) -> IO ()
+
+foreign import ccall unsafe "LLVMGetFirstBasicBlock" getFirstBasicBlock
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetLastBasicBlock" getLastBasicBlock
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetNextBasicBlock" getNextBasicBlock
+    :: BasicBlockRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetPreviousBasicBlock" getPreviousBasicBlock
+    :: BasicBlockRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetEntryBasicBlock" getEntryBasicBlock
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMAppendBasicBlockInContext" appendBasicBlockInContext
+    :: ContextRef -> ValueRef -> CString -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMAppendBasicBlock" appendBasicBlock
+    :: ValueRef -> CString -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMInsertBasicBlockInContext" insertBasicBlockInContext
+    :: ContextRef -> BasicBlockRef -> CString -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMInsertBasicBlock" insertBasicBlock
+    :: BasicBlockRef -> CString -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMDeleteBasicBlock" deleteBasicBlock
+    :: BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMRemoveBasicBlockFromParent" removeBasicBlockFromParent
+    :: BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMMoveBasicBlockBefore" moveBasicBlockBefore
+    :: BasicBlockRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMMoveBasicBlockAfter" moveBasicBlockAfter
+    :: BasicBlockRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetFirstInstruction" getFirstInstruction
+    :: BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetLastInstruction" getLastInstruction
+    :: BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMHasMetadata" hasMetadata
+    :: ValueRef -> IO CInt
+
+foreign import ccall unsafe "LLVMGetMetadata" getMetadata
+    :: ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSetMetadata" setMetadata
+    :: ValueRef -> CUInt -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetInstructionParent" getInstructionParent
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetNextInstruction" getNextInstruction
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetPreviousInstruction" getPreviousInstruction
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMInstructionRemoveFromParent" instructionRemoveFromParent
+    :: ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMInstructionEraseFromParent" instructionEraseFromParent
+    :: ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetInstructionOpcode" getInstructionOpcode
+    :: ValueRef -> IO Opcode
+
+foreign import ccall unsafe "LLVMGetICmpPredicate" getICmpPredicate
+    :: ValueRef -> IO IntPredicate
+
+foreign import ccall unsafe "LLVMGetFCmpPredicate" getFCmpPredicate
+    :: ValueRef -> IO RealPredicate
+
+foreign import ccall unsafe "LLVMInstructionClone" instructionClone
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetNumArgOperands" getNumArgOperands
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMSetInstructionCallConv" setInstructionCallConv
+    :: ValueRef -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMGetInstructionCallConv" getInstructionCallConv
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMSetInstrParamAlignment" setInstrParamAlignment
+    :: ValueRef -> CUInt -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMAddCallSiteAttribute" addCallSiteAttribute
+    :: ValueRef -> AttributeIndex -> AttributeRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetCallSiteAttributeCount" getCallSiteAttributeCount
+    :: ValueRef -> AttributeIndex -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetCallSiteAttributes" getCallSiteAttributes
+    :: ValueRef -> AttributeIndex -> (Ptr AttributeRef) -> IO ()
+
+foreign import ccall unsafe "LLVMGetCallSiteEnumAttribute" getCallSiteEnumAttribute
+    :: ValueRef -> AttributeIndex -> CUInt -> IO AttributeRef
+
+foreign import ccall unsafe "LLVMGetCallSiteStringAttribute" getCallSiteStringAttribute
+    :: ValueRef -> AttributeIndex -> CString -> CUInt -> IO AttributeRef
+
+foreign import ccall unsafe "LLVMRemoveCallSiteEnumAttribute" removeCallSiteEnumAttribute
+    :: ValueRef -> AttributeIndex -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMRemoveCallSiteStringAttribute" removeCallSiteStringAttribute
+    :: ValueRef -> AttributeIndex -> CString -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMGetCalledValue" getCalledValue
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMIsTailCall" isTailCall
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetTailCall" setTailCall
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMGetNormalDest" getNormalDest
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetUnwindDest" getUnwindDest
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMSetNormalDest" setNormalDest
+    :: ValueRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMSetUnwindDest" setUnwindDest
+    :: ValueRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetNumSuccessors" getNumSuccessors
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetSuccessor" getSuccessor
+    :: ValueRef -> CUInt -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMSetSuccessor" setSuccessor
+    :: ValueRef -> CUInt -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMIsConditional" isConditional
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMGetCondition" getCondition
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSetCondition" setCondition
+    :: ValueRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetSwitchDefaultDest" getSwitchDefaultDest
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetAllocatedType" getAllocatedType
+    :: ValueRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMIsInBounds" isInBounds
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetIsInBounds" setIsInBounds
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMAddIncoming" addIncoming
+    :: ValueRef -> (Ptr ValueRef) -> (Ptr BasicBlockRef) -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMCountIncoming" countIncoming
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetIncomingValue" getIncomingValue
+    :: ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetIncomingBlock" getIncomingBlock
+    :: ValueRef -> CUInt -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetNumIndices" getNumIndices
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetIndices" getIndices
+    :: ValueRef -> IO (Ptr CUInt)
+
+foreign import ccall unsafe "LLVMCreateBuilderInContext" createBuilderInContext
+    :: ContextRef -> IO BuilderRef
+
+foreign import ccall unsafe "LLVMCreateBuilder" createBuilder
+    :: IO BuilderRef
+
+foreign import ccall unsafe "LLVMPositionBuilder" positionBuilder
+    :: BuilderRef -> BasicBlockRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMPositionBuilderBefore" positionBuilderBefore
+    :: BuilderRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMPositionBuilderAtEnd" positionBuilderAtEnd
+    :: BuilderRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetInsertBlock" getInsertBlock
+    :: BuilderRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMClearInsertionPosition" clearInsertionPosition
+    :: BuilderRef -> IO ()
+
+foreign import ccall unsafe "LLVMInsertIntoBuilder" insertIntoBuilder
+    :: BuilderRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMInsertIntoBuilderWithName" insertIntoBuilderWithName
+    :: BuilderRef -> ValueRef -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMDisposeBuilder" disposeBuilder
+    :: BuilderRef -> IO ()
+
+foreign import ccall unsafe "LLVMSetCurrentDebugLocation" setCurrentDebugLocation
+    :: BuilderRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetCurrentDebugLocation" getCurrentDebugLocation
+    :: BuilderRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSetInstDebugLocation" setInstDebugLocation
+    :: BuilderRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMBuildRetVoid" buildRetVoid
+    :: BuilderRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildRet" buildRet
+    :: BuilderRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildAggregateRet" buildAggregateRet
+    :: BuilderRef -> (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildBr" buildBr
+    :: BuilderRef -> BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildCondBr" buildCondBr
+    :: BuilderRef -> ValueRef -> BasicBlockRef -> BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSwitch" buildSwitch
+    :: BuilderRef -> ValueRef -> BasicBlockRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildIndirectBr" buildIndirectBr
+    :: BuilderRef -> ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildInvoke" buildInvoke
+    :: BuilderRef -> ValueRef -> (Ptr ValueRef) -> CUInt -> BasicBlockRef -> BasicBlockRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildUnreachable" buildUnreachable
+    :: BuilderRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildResume" buildResume
+    :: BuilderRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildLandingPad" buildLandingPad
+    :: BuilderRef -> TypeRef -> ValueRef -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildCleanupRet" buildCleanupRet
+    :: BuilderRef -> ValueRef -> BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildCatchRet" buildCatchRet
+    :: BuilderRef -> ValueRef -> BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildCatchPad" buildCatchPad
+    :: BuilderRef -> ValueRef -> (Ptr ValueRef) -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildCleanupPad" buildCleanupPad
+    :: BuilderRef -> ValueRef -> (Ptr ValueRef) -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildCatchSwitch" buildCatchSwitch
+    :: BuilderRef -> ValueRef -> BasicBlockRef -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMAddCase" addCase
+    :: ValueRef -> ValueRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMAddDestination" addDestination
+    :: ValueRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetNumClauses" getNumClauses
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetClause" getClause
+    :: ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMAddClause" addClause
+    :: ValueRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMIsCleanup" isCleanup
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetCleanup" setCleanup
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMAddHandler" addHandler
+    :: ValueRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetNumHandlers" getNumHandlers
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetHandlers" getHandlers
+    :: ValueRef -> (Ptr BasicBlockRef) -> IO ()
+
+foreign import ccall unsafe "LLVMGetArgOperand" getArgOperand
+    :: ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSetArgOperand" setArgOperand
+    :: ValueRef -> CUInt -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetParentCatchSwitch" getParentCatchSwitch
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSetParentCatchSwitch" setParentCatchSwitch
+    :: ValueRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMBuildAdd" buildAdd
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNSWAdd" buildNSWAdd
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNUWAdd" buildNUWAdd
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFAdd" buildFAdd
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSub" buildSub
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNSWSub" buildNSWSub
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNUWSub" buildNUWSub
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFSub" buildFSub
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildMul" buildMul
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNSWMul" buildNSWMul
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNUWMul" buildNUWMul
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFMul" buildFMul
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildUDiv" buildUDiv
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildExactUDiv" buildExactUDiv
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSDiv" buildSDiv
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildExactSDiv" buildExactSDiv
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFDiv" buildFDiv
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildURem" buildURem
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSRem" buildSRem
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFRem" buildFRem
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildShl" buildShl
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildLShr" buildLShr
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildAShr" buildAShr
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildAnd" buildAnd
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildOr" buildOr
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildXor" buildXor
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildBinOp" buildBinOp
+    :: BuilderRef -> Opcode -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNeg" buildNeg
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNSWNeg" buildNSWNeg
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNUWNeg" buildNUWNeg
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFNeg" buildFNeg
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNot" buildNot
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildMalloc" buildMalloc
+    :: BuilderRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildArrayMalloc" buildArrayMalloc
+    :: BuilderRef -> TypeRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildAlloca" buildAlloca
+    :: BuilderRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildArrayAlloca" buildArrayAlloca
+    :: BuilderRef -> TypeRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFree" buildFree
+    :: BuilderRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildLoad" buildLoad
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildStore" buildStore
+    :: BuilderRef -> ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildGEP" buildGEP
+    :: BuilderRef -> ValueRef -> (Ptr ValueRef) -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildInBoundsGEP" buildInBoundsGEP
+    :: BuilderRef -> ValueRef -> (Ptr ValueRef) -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildStructGEP" buildStructGEP
+    :: BuilderRef -> ValueRef -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildGlobalString" buildGlobalString
+    :: BuilderRef -> CString -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildGlobalStringPtr" buildGlobalStringPtr
+    :: BuilderRef -> CString -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetVolatile" getVolatile
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetVolatile" setVolatile
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMGetOrdering" getOrdering
+    :: ValueRef -> IO AtomicOrdering
+
+foreign import ccall unsafe "LLVMSetOrdering" setOrdering
+    :: ValueRef -> AtomicOrdering -> IO ()
+
+foreign import ccall unsafe "LLVMBuildTrunc" buildTrunc
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildZExt" buildZExt
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSExt" buildSExt
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFPToUI" buildFPToUI
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFPToSI" buildFPToSI
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildUIToFP" buildUIToFP
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSIToFP" buildSIToFP
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFPTrunc" buildFPTrunc
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFPExt" buildFPExt
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildPtrToInt" buildPtrToInt
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildIntToPtr" buildIntToPtr
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildBitCast" buildBitCast
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildAddrSpaceCast" buildAddrSpaceCast
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildZExtOrBitCast" buildZExtOrBitCast
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSExtOrBitCast" buildSExtOrBitCast
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildTruncOrBitCast" buildTruncOrBitCast
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildCast" buildCast
+    :: BuilderRef -> Opcode -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildPointerCast" buildPointerCast
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFPCast" buildFPCast
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildICmp" buildICmp
+    :: BuilderRef -> IntPredicate -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFCmp" buildFCmp
+    :: BuilderRef -> RealPredicate -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildPhi" buildPhi
+    :: BuilderRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildCall" buildCall
+    :: BuilderRef -> ValueRef -> (Ptr ValueRef) -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSelect" buildSelect
+    :: BuilderRef -> ValueRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildVAArg" buildVAArg
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildExtractElement" buildExtractElement
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildInsertElement" buildInsertElement
+    :: BuilderRef -> ValueRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildShuffleVector" buildShuffleVector
+    :: BuilderRef -> ValueRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildExtractValue" buildExtractValue
+    :: BuilderRef -> ValueRef -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildInsertValue" buildInsertValue
+    :: BuilderRef -> ValueRef -> ValueRef -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildIsNull" buildIsNull
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildIsNotNull" buildIsNotNull
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildPtrDiff" buildPtrDiff
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFence" buildFence
+    :: BuilderRef -> AtomicOrdering -> LLVM.Bool -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildAtomicRMW" buildAtomicRMW
+    :: BuilderRef -> AtomicRMWBinOp -> ValueRef -> ValueRef -> AtomicOrdering -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildAtomicCmpXchg" buildAtomicCmpXchg
+    :: BuilderRef -> ValueRef -> ValueRef -> ValueRef -> AtomicOrdering -> AtomicOrdering -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMIsAtomicSingleThread" isAtomicSingleThread
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetAtomicSingleThread" setAtomicSingleThread
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMGetCmpXchgSuccessOrdering" getCmpXchgSuccessOrdering
+    :: ValueRef -> IO AtomicOrdering
+
+foreign import ccall unsafe "LLVMSetCmpXchgSuccessOrdering" setCmpXchgSuccessOrdering
+    :: ValueRef -> AtomicOrdering -> IO ()
+
+foreign import ccall unsafe "LLVMGetCmpXchgFailureOrdering" getCmpXchgFailureOrdering
+    :: ValueRef -> IO AtomicOrdering
+
+foreign import ccall unsafe "LLVMSetCmpXchgFailureOrdering" setCmpXchgFailureOrdering
+    :: ValueRef -> AtomicOrdering -> IO ()
+
+foreign import ccall unsafe "LLVMCreateModuleProviderForExistingModule" createModuleProviderForExistingModule
+    :: ModuleRef -> IO ModuleProviderRef
+
+foreign import ccall unsafe "LLVMDisposeModuleProvider" disposeModuleProvider
+    :: ModuleProviderRef -> IO ()
+
+foreign import ccall unsafe "LLVMCreateMemoryBufferWithContentsOfFile" createMemoryBufferWithContentsOfFile
+    :: CString -> (Ptr MemoryBufferRef) -> (Ptr CString) -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMCreateMemoryBufferWithSTDIN" createMemoryBufferWithSTDIN
+    :: (Ptr MemoryBufferRef) -> (Ptr CString) -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMCreateMemoryBufferWithMemoryRange" createMemoryBufferWithMemoryRange
+    :: CString -> CSize -> CString -> LLVM.Bool -> IO MemoryBufferRef
+
+foreign import ccall unsafe "LLVMCreateMemoryBufferWithMemoryRangeCopy" createMemoryBufferWithMemoryRangeCopy
+    :: CString -> CSize -> CString -> IO MemoryBufferRef
+
+foreign import ccall unsafe "LLVMGetBufferStart" getBufferStart
+    :: MemoryBufferRef -> IO CString
+
+foreign import ccall unsafe "LLVMGetBufferSize" getBufferSize
+    :: MemoryBufferRef -> IO CSize
+
+foreign import ccall unsafe "LLVMDisposeMemoryBuffer" disposeMemoryBuffer
+    :: MemoryBufferRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetGlobalPassRegistry" getGlobalPassRegistry
+    :: IO PassRegistryRef
+
+foreign import ccall unsafe "LLVMCreatePassManager" createPassManager
+    :: IO PassManagerRef
+
+foreign import ccall unsafe "LLVMCreateFunctionPassManagerForModule" createFunctionPassManagerForModule
+    :: ModuleRef -> IO PassManagerRef
+
+foreign import ccall unsafe "LLVMCreateFunctionPassManager" createFunctionPassManager
+    :: ModuleProviderRef -> IO PassManagerRef
+
+foreign import ccall unsafe "LLVMRunPassManager" runPassManager
+    :: PassManagerRef -> ModuleRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMInitializeFunctionPassManager" initializeFunctionPassManager
+    :: PassManagerRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMRunFunctionPassManager" runFunctionPassManager
+    :: PassManagerRef -> ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMFinalizeFunctionPassManager" finalizeFunctionPassManager
+    :: PassManagerRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMDisposePassManager" disposePassManager
+    :: PassManagerRef -> IO ()
+
+foreign import ccall unsafe "LLVMStartMultithreaded" startMultithreaded
+    :: IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMStopMultithreaded" stopMultithreaded
+    :: IO ()
+
+foreign import ccall unsafe "LLVMIsMultithreaded" isMultithreaded
+    :: IO LLVM.Bool
diff --git a/src/8/LLVM/Raw/Core.hsc b/src/8/LLVM/Raw/Core.hsc
new file mode 100644
--- /dev/null
+++ b/src/8/LLVM/Raw/Core.hsc
@@ -0,0 +1,1867 @@
+{-# LANGUAGE Safe #-}
+{-# LANGUAGE ForeignFunctionInterface #-}
+{-# LANGUAGE EmptyDataDecls #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+module LLVM.Raw.Core where
+
+import qualified LLVM.FFI.Base as LLVM
+
+import qualified Foreign.C.Types as C
+import Foreign.C.String (CString)
+import Foreign.Ptr (Ptr, FunPtr)
+
+import Data.Typeable (Typeable)
+
+import Data.Word (Word8, Word32, Word64)
+
+
+type CDouble  = C.CDouble
+type CInt     = C.CInt
+type CUInt    = C.CUInt
+type CLLong   = C.CLLong
+type CULLong  = C.CULLong
+type CSize    = C.CSize
+
+
+#include <llvm/Config/llvm-config.h>
+#include <llvm-c/Core.h>
+
+
+data Module
+    deriving (Typeable)
+type ModuleRef = Ptr Module
+
+data ModuleProvider
+    deriving (Typeable)
+type ModuleProviderRef = Ptr ModuleProvider
+
+data Type
+    deriving (Typeable)
+type TypeRef = Ptr Type
+
+data BasicBlock
+    deriving (Typeable)
+type BasicBlockRef = Ptr BasicBlock
+
+data Value
+    deriving (Typeable)
+type ValueRef = Ptr Value
+
+data OpaqueUse
+    deriving (Typeable)
+type UseRef = Ptr OpaqueUse
+
+data Builder
+    deriving (Typeable)
+type BuilderRef = Ptr Builder
+
+data MemoryBuffer
+    deriving (Typeable)
+type MemoryBufferRef = Ptr MemoryBuffer
+
+data PassManager
+    deriving (Typeable)
+type PassManagerRef = Ptr PassManager
+
+data PassRegistry
+    deriving (Typeable)
+type PassRegistryRef = Ptr PassRegistry
+
+data Context
+    deriving (Typeable)
+type ContextRef = Ptr Context
+
+{-
+data Attribute
+    deriving (Typeable)
+-}
+-- until 3.9
+newtype Attribute = Attribute Word32
+type AttributeRef = Ptr Attribute
+
+newtype AttributeIndex = AttributeIndex #{type LLVMAttributeIndex}
+
+attributeReturnIndex, attributeFunctionIndex :: AttributeIndex
+attributeReturnIndex   = AttributeIndex (#const LLVMAttributeReturnIndex)
+attributeFunctionIndex = AttributeIndex (#const LLVMAttributeFunctionIndex)
+
+
+data Metadata
+    deriving (Typeable)
+type MetadataRef = Ptr Metadata
+
+data DiagnosticInfo
+    deriving (Typeable)
+type DiagnosticInfoRef = Ptr DiagnosticInfo
+
+data NamedMDNode
+    deriving (Typeable)
+type NamedMDNodeRef = Ptr NamedMDNode
+
+
+data ModuleFlagEntry
+    deriving (Typeable)
+data ValueMetadataEntry
+    deriving (Typeable)
+
+type DiagnosticHandler = FunPtr (DiagnosticInfoRef -> Ptr () -> IO ())
+type YieldCallback = FunPtr (ContextRef -> Ptr () -> IO ())
+
+newtype CallingConvention = CallingConvention {unCallingConvention :: CUInt}
+
+newtype AtomicOrdering = AtomicOrdering #{type LLVMAtomicOrdering}
+newtype AtomicRMWBinOp = AtomicRMWBinOp #{type LLVMAtomicRMWBinOp}
+newtype DiagnosticSeverity = DiagnosticSeverity #{type LLVMDiagnosticSeverity}
+newtype DLLStorageClass = DLLStorageClass #{type LLVMDLLStorageClass}
+-- newtype InlineAsmDialect = InlineAsmDialect #{type LLVMInlineAsmDialect}
+newtype InlineAsmDialect = InlineAsmDialect Word32
+newtype IntPredicate = IntPredicate #{type LLVMIntPredicate}
+newtype Linkage = Linkage #{type LLVMLinkage}
+-- newtype ModuleFlagBehavior = ModuleFlagBehavior #{type LLVMModuleFlagBehavior}
+newtype ModuleFlagBehavior = ModuleFlagBehavior Word32
+newtype Opcode = Opcode #{type LLVMOpcode}
+newtype RealPredicate = RealPredicate #{type LLVMRealPredicate}
+newtype ThreadLocalMode = ThreadLocalMode #{type LLVMThreadLocalMode}
+newtype TypeKind = TypeKind {unTypeKind :: #{type LLVMTypeKind}}
+-- newtype UnnamedAddr = UnnamedAddr #{type LLVMUnnamedAddr}
+newtype UnnamedAddr = UnnamedAddr Word32
+newtype ValueKind = ValueKind #{type LLVMValueKind}
+newtype Visibility = Visibility #{type LLVMVisibility}
+
+
+foreign import ccall unsafe "LLVMInitializeCore" initializeCore
+    :: PassRegistryRef -> IO ()
+
+foreign import ccall unsafe "LLVMShutdown" shutdown
+    :: IO ()
+
+foreign import ccall unsafe "LLVMCreateMessage" createMessage
+    :: CString -> IO CString
+
+foreign import ccall unsafe "LLVMDisposeMessage" disposeMessage
+    :: CString -> IO ()
+
+foreign import ccall unsafe "LLVMContextCreate" contextCreate
+    :: IO ContextRef
+
+foreign import ccall unsafe "LLVMGetGlobalContext" getGlobalContext
+    :: IO ContextRef
+
+foreign import ccall unsafe "LLVMContextSetDiagnosticHandler" contextSetDiagnosticHandler
+    :: ContextRef -> DiagnosticHandler -> (Ptr ()) -> IO ()
+
+foreign import ccall unsafe "LLVMContextGetDiagnosticHandler" contextGetDiagnosticHandler
+    :: ContextRef -> IO DiagnosticHandler
+
+foreign import ccall unsafe "LLVMContextGetDiagnosticContext" contextGetDiagnosticContext
+    :: ContextRef -> IO (Ptr ())
+
+foreign import ccall unsafe "LLVMContextSetYieldCallback" contextSetYieldCallback
+    :: ContextRef -> YieldCallback -> (Ptr ()) -> IO ()
+
+foreign import ccall unsafe "LLVMContextShouldDiscardValueNames" contextShouldDiscardValueNames
+    :: ContextRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMContextSetDiscardValueNames" contextSetDiscardValueNames
+    :: ContextRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMContextDispose" contextDispose
+    :: ContextRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetDiagInfoDescription" getDiagInfoDescription
+    :: DiagnosticInfoRef -> IO CString
+
+foreign import ccall unsafe "LLVMGetDiagInfoSeverity" getDiagInfoSeverity
+    :: DiagnosticInfoRef -> IO DiagnosticSeverity
+
+foreign import ccall unsafe "LLVMGetMDKindIDInContext" getMDKindIDInContext
+    :: ContextRef -> CString -> CUInt -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetMDKindID" getMDKindID
+    :: CString -> CUInt -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetEnumAttributeKindForName" getEnumAttributeKindForName
+    :: CString -> CSize -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetLastEnumAttributeKind" getLastEnumAttributeKind
+    :: IO CUInt
+
+foreign import ccall unsafe "LLVMCreateEnumAttribute" createEnumAttribute
+    :: ContextRef -> CUInt -> Word64 -> IO AttributeRef
+
+foreign import ccall unsafe "LLVMGetEnumAttributeKind" getEnumAttributeKind
+    :: AttributeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetEnumAttributeValue" getEnumAttributeValue
+    :: AttributeRef -> IO Word64
+
+foreign import ccall unsafe "LLVMCreateStringAttribute" createStringAttribute
+    :: ContextRef -> CString -> CUInt -> CString -> CUInt -> IO AttributeRef
+
+foreign import ccall unsafe "LLVMGetStringAttributeKind" getStringAttributeKind
+    :: AttributeRef -> (Ptr CUInt) -> IO CString
+
+foreign import ccall unsafe "LLVMGetStringAttributeValue" getStringAttributeValue
+    :: AttributeRef -> (Ptr CUInt) -> IO CString
+
+foreign import ccall unsafe "LLVMIsEnumAttribute" isEnumAttribute
+    :: AttributeRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMIsStringAttribute" isStringAttribute
+    :: AttributeRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMModuleCreateWithName" moduleCreateWithName
+    :: CString -> IO ModuleRef
+
+foreign import ccall unsafe "LLVMModuleCreateWithNameInContext" moduleCreateWithNameInContext
+    :: CString -> ContextRef -> IO ModuleRef
+
+foreign import ccall unsafe "LLVMCloneModule" cloneModule
+    :: ModuleRef -> IO ModuleRef
+
+foreign import ccall unsafe "LLVMDisposeModule" disposeModule
+    :: ModuleRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetModuleIdentifier" getModuleIdentifier
+    :: ModuleRef -> (Ptr CSize) -> IO CString
+
+foreign import ccall unsafe "LLVMSetModuleIdentifier" setModuleIdentifier
+    :: ModuleRef -> CString -> CSize -> IO ()
+
+foreign import ccall unsafe "LLVMGetSourceFileName" getSourceFileName
+    :: ModuleRef -> (Ptr CSize) -> IO CString
+
+foreign import ccall unsafe "LLVMSetSourceFileName" setSourceFileName
+    :: ModuleRef -> CString -> CSize -> IO ()
+
+foreign import ccall unsafe "LLVMGetDataLayoutStr" getDataLayoutStr
+    :: ModuleRef -> IO CString
+
+foreign import ccall unsafe "LLVMGetDataLayout" getDataLayout
+    :: ModuleRef -> IO CString
+
+foreign import ccall unsafe "LLVMSetDataLayout" setDataLayout
+    :: ModuleRef -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMGetTarget" getTarget
+    :: ModuleRef -> IO CString
+
+foreign import ccall unsafe "LLVMSetTarget" setTarget
+    :: ModuleRef -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMCopyModuleFlagsMetadata" copyModuleFlagsMetadata
+    :: ModuleRef -> (Ptr CSize) -> IO (Ptr ModuleFlagEntry)
+
+foreign import ccall unsafe "LLVMDisposeModuleFlagsMetadata" disposeModuleFlagsMetadata
+    :: (Ptr ModuleFlagEntry) -> IO ()
+
+foreign import ccall unsafe "LLVMModuleFlagEntriesGetFlagBehavior" moduleFlagEntriesGetFlagBehavior
+    :: (Ptr ModuleFlagEntry) -> CUInt -> IO ModuleFlagBehavior
+
+foreign import ccall unsafe "LLVMModuleFlagEntriesGetKey" moduleFlagEntriesGetKey
+    :: (Ptr ModuleFlagEntry) -> CUInt -> (Ptr CSize) -> IO CString
+
+foreign import ccall unsafe "LLVMModuleFlagEntriesGetMetadata" moduleFlagEntriesGetMetadata
+    :: (Ptr ModuleFlagEntry) -> CUInt -> IO MetadataRef
+
+foreign import ccall unsafe "LLVMGetModuleFlag" getModuleFlag
+    :: ModuleRef -> CString -> CSize -> IO MetadataRef
+
+foreign import ccall unsafe "LLVMAddModuleFlag" addModuleFlag
+    :: ModuleRef -> ModuleFlagBehavior -> CString -> CSize -> MetadataRef -> IO ()
+
+foreign import ccall unsafe "LLVMDumpModule" dumpModule
+    :: ModuleRef -> IO ()
+
+foreign import ccall unsafe "LLVMPrintModuleToFile" printModuleToFile
+    :: ModuleRef -> CString -> (Ptr CString) -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMPrintModuleToString" printModuleToString
+    :: ModuleRef -> IO CString
+
+foreign import ccall unsafe "LLVMGetModuleInlineAsm" getModuleInlineAsm
+    :: ModuleRef -> (Ptr CSize) -> IO CString
+
+foreign import ccall unsafe "LLVMSetModuleInlineAsm2" setModuleInlineAsm2
+    :: ModuleRef -> CString -> CSize -> IO ()
+
+foreign import ccall unsafe "LLVMAppendModuleInlineAsm" appendModuleInlineAsm
+    :: ModuleRef -> CString -> CSize -> IO ()
+
+foreign import ccall unsafe "LLVMGetInlineAsm" getInlineAsm
+    :: TypeRef -> CString -> CSize -> CString -> CSize -> LLVM.Bool -> LLVM.Bool -> InlineAsmDialect -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetModuleContext" getModuleContext
+    :: ModuleRef -> IO ContextRef
+
+foreign import ccall unsafe "LLVMGetTypeByName" getTypeByName
+    :: ModuleRef -> CString -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetFirstNamedMetadata" getFirstNamedMetadata
+    :: ModuleRef -> IO NamedMDNodeRef
+
+foreign import ccall unsafe "LLVMGetLastNamedMetadata" getLastNamedMetadata
+    :: ModuleRef -> IO NamedMDNodeRef
+
+foreign import ccall unsafe "LLVMGetNextNamedMetadata" getNextNamedMetadata
+    :: NamedMDNodeRef -> IO NamedMDNodeRef
+
+foreign import ccall unsafe "LLVMGetPreviousNamedMetadata" getPreviousNamedMetadata
+    :: NamedMDNodeRef -> IO NamedMDNodeRef
+
+foreign import ccall unsafe "LLVMGetNamedMetadata" getNamedMetadata
+    :: ModuleRef -> CString -> CSize -> IO NamedMDNodeRef
+
+foreign import ccall unsafe "LLVMGetOrInsertNamedMetadata" getOrInsertNamedMetadata
+    :: ModuleRef -> CString -> CSize -> IO NamedMDNodeRef
+
+foreign import ccall unsafe "LLVMGetNamedMetadataName" getNamedMetadataName
+    :: NamedMDNodeRef -> (Ptr CSize) -> IO CString
+
+foreign import ccall unsafe "LLVMGetNamedMetadataNumOperands" getNamedMetadataNumOperands
+    :: ModuleRef -> CString -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetNamedMetadataOperands" getNamedMetadataOperands
+    :: ModuleRef -> CString -> (Ptr ValueRef) -> IO ()
+
+foreign import ccall unsafe "LLVMAddNamedMetadataOperand" addNamedMetadataOperand
+    :: ModuleRef -> CString -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetDebugLocDirectory" getDebugLocDirectory
+    :: ValueRef -> (Ptr CUInt) -> IO CString
+
+foreign import ccall unsafe "LLVMGetDebugLocFilename" getDebugLocFilename
+    :: ValueRef -> (Ptr CUInt) -> IO CString
+
+foreign import ccall unsafe "LLVMGetDebugLocLine" getDebugLocLine
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetDebugLocColumn" getDebugLocColumn
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMAddFunction" addFunction
+    :: ModuleRef -> CString -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetNamedFunction" getNamedFunction
+    :: ModuleRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetFirstFunction" getFirstFunction
+    :: ModuleRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetLastFunction" getLastFunction
+    :: ModuleRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetNextFunction" getNextFunction
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetPreviousFunction" getPreviousFunction
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSetModuleInlineAsm" setModuleInlineAsm
+    :: ModuleRef -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMGetTypeKind" getTypeKind
+    :: TypeRef -> IO TypeKind
+
+foreign import ccall unsafe "LLVMTypeIsSized" typeIsSized
+    :: TypeRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMGetTypeContext" getTypeContext
+    :: TypeRef -> IO ContextRef
+
+foreign import ccall unsafe "LLVMPrintTypeToString" printTypeToString
+    :: TypeRef -> IO CString
+
+foreign import ccall unsafe "LLVMInt1TypeInContext" int1TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMInt8TypeInContext" int8TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMInt16TypeInContext" int16TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMInt32TypeInContext" int32TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMInt64TypeInContext" int64TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMInt128TypeInContext" int128TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMIntTypeInContext" intTypeInContext
+    :: ContextRef -> CUInt -> IO TypeRef
+
+foreign import ccall unsafe "LLVMInt1Type" int1Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMInt8Type" int8Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMInt16Type" int16Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMInt32Type" int32Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMInt64Type" int64Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMInt128Type" int128Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMIntType" intType
+    :: CUInt -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetIntTypeWidth" getIntTypeWidth
+    :: TypeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMHalfTypeInContext" halfTypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMFloatTypeInContext" floatTypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMDoubleTypeInContext" doubleTypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMX86FP80TypeInContext" x86FP80TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMFP128TypeInContext" fP128TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMPPCFP128TypeInContext" pPCFP128TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMHalfType" halfType
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMFloatType" floatType
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMDoubleType" doubleType
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMX86FP80Type" x86FP80Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMFP128Type" fP128Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMPPCFP128Type" pPCFP128Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMFunctionType" functionType
+    :: TypeRef -> (Ptr TypeRef) -> CUInt -> LLVM.Bool -> IO TypeRef
+
+foreign import ccall unsafe "LLVMIsFunctionVarArg" isFunctionVarArg
+    :: TypeRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMGetReturnType" getReturnType
+    :: TypeRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMCountParamTypes" countParamTypes
+    :: TypeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetParamTypes" getParamTypes
+    :: TypeRef -> (Ptr TypeRef) -> IO ()
+
+foreign import ccall unsafe "LLVMStructTypeInContext" structTypeInContext
+    :: ContextRef -> (Ptr TypeRef) -> CUInt -> LLVM.Bool -> IO TypeRef
+
+foreign import ccall unsafe "LLVMStructType" structType
+    :: (Ptr TypeRef) -> CUInt -> LLVM.Bool -> IO TypeRef
+
+foreign import ccall unsafe "LLVMStructCreateNamed" structCreateNamed
+    :: ContextRef -> CString -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetStructName" getStructName
+    :: TypeRef -> IO CString
+
+foreign import ccall unsafe "LLVMStructSetBody" structSetBody
+    :: TypeRef -> (Ptr TypeRef) -> CUInt -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMCountStructElementTypes" countStructElementTypes
+    :: TypeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetStructElementTypes" getStructElementTypes
+    :: TypeRef -> (Ptr TypeRef) -> IO ()
+
+foreign import ccall unsafe "LLVMStructGetTypeAtIndex" structGetTypeAtIndex
+    :: TypeRef -> CUInt -> IO TypeRef
+
+foreign import ccall unsafe "LLVMIsPackedStruct" isPackedStruct
+    :: TypeRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMIsOpaqueStruct" isOpaqueStruct
+    :: TypeRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMIsLiteralStruct" isLiteralStruct
+    :: TypeRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMGetElementType" getElementType
+    :: TypeRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetSubtypes" getSubtypes
+    :: TypeRef -> (Ptr TypeRef) -> IO ()
+
+foreign import ccall unsafe "LLVMGetNumContainedTypes" getNumContainedTypes
+    :: TypeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMArrayType" arrayType
+    :: TypeRef -> CUInt -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetArrayLength" getArrayLength
+    :: TypeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMPointerType" pointerType
+    :: TypeRef -> CUInt -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetPointerAddressSpace" getPointerAddressSpace
+    :: TypeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMVectorType" vectorType
+    :: TypeRef -> CUInt -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetVectorSize" getVectorSize
+    :: TypeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMVoidTypeInContext" voidTypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMLabelTypeInContext" labelTypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMX86MMXTypeInContext" x86MMXTypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMTokenTypeInContext" tokenTypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMMetadataTypeInContext" metadataTypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMVoidType" voidType
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMLabelType" labelType
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMX86MMXType" x86MMXType
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMTypeOf" typeOf
+    :: ValueRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetValueKind" getValueKind
+    :: ValueRef -> IO ValueKind
+
+foreign import ccall unsafe "LLVMGetValueName2" getValueName2
+    :: ValueRef -> (Ptr CSize) -> IO CString
+
+foreign import ccall unsafe "LLVMSetValueName2" setValueName2
+    :: ValueRef -> CString -> CSize -> IO ()
+
+foreign import ccall unsafe "LLVMDumpValue" dumpValue
+    :: ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMPrintValueToString" printValueToString
+    :: ValueRef -> IO CString
+
+foreign import ccall unsafe "LLVMReplaceAllUsesWith" replaceAllUsesWith
+    :: ValueRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMIsConstant" isConstant
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMIsUndef" isUndef
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMIsAMDNode" isAMDNode
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMIsAMDString" isAMDString
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetValueName" getValueName
+    :: ValueRef -> IO CString
+
+foreign import ccall unsafe "LLVMSetValueName" setValueName
+    :: ValueRef -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMGetFirstUse" getFirstUse
+    :: ValueRef -> IO UseRef
+
+foreign import ccall unsafe "LLVMGetNextUse" getNextUse
+    :: UseRef -> IO UseRef
+
+foreign import ccall unsafe "LLVMGetUser" getUser
+    :: UseRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetUsedValue" getUsedValue
+    :: UseRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetOperand" getOperand
+    :: ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetOperandUse" getOperandUse
+    :: ValueRef -> CUInt -> IO UseRef
+
+foreign import ccall unsafe "LLVMSetOperand" setOperand
+    :: ValueRef -> CUInt -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetNumOperands" getNumOperands
+    :: ValueRef -> IO CInt
+
+foreign import ccall unsafe "LLVMConstNull" constNull
+    :: TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstAllOnes" constAllOnes
+    :: TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetUndef" getUndef
+    :: TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMIsNull" isNull
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMConstPointerNull" constPointerNull
+    :: TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstInt" constInt
+    :: TypeRef -> CULLong -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstIntOfArbitraryPrecision" constIntOfArbitraryPrecision
+    :: TypeRef -> CUInt -> Ptr Word64 -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstIntOfString" constIntOfString
+    :: TypeRef -> CString -> Word8 -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstIntOfStringAndSize" constIntOfStringAndSize
+    :: TypeRef -> CString -> CUInt -> Word8 -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstReal" constReal
+    :: TypeRef -> CDouble -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstRealOfString" constRealOfString
+    :: TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstRealOfStringAndSize" constRealOfStringAndSize
+    :: TypeRef -> CString -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstIntGetZExtValue" constIntGetZExtValue
+    :: ValueRef -> IO CULLong
+
+foreign import ccall unsafe "LLVMConstIntGetSExtValue" constIntGetSExtValue
+    :: ValueRef -> IO CLLong
+
+foreign import ccall unsafe "LLVMConstRealGetDouble" constRealGetDouble
+    :: ValueRef -> (Ptr LLVM.Bool) -> IO CDouble
+
+foreign import ccall unsafe "LLVMConstStringInContext" constStringInContext
+    :: ContextRef -> CString -> CUInt -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstString" constString
+    :: CString -> CUInt -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMIsConstantString" isConstantString
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMGetAsString" getAsString
+    :: ValueRef -> (Ptr CSize) -> IO CString
+
+foreign import ccall unsafe "LLVMConstStructInContext" constStructInContext
+    :: ContextRef -> (Ptr ValueRef) -> CUInt -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstStruct" constStruct
+    :: (Ptr ValueRef) -> CUInt -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstArray" constArray
+    :: TypeRef -> (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNamedStruct" constNamedStruct
+    :: TypeRef -> (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetElementAsConstant" getElementAsConstant
+    :: ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstVector" constVector
+    :: (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetConstOpcode" getConstOpcode
+    :: ValueRef -> IO Opcode
+
+foreign import ccall unsafe "LLVMAlignOf" alignOf
+    :: TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSizeOf" sizeOf
+    :: TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNeg" constNeg
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNSWNeg" constNSWNeg
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNUWNeg" constNUWNeg
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFNeg" constFNeg
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNot" constNot
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstAdd" constAdd
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNSWAdd" constNSWAdd
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNUWAdd" constNUWAdd
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFAdd" constFAdd
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstSub" constSub
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNSWSub" constNSWSub
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNUWSub" constNUWSub
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFSub" constFSub
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstMul" constMul
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNSWMul" constNSWMul
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNUWMul" constNUWMul
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFMul" constFMul
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstUDiv" constUDiv
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstExactUDiv" constExactUDiv
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstSDiv" constSDiv
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstExactSDiv" constExactSDiv
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFDiv" constFDiv
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstURem" constURem
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstSRem" constSRem
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFRem" constFRem
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstAnd" constAnd
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstOr" constOr
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstXor" constXor
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstICmp" constICmp
+    :: IntPredicate -> ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFCmp" constFCmp
+    :: RealPredicate -> ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstShl" constShl
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstLShr" constLShr
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstAShr" constAShr
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstGEP" constGEP
+    :: ValueRef -> (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstInBoundsGEP" constInBoundsGEP
+    :: ValueRef -> (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstTrunc" constTrunc
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstSExt" constSExt
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstZExt" constZExt
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFPTrunc" constFPTrunc
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFPExt" constFPExt
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstUIToFP" constUIToFP
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstSIToFP" constSIToFP
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFPToUI" constFPToUI
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFPToSI" constFPToSI
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstPtrToInt" constPtrToInt
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstIntToPtr" constIntToPtr
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstBitCast" constBitCast
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstAddrSpaceCast" constAddrSpaceCast
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstZExtOrBitCast" constZExtOrBitCast
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstSExtOrBitCast" constSExtOrBitCast
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstTruncOrBitCast" constTruncOrBitCast
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstPointerCast" constPointerCast
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstIntCast" constIntCast
+    :: ValueRef -> TypeRef -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFPCast" constFPCast
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstSelect" constSelect
+    :: ValueRef -> ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstExtractElement" constExtractElement
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstInsertElement" constInsertElement
+    :: ValueRef -> ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstShuffleVector" constShuffleVector
+    :: ValueRef -> ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstExtractValue" constExtractValue
+    :: ValueRef -> (Ptr CUInt) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstInsertValue" constInsertValue
+    :: ValueRef -> ValueRef -> (Ptr CUInt) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBlockAddress" blockAddress
+    :: ValueRef -> BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstInlineAsm" constInlineAsm
+    :: TypeRef -> CString -> CString -> LLVM.Bool -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetGlobalParent" getGlobalParent
+    :: ValueRef -> IO ModuleRef
+
+foreign import ccall unsafe "LLVMIsDeclaration" isDeclaration
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMGetLinkage" getLinkage
+    :: ValueRef -> IO Linkage
+
+foreign import ccall unsafe "LLVMSetLinkage" setLinkage
+    :: ValueRef -> Linkage -> IO ()
+
+foreign import ccall unsafe "LLVMGetSection" getSection
+    :: ValueRef -> IO CString
+
+foreign import ccall unsafe "LLVMSetSection" setSection
+    :: ValueRef -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMGetVisibility" getVisibility
+    :: ValueRef -> IO Visibility
+
+foreign import ccall unsafe "LLVMSetVisibility" setVisibility
+    :: ValueRef -> Visibility -> IO ()
+
+foreign import ccall unsafe "LLVMGetDLLStorageClass" getDLLStorageClass
+    :: ValueRef -> IO DLLStorageClass
+
+foreign import ccall unsafe "LLVMSetDLLStorageClass" setDLLStorageClass
+    :: ValueRef -> DLLStorageClass -> IO ()
+
+foreign import ccall unsafe "LLVMGetUnnamedAddress" getUnnamedAddress
+    :: ValueRef -> IO UnnamedAddr
+
+foreign import ccall unsafe "LLVMSetUnnamedAddress" setUnnamedAddress
+    :: ValueRef -> UnnamedAddr -> IO ()
+
+foreign import ccall unsafe "LLVMGlobalGetValueType" globalGetValueType
+    :: ValueRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMHasUnnamedAddr" hasUnnamedAddr
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetUnnamedAddr" setUnnamedAddr
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMGetAlignment" getAlignment
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMSetAlignment" setAlignment
+    :: ValueRef -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMGlobalSetMetadata" globalSetMetadata
+    :: ValueRef -> CUInt -> MetadataRef -> IO ()
+
+foreign import ccall unsafe "LLVMGlobalEraseMetadata" globalEraseMetadata
+    :: ValueRef -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMGlobalClearMetadata" globalClearMetadata
+    :: ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMGlobalCopyAllMetadata" globalCopyAllMetadata
+    :: ValueRef -> (Ptr CSize) -> IO (Ptr ValueMetadataEntry)
+
+foreign import ccall unsafe "LLVMDisposeValueMetadataEntries" disposeValueMetadataEntries
+    :: (Ptr ValueMetadataEntry) -> IO ()
+
+foreign import ccall unsafe "LLVMValueMetadataEntriesGetKind" valueMetadataEntriesGetKind
+    :: (Ptr ValueMetadataEntry) -> CUInt -> IO CUInt
+
+foreign import ccall unsafe "LLVMValueMetadataEntriesGetMetadata" valueMetadataEntriesGetMetadata
+    :: (Ptr ValueMetadataEntry) -> CUInt -> IO MetadataRef
+
+foreign import ccall unsafe "LLVMAddGlobal" addGlobal
+    :: ModuleRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMAddGlobalInAddressSpace" addGlobalInAddressSpace
+    :: ModuleRef -> TypeRef -> CString -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetNamedGlobal" getNamedGlobal
+    :: ModuleRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetFirstGlobal" getFirstGlobal
+    :: ModuleRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetLastGlobal" getLastGlobal
+    :: ModuleRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetNextGlobal" getNextGlobal
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetPreviousGlobal" getPreviousGlobal
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMDeleteGlobal" deleteGlobal
+    :: ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetInitializer" getInitializer
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSetInitializer" setInitializer
+    :: ValueRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMIsThreadLocal" isThreadLocal
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetThreadLocal" setThreadLocal
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMIsGlobalConstant" isGlobalConstant
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetGlobalConstant" setGlobalConstant
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMGetThreadLocalMode" getThreadLocalMode
+    :: ValueRef -> IO ThreadLocalMode
+
+foreign import ccall unsafe "LLVMSetThreadLocalMode" setThreadLocalMode
+    :: ValueRef -> ThreadLocalMode -> IO ()
+
+foreign import ccall unsafe "LLVMIsExternallyInitialized" isExternallyInitialized
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetExternallyInitialized" setExternallyInitialized
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMAddAlias" addAlias
+    :: ModuleRef -> TypeRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetNamedGlobalAlias" getNamedGlobalAlias
+    :: ModuleRef -> CString -> CSize -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetFirstGlobalAlias" getFirstGlobalAlias
+    :: ModuleRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetLastGlobalAlias" getLastGlobalAlias
+    :: ModuleRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetNextGlobalAlias" getNextGlobalAlias
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetPreviousGlobalAlias" getPreviousGlobalAlias
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMAliasGetAliasee" aliasGetAliasee
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMAliasSetAliasee" aliasSetAliasee
+    :: ValueRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMDeleteFunction" deleteFunction
+    :: ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMHasPersonalityFn" hasPersonalityFn
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMGetPersonalityFn" getPersonalityFn
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSetPersonalityFn" setPersonalityFn
+    :: ValueRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetIntrinsicID" getIntrinsicID
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetIntrinsicDeclaration" getIntrinsicDeclaration
+    :: ModuleRef -> CUInt -> (Ptr TypeRef) -> CSize -> IO ValueRef
+
+foreign import ccall unsafe "LLVMIntrinsicGetType" intrinsicGetType
+    :: ContextRef -> CUInt -> (Ptr TypeRef) -> CSize -> IO TypeRef
+
+foreign import ccall unsafe "LLVMIntrinsicGetName" intrinsicGetName
+    :: CUInt -> (Ptr CSize) -> IO CString
+
+foreign import ccall unsafe "LLVMIntrinsicCopyOverloadedName" intrinsicCopyOverloadedName
+    :: CUInt -> (Ptr TypeRef) -> CSize -> (Ptr CSize) -> IO CString
+
+foreign import ccall unsafe "LLVMIntrinsicIsOverloaded" intrinsicIsOverloaded
+    :: CUInt -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMGetFunctionCallConv" getFunctionCallConv
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMSetFunctionCallConv" setFunctionCallConv
+    :: ValueRef -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMGetGC" getGC
+    :: ValueRef -> IO CString
+
+foreign import ccall unsafe "LLVMSetGC" setGC
+    :: ValueRef -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMAddAttributeAtIndex" addAttributeAtIndex
+    :: ValueRef -> AttributeIndex -> AttributeRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetAttributeCountAtIndex" getAttributeCountAtIndex
+    :: ValueRef -> AttributeIndex -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetAttributesAtIndex" getAttributesAtIndex
+    :: ValueRef -> AttributeIndex -> (Ptr AttributeRef) -> IO ()
+
+foreign import ccall unsafe "LLVMGetEnumAttributeAtIndex" getEnumAttributeAtIndex
+    :: ValueRef -> AttributeIndex -> CUInt -> IO AttributeRef
+
+foreign import ccall unsafe "LLVMGetStringAttributeAtIndex" getStringAttributeAtIndex
+    :: ValueRef -> AttributeIndex -> CString -> CUInt -> IO AttributeRef
+
+foreign import ccall unsafe "LLVMRemoveEnumAttributeAtIndex" removeEnumAttributeAtIndex
+    :: ValueRef -> AttributeIndex -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMRemoveStringAttributeAtIndex" removeStringAttributeAtIndex
+    :: ValueRef -> AttributeIndex -> CString -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMAddTargetDependentFunctionAttr" addTargetDependentFunctionAttr
+    :: ValueRef -> CString -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMCountParams" countParams
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetParams" getParams
+    :: ValueRef -> (Ptr ValueRef) -> IO ()
+
+foreign import ccall unsafe "LLVMGetParam" getParam
+    :: ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetParamParent" getParamParent
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetFirstParam" getFirstParam
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetLastParam" getLastParam
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetNextParam" getNextParam
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetPreviousParam" getPreviousParam
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSetParamAlignment" setParamAlignment
+    :: ValueRef -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMMDStringInContext" mDStringInContext
+    :: ContextRef -> CString -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMMDString" mDString
+    :: CString -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMMDNodeInContext" mDNodeInContext
+    :: ContextRef -> (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMMDNode" mDNode
+    :: (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMMetadataAsValue" metadataAsValue
+    :: ContextRef -> MetadataRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMValueAsMetadata" valueAsMetadata
+    :: ValueRef -> IO MetadataRef
+
+foreign import ccall unsafe "LLVMGetMDString" getMDString
+    :: ValueRef -> (Ptr CUInt) -> IO CString
+
+foreign import ccall unsafe "LLVMGetMDNodeNumOperands" getMDNodeNumOperands
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetMDNodeOperands" getMDNodeOperands
+    :: ValueRef -> (Ptr ValueRef) -> IO ()
+
+foreign import ccall unsafe "LLVMBasicBlockAsValue" basicBlockAsValue
+    :: BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMValueIsBasicBlock" valueIsBasicBlock
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMValueAsBasicBlock" valueAsBasicBlock
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetBasicBlockName" getBasicBlockName
+    :: BasicBlockRef -> IO CString
+
+foreign import ccall unsafe "LLVMGetBasicBlockParent" getBasicBlockParent
+    :: BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetBasicBlockTerminator" getBasicBlockTerminator
+    :: BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMCountBasicBlocks" countBasicBlocks
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetBasicBlocks" getBasicBlocks
+    :: ValueRef -> (Ptr BasicBlockRef) -> IO ()
+
+foreign import ccall unsafe "LLVMGetFirstBasicBlock" getFirstBasicBlock
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetLastBasicBlock" getLastBasicBlock
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetNextBasicBlock" getNextBasicBlock
+    :: BasicBlockRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetPreviousBasicBlock" getPreviousBasicBlock
+    :: BasicBlockRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetEntryBasicBlock" getEntryBasicBlock
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMCreateBasicBlockInContext" createBasicBlockInContext
+    :: ContextRef -> CString -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMAppendBasicBlockInContext" appendBasicBlockInContext
+    :: ContextRef -> ValueRef -> CString -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMAppendBasicBlock" appendBasicBlock
+    :: ValueRef -> CString -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMInsertBasicBlockInContext" insertBasicBlockInContext
+    :: ContextRef -> BasicBlockRef -> CString -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMInsertBasicBlock" insertBasicBlock
+    :: BasicBlockRef -> CString -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMDeleteBasicBlock" deleteBasicBlock
+    :: BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMRemoveBasicBlockFromParent" removeBasicBlockFromParent
+    :: BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMMoveBasicBlockBefore" moveBasicBlockBefore
+    :: BasicBlockRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMMoveBasicBlockAfter" moveBasicBlockAfter
+    :: BasicBlockRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetFirstInstruction" getFirstInstruction
+    :: BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetLastInstruction" getLastInstruction
+    :: BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMHasMetadata" hasMetadata
+    :: ValueRef -> IO CInt
+
+foreign import ccall unsafe "LLVMGetMetadata" getMetadata
+    :: ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSetMetadata" setMetadata
+    :: ValueRef -> CUInt -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMInstructionGetAllMetadataOtherThanDebugLoc" instructionGetAllMetadataOtherThanDebugLoc
+    :: ValueRef -> (Ptr CSize) -> IO (Ptr ValueMetadataEntry)
+
+foreign import ccall unsafe "LLVMGetInstructionParent" getInstructionParent
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetNextInstruction" getNextInstruction
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetPreviousInstruction" getPreviousInstruction
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMInstructionRemoveFromParent" instructionRemoveFromParent
+    :: ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMInstructionEraseFromParent" instructionEraseFromParent
+    :: ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetInstructionOpcode" getInstructionOpcode
+    :: ValueRef -> IO Opcode
+
+foreign import ccall unsafe "LLVMGetICmpPredicate" getICmpPredicate
+    :: ValueRef -> IO IntPredicate
+
+foreign import ccall unsafe "LLVMGetFCmpPredicate" getFCmpPredicate
+    :: ValueRef -> IO RealPredicate
+
+foreign import ccall unsafe "LLVMInstructionClone" instructionClone
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMIsATerminatorInst" isATerminatorInst
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetNumArgOperands" getNumArgOperands
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMSetInstructionCallConv" setInstructionCallConv
+    :: ValueRef -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMGetInstructionCallConv" getInstructionCallConv
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMSetInstrParamAlignment" setInstrParamAlignment
+    :: ValueRef -> CUInt -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMAddCallSiteAttribute" addCallSiteAttribute
+    :: ValueRef -> AttributeIndex -> AttributeRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetCallSiteAttributeCount" getCallSiteAttributeCount
+    :: ValueRef -> AttributeIndex -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetCallSiteAttributes" getCallSiteAttributes
+    :: ValueRef -> AttributeIndex -> (Ptr AttributeRef) -> IO ()
+
+foreign import ccall unsafe "LLVMGetCallSiteEnumAttribute" getCallSiteEnumAttribute
+    :: ValueRef -> AttributeIndex -> CUInt -> IO AttributeRef
+
+foreign import ccall unsafe "LLVMGetCallSiteStringAttribute" getCallSiteStringAttribute
+    :: ValueRef -> AttributeIndex -> CString -> CUInt -> IO AttributeRef
+
+foreign import ccall unsafe "LLVMRemoveCallSiteEnumAttribute" removeCallSiteEnumAttribute
+    :: ValueRef -> AttributeIndex -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMRemoveCallSiteStringAttribute" removeCallSiteStringAttribute
+    :: ValueRef -> AttributeIndex -> CString -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMGetCalledFunctionType" getCalledFunctionType
+    :: ValueRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetCalledValue" getCalledValue
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMIsTailCall" isTailCall
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetTailCall" setTailCall
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMGetNormalDest" getNormalDest
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetUnwindDest" getUnwindDest
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMSetNormalDest" setNormalDest
+    :: ValueRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMSetUnwindDest" setUnwindDest
+    :: ValueRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetNumSuccessors" getNumSuccessors
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetSuccessor" getSuccessor
+    :: ValueRef -> CUInt -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMSetSuccessor" setSuccessor
+    :: ValueRef -> CUInt -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMIsConditional" isConditional
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMGetCondition" getCondition
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSetCondition" setCondition
+    :: ValueRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetSwitchDefaultDest" getSwitchDefaultDest
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetAllocatedType" getAllocatedType
+    :: ValueRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMIsInBounds" isInBounds
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetIsInBounds" setIsInBounds
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMAddIncoming" addIncoming
+    :: ValueRef -> (Ptr ValueRef) -> (Ptr BasicBlockRef) -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMCountIncoming" countIncoming
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetIncomingValue" getIncomingValue
+    :: ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetIncomingBlock" getIncomingBlock
+    :: ValueRef -> CUInt -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetNumIndices" getNumIndices
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetIndices" getIndices
+    :: ValueRef -> IO (Ptr CUInt)
+
+foreign import ccall unsafe "LLVMCreateBuilderInContext" createBuilderInContext
+    :: ContextRef -> IO BuilderRef
+
+foreign import ccall unsafe "LLVMCreateBuilder" createBuilder
+    :: IO BuilderRef
+
+foreign import ccall unsafe "LLVMPositionBuilder" positionBuilder
+    :: BuilderRef -> BasicBlockRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMPositionBuilderBefore" positionBuilderBefore
+    :: BuilderRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMPositionBuilderAtEnd" positionBuilderAtEnd
+    :: BuilderRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetInsertBlock" getInsertBlock
+    :: BuilderRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMClearInsertionPosition" clearInsertionPosition
+    :: BuilderRef -> IO ()
+
+foreign import ccall unsafe "LLVMInsertIntoBuilder" insertIntoBuilder
+    :: BuilderRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMInsertIntoBuilderWithName" insertIntoBuilderWithName
+    :: BuilderRef -> ValueRef -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMDisposeBuilder" disposeBuilder
+    :: BuilderRef -> IO ()
+
+foreign import ccall unsafe "LLVMSetCurrentDebugLocation" setCurrentDebugLocation
+    :: BuilderRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetCurrentDebugLocation" getCurrentDebugLocation
+    :: BuilderRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSetInstDebugLocation" setInstDebugLocation
+    :: BuilderRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMBuildRetVoid" buildRetVoid
+    :: BuilderRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildRet" buildRet
+    :: BuilderRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildAggregateRet" buildAggregateRet
+    :: BuilderRef -> (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildBr" buildBr
+    :: BuilderRef -> BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildCondBr" buildCondBr
+    :: BuilderRef -> ValueRef -> BasicBlockRef -> BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSwitch" buildSwitch
+    :: BuilderRef -> ValueRef -> BasicBlockRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildIndirectBr" buildIndirectBr
+    :: BuilderRef -> ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildInvoke" buildInvoke
+    :: BuilderRef -> ValueRef -> (Ptr ValueRef) -> CUInt -> BasicBlockRef -> BasicBlockRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildInvoke2" buildInvoke2
+    :: BuilderRef -> TypeRef -> ValueRef -> (Ptr ValueRef) -> CUInt -> BasicBlockRef -> BasicBlockRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildUnreachable" buildUnreachable
+    :: BuilderRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildResume" buildResume
+    :: BuilderRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildLandingPad" buildLandingPad
+    :: BuilderRef -> TypeRef -> ValueRef -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildCleanupRet" buildCleanupRet
+    :: BuilderRef -> ValueRef -> BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildCatchRet" buildCatchRet
+    :: BuilderRef -> ValueRef -> BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildCatchPad" buildCatchPad
+    :: BuilderRef -> ValueRef -> (Ptr ValueRef) -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildCleanupPad" buildCleanupPad
+    :: BuilderRef -> ValueRef -> (Ptr ValueRef) -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildCatchSwitch" buildCatchSwitch
+    :: BuilderRef -> ValueRef -> BasicBlockRef -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMAddCase" addCase
+    :: ValueRef -> ValueRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMAddDestination" addDestination
+    :: ValueRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetNumClauses" getNumClauses
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetClause" getClause
+    :: ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMAddClause" addClause
+    :: ValueRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMIsCleanup" isCleanup
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetCleanup" setCleanup
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMAddHandler" addHandler
+    :: ValueRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetNumHandlers" getNumHandlers
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetHandlers" getHandlers
+    :: ValueRef -> (Ptr BasicBlockRef) -> IO ()
+
+foreign import ccall unsafe "LLVMGetArgOperand" getArgOperand
+    :: ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSetArgOperand" setArgOperand
+    :: ValueRef -> CUInt -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetParentCatchSwitch" getParentCatchSwitch
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSetParentCatchSwitch" setParentCatchSwitch
+    :: ValueRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMBuildAdd" buildAdd
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNSWAdd" buildNSWAdd
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNUWAdd" buildNUWAdd
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFAdd" buildFAdd
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSub" buildSub
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNSWSub" buildNSWSub
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNUWSub" buildNUWSub
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFSub" buildFSub
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildMul" buildMul
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNSWMul" buildNSWMul
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNUWMul" buildNUWMul
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFMul" buildFMul
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildUDiv" buildUDiv
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildExactUDiv" buildExactUDiv
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSDiv" buildSDiv
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildExactSDiv" buildExactSDiv
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFDiv" buildFDiv
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildURem" buildURem
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSRem" buildSRem
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFRem" buildFRem
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildShl" buildShl
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildLShr" buildLShr
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildAShr" buildAShr
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildAnd" buildAnd
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildOr" buildOr
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildXor" buildXor
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildBinOp" buildBinOp
+    :: BuilderRef -> Opcode -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNeg" buildNeg
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNSWNeg" buildNSWNeg
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNUWNeg" buildNUWNeg
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFNeg" buildFNeg
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNot" buildNot
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildMalloc" buildMalloc
+    :: BuilderRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildArrayMalloc" buildArrayMalloc
+    :: BuilderRef -> TypeRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildMemSet" buildMemSet
+    :: BuilderRef -> ValueRef -> ValueRef -> ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildMemCpy" buildMemCpy
+    :: BuilderRef -> ValueRef -> CUInt -> ValueRef -> CUInt -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildMemMove" buildMemMove
+    :: BuilderRef -> ValueRef -> CUInt -> ValueRef -> CUInt -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildAlloca" buildAlloca
+    :: BuilderRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildArrayAlloca" buildArrayAlloca
+    :: BuilderRef -> TypeRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFree" buildFree
+    :: BuilderRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildLoad" buildLoad
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildLoad2" buildLoad2
+    :: BuilderRef -> TypeRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildStore" buildStore
+    :: BuilderRef -> ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildGEP" buildGEP
+    :: BuilderRef -> ValueRef -> (Ptr ValueRef) -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildInBoundsGEP" buildInBoundsGEP
+    :: BuilderRef -> ValueRef -> (Ptr ValueRef) -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildStructGEP" buildStructGEP
+    :: BuilderRef -> ValueRef -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildGEP2" buildGEP2
+    :: BuilderRef -> TypeRef -> ValueRef -> (Ptr ValueRef) -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildInBoundsGEP2" buildInBoundsGEP2
+    :: BuilderRef -> TypeRef -> ValueRef -> (Ptr ValueRef) -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildStructGEP2" buildStructGEP2
+    :: BuilderRef -> TypeRef -> ValueRef -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildGlobalString" buildGlobalString
+    :: BuilderRef -> CString -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildGlobalStringPtr" buildGlobalStringPtr
+    :: BuilderRef -> CString -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetVolatile" getVolatile
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetVolatile" setVolatile
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMGetOrdering" getOrdering
+    :: ValueRef -> IO AtomicOrdering
+
+foreign import ccall unsafe "LLVMSetOrdering" setOrdering
+    :: ValueRef -> AtomicOrdering -> IO ()
+
+foreign import ccall unsafe "LLVMBuildTrunc" buildTrunc
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildZExt" buildZExt
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSExt" buildSExt
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFPToUI" buildFPToUI
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFPToSI" buildFPToSI
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildUIToFP" buildUIToFP
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSIToFP" buildSIToFP
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFPTrunc" buildFPTrunc
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFPExt" buildFPExt
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildPtrToInt" buildPtrToInt
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildIntToPtr" buildIntToPtr
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildBitCast" buildBitCast
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildAddrSpaceCast" buildAddrSpaceCast
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildZExtOrBitCast" buildZExtOrBitCast
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSExtOrBitCast" buildSExtOrBitCast
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildTruncOrBitCast" buildTruncOrBitCast
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildCast" buildCast
+    :: BuilderRef -> Opcode -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildPointerCast" buildPointerCast
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildIntCast2" buildIntCast2
+    :: BuilderRef -> ValueRef -> TypeRef -> LLVM.Bool -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFPCast" buildFPCast
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildICmp" buildICmp
+    :: BuilderRef -> IntPredicate -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFCmp" buildFCmp
+    :: BuilderRef -> RealPredicate -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildPhi" buildPhi
+    :: BuilderRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildCall" buildCall
+    :: BuilderRef -> ValueRef -> (Ptr ValueRef) -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildCall2" buildCall2
+    :: BuilderRef -> TypeRef -> ValueRef -> (Ptr ValueRef) -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSelect" buildSelect
+    :: BuilderRef -> ValueRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildVAArg" buildVAArg
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildExtractElement" buildExtractElement
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildInsertElement" buildInsertElement
+    :: BuilderRef -> ValueRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildShuffleVector" buildShuffleVector
+    :: BuilderRef -> ValueRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildExtractValue" buildExtractValue
+    :: BuilderRef -> ValueRef -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildInsertValue" buildInsertValue
+    :: BuilderRef -> ValueRef -> ValueRef -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildIsNull" buildIsNull
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildIsNotNull" buildIsNotNull
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildPtrDiff" buildPtrDiff
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFence" buildFence
+    :: BuilderRef -> AtomicOrdering -> LLVM.Bool -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildAtomicRMW" buildAtomicRMW
+    :: BuilderRef -> AtomicRMWBinOp -> ValueRef -> ValueRef -> AtomicOrdering -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildAtomicCmpXchg" buildAtomicCmpXchg
+    :: BuilderRef -> ValueRef -> ValueRef -> ValueRef -> AtomicOrdering -> AtomicOrdering -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMIsAtomicSingleThread" isAtomicSingleThread
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetAtomicSingleThread" setAtomicSingleThread
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMGetCmpXchgSuccessOrdering" getCmpXchgSuccessOrdering
+    :: ValueRef -> IO AtomicOrdering
+
+foreign import ccall unsafe "LLVMSetCmpXchgSuccessOrdering" setCmpXchgSuccessOrdering
+    :: ValueRef -> AtomicOrdering -> IO ()
+
+foreign import ccall unsafe "LLVMGetCmpXchgFailureOrdering" getCmpXchgFailureOrdering
+    :: ValueRef -> IO AtomicOrdering
+
+foreign import ccall unsafe "LLVMSetCmpXchgFailureOrdering" setCmpXchgFailureOrdering
+    :: ValueRef -> AtomicOrdering -> IO ()
+
+foreign import ccall unsafe "LLVMCreateModuleProviderForExistingModule" createModuleProviderForExistingModule
+    :: ModuleRef -> IO ModuleProviderRef
+
+foreign import ccall unsafe "LLVMDisposeModuleProvider" disposeModuleProvider
+    :: ModuleProviderRef -> IO ()
+
+foreign import ccall unsafe "LLVMCreateMemoryBufferWithContentsOfFile" createMemoryBufferWithContentsOfFile
+    :: CString -> (Ptr MemoryBufferRef) -> (Ptr CString) -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMCreateMemoryBufferWithSTDIN" createMemoryBufferWithSTDIN
+    :: (Ptr MemoryBufferRef) -> (Ptr CString) -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMCreateMemoryBufferWithMemoryRange" createMemoryBufferWithMemoryRange
+    :: CString -> CSize -> CString -> LLVM.Bool -> IO MemoryBufferRef
+
+foreign import ccall unsafe "LLVMCreateMemoryBufferWithMemoryRangeCopy" createMemoryBufferWithMemoryRangeCopy
+    :: CString -> CSize -> CString -> IO MemoryBufferRef
+
+foreign import ccall unsafe "LLVMGetBufferStart" getBufferStart
+    :: MemoryBufferRef -> IO CString
+
+foreign import ccall unsafe "LLVMGetBufferSize" getBufferSize
+    :: MemoryBufferRef -> IO CSize
+
+foreign import ccall unsafe "LLVMDisposeMemoryBuffer" disposeMemoryBuffer
+    :: MemoryBufferRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetGlobalPassRegistry" getGlobalPassRegistry
+    :: IO PassRegistryRef
+
+foreign import ccall unsafe "LLVMCreatePassManager" createPassManager
+    :: IO PassManagerRef
+
+foreign import ccall unsafe "LLVMCreateFunctionPassManagerForModule" createFunctionPassManagerForModule
+    :: ModuleRef -> IO PassManagerRef
+
+foreign import ccall unsafe "LLVMCreateFunctionPassManager" createFunctionPassManager
+    :: ModuleProviderRef -> IO PassManagerRef
+
+foreign import ccall unsafe "LLVMRunPassManager" runPassManager
+    :: PassManagerRef -> ModuleRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMInitializeFunctionPassManager" initializeFunctionPassManager
+    :: PassManagerRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMRunFunctionPassManager" runFunctionPassManager
+    :: PassManagerRef -> ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMFinalizeFunctionPassManager" finalizeFunctionPassManager
+    :: PassManagerRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMDisposePassManager" disposePassManager
+    :: PassManagerRef -> IO ()
+
+foreign import ccall unsafe "LLVMStartMultithreaded" startMultithreaded
+    :: IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMStopMultithreaded" stopMultithreaded
+    :: IO ()
+
+foreign import ccall unsafe "LLVMIsMultithreaded" isMultithreaded
+    :: IO LLVM.Bool
diff --git a/src/9/LLVM/Raw/Core.hsc b/src/9/LLVM/Raw/Core.hsc
new file mode 100644
--- /dev/null
+++ b/src/9/LLVM/Raw/Core.hsc
@@ -0,0 +1,1924 @@
+{-# LANGUAGE Safe #-}
+{-# LANGUAGE ForeignFunctionInterface #-}
+{-# LANGUAGE EmptyDataDecls #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+module LLVM.Raw.Core where
+
+import qualified LLVM.FFI.Base as LLVM
+
+import qualified Foreign.C.Types as C
+import Foreign.C.String (CString)
+import Foreign.Ptr (Ptr, FunPtr)
+
+import Data.Typeable (Typeable)
+
+import Data.Word (Word8, Word32, Word64)
+
+
+type CDouble  = C.CDouble
+type CInt     = C.CInt
+type CUInt    = C.CUInt
+type CLLong   = C.CLLong
+type CULLong  = C.CULLong
+type CSize    = C.CSize
+
+
+#include <llvm/Config/llvm-config.h>
+#include <llvm-c/Core.h>
+
+
+data Module
+    deriving (Typeable)
+type ModuleRef = Ptr Module
+
+data ModuleProvider
+    deriving (Typeable)
+type ModuleProviderRef = Ptr ModuleProvider
+
+data Type
+    deriving (Typeable)
+type TypeRef = Ptr Type
+
+data BasicBlock
+    deriving (Typeable)
+type BasicBlockRef = Ptr BasicBlock
+
+data Value
+    deriving (Typeable)
+type ValueRef = Ptr Value
+
+data OpaqueUse
+    deriving (Typeable)
+type UseRef = Ptr OpaqueUse
+
+data Builder
+    deriving (Typeable)
+type BuilderRef = Ptr Builder
+
+data MemoryBuffer
+    deriving (Typeable)
+type MemoryBufferRef = Ptr MemoryBuffer
+
+data PassManager
+    deriving (Typeable)
+type PassManagerRef = Ptr PassManager
+
+data PassRegistry
+    deriving (Typeable)
+type PassRegistryRef = Ptr PassRegistry
+
+data Context
+    deriving (Typeable)
+type ContextRef = Ptr Context
+
+{-
+data Attribute
+    deriving (Typeable)
+-}
+-- until 3.9
+newtype Attribute = Attribute Word32
+type AttributeRef = Ptr Attribute
+
+newtype AttributeIndex = AttributeIndex #{type LLVMAttributeIndex}
+
+attributeReturnIndex, attributeFunctionIndex :: AttributeIndex
+attributeReturnIndex   = AttributeIndex (#const LLVMAttributeReturnIndex)
+attributeFunctionIndex = AttributeIndex (#const LLVMAttributeFunctionIndex)
+
+
+data Metadata
+    deriving (Typeable)
+type MetadataRef = Ptr Metadata
+
+data DiagnosticInfo
+    deriving (Typeable)
+type DiagnosticInfoRef = Ptr DiagnosticInfo
+
+data NamedMDNode
+    deriving (Typeable)
+type NamedMDNodeRef = Ptr NamedMDNode
+
+
+data ModuleFlagEntry
+    deriving (Typeable)
+data ValueMetadataEntry
+    deriving (Typeable)
+
+type DiagnosticHandler = FunPtr (DiagnosticInfoRef -> Ptr () -> IO ())
+type YieldCallback = FunPtr (ContextRef -> Ptr () -> IO ())
+
+newtype CallingConvention = CallingConvention {unCallingConvention :: CUInt}
+
+newtype AtomicOrdering = AtomicOrdering #{type LLVMAtomicOrdering}
+newtype AtomicRMWBinOp = AtomicRMWBinOp #{type LLVMAtomicRMWBinOp}
+newtype DiagnosticSeverity = DiagnosticSeverity #{type LLVMDiagnosticSeverity}
+newtype DLLStorageClass = DLLStorageClass #{type LLVMDLLStorageClass}
+-- newtype InlineAsmDialect = InlineAsmDialect #{type LLVMInlineAsmDialect}
+newtype InlineAsmDialect = InlineAsmDialect Word32
+newtype IntPredicate = IntPredicate #{type LLVMIntPredicate}
+newtype Linkage = Linkage #{type LLVMLinkage}
+-- newtype ModuleFlagBehavior = ModuleFlagBehavior #{type LLVMModuleFlagBehavior}
+newtype ModuleFlagBehavior = ModuleFlagBehavior Word32
+newtype Opcode = Opcode #{type LLVMOpcode}
+newtype RealPredicate = RealPredicate #{type LLVMRealPredicate}
+newtype ThreadLocalMode = ThreadLocalMode #{type LLVMThreadLocalMode}
+newtype TypeKind = TypeKind {unTypeKind :: #{type LLVMTypeKind}}
+-- newtype UnnamedAddr = UnnamedAddr #{type LLVMUnnamedAddr}
+newtype UnnamedAddr = UnnamedAddr Word32
+newtype ValueKind = ValueKind #{type LLVMValueKind}
+newtype Visibility = Visibility #{type LLVMVisibility}
+
+
+foreign import ccall unsafe "LLVMInitializeCore" initializeCore
+    :: PassRegistryRef -> IO ()
+
+foreign import ccall unsafe "LLVMShutdown" shutdown
+    :: IO ()
+
+foreign import ccall unsafe "LLVMCreateMessage" createMessage
+    :: CString -> IO CString
+
+foreign import ccall unsafe "LLVMDisposeMessage" disposeMessage
+    :: CString -> IO ()
+
+foreign import ccall unsafe "LLVMContextCreate" contextCreate
+    :: IO ContextRef
+
+foreign import ccall unsafe "LLVMGetGlobalContext" getGlobalContext
+    :: IO ContextRef
+
+foreign import ccall unsafe "LLVMContextSetDiagnosticHandler" contextSetDiagnosticHandler
+    :: ContextRef -> DiagnosticHandler -> (Ptr ()) -> IO ()
+
+foreign import ccall unsafe "LLVMContextGetDiagnosticHandler" contextGetDiagnosticHandler
+    :: ContextRef -> IO DiagnosticHandler
+
+foreign import ccall unsafe "LLVMContextGetDiagnosticContext" contextGetDiagnosticContext
+    :: ContextRef -> IO (Ptr ())
+
+foreign import ccall unsafe "LLVMContextSetYieldCallback" contextSetYieldCallback
+    :: ContextRef -> YieldCallback -> (Ptr ()) -> IO ()
+
+foreign import ccall unsafe "LLVMContextShouldDiscardValueNames" contextShouldDiscardValueNames
+    :: ContextRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMContextSetDiscardValueNames" contextSetDiscardValueNames
+    :: ContextRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMContextDispose" contextDispose
+    :: ContextRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetDiagInfoDescription" getDiagInfoDescription
+    :: DiagnosticInfoRef -> IO CString
+
+foreign import ccall unsafe "LLVMGetDiagInfoSeverity" getDiagInfoSeverity
+    :: DiagnosticInfoRef -> IO DiagnosticSeverity
+
+foreign import ccall unsafe "LLVMGetMDKindIDInContext" getMDKindIDInContext
+    :: ContextRef -> CString -> CUInt -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetMDKindID" getMDKindID
+    :: CString -> CUInt -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetEnumAttributeKindForName" getEnumAttributeKindForName
+    :: CString -> CSize -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetLastEnumAttributeKind" getLastEnumAttributeKind
+    :: IO CUInt
+
+foreign import ccall unsafe "LLVMCreateEnumAttribute" createEnumAttribute
+    :: ContextRef -> CUInt -> Word64 -> IO AttributeRef
+
+foreign import ccall unsafe "LLVMGetEnumAttributeKind" getEnumAttributeKind
+    :: AttributeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetEnumAttributeValue" getEnumAttributeValue
+    :: AttributeRef -> IO Word64
+
+foreign import ccall unsafe "LLVMCreateStringAttribute" createStringAttribute
+    :: ContextRef -> CString -> CUInt -> CString -> CUInt -> IO AttributeRef
+
+foreign import ccall unsafe "LLVMGetStringAttributeKind" getStringAttributeKind
+    :: AttributeRef -> (Ptr CUInt) -> IO CString
+
+foreign import ccall unsafe "LLVMGetStringAttributeValue" getStringAttributeValue
+    :: AttributeRef -> (Ptr CUInt) -> IO CString
+
+foreign import ccall unsafe "LLVMIsEnumAttribute" isEnumAttribute
+    :: AttributeRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMIsStringAttribute" isStringAttribute
+    :: AttributeRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMModuleCreateWithName" moduleCreateWithName
+    :: CString -> IO ModuleRef
+
+foreign import ccall unsafe "LLVMModuleCreateWithNameInContext" moduleCreateWithNameInContext
+    :: CString -> ContextRef -> IO ModuleRef
+
+foreign import ccall unsafe "LLVMCloneModule" cloneModule
+    :: ModuleRef -> IO ModuleRef
+
+foreign import ccall unsafe "LLVMDisposeModule" disposeModule
+    :: ModuleRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetModuleIdentifier" getModuleIdentifier
+    :: ModuleRef -> (Ptr CSize) -> IO CString
+
+foreign import ccall unsafe "LLVMSetModuleIdentifier" setModuleIdentifier
+    :: ModuleRef -> CString -> CSize -> IO ()
+
+foreign import ccall unsafe "LLVMGetSourceFileName" getSourceFileName
+    :: ModuleRef -> (Ptr CSize) -> IO CString
+
+foreign import ccall unsafe "LLVMSetSourceFileName" setSourceFileName
+    :: ModuleRef -> CString -> CSize -> IO ()
+
+foreign import ccall unsafe "LLVMGetDataLayoutStr" getDataLayoutStr
+    :: ModuleRef -> IO CString
+
+foreign import ccall unsafe "LLVMGetDataLayout" getDataLayout
+    :: ModuleRef -> IO CString
+
+foreign import ccall unsafe "LLVMSetDataLayout" setDataLayout
+    :: ModuleRef -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMGetTarget" getTarget
+    :: ModuleRef -> IO CString
+
+foreign import ccall unsafe "LLVMSetTarget" setTarget
+    :: ModuleRef -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMCopyModuleFlagsMetadata" copyModuleFlagsMetadata
+    :: ModuleRef -> (Ptr CSize) -> IO (Ptr ModuleFlagEntry)
+
+foreign import ccall unsafe "LLVMDisposeModuleFlagsMetadata" disposeModuleFlagsMetadata
+    :: (Ptr ModuleFlagEntry) -> IO ()
+
+foreign import ccall unsafe "LLVMModuleFlagEntriesGetFlagBehavior" moduleFlagEntriesGetFlagBehavior
+    :: (Ptr ModuleFlagEntry) -> CUInt -> IO ModuleFlagBehavior
+
+foreign import ccall unsafe "LLVMModuleFlagEntriesGetKey" moduleFlagEntriesGetKey
+    :: (Ptr ModuleFlagEntry) -> CUInt -> (Ptr CSize) -> IO CString
+
+foreign import ccall unsafe "LLVMModuleFlagEntriesGetMetadata" moduleFlagEntriesGetMetadata
+    :: (Ptr ModuleFlagEntry) -> CUInt -> IO MetadataRef
+
+foreign import ccall unsafe "LLVMGetModuleFlag" getModuleFlag
+    :: ModuleRef -> CString -> CSize -> IO MetadataRef
+
+foreign import ccall unsafe "LLVMAddModuleFlag" addModuleFlag
+    :: ModuleRef -> ModuleFlagBehavior -> CString -> CSize -> MetadataRef -> IO ()
+
+foreign import ccall unsafe "LLVMDumpModule" dumpModule
+    :: ModuleRef -> IO ()
+
+foreign import ccall unsafe "LLVMPrintModuleToFile" printModuleToFile
+    :: ModuleRef -> CString -> (Ptr CString) -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMPrintModuleToString" printModuleToString
+    :: ModuleRef -> IO CString
+
+foreign import ccall unsafe "LLVMGetModuleInlineAsm" getModuleInlineAsm
+    :: ModuleRef -> (Ptr CSize) -> IO CString
+
+foreign import ccall unsafe "LLVMSetModuleInlineAsm2" setModuleInlineAsm2
+    :: ModuleRef -> CString -> CSize -> IO ()
+
+foreign import ccall unsafe "LLVMAppendModuleInlineAsm" appendModuleInlineAsm
+    :: ModuleRef -> CString -> CSize -> IO ()
+
+foreign import ccall unsafe "LLVMGetInlineAsm" getInlineAsm
+    :: TypeRef -> CString -> CSize -> CString -> CSize -> LLVM.Bool -> LLVM.Bool -> InlineAsmDialect -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetModuleContext" getModuleContext
+    :: ModuleRef -> IO ContextRef
+
+foreign import ccall unsafe "LLVMGetTypeByName" getTypeByName
+    :: ModuleRef -> CString -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetFirstNamedMetadata" getFirstNamedMetadata
+    :: ModuleRef -> IO NamedMDNodeRef
+
+foreign import ccall unsafe "LLVMGetLastNamedMetadata" getLastNamedMetadata
+    :: ModuleRef -> IO NamedMDNodeRef
+
+foreign import ccall unsafe "LLVMGetNextNamedMetadata" getNextNamedMetadata
+    :: NamedMDNodeRef -> IO NamedMDNodeRef
+
+foreign import ccall unsafe "LLVMGetPreviousNamedMetadata" getPreviousNamedMetadata
+    :: NamedMDNodeRef -> IO NamedMDNodeRef
+
+foreign import ccall unsafe "LLVMGetNamedMetadata" getNamedMetadata
+    :: ModuleRef -> CString -> CSize -> IO NamedMDNodeRef
+
+foreign import ccall unsafe "LLVMGetOrInsertNamedMetadata" getOrInsertNamedMetadata
+    :: ModuleRef -> CString -> CSize -> IO NamedMDNodeRef
+
+foreign import ccall unsafe "LLVMGetNamedMetadataName" getNamedMetadataName
+    :: NamedMDNodeRef -> (Ptr CSize) -> IO CString
+
+foreign import ccall unsafe "LLVMGetNamedMetadataNumOperands" getNamedMetadataNumOperands
+    :: ModuleRef -> CString -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetNamedMetadataOperands" getNamedMetadataOperands
+    :: ModuleRef -> CString -> (Ptr ValueRef) -> IO ()
+
+foreign import ccall unsafe "LLVMAddNamedMetadataOperand" addNamedMetadataOperand
+    :: ModuleRef -> CString -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetDebugLocDirectory" getDebugLocDirectory
+    :: ValueRef -> (Ptr CUInt) -> IO CString
+
+foreign import ccall unsafe "LLVMGetDebugLocFilename" getDebugLocFilename
+    :: ValueRef -> (Ptr CUInt) -> IO CString
+
+foreign import ccall unsafe "LLVMGetDebugLocLine" getDebugLocLine
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetDebugLocColumn" getDebugLocColumn
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMAddFunction" addFunction
+    :: ModuleRef -> CString -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetNamedFunction" getNamedFunction
+    :: ModuleRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetFirstFunction" getFirstFunction
+    :: ModuleRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetLastFunction" getLastFunction
+    :: ModuleRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetNextFunction" getNextFunction
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetPreviousFunction" getPreviousFunction
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSetModuleInlineAsm" setModuleInlineAsm
+    :: ModuleRef -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMGetTypeKind" getTypeKind
+    :: TypeRef -> IO TypeKind
+
+foreign import ccall unsafe "LLVMTypeIsSized" typeIsSized
+    :: TypeRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMGetTypeContext" getTypeContext
+    :: TypeRef -> IO ContextRef
+
+foreign import ccall unsafe "LLVMPrintTypeToString" printTypeToString
+    :: TypeRef -> IO CString
+
+foreign import ccall unsafe "LLVMInt1TypeInContext" int1TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMInt8TypeInContext" int8TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMInt16TypeInContext" int16TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMInt32TypeInContext" int32TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMInt64TypeInContext" int64TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMInt128TypeInContext" int128TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMIntTypeInContext" intTypeInContext
+    :: ContextRef -> CUInt -> IO TypeRef
+
+foreign import ccall unsafe "LLVMInt1Type" int1Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMInt8Type" int8Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMInt16Type" int16Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMInt32Type" int32Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMInt64Type" int64Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMInt128Type" int128Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMIntType" intType
+    :: CUInt -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetIntTypeWidth" getIntTypeWidth
+    :: TypeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMHalfTypeInContext" halfTypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMFloatTypeInContext" floatTypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMDoubleTypeInContext" doubleTypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMX86FP80TypeInContext" x86FP80TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMFP128TypeInContext" fP128TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMPPCFP128TypeInContext" pPCFP128TypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMHalfType" halfType
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMFloatType" floatType
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMDoubleType" doubleType
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMX86FP80Type" x86FP80Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMFP128Type" fP128Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMPPCFP128Type" pPCFP128Type
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMFunctionType" functionType
+    :: TypeRef -> (Ptr TypeRef) -> CUInt -> LLVM.Bool -> IO TypeRef
+
+foreign import ccall unsafe "LLVMIsFunctionVarArg" isFunctionVarArg
+    :: TypeRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMGetReturnType" getReturnType
+    :: TypeRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMCountParamTypes" countParamTypes
+    :: TypeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetParamTypes" getParamTypes
+    :: TypeRef -> (Ptr TypeRef) -> IO ()
+
+foreign import ccall unsafe "LLVMStructTypeInContext" structTypeInContext
+    :: ContextRef -> (Ptr TypeRef) -> CUInt -> LLVM.Bool -> IO TypeRef
+
+foreign import ccall unsafe "LLVMStructType" structType
+    :: (Ptr TypeRef) -> CUInt -> LLVM.Bool -> IO TypeRef
+
+foreign import ccall unsafe "LLVMStructCreateNamed" structCreateNamed
+    :: ContextRef -> CString -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetStructName" getStructName
+    :: TypeRef -> IO CString
+
+foreign import ccall unsafe "LLVMStructSetBody" structSetBody
+    :: TypeRef -> (Ptr TypeRef) -> CUInt -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMCountStructElementTypes" countStructElementTypes
+    :: TypeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetStructElementTypes" getStructElementTypes
+    :: TypeRef -> (Ptr TypeRef) -> IO ()
+
+foreign import ccall unsafe "LLVMStructGetTypeAtIndex" structGetTypeAtIndex
+    :: TypeRef -> CUInt -> IO TypeRef
+
+foreign import ccall unsafe "LLVMIsPackedStruct" isPackedStruct
+    :: TypeRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMIsOpaqueStruct" isOpaqueStruct
+    :: TypeRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMIsLiteralStruct" isLiteralStruct
+    :: TypeRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMGetElementType" getElementType
+    :: TypeRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetSubtypes" getSubtypes
+    :: TypeRef -> (Ptr TypeRef) -> IO ()
+
+foreign import ccall unsafe "LLVMGetNumContainedTypes" getNumContainedTypes
+    :: TypeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMArrayType" arrayType
+    :: TypeRef -> CUInt -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetArrayLength" getArrayLength
+    :: TypeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMPointerType" pointerType
+    :: TypeRef -> CUInt -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetPointerAddressSpace" getPointerAddressSpace
+    :: TypeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMVectorType" vectorType
+    :: TypeRef -> CUInt -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetVectorSize" getVectorSize
+    :: TypeRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMVoidTypeInContext" voidTypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMLabelTypeInContext" labelTypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMX86MMXTypeInContext" x86MMXTypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMTokenTypeInContext" tokenTypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMMetadataTypeInContext" metadataTypeInContext
+    :: ContextRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMVoidType" voidType
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMLabelType" labelType
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMX86MMXType" x86MMXType
+    :: IO TypeRef
+
+foreign import ccall unsafe "LLVMTypeOf" typeOf
+    :: ValueRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetValueKind" getValueKind
+    :: ValueRef -> IO ValueKind
+
+foreign import ccall unsafe "LLVMGetValueName2" getValueName2
+    :: ValueRef -> (Ptr CSize) -> IO CString
+
+foreign import ccall unsafe "LLVMSetValueName2" setValueName2
+    :: ValueRef -> CString -> CSize -> IO ()
+
+foreign import ccall unsafe "LLVMDumpValue" dumpValue
+    :: ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMPrintValueToString" printValueToString
+    :: ValueRef -> IO CString
+
+foreign import ccall unsafe "LLVMReplaceAllUsesWith" replaceAllUsesWith
+    :: ValueRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMIsConstant" isConstant
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMIsUndef" isUndef
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMIsAMDNode" isAMDNode
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMIsAMDString" isAMDString
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetValueName" getValueName
+    :: ValueRef -> IO CString
+
+foreign import ccall unsafe "LLVMSetValueName" setValueName
+    :: ValueRef -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMGetFirstUse" getFirstUse
+    :: ValueRef -> IO UseRef
+
+foreign import ccall unsafe "LLVMGetNextUse" getNextUse
+    :: UseRef -> IO UseRef
+
+foreign import ccall unsafe "LLVMGetUser" getUser
+    :: UseRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetUsedValue" getUsedValue
+    :: UseRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetOperand" getOperand
+    :: ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetOperandUse" getOperandUse
+    :: ValueRef -> CUInt -> IO UseRef
+
+foreign import ccall unsafe "LLVMSetOperand" setOperand
+    :: ValueRef -> CUInt -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetNumOperands" getNumOperands
+    :: ValueRef -> IO CInt
+
+foreign import ccall unsafe "LLVMConstNull" constNull
+    :: TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstAllOnes" constAllOnes
+    :: TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetUndef" getUndef
+    :: TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMIsNull" isNull
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMConstPointerNull" constPointerNull
+    :: TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstInt" constInt
+    :: TypeRef -> CULLong -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstIntOfArbitraryPrecision" constIntOfArbitraryPrecision
+    :: TypeRef -> CUInt -> Ptr Word64 -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstIntOfString" constIntOfString
+    :: TypeRef -> CString -> Word8 -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstIntOfStringAndSize" constIntOfStringAndSize
+    :: TypeRef -> CString -> CUInt -> Word8 -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstReal" constReal
+    :: TypeRef -> CDouble -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstRealOfString" constRealOfString
+    :: TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstRealOfStringAndSize" constRealOfStringAndSize
+    :: TypeRef -> CString -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstIntGetZExtValue" constIntGetZExtValue
+    :: ValueRef -> IO CULLong
+
+foreign import ccall unsafe "LLVMConstIntGetSExtValue" constIntGetSExtValue
+    :: ValueRef -> IO CLLong
+
+foreign import ccall unsafe "LLVMConstRealGetDouble" constRealGetDouble
+    :: ValueRef -> (Ptr LLVM.Bool) -> IO CDouble
+
+foreign import ccall unsafe "LLVMConstStringInContext" constStringInContext
+    :: ContextRef -> CString -> CUInt -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstString" constString
+    :: CString -> CUInt -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMIsConstantString" isConstantString
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMGetAsString" getAsString
+    :: ValueRef -> (Ptr CSize) -> IO CString
+
+foreign import ccall unsafe "LLVMConstStructInContext" constStructInContext
+    :: ContextRef -> (Ptr ValueRef) -> CUInt -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstStruct" constStruct
+    :: (Ptr ValueRef) -> CUInt -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstArray" constArray
+    :: TypeRef -> (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNamedStruct" constNamedStruct
+    :: TypeRef -> (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetElementAsConstant" getElementAsConstant
+    :: ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstVector" constVector
+    :: (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetConstOpcode" getConstOpcode
+    :: ValueRef -> IO Opcode
+
+foreign import ccall unsafe "LLVMAlignOf" alignOf
+    :: TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSizeOf" sizeOf
+    :: TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNeg" constNeg
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNSWNeg" constNSWNeg
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNUWNeg" constNUWNeg
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFNeg" constFNeg
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNot" constNot
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstAdd" constAdd
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNSWAdd" constNSWAdd
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNUWAdd" constNUWAdd
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFAdd" constFAdd
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstSub" constSub
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNSWSub" constNSWSub
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNUWSub" constNUWSub
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFSub" constFSub
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstMul" constMul
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNSWMul" constNSWMul
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstNUWMul" constNUWMul
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFMul" constFMul
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstUDiv" constUDiv
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstExactUDiv" constExactUDiv
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstSDiv" constSDiv
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstExactSDiv" constExactSDiv
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFDiv" constFDiv
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstURem" constURem
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstSRem" constSRem
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFRem" constFRem
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstAnd" constAnd
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstOr" constOr
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstXor" constXor
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstICmp" constICmp
+    :: IntPredicate -> ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFCmp" constFCmp
+    :: RealPredicate -> ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstShl" constShl
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstLShr" constLShr
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstAShr" constAShr
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstGEP" constGEP
+    :: ValueRef -> (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstInBoundsGEP" constInBoundsGEP
+    :: ValueRef -> (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstTrunc" constTrunc
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstSExt" constSExt
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstZExt" constZExt
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFPTrunc" constFPTrunc
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFPExt" constFPExt
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstUIToFP" constUIToFP
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstSIToFP" constSIToFP
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFPToUI" constFPToUI
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFPToSI" constFPToSI
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstPtrToInt" constPtrToInt
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstIntToPtr" constIntToPtr
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstBitCast" constBitCast
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstAddrSpaceCast" constAddrSpaceCast
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstZExtOrBitCast" constZExtOrBitCast
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstSExtOrBitCast" constSExtOrBitCast
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstTruncOrBitCast" constTruncOrBitCast
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstPointerCast" constPointerCast
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstIntCast" constIntCast
+    :: ValueRef -> TypeRef -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstFPCast" constFPCast
+    :: ValueRef -> TypeRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstSelect" constSelect
+    :: ValueRef -> ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstExtractElement" constExtractElement
+    :: ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstInsertElement" constInsertElement
+    :: ValueRef -> ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstShuffleVector" constShuffleVector
+    :: ValueRef -> ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstExtractValue" constExtractValue
+    :: ValueRef -> (Ptr CUInt) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstInsertValue" constInsertValue
+    :: ValueRef -> ValueRef -> (Ptr CUInt) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBlockAddress" blockAddress
+    :: ValueRef -> BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMConstInlineAsm" constInlineAsm
+    :: TypeRef -> CString -> CString -> LLVM.Bool -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetGlobalParent" getGlobalParent
+    :: ValueRef -> IO ModuleRef
+
+foreign import ccall unsafe "LLVMIsDeclaration" isDeclaration
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMGetLinkage" getLinkage
+    :: ValueRef -> IO Linkage
+
+foreign import ccall unsafe "LLVMSetLinkage" setLinkage
+    :: ValueRef -> Linkage -> IO ()
+
+foreign import ccall unsafe "LLVMGetSection" getSection
+    :: ValueRef -> IO CString
+
+foreign import ccall unsafe "LLVMSetSection" setSection
+    :: ValueRef -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMGetVisibility" getVisibility
+    :: ValueRef -> IO Visibility
+
+foreign import ccall unsafe "LLVMSetVisibility" setVisibility
+    :: ValueRef -> Visibility -> IO ()
+
+foreign import ccall unsafe "LLVMGetDLLStorageClass" getDLLStorageClass
+    :: ValueRef -> IO DLLStorageClass
+
+foreign import ccall unsafe "LLVMSetDLLStorageClass" setDLLStorageClass
+    :: ValueRef -> DLLStorageClass -> IO ()
+
+foreign import ccall unsafe "LLVMGetUnnamedAddress" getUnnamedAddress
+    :: ValueRef -> IO UnnamedAddr
+
+foreign import ccall unsafe "LLVMSetUnnamedAddress" setUnnamedAddress
+    :: ValueRef -> UnnamedAddr -> IO ()
+
+foreign import ccall unsafe "LLVMGlobalGetValueType" globalGetValueType
+    :: ValueRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMHasUnnamedAddr" hasUnnamedAddr
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetUnnamedAddr" setUnnamedAddr
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMGetAlignment" getAlignment
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMSetAlignment" setAlignment
+    :: ValueRef -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMGlobalSetMetadata" globalSetMetadata
+    :: ValueRef -> CUInt -> MetadataRef -> IO ()
+
+foreign import ccall unsafe "LLVMGlobalEraseMetadata" globalEraseMetadata
+    :: ValueRef -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMGlobalClearMetadata" globalClearMetadata
+    :: ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMGlobalCopyAllMetadata" globalCopyAllMetadata
+    :: ValueRef -> (Ptr CSize) -> IO (Ptr ValueMetadataEntry)
+
+foreign import ccall unsafe "LLVMDisposeValueMetadataEntries" disposeValueMetadataEntries
+    :: (Ptr ValueMetadataEntry) -> IO ()
+
+foreign import ccall unsafe "LLVMValueMetadataEntriesGetKind" valueMetadataEntriesGetKind
+    :: (Ptr ValueMetadataEntry) -> CUInt -> IO CUInt
+
+foreign import ccall unsafe "LLVMValueMetadataEntriesGetMetadata" valueMetadataEntriesGetMetadata
+    :: (Ptr ValueMetadataEntry) -> CUInt -> IO MetadataRef
+
+foreign import ccall unsafe "LLVMAddGlobal" addGlobal
+    :: ModuleRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMAddGlobalInAddressSpace" addGlobalInAddressSpace
+    :: ModuleRef -> TypeRef -> CString -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetNamedGlobal" getNamedGlobal
+    :: ModuleRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetFirstGlobal" getFirstGlobal
+    :: ModuleRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetLastGlobal" getLastGlobal
+    :: ModuleRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetNextGlobal" getNextGlobal
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetPreviousGlobal" getPreviousGlobal
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMDeleteGlobal" deleteGlobal
+    :: ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetInitializer" getInitializer
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSetInitializer" setInitializer
+    :: ValueRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMIsThreadLocal" isThreadLocal
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetThreadLocal" setThreadLocal
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMIsGlobalConstant" isGlobalConstant
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetGlobalConstant" setGlobalConstant
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMGetThreadLocalMode" getThreadLocalMode
+    :: ValueRef -> IO ThreadLocalMode
+
+foreign import ccall unsafe "LLVMSetThreadLocalMode" setThreadLocalMode
+    :: ValueRef -> ThreadLocalMode -> IO ()
+
+foreign import ccall unsafe "LLVMIsExternallyInitialized" isExternallyInitialized
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetExternallyInitialized" setExternallyInitialized
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMAddAlias" addAlias
+    :: ModuleRef -> TypeRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetNamedGlobalAlias" getNamedGlobalAlias
+    :: ModuleRef -> CString -> CSize -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetFirstGlobalAlias" getFirstGlobalAlias
+    :: ModuleRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetLastGlobalAlias" getLastGlobalAlias
+    :: ModuleRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetNextGlobalAlias" getNextGlobalAlias
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetPreviousGlobalAlias" getPreviousGlobalAlias
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMAliasGetAliasee" aliasGetAliasee
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMAliasSetAliasee" aliasSetAliasee
+    :: ValueRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMDeleteFunction" deleteFunction
+    :: ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMHasPersonalityFn" hasPersonalityFn
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMGetPersonalityFn" getPersonalityFn
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSetPersonalityFn" setPersonalityFn
+    :: ValueRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMLookupIntrinsicID" lookupIntrinsicID
+    :: CString -> CSize -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetIntrinsicID" getIntrinsicID
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetIntrinsicDeclaration" getIntrinsicDeclaration
+    :: ModuleRef -> CUInt -> (Ptr TypeRef) -> CSize -> IO ValueRef
+
+foreign import ccall unsafe "LLVMIntrinsicGetType" intrinsicGetType
+    :: ContextRef -> CUInt -> (Ptr TypeRef) -> CSize -> IO TypeRef
+
+foreign import ccall unsafe "LLVMIntrinsicGetName" intrinsicGetName
+    :: CUInt -> (Ptr CSize) -> IO CString
+
+foreign import ccall unsafe "LLVMIntrinsicCopyOverloadedName" intrinsicCopyOverloadedName
+    :: CUInt -> (Ptr TypeRef) -> CSize -> (Ptr CSize) -> IO CString
+
+foreign import ccall unsafe "LLVMIntrinsicIsOverloaded" intrinsicIsOverloaded
+    :: CUInt -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMGetFunctionCallConv" getFunctionCallConv
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMSetFunctionCallConv" setFunctionCallConv
+    :: ValueRef -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMGetGC" getGC
+    :: ValueRef -> IO CString
+
+foreign import ccall unsafe "LLVMSetGC" setGC
+    :: ValueRef -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMAddAttributeAtIndex" addAttributeAtIndex
+    :: ValueRef -> AttributeIndex -> AttributeRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetAttributeCountAtIndex" getAttributeCountAtIndex
+    :: ValueRef -> AttributeIndex -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetAttributesAtIndex" getAttributesAtIndex
+    :: ValueRef -> AttributeIndex -> (Ptr AttributeRef) -> IO ()
+
+foreign import ccall unsafe "LLVMGetEnumAttributeAtIndex" getEnumAttributeAtIndex
+    :: ValueRef -> AttributeIndex -> CUInt -> IO AttributeRef
+
+foreign import ccall unsafe "LLVMGetStringAttributeAtIndex" getStringAttributeAtIndex
+    :: ValueRef -> AttributeIndex -> CString -> CUInt -> IO AttributeRef
+
+foreign import ccall unsafe "LLVMRemoveEnumAttributeAtIndex" removeEnumAttributeAtIndex
+    :: ValueRef -> AttributeIndex -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMRemoveStringAttributeAtIndex" removeStringAttributeAtIndex
+    :: ValueRef -> AttributeIndex -> CString -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMAddTargetDependentFunctionAttr" addTargetDependentFunctionAttr
+    :: ValueRef -> CString -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMCountParams" countParams
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetParams" getParams
+    :: ValueRef -> (Ptr ValueRef) -> IO ()
+
+foreign import ccall unsafe "LLVMGetParam" getParam
+    :: ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetParamParent" getParamParent
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetFirstParam" getFirstParam
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetLastParam" getLastParam
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetNextParam" getNextParam
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetPreviousParam" getPreviousParam
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSetParamAlignment" setParamAlignment
+    :: ValueRef -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMAddGlobalIFunc" addGlobalIFunc
+    :: ModuleRef -> CString -> CSize -> TypeRef -> CUInt -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetNamedGlobalIFunc" getNamedGlobalIFunc
+    :: ModuleRef -> CString -> CSize -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetFirstGlobalIFunc" getFirstGlobalIFunc
+    :: ModuleRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetLastGlobalIFunc" getLastGlobalIFunc
+    :: ModuleRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetNextGlobalIFunc" getNextGlobalIFunc
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetPreviousGlobalIFunc" getPreviousGlobalIFunc
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetGlobalIFuncResolver" getGlobalIFuncResolver
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSetGlobalIFuncResolver" setGlobalIFuncResolver
+    :: ValueRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMEraseGlobalIFunc" eraseGlobalIFunc
+    :: ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMRemoveGlobalIFunc" removeGlobalIFunc
+    :: ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMMDStringInContext2" mDStringInContext2
+    :: ContextRef -> CString -> CSize -> IO MetadataRef
+
+foreign import ccall unsafe "LLVMMDNodeInContext2" mDNodeInContext2
+    :: ContextRef -> (Ptr MetadataRef) -> CSize -> IO MetadataRef
+
+foreign import ccall unsafe "LLVMMetadataAsValue" metadataAsValue
+    :: ContextRef -> MetadataRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMValueAsMetadata" valueAsMetadata
+    :: ValueRef -> IO MetadataRef
+
+foreign import ccall unsafe "LLVMGetMDString" getMDString
+    :: ValueRef -> (Ptr CUInt) -> IO CString
+
+foreign import ccall unsafe "LLVMGetMDNodeNumOperands" getMDNodeNumOperands
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetMDNodeOperands" getMDNodeOperands
+    :: ValueRef -> (Ptr ValueRef) -> IO ()
+
+foreign import ccall unsafe "LLVMMDStringInContext" mDStringInContext
+    :: ContextRef -> CString -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMMDString" mDString
+    :: CString -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMMDNodeInContext" mDNodeInContext
+    :: ContextRef -> (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMMDNode" mDNode
+    :: (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBasicBlockAsValue" basicBlockAsValue
+    :: BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMValueIsBasicBlock" valueIsBasicBlock
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMValueAsBasicBlock" valueAsBasicBlock
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetBasicBlockName" getBasicBlockName
+    :: BasicBlockRef -> IO CString
+
+foreign import ccall unsafe "LLVMGetBasicBlockParent" getBasicBlockParent
+    :: BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetBasicBlockTerminator" getBasicBlockTerminator
+    :: BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMCountBasicBlocks" countBasicBlocks
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetBasicBlocks" getBasicBlocks
+    :: ValueRef -> (Ptr BasicBlockRef) -> IO ()
+
+foreign import ccall unsafe "LLVMGetFirstBasicBlock" getFirstBasicBlock
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetLastBasicBlock" getLastBasicBlock
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetNextBasicBlock" getNextBasicBlock
+    :: BasicBlockRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetPreviousBasicBlock" getPreviousBasicBlock
+    :: BasicBlockRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetEntryBasicBlock" getEntryBasicBlock
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMInsertExistingBasicBlockAfterInsertBlock" insertExistingBasicBlockAfterInsertBlock
+    :: BuilderRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMAppendExistingBasicBlock" appendExistingBasicBlock
+    :: ValueRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMCreateBasicBlockInContext" createBasicBlockInContext
+    :: ContextRef -> CString -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMAppendBasicBlockInContext" appendBasicBlockInContext
+    :: ContextRef -> ValueRef -> CString -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMAppendBasicBlock" appendBasicBlock
+    :: ValueRef -> CString -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMInsertBasicBlockInContext" insertBasicBlockInContext
+    :: ContextRef -> BasicBlockRef -> CString -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMInsertBasicBlock" insertBasicBlock
+    :: BasicBlockRef -> CString -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMDeleteBasicBlock" deleteBasicBlock
+    :: BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMRemoveBasicBlockFromParent" removeBasicBlockFromParent
+    :: BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMMoveBasicBlockBefore" moveBasicBlockBefore
+    :: BasicBlockRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMMoveBasicBlockAfter" moveBasicBlockAfter
+    :: BasicBlockRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetFirstInstruction" getFirstInstruction
+    :: BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetLastInstruction" getLastInstruction
+    :: BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMHasMetadata" hasMetadata
+    :: ValueRef -> IO CInt
+
+foreign import ccall unsafe "LLVMGetMetadata" getMetadata
+    :: ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSetMetadata" setMetadata
+    :: ValueRef -> CUInt -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMInstructionGetAllMetadataOtherThanDebugLoc" instructionGetAllMetadataOtherThanDebugLoc
+    :: ValueRef -> (Ptr CSize) -> IO (Ptr ValueMetadataEntry)
+
+foreign import ccall unsafe "LLVMGetInstructionParent" getInstructionParent
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetNextInstruction" getNextInstruction
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetPreviousInstruction" getPreviousInstruction
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMInstructionRemoveFromParent" instructionRemoveFromParent
+    :: ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMInstructionEraseFromParent" instructionEraseFromParent
+    :: ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetInstructionOpcode" getInstructionOpcode
+    :: ValueRef -> IO Opcode
+
+foreign import ccall unsafe "LLVMGetICmpPredicate" getICmpPredicate
+    :: ValueRef -> IO IntPredicate
+
+foreign import ccall unsafe "LLVMGetFCmpPredicate" getFCmpPredicate
+    :: ValueRef -> IO RealPredicate
+
+foreign import ccall unsafe "LLVMInstructionClone" instructionClone
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMIsATerminatorInst" isATerminatorInst
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetNumArgOperands" getNumArgOperands
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMSetInstructionCallConv" setInstructionCallConv
+    :: ValueRef -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMGetInstructionCallConv" getInstructionCallConv
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMSetInstrParamAlignment" setInstrParamAlignment
+    :: ValueRef -> CUInt -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMAddCallSiteAttribute" addCallSiteAttribute
+    :: ValueRef -> AttributeIndex -> AttributeRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetCallSiteAttributeCount" getCallSiteAttributeCount
+    :: ValueRef -> AttributeIndex -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetCallSiteAttributes" getCallSiteAttributes
+    :: ValueRef -> AttributeIndex -> (Ptr AttributeRef) -> IO ()
+
+foreign import ccall unsafe "LLVMGetCallSiteEnumAttribute" getCallSiteEnumAttribute
+    :: ValueRef -> AttributeIndex -> CUInt -> IO AttributeRef
+
+foreign import ccall unsafe "LLVMGetCallSiteStringAttribute" getCallSiteStringAttribute
+    :: ValueRef -> AttributeIndex -> CString -> CUInt -> IO AttributeRef
+
+foreign import ccall unsafe "LLVMRemoveCallSiteEnumAttribute" removeCallSiteEnumAttribute
+    :: ValueRef -> AttributeIndex -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMRemoveCallSiteStringAttribute" removeCallSiteStringAttribute
+    :: ValueRef -> AttributeIndex -> CString -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMGetCalledFunctionType" getCalledFunctionType
+    :: ValueRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMGetCalledValue" getCalledValue
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMIsTailCall" isTailCall
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetTailCall" setTailCall
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMGetNormalDest" getNormalDest
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetUnwindDest" getUnwindDest
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMSetNormalDest" setNormalDest
+    :: ValueRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMSetUnwindDest" setUnwindDest
+    :: ValueRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetNumSuccessors" getNumSuccessors
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetSuccessor" getSuccessor
+    :: ValueRef -> CUInt -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMSetSuccessor" setSuccessor
+    :: ValueRef -> CUInt -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMIsConditional" isConditional
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMGetCondition" getCondition
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSetCondition" setCondition
+    :: ValueRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetSwitchDefaultDest" getSwitchDefaultDest
+    :: ValueRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetAllocatedType" getAllocatedType
+    :: ValueRef -> IO TypeRef
+
+foreign import ccall unsafe "LLVMIsInBounds" isInBounds
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetIsInBounds" setIsInBounds
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMAddIncoming" addIncoming
+    :: ValueRef -> (Ptr ValueRef) -> (Ptr BasicBlockRef) -> CUInt -> IO ()
+
+foreign import ccall unsafe "LLVMCountIncoming" countIncoming
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetIncomingValue" getIncomingValue
+    :: ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetIncomingBlock" getIncomingBlock
+    :: ValueRef -> CUInt -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMGetNumIndices" getNumIndices
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetIndices" getIndices
+    :: ValueRef -> IO (Ptr CUInt)
+
+foreign import ccall unsafe "LLVMCreateBuilderInContext" createBuilderInContext
+    :: ContextRef -> IO BuilderRef
+
+foreign import ccall unsafe "LLVMCreateBuilder" createBuilder
+    :: IO BuilderRef
+
+foreign import ccall unsafe "LLVMPositionBuilder" positionBuilder
+    :: BuilderRef -> BasicBlockRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMPositionBuilderBefore" positionBuilderBefore
+    :: BuilderRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMPositionBuilderAtEnd" positionBuilderAtEnd
+    :: BuilderRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetInsertBlock" getInsertBlock
+    :: BuilderRef -> IO BasicBlockRef
+
+foreign import ccall unsafe "LLVMClearInsertionPosition" clearInsertionPosition
+    :: BuilderRef -> IO ()
+
+foreign import ccall unsafe "LLVMInsertIntoBuilder" insertIntoBuilder
+    :: BuilderRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMInsertIntoBuilderWithName" insertIntoBuilderWithName
+    :: BuilderRef -> ValueRef -> CString -> IO ()
+
+foreign import ccall unsafe "LLVMDisposeBuilder" disposeBuilder
+    :: BuilderRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetCurrentDebugLocation2" getCurrentDebugLocation2
+    :: BuilderRef -> IO MetadataRef
+
+foreign import ccall unsafe "LLVMSetCurrentDebugLocation2" setCurrentDebugLocation2
+    :: BuilderRef -> MetadataRef -> IO ()
+
+foreign import ccall unsafe "LLVMSetInstDebugLocation" setInstDebugLocation
+    :: BuilderRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMBuilderGetDefaultFPMathTag" builderGetDefaultFPMathTag
+    :: BuilderRef -> IO MetadataRef
+
+foreign import ccall unsafe "LLVMBuilderSetDefaultFPMathTag" builderSetDefaultFPMathTag
+    :: BuilderRef -> MetadataRef -> IO ()
+
+foreign import ccall unsafe "LLVMSetCurrentDebugLocation" setCurrentDebugLocation
+    :: BuilderRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetCurrentDebugLocation" getCurrentDebugLocation
+    :: BuilderRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildRetVoid" buildRetVoid
+    :: BuilderRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildRet" buildRet
+    :: BuilderRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildAggregateRet" buildAggregateRet
+    :: BuilderRef -> (Ptr ValueRef) -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildBr" buildBr
+    :: BuilderRef -> BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildCondBr" buildCondBr
+    :: BuilderRef -> ValueRef -> BasicBlockRef -> BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSwitch" buildSwitch
+    :: BuilderRef -> ValueRef -> BasicBlockRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildIndirectBr" buildIndirectBr
+    :: BuilderRef -> ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildInvoke" buildInvoke
+    :: BuilderRef -> ValueRef -> (Ptr ValueRef) -> CUInt -> BasicBlockRef -> BasicBlockRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildInvoke2" buildInvoke2
+    :: BuilderRef -> TypeRef -> ValueRef -> (Ptr ValueRef) -> CUInt -> BasicBlockRef -> BasicBlockRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildUnreachable" buildUnreachable
+    :: BuilderRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildResume" buildResume
+    :: BuilderRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildLandingPad" buildLandingPad
+    :: BuilderRef -> TypeRef -> ValueRef -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildCleanupRet" buildCleanupRet
+    :: BuilderRef -> ValueRef -> BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildCatchRet" buildCatchRet
+    :: BuilderRef -> ValueRef -> BasicBlockRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildCatchPad" buildCatchPad
+    :: BuilderRef -> ValueRef -> (Ptr ValueRef) -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildCleanupPad" buildCleanupPad
+    :: BuilderRef -> ValueRef -> (Ptr ValueRef) -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildCatchSwitch" buildCatchSwitch
+    :: BuilderRef -> ValueRef -> BasicBlockRef -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMAddCase" addCase
+    :: ValueRef -> ValueRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMAddDestination" addDestination
+    :: ValueRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetNumClauses" getNumClauses
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetClause" getClause
+    :: ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMAddClause" addClause
+    :: ValueRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMIsCleanup" isCleanup
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetCleanup" setCleanup
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMAddHandler" addHandler
+    :: ValueRef -> BasicBlockRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetNumHandlers" getNumHandlers
+    :: ValueRef -> IO CUInt
+
+foreign import ccall unsafe "LLVMGetHandlers" getHandlers
+    :: ValueRef -> (Ptr BasicBlockRef) -> IO ()
+
+foreign import ccall unsafe "LLVMGetArgOperand" getArgOperand
+    :: ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSetArgOperand" setArgOperand
+    :: ValueRef -> CUInt -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetParentCatchSwitch" getParentCatchSwitch
+    :: ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMSetParentCatchSwitch" setParentCatchSwitch
+    :: ValueRef -> ValueRef -> IO ()
+
+foreign import ccall unsafe "LLVMBuildAdd" buildAdd
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNSWAdd" buildNSWAdd
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNUWAdd" buildNUWAdd
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFAdd" buildFAdd
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSub" buildSub
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNSWSub" buildNSWSub
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNUWSub" buildNUWSub
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFSub" buildFSub
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildMul" buildMul
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNSWMul" buildNSWMul
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNUWMul" buildNUWMul
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFMul" buildFMul
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildUDiv" buildUDiv
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildExactUDiv" buildExactUDiv
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSDiv" buildSDiv
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildExactSDiv" buildExactSDiv
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFDiv" buildFDiv
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildURem" buildURem
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSRem" buildSRem
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFRem" buildFRem
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildShl" buildShl
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildLShr" buildLShr
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildAShr" buildAShr
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildAnd" buildAnd
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildOr" buildOr
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildXor" buildXor
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildBinOp" buildBinOp
+    :: BuilderRef -> Opcode -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNeg" buildNeg
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNSWNeg" buildNSWNeg
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNUWNeg" buildNUWNeg
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFNeg" buildFNeg
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildNot" buildNot
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildMalloc" buildMalloc
+    :: BuilderRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildArrayMalloc" buildArrayMalloc
+    :: BuilderRef -> TypeRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildMemSet" buildMemSet
+    :: BuilderRef -> ValueRef -> ValueRef -> ValueRef -> CUInt -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildMemCpy" buildMemCpy
+    :: BuilderRef -> ValueRef -> CUInt -> ValueRef -> CUInt -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildMemMove" buildMemMove
+    :: BuilderRef -> ValueRef -> CUInt -> ValueRef -> CUInt -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildAlloca" buildAlloca
+    :: BuilderRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildArrayAlloca" buildArrayAlloca
+    :: BuilderRef -> TypeRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFree" buildFree
+    :: BuilderRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildLoad" buildLoad
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildLoad2" buildLoad2
+    :: BuilderRef -> TypeRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildStore" buildStore
+    :: BuilderRef -> ValueRef -> ValueRef -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildGEP" buildGEP
+    :: BuilderRef -> ValueRef -> (Ptr ValueRef) -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildInBoundsGEP" buildInBoundsGEP
+    :: BuilderRef -> ValueRef -> (Ptr ValueRef) -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildStructGEP" buildStructGEP
+    :: BuilderRef -> ValueRef -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildGEP2" buildGEP2
+    :: BuilderRef -> TypeRef -> ValueRef -> (Ptr ValueRef) -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildInBoundsGEP2" buildInBoundsGEP2
+    :: BuilderRef -> TypeRef -> ValueRef -> (Ptr ValueRef) -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildStructGEP2" buildStructGEP2
+    :: BuilderRef -> TypeRef -> ValueRef -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildGlobalString" buildGlobalString
+    :: BuilderRef -> CString -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildGlobalStringPtr" buildGlobalStringPtr
+    :: BuilderRef -> CString -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMGetVolatile" getVolatile
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetVolatile" setVolatile
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMGetOrdering" getOrdering
+    :: ValueRef -> IO AtomicOrdering
+
+foreign import ccall unsafe "LLVMSetOrdering" setOrdering
+    :: ValueRef -> AtomicOrdering -> IO ()
+
+foreign import ccall unsafe "LLVMBuildTrunc" buildTrunc
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildZExt" buildZExt
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSExt" buildSExt
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFPToUI" buildFPToUI
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFPToSI" buildFPToSI
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildUIToFP" buildUIToFP
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSIToFP" buildSIToFP
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFPTrunc" buildFPTrunc
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFPExt" buildFPExt
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildPtrToInt" buildPtrToInt
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildIntToPtr" buildIntToPtr
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildBitCast" buildBitCast
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildAddrSpaceCast" buildAddrSpaceCast
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildZExtOrBitCast" buildZExtOrBitCast
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSExtOrBitCast" buildSExtOrBitCast
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildTruncOrBitCast" buildTruncOrBitCast
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildCast" buildCast
+    :: BuilderRef -> Opcode -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildPointerCast" buildPointerCast
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildIntCast2" buildIntCast2
+    :: BuilderRef -> ValueRef -> TypeRef -> LLVM.Bool -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFPCast" buildFPCast
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildICmp" buildICmp
+    :: BuilderRef -> IntPredicate -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFCmp" buildFCmp
+    :: BuilderRef -> RealPredicate -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildPhi" buildPhi
+    :: BuilderRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildCall" buildCall
+    :: BuilderRef -> ValueRef -> (Ptr ValueRef) -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildCall2" buildCall2
+    :: BuilderRef -> TypeRef -> ValueRef -> (Ptr ValueRef) -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildSelect" buildSelect
+    :: BuilderRef -> ValueRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildVAArg" buildVAArg
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildExtractElement" buildExtractElement
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildInsertElement" buildInsertElement
+    :: BuilderRef -> ValueRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildShuffleVector" buildShuffleVector
+    :: BuilderRef -> ValueRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildExtractValue" buildExtractValue
+    :: BuilderRef -> ValueRef -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildInsertValue" buildInsertValue
+    :: BuilderRef -> ValueRef -> ValueRef -> CUInt -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildIsNull" buildIsNull
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildIsNotNull" buildIsNotNull
+    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildPtrDiff" buildPtrDiff
+    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildFence" buildFence
+    :: BuilderRef -> AtomicOrdering -> LLVM.Bool -> CString -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildAtomicRMW" buildAtomicRMW
+    :: BuilderRef -> AtomicRMWBinOp -> ValueRef -> ValueRef -> AtomicOrdering -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMBuildAtomicCmpXchg" buildAtomicCmpXchg
+    :: BuilderRef -> ValueRef -> ValueRef -> ValueRef -> AtomicOrdering -> AtomicOrdering -> LLVM.Bool -> IO ValueRef
+
+foreign import ccall unsafe "LLVMIsAtomicSingleThread" isAtomicSingleThread
+    :: ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMSetAtomicSingleThread" setAtomicSingleThread
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+foreign import ccall unsafe "LLVMGetCmpXchgSuccessOrdering" getCmpXchgSuccessOrdering
+    :: ValueRef -> IO AtomicOrdering
+
+foreign import ccall unsafe "LLVMSetCmpXchgSuccessOrdering" setCmpXchgSuccessOrdering
+    :: ValueRef -> AtomicOrdering -> IO ()
+
+foreign import ccall unsafe "LLVMGetCmpXchgFailureOrdering" getCmpXchgFailureOrdering
+    :: ValueRef -> IO AtomicOrdering
+
+foreign import ccall unsafe "LLVMSetCmpXchgFailureOrdering" setCmpXchgFailureOrdering
+    :: ValueRef -> AtomicOrdering -> IO ()
+
+foreign import ccall unsafe "LLVMCreateModuleProviderForExistingModule" createModuleProviderForExistingModule
+    :: ModuleRef -> IO ModuleProviderRef
+
+foreign import ccall unsafe "LLVMDisposeModuleProvider" disposeModuleProvider
+    :: ModuleProviderRef -> IO ()
+
+foreign import ccall unsafe "LLVMCreateMemoryBufferWithContentsOfFile" createMemoryBufferWithContentsOfFile
+    :: CString -> (Ptr MemoryBufferRef) -> (Ptr CString) -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMCreateMemoryBufferWithSTDIN" createMemoryBufferWithSTDIN
+    :: (Ptr MemoryBufferRef) -> (Ptr CString) -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMCreateMemoryBufferWithMemoryRange" createMemoryBufferWithMemoryRange
+    :: CString -> CSize -> CString -> LLVM.Bool -> IO MemoryBufferRef
+
+foreign import ccall unsafe "LLVMCreateMemoryBufferWithMemoryRangeCopy" createMemoryBufferWithMemoryRangeCopy
+    :: CString -> CSize -> CString -> IO MemoryBufferRef
+
+foreign import ccall unsafe "LLVMGetBufferStart" getBufferStart
+    :: MemoryBufferRef -> IO CString
+
+foreign import ccall unsafe "LLVMGetBufferSize" getBufferSize
+    :: MemoryBufferRef -> IO CSize
+
+foreign import ccall unsafe "LLVMDisposeMemoryBuffer" disposeMemoryBuffer
+    :: MemoryBufferRef -> IO ()
+
+foreign import ccall unsafe "LLVMGetGlobalPassRegistry" getGlobalPassRegistry
+    :: IO PassRegistryRef
+
+foreign import ccall unsafe "LLVMCreatePassManager" createPassManager
+    :: IO PassManagerRef
+
+foreign import ccall unsafe "LLVMCreateFunctionPassManagerForModule" createFunctionPassManagerForModule
+    :: ModuleRef -> IO PassManagerRef
+
+foreign import ccall unsafe "LLVMCreateFunctionPassManager" createFunctionPassManager
+    :: ModuleProviderRef -> IO PassManagerRef
+
+foreign import ccall unsafe "LLVMRunPassManager" runPassManager
+    :: PassManagerRef -> ModuleRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMInitializeFunctionPassManager" initializeFunctionPassManager
+    :: PassManagerRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMRunFunctionPassManager" runFunctionPassManager
+    :: PassManagerRef -> ValueRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMFinalizeFunctionPassManager" finalizeFunctionPassManager
+    :: PassManagerRef -> IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMDisposePassManager" disposePassManager
+    :: PassManagerRef -> IO ()
+
+foreign import ccall unsafe "LLVMStartMultithreaded" startMultithreaded
+    :: IO LLVM.Bool
+
+foreign import ccall unsafe "LLVMStopMultithreaded" stopMultithreaded
+    :: IO ()
+
+foreign import ccall unsafe "LLVMIsMultithreaded" isMultithreaded
+    :: IO LLVM.Bool
diff --git a/src/LLVM/FFI/Core.hsc b/src/LLVM/FFI/Core.hsc
--- a/src/LLVM/FFI/Core.hsc
+++ b/src/LLVM/FFI/Core.hsc
@@ -4,1827 +4,2282 @@
 {-# LANGUAGE DeriveDataTypeable #-}
 
 -- |
--- Module:      LLVM.FFI.Core
--- Copyright:   Bryan O'Sullivan 2007, 2008
--- License:     BSD-style (see the file LICENSE)
---
--- Maintainer:  bos@serpentine.com
--- Stability:   experimental
--- Portability: requires GHC 6.8, LLVM
---
--- This module provides direct access to the LLVM C bindings.
-
-module LLVM.FFI.Core
-    (
-      initializeCore
-    , Version.version
-
-    -- * Boolean values
-    , LLVM.Bool(LLVM.Bool)
-    , LLVM.false
-    , LLVM.true
-    , LLVM.consBool
-    , LLVM.deconsBool
-
-    -- * Error handling
-    , disposeMessage
-
-    -- * Context functions
-    , Context
-    , ContextRef
-    , contextCreate
-    , contextDispose
-    , getGlobalContext
-
-    , getMDKindID
-    , getMDKindIDInContext
-
-      -- * Modules
-    , Module
-    , ModuleRef
-    , moduleCreateWithName
-    , moduleCreateWithNameInContext
-    , disposeModule
-    , ptrDisposeModule
-
-    , getDataLayout
-    , setDataLayout
-
-    , getTarget
-    , setTarget
-
-    , defaultTargetTriple
-    , hostTriple
-
-    , dumpModule
-
-    , setModuleInlineAsm
-    , getModuleContext
-
-    -- * Types
-    , Type
-    , TypeRef
-    , TypeKind(..)
-
-    , getTypeKind
-    , typeIsSized
-    , getTypeContext
-
-    -- ** Integer types
-    , int1TypeInContext
-    , int8TypeInContext
-    , int16TypeInContext
-    , int32TypeInContext
-    , int64TypeInContext
-    , intTypeInContext
-
-    , int1Type
-    , int8Type
-    , int16Type
-    , int32Type
-    , int64Type
-    , integerType
-    , getIntTypeWidth
-
-    -- ** Real types
-    , floatTypeInContext
-    , doubleTypeInContext
-    , x86FP80TypeInContext
-    , fp128TypeInContext
-    , ppcFP128TypeInContext
-
-    , floatType
-    , doubleType
-    , x86FP80Type
-    , fp128Type
-    , ppcFP128Type
-
-    -- ** Function types
-    , functionType
-    , isFunctionVarArg
-    , getReturnType
-    , countParamTypes
-    , getParamTypes
-
-    -- ** Struct types
-    , structTypeInContext
-    , structType
-    , structCreateNamed
-    , getStructName
-    , structSetBody
-
-    , countStructElementTypes
-    , getStructElementTypes
-    , isPackedStruct
-    , isOpaqueStruct
-
-    , getTypeByName
-
-    -- ** Array, pointer, and vector types
-    , arrayType
-    , pointerType
-    , vectorType
-
-    , getElementType
-    , getArrayLength
-    , getPointerAddressSpace
-    , getVectorSize
-
-    -- ** Other types
-    , voidTypeInContext
-    , labelTypeInContext
-    , x86MMXTypeInContext
-
-    , voidType
-    , labelType
-    , x86MMXType
-
-    -- * Values
-    , Value
-    , ValueRef
-    , typeOf
-    , getValueName
-    , setValueName
-    , dumpValue
-    , replaceAllUsesWith
-    , hasMetadata
-    , getMetadata
-    , setMetadata
-
-    -- ** Uses
-    , OpaqueUse
-    , UseRef
-    , getFirstUse
-    , getNextUse
-    , getUser
-    , getUsedValue
-
-    -- ** Users
-    , getOperand
-    , setOperand
-    , getNumOperands
-
-    -- ** Constants
-    , constNull
-    , constAllOnes
-    , getUndef
-    , isConstant
-    , isNull
-    , isUndef
-    , constPointerNull
-
-    -- ** Metadata
-    , mDStringInContext
-    , mDString
-    , mDNodeInContext
-    , mDNode
-    , getMDString
---    , getMDNodeNumOperands
---    , getMDNodeOperand
-    , getNamedMetadataNumOperands
-    , getNamedMetadataOperands
-
-    -- ** Scalar constants
-    , constInt
-    , constIntOfArbitraryPrecision
-    , constIntOfString
-    , constIntOfStringAndSize
-    , constReal
-    , constRealOfString
-    , constRealOfStringAndSize
-    , constIntGetZExtValue
-    , constIntGetSExtValue
-
-    -- ** Composite constants
-    , constStringInContext
-    , constStructInContext
-    , constString
-    , constArray
-    , constStruct
-    , constNamedStruct
-    , constVector
-
-    -- ** Constant Expressions
-    , getConstOpcode
-    , alignOf
-    , sizeOf
-    , constNeg
-    , constNUWNeg
-    , constNSWNeg
-    , constFNeg
-    , constNot
-    , constAdd
-    , constNSWAdd
-    , constNUWAdd
-    , constFAdd
-    , constSub
-    , constNSWSub
-    , constNUWSub
-    , constFSub
-    , constMul
-    , constNSWMul
-    , constNUWMul
-    , constFMul
-    , constUDiv
-    , constSDiv
-    , constExactSDiv
-    , constFDiv
-    , constURem
-    , constSRem
-    , constFRem
-    , constAnd
-    , constOr
-    , constXor
-    , constICmp
-    , constFCmp
-    , constShl
-    , constLShr
-    , constAShr
-    , constGEP
-    , constInBoundsGEP
-    , constTrunc
-    , constSExt
-    , constZExt
-    , constFPTrunc
-    , constFPExt
-    , constUIToFP
-    , constSIToFP
-    , constFPToUI
-    , constFPToSI
-    , constPtrToInt
-    , constIntToPtr
-    , constBitCast
-    , constZExtOrBitCast
-    , constSExtOrBitCast
-    , constTruncOrBitCast
-    , constPointerCast
-    , constIntCast
-    , constFPCast
-    , constSelect
-    , constExtractElement
-    , constInsertElement
-    , constShuffleVector
-    , constExtractValue
-    , constInsertValue
-    , constInlineAsm
-    , blockAddress
-
-    -- ** Floating point attributes
-    , setFastMath
-    , setHasUnsafeAlgebra
-    , setHasNoNaNs
-    , setHasNoInfs
-    , setHasNoSignedZeros
-    , setHasAllowReciprocal
-    , setHasAllowReassoc
-    , setHasApproxFunc
-
-    -- ** Support operations and types
-    , Linkage(..)
-    , fromLinkage
-    , toLinkage
-
-    , Visibility(..)
-    , fromVisibility
-    , toVisibility
-
-    -- ** Global variables, functions, and aliases (globals)
-    , getGlobalParent
-    , isDeclaration
-    , getLinkage
-    , setLinkage
-    , getSection
-    , setSection
-    , getVisibility
-    , setVisibility
-    , getAlignment
-    , setAlignment
-
-    -- ** Global variables
-    , addGlobal
-    , addGlobalInAddressSpace
-    , getNamedGlobal
-    , getFirstGlobal
-    , getLastGlobal
-    , getNextGlobal
-    , getPreviousGlobal
-    , deleteGlobal
-    , getInitializer
-    , setInitializer
-    , isThreadLocal
-    , setThreadLocal
-    , isGlobalConstant
-    , setGlobalConstant
-
-    -- ** Aliases
-    , addAlias
-
-    -- * Parameter passing
-    , Attribute
-    , AttributeKind(..)
-
-    -- ** Calling conventions
-    , CallingConvention(..)
-    , fromCallingConvention
-    , toCallingConvention
-
-    -- ** Functions
-    , addFunction
-    , getNamedFunction
-    , getFirstFunction
-    , getLastFunction
-    , getNextFunction
-    , getPreviousFunction
-    , deleteFunction
-    , getIntrinsicID
-    , getFunctionCallConv
-    , setFunctionCallConv
-    , getGC
-    , setGC
-    , AttributeIndex(AttributeIndex)
-    , attributeReturnIndex, attributeFunctionIndex
-    , getEnumAttributeKindForName
-    , getLastEnumAttributeKind
-    , createEnumAttribute
-    , getEnumAttributeKind
-    , getEnumAttributeValue
-    , createStringAttribute
-    , getStringAttributeKind
-    , getStringAttributeValue
-    , isEnumAttribute
-    , isStringAttribute
-    , addAttributeAtIndex
-    , getAttributeCountAtIndex
-    , getAttributesAtIndex
-    , getEnumAttributeAtIndex
-    , getStringAttributeAtIndex
-    , removeEnumAttributeAtIndex
-    , removeStringAttributeAtIndex
-    , addTargetDependentFunctionAttr
-    , addCallSiteAttribute
-    , getCallSiteAttributeCount
-    , getCallSiteAttributes
-    , getCallSiteEnumAttribute
-    , getCallSiteStringAttribute
-    , removeCallSiteEnumAttribute
-    , removeCallSiteStringAttribute
-    , getCalledValue
-
-    -- ** Parameters
-    , countParams
-    , getParams
-    , getParam
-    , getParamParent
-    , getFirstParam
-    , getLastParam
-    , getNextParam
-    , getPreviousParam
-    , setParamAlignment
-
-    -- ** Basic blocks
-    , BasicBlock
-    , BasicBlockRef
-    , basicBlockAsValue
-    , valueIsBasicBlock
-    , valueAsBasicBlock
-    , getBasicBlockName
-    , getBasicBlockParent
-    , getBasicBlockTerminator
-    , countBasicBlocks
-    , getBasicBlocks
-    , getFirstBasicBlock
-    , getLastBasicBlock
-    , getNextBasicBlock
-    , getPreviousBasicBlock
-    , getEntryBasicBlock
-    , appendBasicBlockInContext
-    , insertBasicBlockInContext
-    , appendBasicBlock
-    , insertBasicBlock
-    , deleteBasicBlock
-    , removeBasicBlockFromParent
-    , moveBasicBlockBefore
-    , moveBasicBlockAfter
-    , getFirstInstruction
-    , getLastInstruction
-
-    -- ** Instructions
-    , getInstructionParent
-    , getNextInstruction
-    , getPreviousInstruction
-    , instructionEraseFromParent
-    , getInstructionOpcode
-    , getICmpPredicate
-
-    -- ** Call Sites
-    , getInstructionCallConv
-    , setInstructionCallConv
-    , setInstrParamAlignment
-
-    -- ** Call Instructions (only)
-    , isTailCall
-    , setTailCall
-
-    -- ** Switch Instructions (only)
-    , getSwitchDefaultDest
-
-    -- ** Phi nodes
-    , addIncoming
-    , countIncoming
-    , getIncomingValue
-    , getIncomingBlock
-
-    -- * Instruction building
-    , Builder
-    , BuilderRef
-    , createBuilderInContext
-    , createBuilder
-    , positionBuilder
-    , positionBefore
-    , positionAtEnd
-    , getInsertBlock
-    , clearInsertionPosition
-    , insertIntoBuilder
-    , insertIntoBuilderWithName
-    , ptrDisposeBuilder
-
-    -- ** Metadata
-    , setCurrentDebugLocation
-    , getCurrentDebugLocation
-    , setInstDebugLocation
-
-    -- ** Terminators
-    , buildRetVoid
-    , buildRet
-    , buildAggregateRet
-    , buildBr
-    , buildCondBr
-    , buildSwitch
-    , buildIndirectBr
-    , buildInvoke
-    , buildLandingPad
-    , buildResume
-    , buildUnreachable
-
-    , addCase
-    , addDestination
-    , addClause
-    , setCleanup
-
-    -- ** Arithmetic
-    , buildAdd
-    , buildNSWAdd
-    , buildNUWAdd
-    , buildFAdd
-    , buildSub
-    , buildNSWSub
-    , buildNUWSub
-    , buildFSub
-    , buildMul
-    , buildNSWMul
-    , buildNUWMul
-    , buildFMul
-    , buildUDiv
-    , buildSDiv
-    , buildExactSDiv
-    , buildFDiv
-    , buildURem
-    , buildSRem
-    , buildFRem
-    , buildShl
-    , buildLShr
-    , buildAShr
-    , buildAnd
-    , buildOr
-    , buildXor
-    , buildBinOp
-    , buildNeg
-    , buildNSWNeg
-    , buildNUWNeg
-    , buildFNeg
-    , buildNot
-
-    -- ** Memory
-    , buildMalloc
-    , buildArrayMalloc
-    , buildAlloca
-    , buildArrayAlloca
-    , buildFree
-    , buildLoad
-    , buildStore
-    , buildGEP
-    , buildInBoundsGEP
-    , buildStructGEP
-    , buildGlobalString
-    , buildGlobalStringPtr
-
-    -- ** Casts
-    , buildTrunc
-    , buildZExt
-    , buildSExt
-    , buildFPToUI
-    , buildFPToSI
-    , buildUIToFP
-    , buildSIToFP
-    , buildFPTrunc
-    , buildFPExt
-    , buildPtrToInt
-    , buildIntToPtr
-    , buildBitCast
-    , buildZExtOrBitCast
-    , buildSExtOrBitCast
-    , buildTruncOrBitCast
-    , buildCast
-    , buildPointerCast
-    , buildIntCast
-    , buildFPCast
-
-    -- ** Comparisons
-    , buildICmp
-    , buildFCmp
-
-    -- ** Miscellaneous instructions
-    , buildPhi
-    , buildCall
-    , buildSelect
-    , buildVAArg
-    , buildExtractElement
-    , buildInsertElement
-    , buildShuffleVector
-    , buildExtractValue
-    , buildInsertValue
-    , buildIsNull
-    , buildIsNotNull
-    , buildPtrDiff
-
-    -- * Memory buffers
-    , MemoryBuffer
-    , MemoryBufferRef
-    , createMemoryBufferWithContentsOfFile
-    , createMemoryBufferWithSTDIN
-    , disposeMemoryBuffer
-
-    -- ** PassRegistry
-    , PassRegistry
-    , PassRegistryRef
-    , getGlobalPassRegistry
-
-    -- ** Pass manager
-    , PassManager
-    , PassManagerRef
-    , ptrDisposePassManager
-
-    , createPassManager
-    , createFunctionPassManagerForModule
-    , runPassManager
-    , initializeFunctionPassManager
-    , runFunctionPassManager
-    , finalizeFunctionPassManager
-    , disposePassManager
-
-    -- ** Functions from extras.cpp
-    , getNumUses
-    , instGetOpcode
-    , cmpInstGetPredicate
-
-    ) where
-
-import qualified LLVM.FFI.Version as Version
-import qualified LLVM.FFI.Base as LLVM
-
-import qualified Foreign.C.Types as C
-import Foreign.C.String (CString)
-import Foreign.Ptr (Ptr, FunPtr)
-
-import Data.Typeable (Typeable)
-
-import Data.Word (Word32, Word64)
-
-import Prelude
-         (IO, Eq, Ord, Int, Bounded, Enum, Show, Read, String,
-          ($), (++), (.), error,
-           fmap, fromIntegral, show, toEnum, )
-
-
-type CDouble  = C.CDouble
-type CInt     = C.CInt
-type CUInt    = C.CUInt
-type CLLong   = C.CLLong
-type CULLong  = C.CULLong
-
-
-#include <llvm/Config/llvm-config.h>
-#include <llvm-c/Core.h>
-
-
-data Module
-    deriving (Typeable)
-type ModuleRef = Ptr Module
-
-data Type
-    deriving (Typeable)
-type TypeRef = Ptr Type
-
-data BasicBlock
-    deriving (Typeable)
-type BasicBlockRef = Ptr BasicBlock
-
-data Value
-    deriving (Typeable)
-type ValueRef = Ptr Value
-
-data OpaqueUse
-    deriving (Typeable)
-type UseRef = Ptr OpaqueUse
-
-data Builder
-    deriving (Typeable)
-type BuilderRef = Ptr Builder
-
-data MemoryBuffer
-    deriving (Typeable)
-type MemoryBufferRef = Ptr MemoryBuffer
-
-data PassManager
-    deriving (Typeable)
-type PassManagerRef = Ptr PassManager
-
-data PassRegistry
-    deriving (Typeable)
-type PassRegistryRef = Ptr PassRegistry
-
-data Context
-    deriving (Typeable)
-type ContextRef = Ptr Context
-
-data Attribute
-    deriving (Typeable)
-type AttributeRef = Ptr Attribute
-
-newtype AttributeIndex = AttributeIndex (#type LLVMAttributeIndex)
-
-attributeReturnIndex, attributeFunctionIndex :: AttributeIndex
-attributeReturnIndex   = AttributeIndex (#const LLVMAttributeReturnIndex)
-attributeFunctionIndex = AttributeIndex (#const LLVMAttributeFunctionIndex)
-
-
-defaultTargetTriple, hostTriple :: String
-defaultTargetTriple = (#const_str LLVM_DEFAULT_TARGET_TRIPLE)
-hostTriple          = (#const_str LLVM_HOST_TRIPLE)
-
-
-data TypeKind
-    = VoidTypeKind
-    | FloatTypeKind
-    | DoubleTypeKind
-    | X86_FP80TypeKind
-    | FP128TypeKind
-    | PPC_FP128TypeKind
-    | LabelTypeKind
-    | IntegerTypeKind
-    | FunctionTypeKind
-    | StructTypeKind
-    | ArrayTypeKind
-    | PointerTypeKind
-    | OpaqueTypeKind
-    | VectorTypeKind
-    deriving (Eq, Ord, Enum, Bounded, Show, Read, Typeable)
-
-getTypeKind :: TypeRef -> IO TypeKind
-getTypeKind = fmap (toEnum . fromIntegral) . getTypeKindCUInt
-
-data CallingConvention = C
-                       | Fast
-                       | Cold
-                       | X86StdCall
-                       | X86FastCall
-                       | GHC
-                         deriving (Show, Eq, Ord, Enum, Bounded, Typeable)
-
-fromCallingConvention :: CallingConvention -> CUInt
-fromCallingConvention c =
-    case c of
-        C -> (#const LLVMCCallConv)
-        Fast -> (#const LLVMFastCallConv)
-        Cold -> (#const LLVMColdCallConv)
-        X86StdCall -> (#const LLVMX86FastcallCallConv)
-        X86FastCall -> (#const LLVMX86StdcallCallConv)
-        GHC -> 10
-
-toCallingConvention :: CUInt -> CallingConvention
-toCallingConvention c =
-    case c of
-        (#const LLVMCCallConv) -> C
-        (#const LLVMFastCallConv) -> Fast
-        (#const LLVMColdCallConv) -> Cold
-        (#const LLVMX86StdcallCallConv) -> X86StdCall
-        (#const LLVMX86FastcallCallConv) -> X86FastCall
-        10 -> GHC
-        _ ->
-            error $ "LLVM.Core.FFI.toCallingConvention: " ++
-                                "unsupported calling convention" ++ show c
-
--- |An enumeration for the kinds of linkage for global values.
-data Linkage
-    = ExternalLinkage     -- ^Externally visible function
-    | AvailableExternallyLinkage
-    | LinkOnceAnyLinkage  -- ^Keep one copy of function when linking (inline)
-    | LinkOnceODRLinkage  -- ^Same, but only replaced by something equivalent.
-    | LinkOnceODRAutoHideLinkage -- ^Like LinkOnceODR, but possibly hidden.
-    | WeakAnyLinkage      -- ^Keep one copy of named function when linking (weak)
-    | WeakODRLinkage      -- ^Same, but only replaced by something equivalent.
-    | AppendingLinkage    -- ^Special purpose, only applies to global arrays
-    | InternalLinkage     -- ^Rename collisions when linking (static functions)
-    | PrivateLinkage      -- ^Like Internal, but omit from symbol table
-    | DLLImportLinkage    -- ^Function to be imported from DLL
-    | DLLExportLinkage    -- ^Function to be accessible from DLL
-    | ExternalWeakLinkage -- ^ExternalWeak linkage description
-    | GhostLinkage        -- ^Stand-in functions for streaming fns from BC files
-    | CommonLinkage       -- ^Tentative definitions
-    | LinkerPrivateLinkage -- ^Like Private, but linker removes.
-    | LinkerPrivateWeakLinkage -- ^Like LinkerPrivate, but is weak.
-    deriving (Show, Eq, Ord, Enum, Typeable)
-
-fromLinkage :: Linkage -> CUInt
-fromLinkage c =
-    case c of
-        ExternalLinkage             -> (#const LLVMExternalLinkage)
-        AvailableExternallyLinkage  -> (#const LLVMAvailableExternallyLinkage)
-        LinkOnceAnyLinkage          -> (#const LLVMLinkOnceAnyLinkage)
-        LinkOnceODRLinkage          -> (#const LLVMLinkOnceODRLinkage)
-        LinkOnceODRAutoHideLinkage  -> (#const LLVMLinkOnceODRAutoHideLinkage)
-        WeakAnyLinkage              -> (#const LLVMWeakAnyLinkage)
-        WeakODRLinkage              -> (#const LLVMWeakODRLinkage)
-        AppendingLinkage            -> (#const LLVMAppendingLinkage)
-        InternalLinkage             -> (#const LLVMInternalLinkage)
-        PrivateLinkage              -> (#const LLVMPrivateLinkage)
-        DLLImportLinkage            -> (#const LLVMDLLImportLinkage)
-        DLLExportLinkage            -> (#const LLVMDLLExportLinkage)
-        ExternalWeakLinkage         -> (#const LLVMExternalWeakLinkage)
-        GhostLinkage                -> (#const LLVMGhostLinkage)
-        CommonLinkage               -> (#const LLVMCommonLinkage)
-        LinkerPrivateLinkage        -> (#const LLVMLinkerPrivateLinkage)
-        LinkerPrivateWeakLinkage    -> (#const LLVMLinkerPrivateWeakLinkage)
-
-toLinkage :: CUInt -> Linkage
-toLinkage c =
-    case c of
-        (#const LLVMExternalLinkage)             -> ExternalLinkage
-        (#const LLVMAvailableExternallyLinkage)  -> AvailableExternallyLinkage
-        (#const LLVMLinkOnceAnyLinkage)          -> LinkOnceAnyLinkage
-        (#const LLVMLinkOnceODRLinkage)          -> LinkOnceODRLinkage
-        (#const LLVMLinkOnceODRAutoHideLinkage)  -> LinkOnceODRAutoHideLinkage
-        (#const LLVMWeakAnyLinkage)              -> WeakAnyLinkage
-        (#const LLVMWeakODRLinkage)              -> WeakODRLinkage
-        (#const LLVMAppendingLinkage)            -> AppendingLinkage
-        (#const LLVMInternalLinkage)             -> InternalLinkage
-        (#const LLVMPrivateLinkage)              -> PrivateLinkage
-        (#const LLVMDLLImportLinkage)            -> DLLImportLinkage
-        (#const LLVMDLLExportLinkage)            -> DLLExportLinkage
-        (#const LLVMExternalWeakLinkage)         -> ExternalWeakLinkage
-        (#const LLVMGhostLinkage)                -> GhostLinkage
-        (#const LLVMCommonLinkage)               -> CommonLinkage
-        (#const LLVMLinkerPrivateLinkage)        -> LinkerPrivateLinkage
-        (#const LLVMLinkerPrivateWeakLinkage)    -> LinkerPrivateWeakLinkage
-        _ -> error "toLinkage: bad value"
-
--- |An enumeration for the kinds of visibility of global values.
-data Visibility
-    = DefaultVisibility   -- ^The GV is visible
-    | HiddenVisibility    -- ^The GV is hidden
-    | ProtectedVisibility -- ^The GV is protected
-    deriving (Show, Eq, Ord, Enum)
-
-fromVisibility :: Visibility -> CUInt
-fromVisibility c =
-    case c of
-        DefaultVisibility   -> (#const LLVMDefaultVisibility)
-        HiddenVisibility    -> (#const LLVMHiddenVisibility)
-        ProtectedVisibility -> (#const LLVMProtectedVisibility)
-
-toVisibility :: CUInt -> Visibility
-toVisibility c =
-    case c of
-        (#const LLVMDefaultVisibility)   -> DefaultVisibility
-        (#const LLVMHiddenVisibility)    -> HiddenVisibility
-        (#const LLVMProtectedVisibility) -> ProtectedVisibility
-        _ -> error "toVisibility: bad value"
-
--- ** Initialization
-foreign import ccall unsafe "LLVMInitializeCore" initializeCore
-    :: PassRegistryRef -> IO ()
-
--- ** Error Handling
-foreign import ccall unsafe "LLVMDisposeMessage" disposeMessage
-    :: CString -> IO ()
-
--- ** Contexts
-foreign import ccall unsafe "LLVMContextCreate" contextCreate
-    :: IO ContextRef
-foreign import ccall unsafe "LLVMGetGlobalContext" getGlobalContext
-    :: IO ContextRef
-foreign import ccall unsafe "LLVMContextDispose" contextDispose
-    :: ContextRef -> IO ()
-foreign import ccall unsafe "LLVMGetMDKindIDInContext" getMDKindIDInContext
-    :: ContextRef -> CString -> CUInt -> IO CUInt
-foreign import ccall unsafe "LLVMGetMDKindID" getMDKindID
-    :: CString -> CUInt -> IO CUInt
-
--- ** Attributes
-
-newtype AttributeKind = AttributeKind CUInt
-
-foreign import ccall unsafe "LLVMGetEnumAttributeKindForName" getEnumAttributeKindForName
-    :: CString -> C.CSize -> IO AttributeKind
-
-foreign import ccall unsafe "LLVMGetLastEnumAttributeKind" getLastEnumAttributeKind
-    :: IO AttributeKind
-
-foreign import ccall unsafe "LLVMCreateEnumAttribute" createEnumAttribute
-    :: ContextRef -> AttributeKind -> Word64 -> IO AttributeRef
-
-foreign import ccall unsafe "LLVMGetEnumAttributeKind" getEnumAttributeKind
-    :: AttributeRef -> IO AttributeKind
-
-foreign import ccall unsafe "LLVMGetEnumAttributeValue" getEnumAttributeValue
-    :: AttributeRef -> IO Word64
-
-foreign import ccall unsafe "LLVMCreateStringAttribute" createStringAttribute
-    :: ContextRef -> CString -> CUInt -> CString -> CUInt -> IO AttributeRef
-
-foreign import ccall unsafe "LLVMGetStringAttributeKind" getStringAttributeKind
-    :: AttributeRef -> Ptr CUInt -> IO CString
-
-foreign import ccall unsafe "LLVMGetStringAttributeValue" getStringAttributeValue
-    :: AttributeRef -> Ptr CUInt -> IO CString
-
-foreign import ccall unsafe "LLVMIsEnumAttribute" isEnumAttribute
-    :: AttributeRef -> IO LLVM.Bool
-
-foreign import ccall unsafe "LLVMIsStringAttribute" isStringAttribute
-    :: AttributeRef -> IO LLVM.Bool
-
--- ** Modules
-foreign import ccall unsafe "LLVMModuleCreateWithName" moduleCreateWithName
-    :: CString -> IO ModuleRef
-foreign import ccall unsafe "LLVMModuleCreateWithNameInContext"
-        moduleCreateWithNameInContext
-    :: CString -> ContextRef -> IO ModuleRef
-foreign import ccall unsafe "LLVMDisposeModule" disposeModule
-    :: ModuleRef -> IO ()
-foreign import ccall unsafe "&LLVMDisposeModule" ptrDisposeModule
-    :: FunPtr (ModuleRef -> IO ())
-
--- ** Data Layout
-foreign import ccall unsafe "LLVMGetDataLayout" getDataLayout
-    :: ModuleRef -> IO CString
-foreign import ccall unsafe "LLVMSetDataLayout" setDataLayout
-    :: ModuleRef -> CString -> IO ()
-
--- ** Targets
-foreign import ccall unsafe "LLVMGetTarget" getTarget
-    :: ModuleRef -> IO CString
-foreign import ccall unsafe "LLVMSetTarget" setTarget
-    :: ModuleRef -> CString -> IO ()
-
--- ** Dump module
-foreign import ccall unsafe "LLVMDumpModule" dumpModule
-    :: ModuleRef -> IO ()
-foreign import ccall unsafe "LLVMSetModuleInlineAsm" setModuleInlineAsm
-    :: ModuleRef -> CString -> IO ()
-foreign import ccall unsafe "LLVMGetModuleContext" getModuleContext
-    :: ModuleRef -> IO ContextRef
-
--- ** Functions
-foreign import ccall unsafe "LLVMAddFunction" addFunction
-    :: ModuleRef                -- ^ module
-    -> CString                  -- ^ name
-    -> TypeRef                  -- ^ type
-    -> IO ValueRef
-foreign import ccall unsafe "LLVMGetNamedFunction" getNamedFunction
-    :: ModuleRef                -- ^ module
-    -> CString                  -- ^ name
-    -> IO ValueRef              -- ^ function (@nullPtr@ if not found)
-foreign import ccall unsafe "LLVMGetFirstFunction" getFirstFunction
-    :: ModuleRef -> IO ValueRef
-foreign import ccall unsafe "LLVMGetLastFunction" getLastFunction
-    :: ModuleRef -> IO ValueRef
-foreign import ccall unsafe "LLVMGetNextFunction" getNextFunction
-    :: ValueRef -> IO ValueRef
-foreign import ccall unsafe "LLVMGetPreviousFunction" getPreviousFunction
-    :: ValueRef -> IO ValueRef
-
-
--- ** Types
-foreign import ccall unsafe "LLVMGetTypeKind" getTypeKindCUInt
-    :: TypeRef -> IO CUInt
-foreign import ccall unsafe "LLVMTypeIsSized" typeIsSized
-    :: TypeRef -> IO LLVM.Bool
-foreign import ccall unsafe "LLVMGetTypeContext" getTypeContext
-    :: TypeRef -> IO ContextRef
-
--- ** Integer types
-foreign import ccall unsafe "LLVMInt1TypeInContext" int1TypeInContext
-    :: ContextRef -> IO TypeRef
-foreign import ccall unsafe "LLVMInt8TypeInContext" int8TypeInContext
-    :: ContextRef -> IO TypeRef
-foreign import ccall unsafe "LLVMInt16TypeInContext" int16TypeInContext
-    :: ContextRef -> IO TypeRef
-foreign import ccall unsafe "LLVMInt32TypeInContext" int32TypeInContext
-    :: ContextRef -> IO TypeRef
-foreign import ccall unsafe "LLVMInt64TypeInContext" int64TypeInContext
-    :: ContextRef -> IO TypeRef
-foreign import ccall unsafe "LLVMIntTypeInContext" intTypeInContext
-    :: ContextRef -> CUInt -> IO TypeRef
-
-foreign import ccall unsafe "LLVMInt1Type" int1Type :: IO TypeRef
-foreign import ccall unsafe "LLVMInt8Type" int8Type :: IO TypeRef
-foreign import ccall unsafe "LLVMInt16Type" int16Type :: IO TypeRef
-foreign import ccall unsafe "LLVMInt32Type" int32Type :: IO TypeRef
-foreign import ccall unsafe "LLVMInt64Type" int64Type :: IO TypeRef
-foreign import ccall unsafe "LLVMIntType" integerType :: CUInt -> IO TypeRef
-foreign import ccall unsafe "LLVMGetIntTypeWidth" getIntTypeWidth
-    :: TypeRef -> IO CUInt
-
--- ** Real types
-foreign import ccall unsafe "LLVMFloatTypeInContext" floatTypeInContext
-    :: ContextRef -> IO TypeRef
-foreign import ccall unsafe "LLVMDoubleTypeInContext" doubleTypeInContext
-    :: ContextRef -> IO TypeRef
-foreign import ccall unsafe "LLVMX86FP80TypeInContext" x86FP80TypeInContext
-    :: ContextRef -> IO TypeRef
-foreign import ccall unsafe "LLVMFP128TypeInContext" fp128TypeInContext
-    :: ContextRef -> IO TypeRef
-foreign import ccall unsafe "LLVMPPCFP128TypeInContext" ppcFP128TypeInContext
-    :: ContextRef -> IO TypeRef
-
-foreign import ccall unsafe "LLVMFloatType" floatType :: IO TypeRef
-foreign import ccall unsafe "LLVMDoubleType" doubleType :: IO TypeRef
-foreign import ccall unsafe "LLVMX86FP80Type" x86FP80Type :: IO TypeRef
-foreign import ccall unsafe "LLVMFP128Type" fp128Type :: IO TypeRef
-foreign import ccall unsafe "LLVMPPCFP128Type" ppcFP128Type :: IO TypeRef
-
--- ** Function types
--- | Create a function type.
-foreign import ccall unsafe "LLVMFunctionType" functionType
-        :: TypeRef              -- ^ return type
-        -> Ptr TypeRef          -- ^ array of argument types
-        -> CUInt                -- ^ number of elements in array
-        -> LLVM.Bool                 -- ^ non-zero if function is varargs
-        -> IO TypeRef
-
--- | Indicate whether a function takes varargs.
-foreign import ccall unsafe "LLVMIsFunctionVarArg" isFunctionVarArg
-        :: TypeRef -> IO LLVM.Bool
-
--- | Give a function's return type.
-foreign import ccall unsafe "LLVMGetReturnType" getReturnType
-        :: TypeRef -> IO TypeRef
-
--- | Give the number of fixed parameters that a function takes.
-foreign import ccall unsafe "LLVMCountParamTypes" countParamTypes
-        :: TypeRef -> IO CUInt
-
--- | Fill out an array with the types of a function's fixed
--- parameters.
-foreign import ccall unsafe "LLVMGetParamTypes" getParamTypes
-        :: TypeRef -> Ptr TypeRef -> IO ()
-
--- ** Struct Type
-foreign import ccall unsafe "LLVMStructTypeInContext" structTypeInContext
-    :: ContextRef -> Ptr TypeRef -> CUInt -> LLVM.Bool -> IO TypeRef
-foreign import ccall unsafe "LLVMStructType" structType
-    :: Ptr TypeRef -> CUInt -> LLVM.Bool -> IO TypeRef
-foreign import ccall unsafe "LLVMStructCreateNamed" structCreateNamed
-    :: ContextRef -> CString -> IO TypeRef
-foreign import ccall unsafe "LLVMGetStructName" getStructName
-    :: TypeRef -> IO CString
-foreign import ccall unsafe "LLVMStructSetBody" structSetBody
-    :: TypeRef -> Ptr TypeRef -> CUInt -> LLVM.Bool -> IO ()
-foreign import ccall unsafe "LLVMCountStructElementTypes"
-    countStructElementTypes :: TypeRef -> IO CUInt
-foreign import ccall unsafe "LLVMGetStructElementTypes" getStructElementTypes
-    :: TypeRef -> Ptr TypeRef -> IO ()
-foreign import ccall unsafe "LLVMIsPackedStruct" isPackedStruct
-    :: TypeRef -> IO LLVM.Bool
-foreign import ccall unsafe "LLVMIsOpaqueStruct" isOpaqueStruct
-    :: TypeRef -> IO LLVM.Bool
-foreign import ccall unsafe "LLVMGetTypeByName" getTypeByName
-    :: ModuleRef -> CString -> IO TypeRef
-
--- ** Array, Pointer, and Vector types
-foreign import ccall unsafe "LLVMArrayType" arrayType
-    :: TypeRef                  -- ^ element type
-    -> CUInt                    -- ^ element count
-    -> IO TypeRef
-foreign import ccall unsafe "LLVMPointerType" pointerType
-    :: TypeRef                  -- ^ pointed-to type
-    -> CUInt                    -- ^ address space
-    -> IO TypeRef
-foreign import ccall unsafe "LLVMVectorType" vectorType
-    :: TypeRef                  -- ^ element type
-    -> CUInt                    -- ^ element count
-    -> IO TypeRef
-
-
--- | Get the type of a sequential type's elements.
-foreign import ccall unsafe "LLVMGetElementType" getElementType
-    :: TypeRef -> IO TypeRef
-foreign import ccall unsafe "LLVMGetArrayLength" getArrayLength
-    :: TypeRef -> IO CUInt
-foreign import ccall unsafe "LLVMGetPointerAddressSpace" getPointerAddressSpace
-    :: TypeRef -> IO CUInt
-foreign import ccall unsafe "LLVMGetVectorSize" getVectorSize
-    :: TypeRef -> IO CUInt
-
-
--- ** Other Types
-
-foreign import ccall unsafe "LLVMVoidTypeInContext" voidTypeInContext
-    :: ContextRef -> IO TypeRef
-foreign import ccall unsafe "LLVMLabelTypeInContext" labelTypeInContext
-    :: ContextRef -> IO TypeRef
-foreign import ccall unsafe "LLVMX86MMXTypeInContext" x86MMXTypeInContext
-    :: ContextRef -> IO TypeRef
-
-foreign import ccall unsafe "LLVMVoidType" voidType :: IO TypeRef
-foreign import ccall unsafe "LLVMLabelType" labelType :: IO TypeRef
-foreign import ccall unsafe "LLVMX86MMXType" x86MMXType :: IO TypeRef
-
--- ** Values
-foreign import ccall unsafe "LLVMTypeOf" typeOf
-    :: ValueRef -> IO TypeRef
-foreign import ccall unsafe "LLVMGetValueName" getValueName
-    :: ValueRef -> IO CString
-foreign import ccall unsafe "LLVMSetValueName" setValueName
-    :: ValueRef -> CString -> IO ()
-foreign import ccall unsafe "LLVMDumpValue" dumpValue
-    :: ValueRef -> IO ()
-foreign import ccall unsafe "LLVMReplaceAllUsesWith" replaceAllUsesWith
-    :: ValueRef -> ValueRef -> IO ()
-foreign import ccall unsafe "LLVMHasMetadata" hasMetadata
-    :: ValueRef -> IO LLVM.Bool
-foreign import ccall unsafe "LLVMGetMetadata" getMetadata
-    :: ValueRef -> CUInt -> IO ValueRef
-foreign import ccall unsafe "LLVMSetMetadata" setMetadata
-    :: ValueRef -> CUInt -> ValueRef -> IO ()
-
--- ** Uses
-foreign import ccall unsafe "LLVMGetFirstUse" getFirstUse
-    :: ValueRef -> IO UseRef
-foreign import ccall unsafe "LLVMGetNextUse" getNextUse
-    :: UseRef -> IO UseRef
-foreign import ccall unsafe "LLVMGetUser" getUser
-    :: UseRef -> IO ValueRef
-foreign import ccall unsafe "LLVMGetUsedValue" getUsedValue
-    :: UseRef -> IO ValueRef
-
--- ** Users
-foreign import ccall unsafe "LLVMGetOperand" getOperand
-    :: ValueRef -> CUInt -> IO ValueRef
-foreign import ccall unsafe "LLVMSetOperand" setOperand
-    :: ValueRef -> CUInt -> ValueRef -> IO ()
-foreign import ccall unsafe "LLVMGetNumOperands" getNumOperands
-    :: ValueRef -> IO CUInt
-
--- ** Constants
-foreign import ccall unsafe "LLVMConstNull" constNull
-    :: TypeRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstAllOnes" constAllOnes
-    :: TypeRef -> IO ValueRef
-foreign import ccall unsafe "LLVMGetUndef" getUndef
-    :: TypeRef -> IO ValueRef
-foreign import ccall unsafe "LLVMIsConstant" isConstant
-    :: ValueRef -> IO LLVM.Bool
-foreign import ccall unsafe "LLVMIsUndef" isUndef
-    :: ValueRef -> IO LLVM.Bool
-foreign import ccall unsafe "LLVMIsNull" isNull
-    :: ValueRef -> IO LLVM.Bool
-foreign import ccall unsafe "LLVMConstPointerNull" constPointerNull
-    :: TypeRef -> IO ValueRef
-
--- ** Metadata
-foreign import ccall unsafe "LLVMMDStringInContext" mDStringInContext
-    :: ContextRef -> CString -> CUInt -> IO ValueRef
-foreign import ccall unsafe "LLVMMDString" mDString
-    :: CString -> CUInt -> IO ValueRef
-foreign import ccall unsafe "LLVMMDNodeInContext" mDNodeInContext
-    :: ContextRef -> Ptr ValueRef -> CUInt -> IO ValueRef
-foreign import ccall unsafe "LLVMMDNode" mDNode
-    :: Ptr ValueRef -> CUInt -> IO ValueRef
-foreign import ccall unsafe "LLVMGetMDString" getMDString
-    :: ValueRef -> Ptr CUInt -> IO CString
-{-
-foreign import ccall unsafe "LLVMGetMDNodeNumOperands" getMDNodeNumOperands
-    :: ValueRef -> IO CInt
-foreign import ccall unsafe "LLVMGetMDNodeOperand" getMDNodeOperand
-    :: ValueRef -> CUInt -> IO (Ptr ValueRef)
--}
-foreign import ccall unsafe "LLVMGetNamedMetadataNumOperands" getNamedMetadataNumOperands
-    :: ModuleRef -> CString -> IO CUInt
-foreign import ccall unsafe "LLVMGetNamedMetadataOperands" getNamedMetadataOperands
-    :: ModuleRef -> CString -> Ptr ValueRef -> IO ()
-
--- ** Scalar Constants
-foreign import ccall unsafe "LLVMConstInt" constInt
-    :: TypeRef -> CULLong -> LLVM.Bool -> IO ValueRef
-foreign import ccall unsafe "LLVMConstIntOfArbitraryPrecision" constIntOfArbitraryPrecision
-    :: TypeRef -> CUInt -> Ptr CULLong -> IO ValueRef
-foreign import ccall unsafe "LLVMConstIntOfString" constIntOfString
-    :: TypeRef -> CString -> CUInt -> IO ValueRef
-foreign import ccall unsafe "LLVMConstIntOfStringAndSize" constIntOfStringAndSize
-    :: TypeRef -> CString -> CUInt -> CUInt -> IO ValueRef
-foreign import ccall unsafe "LLVMConstReal" constReal
-    :: TypeRef -> CDouble -> IO ValueRef
-foreign import ccall unsafe "LLVMConstRealOfString" constRealOfString
-    :: TypeRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMConstRealOfStringAndSize" constRealOfStringAndSize
-    :: TypeRef -> CString -> CUInt -> IO ValueRef
-foreign import ccall unsafe "LLVMConstIntGetZExtValue" constIntGetZExtValue
-    :: ValueRef -> IO CULLong
-foreign import ccall unsafe "LLVMConstIntGetSExtValue" constIntGetSExtValue
-    :: ValueRef -> IO CLLong
-
--- ** Composite Constants
-foreign import ccall unsafe "LLVMConstStringInContext" constStringInContext
-    :: ContextRef -> CString -> CUInt -> LLVM.Bool -> IO ValueRef
-foreign import ccall unsafe "LLVMConstStructInContext" constStructInContext
-    :: ContextRef -> Ptr ValueRef -> CUInt -> LLVM.Bool -> IO ValueRef
-foreign import ccall unsafe "LLVMConstString" constString
-    :: CString -> CUInt -> LLVM.Bool -> IO ValueRef
-foreign import ccall unsafe "LLVMConstArray" constArray
-    :: TypeRef -> Ptr ValueRef -> CUInt -> IO ValueRef
-foreign import ccall unsafe "LLVMConstStruct" constStruct
-    :: Ptr ValueRef -> CUInt -> LLVM.Bool -> IO ValueRef
-foreign import ccall unsafe "LLVMConstNamedStruct" constNamedStruct
-    :: TypeRef -> Ptr ValueRef -> CUInt -> IO ValueRef
-foreign import ccall unsafe "LLVMConstVector" constVector
-    :: Ptr ValueRef -> CUInt -> IO ValueRef
-
--- ** Constant expressions
-foreign import ccall unsafe "LLVMGetConstOpcode" getConstOpcode
-    :: ValueRef -> IO CUInt {-Opcode-}
-foreign import ccall unsafe "LLVMAlignOf" alignOf
-    :: TypeRef -> IO ValueRef
-foreign import ccall unsafe "LLVMSizeOf" sizeOf
-    :: TypeRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstNeg" constNeg
-    :: ValueRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstNSWNeg" constNSWNeg
-    :: ValueRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstNUWNeg" constNUWNeg
-    :: ValueRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstFNeg" constFNeg
-    :: ValueRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstNot" constNot
-    :: ValueRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstAdd" constAdd
-    :: ValueRef -> ValueRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstNSWAdd" constNSWAdd
-    :: ValueRef -> ValueRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstNUWAdd" constNUWAdd
-    :: ValueRef -> ValueRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstFAdd" constFAdd
-    :: ValueRef -> ValueRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstSub" constSub
-    :: ValueRef -> ValueRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstNSWSub" constNSWSub
-    :: ValueRef -> ValueRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstNUWSub" constNUWSub
-    :: ValueRef -> ValueRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstFSub" constFSub
-    :: ValueRef -> ValueRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstMul" constMul
-    :: ValueRef -> ValueRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstNSWMul" constNSWMul
-    :: ValueRef -> ValueRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstNUWMul" constNUWMul
-    :: ValueRef -> ValueRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstFMul" constFMul
-    :: ValueRef -> ValueRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstUDiv" constUDiv
-    :: ValueRef -> ValueRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstSDiv" constSDiv
-    :: ValueRef -> ValueRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstExactSDiv" constExactSDiv
-    :: ValueRef -> ValueRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstFDiv" constFDiv
-    :: ValueRef -> ValueRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstURem" constURem
-    :: ValueRef -> ValueRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstSRem" constSRem
-    :: ValueRef -> ValueRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstFRem" constFRem
-    :: ValueRef -> ValueRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstAnd" constAnd
-    :: ValueRef -> ValueRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstOr" constOr
-    :: ValueRef -> ValueRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstXor" constXor
-    :: ValueRef -> ValueRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstICmp" constICmp
-    :: CInt -> ValueRef -> ValueRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstFCmp" constFCmp
-    :: CInt -> ValueRef -> ValueRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstShl" constShl
-    :: ValueRef -> ValueRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstLShr" constLShr
-    :: ValueRef -> ValueRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstAShr" constAShr
-    :: ValueRef -> ValueRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstGEP" constGEP
-    :: ValueRef -> Ptr ValueRef -> CUInt -> IO ValueRef
-foreign import ccall unsafe "LLVMConstInBoundsGEP" constInBoundsGEP
-    :: ValueRef -> Ptr ValueRef -> CUInt -> IO ValueRef
-foreign import ccall unsafe "LLVMConstTrunc" constTrunc
-    :: ValueRef -> TypeRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstSExt" constSExt
-    :: ValueRef -> TypeRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstZExt" constZExt
-    :: ValueRef -> TypeRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstFPTrunc" constFPTrunc
-    :: ValueRef -> TypeRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstFPExt" constFPExt
-    :: ValueRef -> TypeRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstUIToFP" constUIToFP
-    :: ValueRef -> TypeRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstSIToFP" constSIToFP
-    :: ValueRef -> TypeRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstFPToUI" constFPToUI
-    :: ValueRef -> TypeRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstFPToSI" constFPToSI
-    :: ValueRef -> TypeRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstPtrToInt" constPtrToInt
-    :: ValueRef -> TypeRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstIntToPtr" constIntToPtr
-    :: ValueRef -> TypeRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstBitCast" constBitCast
-    :: ValueRef -> TypeRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstSExtOrBitCast" constSExtOrBitCast
-    :: ValueRef -> TypeRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstZExtOrBitCast" constZExtOrBitCast
-    :: ValueRef -> TypeRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstTruncOrBitCast" constTruncOrBitCast
-    :: ValueRef -> TypeRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstPointerCast" constPointerCast
-    :: ValueRef -> TypeRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstIntCast" constIntCast
-    :: ValueRef -> TypeRef -> CUInt -> IO ValueRef
-foreign import ccall unsafe "LLVMConstFPCast" constFPCast
-    :: ValueRef -> TypeRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstSelect" constSelect
-    :: ValueRef -> ValueRef -> ValueRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstExtractElement" constExtractElement
-    :: ValueRef -> ValueRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstInsertElement" constInsertElement
-    :: ValueRef -> ValueRef -> ValueRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstShuffleVector" constShuffleVector
-    :: ValueRef -> ValueRef -> ValueRef -> IO ValueRef
-foreign import ccall unsafe "LLVMConstExtractValue" constExtractValue
-    :: ValueRef -> Ptr CUInt -> CUInt -> IO ValueRef
-foreign import ccall unsafe "LLVMConstInsertValue" constInsertValue
-    :: ValueRef -> ValueRef -> Ptr CUInt -> CUInt -> IO ValueRef
-foreign import ccall unsafe "LLVMConstInlineAsm" constInlineAsm
-    :: TypeRef -> CString -> CString -> LLVM.Bool -> LLVM.Bool -> IO ValueRef
-foreign import ccall unsafe "LLVMBlockAddress" blockAddress
-    :: ValueRef -> BasicBlockRef -> IO ValueRef
-
--- ** Operations on globals
-foreign import ccall unsafe "LLVMGetGlobalParent" getGlobalParent
-    :: ValueRef -> IO ModuleRef
-foreign import ccall unsafe "LLVMIsDeclaration" isDeclaration
-    :: ValueRef -> IO LLVM.Bool
-foreign import ccall unsafe "LLVMGetLinkage" getLinkage
-    :: ValueRef -> IO CUInt
-foreign import ccall unsafe "LLVMSetLinkage" setLinkage
-    :: ValueRef -> CUInt -> IO ()
-foreign import ccall unsafe "LLVMGetSection" getSection
-    :: ValueRef -> IO CString
-foreign import ccall unsafe "LLVMSetSection" setSection
-    :: ValueRef -> CString -> IO ()
-foreign import ccall unsafe "LLVMGetVisibility" getVisibility
-    :: ValueRef -> IO CUInt
-foreign import ccall unsafe "LLVMSetVisibility" setVisibility
-    :: ValueRef -> CUInt -> IO ()
-foreign import ccall unsafe "LLVMGetAlignment" getAlignment
-    :: ValueRef -> IO CUInt
-foreign import ccall unsafe "LLVMSetAlignment" setAlignment
-    :: ValueRef -> CUInt -> IO ()
-
--- ** Global Variables
-foreign import ccall unsafe "LLVMAddGlobal" addGlobal
-    :: ModuleRef -> TypeRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMAddGlobalInAddressSpace" addGlobalInAddressSpace
-    :: ModuleRef -> TypeRef -> CString -> CUInt -> IO ValueRef
-foreign import ccall unsafe "LLVMGetNamedGlobal" getNamedGlobal
-    :: ModuleRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMGetFirstGlobal" getFirstGlobal
-    :: ModuleRef -> IO ValueRef
-foreign import ccall unsafe "LLVMGetLastGlobal" getLastGlobal
-    :: ModuleRef -> IO ValueRef
-foreign import ccall unsafe "LLVMGetNextGlobal" getNextGlobal
-    :: ValueRef -> IO ValueRef
-foreign import ccall unsafe "LLVMGetPreviousGlobal" getPreviousGlobal
-    :: ValueRef -> IO ValueRef
-foreign import ccall unsafe "LLVMDeleteGlobal" deleteGlobal
-    :: ValueRef -> IO ()
-foreign import ccall unsafe "LLVMSetInitializer" setInitializer
-    :: ValueRef -> ValueRef -> IO ()
-foreign import ccall unsafe "LLVMGetInitializer" getInitializer
-    :: ValueRef -> IO ValueRef
-foreign import ccall unsafe "LLVMIsThreadLocal" isThreadLocal
-    :: ValueRef -> IO LLVM.Bool
-foreign import ccall unsafe "LLVMSetThreadLocal" setThreadLocal
-    :: ValueRef -> LLVM.Bool -> IO ()
-foreign import ccall unsafe "LLVMIsGlobalConstant" isGlobalConstant
-    :: ValueRef -> IO LLVM.Bool
-foreign import ccall unsafe "LLVMSetGlobalConstant" setGlobalConstant
-    :: ValueRef -> LLVM.Bool -> IO ()
-
--- ** Aliases
-foreign import ccall unsafe "LLVMAddAlias" addAlias
-    :: ModuleRef -> TypeRef -> ValueRef -> CString -> IO ValueRef
-
-foreign import ccall unsafe "LLVMDeleteFunction" deleteFunction
-    :: ValueRef                 -- ^ function
-    -> IO ()
-foreign import ccall unsafe "LLVMGetIntrinsicID" getIntrinsicID
-    :: ValueRef                 -- ^ function
-    -> IO CUInt
-foreign import ccall unsafe "LLVMGetFunctionCallConv" getFunctionCallConv
-    :: ValueRef                 -- ^ function
-    -> IO CUInt
-foreign import ccall unsafe "LLVMSetFunctionCallConv" setFunctionCallConv
-    :: ValueRef                 -- ^ function
-    -> CUInt
-    -> IO ()
-foreign import ccall unsafe "LLVMGetGC" getGC
-    :: ValueRef -> IO CString
-foreign import ccall unsafe "LLVMSetGC" setGC
-    :: ValueRef -> CString -> IO ()
-
--- ** Attribute attachment
-
-foreign import ccall unsafe "LLVMAddAttributeAtIndex" addAttributeAtIndex
-    :: ValueRef -> AttributeIndex -> AttributeRef -> IO ()
-
-foreign import ccall unsafe "LLVMGetAttributeCountAtIndex" getAttributeCountAtIndex
-    :: ValueRef -> AttributeIndex -> IO CUInt
-
-foreign import ccall unsafe "LLVMGetAttributesAtIndex" getAttributesAtIndex
-    :: ValueRef -> AttributeIndex -> Ptr AttributeRef -> IO ()
-
-foreign import ccall unsafe "LLVMGetEnumAttributeAtIndex" getEnumAttributeAtIndex
-    :: ValueRef -> AttributeIndex -> AttributeKind -> IO AttributeRef
-
-foreign import ccall unsafe "LLVMGetStringAttributeAtIndex" getStringAttributeAtIndex
-    :: ValueRef -> AttributeIndex -> CString -> CUInt -> IO AttributeRef
-
-foreign import ccall unsafe "LLVMRemoveEnumAttributeAtIndex" removeEnumAttributeAtIndex
-    :: ValueRef -> AttributeIndex -> AttributeKind -> IO ()
-
-foreign import ccall unsafe "LLVMRemoveStringAttributeAtIndex" removeStringAttributeAtIndex
-    :: ValueRef -> AttributeIndex -> CString -> CUInt -> IO ()
-
-foreign import ccall unsafe "LLVMAddTargetDependentFunctionAttr" addTargetDependentFunctionAttr
-    :: ValueRef -> CString -> CString -> IO ()
-
--- ** Parameters
-foreign import ccall unsafe "LLVMCountParams" countParams
-    :: ValueRef                 -- ^ function
-    -> IO CUInt
-foreign import ccall unsafe "LLVMGetParams" getParams
-    :: ValueRef                 -- ^ function
-    -> Ptr ValueRef             -- ^ array to fill out
-    -> IO ()
-foreign import ccall unsafe "LLVMGetParam" getParam
-    :: ValueRef                 -- ^ function
-    -> CUInt                    -- ^ offset into array
-    -> IO ValueRef
-foreign import ccall unsafe "LLVMGetParamParent" getParamParent
-    :: ValueRef -> IO ValueRef
-foreign import ccall unsafe "LLVMGetFirstParam" getFirstParam
-    :: ValueRef -> IO ValueRef
-foreign import ccall unsafe "LLVMGetLastParam" getLastParam
-    :: ValueRef -> IO ValueRef
-foreign import ccall unsafe "LLVMGetNextParam" getNextParam
-    :: ValueRef -> IO ValueRef
-foreign import ccall unsafe "LLVMGetPreviousParam" getPreviousParam
-    :: ValueRef -> IO ValueRef
-foreign import ccall unsafe "LLVMSetParamAlignment" setParamAlignment
-    :: ValueRef -> CUInt -> IO ()
-
--- ** Basic Blocks
-foreign import ccall unsafe "LLVMBasicBlockAsValue" basicBlockAsValue
-    :: BasicBlockRef -> IO ValueRef
-foreign import ccall unsafe "LLVMValueIsBasicBlock" valueIsBasicBlock
-    :: ValueRef -> IO LLVM.Bool
-foreign import ccall unsafe "LLVMValueAsBasicBlock" valueAsBasicBlock
-    :: ValueRef                 -- ^ basic block
-    -> IO BasicBlockRef
-foreign import ccall unsafe "LLVMGetBasicBlockName" getBasicBlockName
-    :: BasicBlockRef -> IO CString
-foreign import ccall unsafe "LLVMGetBasicBlockParent" getBasicBlockParent
-    :: BasicBlockRef -> IO ValueRef
-foreign import ccall unsafe "LLVMGetBasicBlockTerminator" getBasicBlockTerminator
-    :: BasicBlockRef -> IO ValueRef
-foreign import ccall unsafe "LLVMCountBasicBlocks" countBasicBlocks
-    :: ValueRef                 -- ^ function
-    -> IO CUInt
-foreign import ccall unsafe "LLVMGetBasicBlocks" getBasicBlocks
-    :: ValueRef                 -- ^ function
-    -> Ptr BasicBlockRef        -- ^ array to fill out
-    -> IO ()
-foreign import ccall unsafe "LLVMGetFirstBasicBlock" getFirstBasicBlock
-    :: ValueRef -> IO BasicBlockRef
-foreign import ccall unsafe "LLVMGetLastBasicBlock" getLastBasicBlock
-    :: ValueRef -> IO BasicBlockRef
-foreign import ccall unsafe "LLVMGetNextBasicBlock" getNextBasicBlock
-    :: BasicBlockRef -> IO BasicBlockRef
-foreign import ccall unsafe "LLVMGetPreviousBasicBlock" getPreviousBasicBlock
-    :: BasicBlockRef -> IO BasicBlockRef
-foreign import ccall unsafe "LLVMGetEntryBasicBlock" getEntryBasicBlock
-    :: ValueRef                 -- ^ function
-    -> IO BasicBlockRef
-foreign import ccall unsafe "LLVMAppendBasicBlockInContext" appendBasicBlockInContext
-    :: ContextRef -> ValueRef -> CString -> IO BasicBlockRef
-foreign import ccall unsafe "LLVMInsertBasicBlockInContext" insertBasicBlockInContext
-    :: ContextRef -> BasicBlockRef -> CString -> IO BasicBlockRef
-foreign import ccall unsafe "LLVMAppendBasicBlock" appendBasicBlock
-    :: ValueRef                 -- ^ function
-    -> CString                  -- ^ name for label
-    -> IO BasicBlockRef
-foreign import ccall unsafe "LLVMInsertBasicBlock" insertBasicBlock
-    :: BasicBlockRef            -- ^ insert before this one
-    -> CString                  -- ^ name for label
-    -> IO BasicBlockRef
-foreign import ccall unsafe "LLVMDeleteBasicBlock" deleteBasicBlock
-    :: BasicBlockRef -> IO ()
-foreign import ccall unsafe "LLVMRemoveBasicBlockFromParent" removeBasicBlockFromParent
-    :: BasicBlockRef -> IO ()
-foreign import ccall unsafe "LLVMMoveBasicBlockBefore" moveBasicBlockBefore
-    :: BasicBlockRef -> BasicBlockRef -> IO ()
-foreign import ccall unsafe "LLVMMoveBasicBlockAfter" moveBasicBlockAfter
-    :: BasicBlockRef -> BasicBlockRef -> IO ()
-foreign import ccall unsafe "LLVMGetFirstInstruction" getFirstInstruction
-    :: BasicBlockRef -> IO ValueRef
-foreign import ccall unsafe "LLVMGetLastInstruction" getLastInstruction
-    :: BasicBlockRef -> IO ValueRef
-
--- ** Instructions
-foreign import ccall unsafe "LLVMGetInstructionParent" getInstructionParent
-    :: ValueRef -> IO BasicBlockRef
-foreign import ccall unsafe "LLVMGetNextInstruction" getNextInstruction
-    :: ValueRef -> IO ValueRef
-foreign import ccall unsafe "LLVMGetPreviousInstruction" getPreviousInstruction
-    :: ValueRef -> IO ValueRef
-foreign import ccall unsafe "LLVMInstructionEraseFromParent" instructionEraseFromParent
-    :: ValueRef -> IO ()
-foreign import ccall unsafe "LLVMGetInstructionOpcode" getInstructionOpcode
-    :: ValueRef -> IO Int
-foreign import ccall unsafe "LLVMGetICmpPredicate" getICmpPredicate
-    :: ValueRef -> IO Int
-
--- ** Call sites
-foreign import ccall unsafe "LLVMSetInstructionCallConv" setInstructionCallConv
-    :: ValueRef -> CUInt -> IO ()
-foreign import ccall unsafe "LLVMGetInstructionCallConv" getInstructionCallConv
-    :: ValueRef -> IO CUInt
-foreign import ccall unsafe "LLVMSetInstrParamAlignment" setInstrParamAlignment
-    :: ValueRef -> CUInt -> CUInt -> IO ()
-
-foreign import ccall unsafe "LLVMAddCallSiteAttribute" addCallSiteAttribute
-    :: ValueRef -> AttributeIndex -> AttributeRef -> IO ()
-
-foreign import ccall unsafe "LLVMGetCallSiteAttributeCount" getCallSiteAttributeCount
-    :: ValueRef -> AttributeIndex -> IO CUInt
-
-foreign import ccall unsafe "LLVMGetCallSiteAttributes" getCallSiteAttributes
-    :: ValueRef -> AttributeIndex -> Ptr AttributeRef -> IO ()
-
-foreign import ccall unsafe "LLVMGetCallSiteEnumAttribute" getCallSiteEnumAttribute
-    :: ValueRef -> AttributeIndex -> AttributeKind -> IO AttributeRef
-
-foreign import ccall unsafe "LLVMGetCallSiteStringAttribute" getCallSiteStringAttribute
-    :: ValueRef -> AttributeIndex -> CString -> CUInt -> IO AttributeRef
-
-foreign import ccall unsafe "LLVMRemoveCallSiteEnumAttribute" removeCallSiteEnumAttribute
-    :: ValueRef -> AttributeIndex -> AttributeKind -> IO ()
-
-foreign import ccall unsafe "LLVMRemoveCallSiteStringAttribute" removeCallSiteStringAttribute
-    :: ValueRef -> AttributeIndex -> CString -> CUInt -> IO ()
-
-foreign import ccall unsafe "LLVMGetCalledValue" getCalledValue
-    :: ValueRef -> IO ValueRef
-
--- ** Call instructions
-foreign import ccall unsafe "LLVMIsTailCall" isTailCall
-    :: ValueRef -> IO LLVM.Bool
-foreign import ccall unsafe "LLVMSetTailCall" setTailCall
-    :: ValueRef -> LLVM.Bool -> IO ()
-
--- ** Switch Instructions
-foreign import ccall unsafe "LLVMGetSwitchDefaultDest" getSwitchDefaultDest
-    :: ValueRef -> IO BasicBlockRef
-
--- ** Phi Nodes
-foreign import ccall unsafe "LLVMAddIncoming" addIncoming
-    :: ValueRef -> Ptr ValueRef -> Ptr BasicBlockRef -> CUInt -> IO ()
-foreign import ccall unsafe "LLVMCountIncoming" countIncoming
-    :: ValueRef -> IO CUInt
-foreign import ccall unsafe "LLVMGetIncomingValue" getIncomingValue
-    :: ValueRef -> CUInt -> IO ValueRef
-foreign import ccall unsafe "LLVMGetIncomingBlock" getIncomingBlock
-    :: ValueRef -> CUInt -> IO BasicBlockRef
-
--- ** Builders
-foreign import ccall unsafe "LLVMCreateBuilderInContext" createBuilderInContext
-    :: ContextRef -> IO BuilderRef
-foreign import ccall unsafe "LLVMCreateBuilder" createBuilder
-    :: IO BuilderRef
-foreign import ccall unsafe "LLVMPositionBuilder" positionBuilder
-    :: BuilderRef -> BasicBlockRef -> ValueRef -> IO ()
-foreign import ccall unsafe "LLVMPositionBuilderBefore" positionBefore
-    :: BuilderRef -> ValueRef -> IO ()
-foreign import ccall unsafe "LLVMPositionBuilderAtEnd" positionAtEnd
-    :: BuilderRef -> BasicBlockRef -> IO ()
-foreign import ccall unsafe "LLVMGetInsertBlock" getInsertBlock
-    :: BuilderRef -> IO BasicBlockRef
-foreign import ccall unsafe "LLVMClearInsertionPosition" clearInsertionPosition
-    :: BuilderRef -> IO ()
-foreign import ccall unsafe "LLVMInsertIntoBuilder" insertIntoBuilder
-    :: BuilderRef -> ValueRef -> IO ()
-foreign import ccall unsafe "LLVMInsertIntoBuilderWithName" insertIntoBuilderWithName
-    :: BuilderRef -> ValueRef -> CString -> IO ()
-foreign import ccall unsafe "&LLVMDisposeBuilder" ptrDisposeBuilder
-    :: FunPtr (BuilderRef -> IO ())
-
--- ** Metadata
-foreign import ccall unsafe "LLVMGetCurrentDebugLocation" getCurrentDebugLocation
-    :: BuilderRef -> IO ValueRef
-foreign import ccall unsafe "LLVMSetCurrentDebugLocation" setCurrentDebugLocation
-    :: BuilderRef -> ValueRef -> IO ()
-foreign import ccall unsafe "LLVMSetInstDebugLocation" setInstDebugLocation
-    :: BuilderRef -> ValueRef -> IO ()
-
--- ** Terminators
-foreign import ccall unsafe "LLVMBuildRetVoid" buildRetVoid
-    :: BuilderRef -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildRet" buildRet
-    :: BuilderRef -> ValueRef -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildAggregateRet" buildAggregateRet
-    :: BuilderRef -> Ptr ValueRef -> CUInt -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildBr" buildBr
-    :: BuilderRef -> BasicBlockRef -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildCondBr" buildCondBr
-    :: BuilderRef -> ValueRef -> BasicBlockRef -> BasicBlockRef -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildSwitch" buildSwitch
-    :: BuilderRef -> ValueRef -> BasicBlockRef -> CUInt -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildIndirectBr" buildIndirectBr
-    :: BuilderRef -> ValueRef -> CUInt -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildInvoke" buildInvoke
-    :: BuilderRef -> ValueRef -> Ptr ValueRef -> CUInt
-    -> BasicBlockRef -> BasicBlockRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildLandingPad" buildLandingPad
-    :: BuilderRef -> TypeRef -> ValueRef -> CUInt -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildResume" buildResume
-    :: BuilderRef -> ValueRef -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildUnreachable" buildUnreachable
-    :: BuilderRef -> IO ValueRef
-
--- ** Switch instructions
-foreign import ccall unsafe "LLVMAddCase" addCase
-    :: ValueRef -> ValueRef -> BasicBlockRef -> IO ()
-
--- ** IndirectBr instructions
-foreign import ccall unsafe "LLVMAddDestination" addDestination
-    :: ValueRef -> BasicBlockRef -> IO ()
-
--- ** LandingPad instructions
-foreign import ccall unsafe "LLVMAddClause" addClause
-    :: ValueRef -> ValueRef -> IO ()
-
--- ** Resume instructions
-foreign import ccall unsafe "LLVMSetCleanup" setCleanup
-    :: ValueRef -> LLVM.Bool -> IO ()
-
--- ** Arithmetic
-foreign import ccall unsafe "LLVMBuildAdd" buildAdd
-    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildNSWAdd" buildNSWAdd
-    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildNUWAdd" buildNUWAdd
-    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildFAdd" buildFAdd
-    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildSub" buildSub
-    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildNSWSub" buildNSWSub
-    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildNUWSub" buildNUWSub
-    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildFSub" buildFSub
-    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildMul" buildMul
-    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildNSWMul" buildNSWMul
-    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildNUWMul" buildNUWMul
-    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildFMul" buildFMul
-    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildUDiv" buildUDiv
-    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildSDiv" buildSDiv
-    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildExactSDiv" buildExactSDiv
-    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildFDiv" buildFDiv
-    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildURem" buildURem
-    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildSRem" buildSRem
-    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildFRem" buildFRem
-    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildShl" buildShl
-    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildLShr" buildLShr
-    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildAShr" buildAShr
-    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildAnd" buildAnd
-    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildOr" buildOr
-    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildXor" buildXor
-    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildBinOp" buildBinOp
-    :: BuilderRef -> CUInt{-Opcode-} -> ValueRef -> ValueRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildNeg" buildNeg
-    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildNSWNeg" buildNSWNeg
-    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildNUWNeg" buildNUWNeg
-    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildFNeg" buildFNeg
-    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildNot" buildNot
-    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
-
--- ** Floating point attributes
-foreign import ccall unsafe "LLVMSetHasUnsafeAlgebra" setFastMath
-    :: ValueRef -> LLVM.Bool -> IO ()
-foreign import ccall unsafe "LLVMSetHasUnsafeAlgebra" setHasUnsafeAlgebra
-    :: ValueRef -> LLVM.Bool -> IO ()
-foreign import ccall unsafe "LLVMSetHasNoNaNs" setHasNoNaNs
-    :: ValueRef -> LLVM.Bool -> IO ()
-foreign import ccall unsafe "LLVMSetHasNoInfs" setHasNoInfs
-    :: ValueRef -> LLVM.Bool -> IO ()
-foreign import ccall unsafe "LLVMSetHasNoSignedZeros" setHasNoSignedZeros
-    :: ValueRef -> LLVM.Bool -> IO ()
-foreign import ccall unsafe "LLVMSetHasAllowReciprocal" setHasAllowReciprocal
-    :: ValueRef -> LLVM.Bool -> IO ()
-foreign import ccall unsafe "LLVMSetHasAllowReassoc" setHasAllowReassoc
-    :: ValueRef -> LLVM.Bool -> IO ()
-foreign import ccall unsafe "LLVMSetHasApproxFunc" setHasApproxFunc
-    :: ValueRef -> LLVM.Bool -> IO ()
-
-
--- ** Memory
-foreign import ccall unsafe "LLVMBuildMalloc" buildMalloc
-    :: BuilderRef -> TypeRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildArrayMalloc" buildArrayMalloc
-    :: BuilderRef -> TypeRef -> ValueRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildAlloca" buildAlloca
-    :: BuilderRef -> TypeRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildArrayAlloca" buildArrayAlloca
-    :: BuilderRef -> TypeRef -> ValueRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildFree" buildFree
-    :: BuilderRef -> ValueRef -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildLoad" buildLoad
-    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildStore" buildStore
-    :: BuilderRef -> ValueRef -> ValueRef -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildGEP" buildGEP
-    :: BuilderRef -> ValueRef -> Ptr ValueRef -> CUInt -> CString
-    -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildInBoundsGEP" buildInBoundsGEP
-    :: BuilderRef -> ValueRef -> Ptr ValueRef -> CUInt -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildStructGEP" buildStructGEP
-    :: BuilderRef -> ValueRef -> CUInt -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildGlobalString" buildGlobalString
-    :: BuilderRef -> CString -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildGlobalStringPtr" buildGlobalStringPtr
-    :: BuilderRef -> CString -> CString -> IO ValueRef
-
--- Casts
-foreign import ccall unsafe "LLVMBuildTrunc" buildTrunc
-    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildZExt" buildZExt
-    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildSExt" buildSExt
-    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildFPToUI" buildFPToUI
-    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildFPToSI" buildFPToSI
-    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildUIToFP" buildUIToFP
-    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildSIToFP" buildSIToFP
-    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildFPTrunc" buildFPTrunc
-    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildFPExt" buildFPExt
-    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildPtrToInt" buildPtrToInt
-    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildIntToPtr" buildIntToPtr
-    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildBitCast" buildBitCast
-    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildZExtOrBitCast" buildZExtOrBitCast
-    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildSExtOrBitCast" buildSExtOrBitCast
-    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildTruncOrBitCast" buildTruncOrBitCast
-    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildCast" buildCast
-    :: BuilderRef -> CUInt{-Opcode-} -> ValueRef -> TypeRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildPointerCast" buildPointerCast
-    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildIntCast" buildIntCast
-    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildFPCast" buildFPCast
-    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
-
--- Comparisons
-foreign import ccall unsafe "LLVMBuildICmp" buildICmp
-    :: BuilderRef -> CInt -> ValueRef -> ValueRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildFCmp" buildFCmp
-    :: BuilderRef -> CInt -> ValueRef -> ValueRef -> CString -> IO ValueRef
-
--- Miscellaneous instructions
-foreign import ccall unsafe "LLVMBuildPhi" buildPhi
-    :: BuilderRef -> TypeRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildCall" buildCall
-    :: BuilderRef -> ValueRef -> Ptr ValueRef -> CUInt -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildSelect" buildSelect
-    :: BuilderRef -> ValueRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildVAArg" buildVAArg
-    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildExtractElement" buildExtractElement
-    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildInsertElement" buildInsertElement
-    :: BuilderRef -> ValueRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildShuffleVector" buildShuffleVector
-    :: BuilderRef -> ValueRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildExtractValue" buildExtractValue
-    :: BuilderRef -> ValueRef -> CUInt -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildInsertValue" buildInsertValue
-    :: BuilderRef -> ValueRef -> ValueRef -> CUInt -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildIsNull" buildIsNull
-    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildIsNotNull" buildIsNotNull
-    :: BuilderRef -> ValueRef -> CString -> IO ValueRef
-foreign import ccall unsafe "LLVMBuildPtrDiff" buildPtrDiff
-    :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
-
-
--- ** Memory Buffers
-foreign import ccall unsafe "LLVMCreateMemoryBufferWithContentsOfFile" createMemoryBufferWithContentsOfFile
-    :: CString -> Ptr MemoryBufferRef -> Ptr CString -> IO LLVM.Bool
-foreign import ccall unsafe "LLVMCreateMemoryBufferWithSTDIN" createMemoryBufferWithSTDIN
-    :: Ptr MemoryBufferRef -> Ptr CString -> IO LLVM.Bool
-foreign import ccall unsafe "LLVMDisposeMemoryBuffer" disposeMemoryBuffer
-    :: MemoryBufferRef -> IO ()
-
--- ** Pass Registry
-foreign import ccall unsafe "LLVMGetGlobalPassRegistry" getGlobalPassRegistry
-    :: IO PassRegistryRef
-
--- ** Pass Managers
-foreign import ccall unsafe "LLVMCreatePassManager" createPassManager
-    :: IO PassManagerRef
-foreign import ccall unsafe "LLVMCreateFunctionPassManagerForModule" createFunctionPassManagerForModule
-    :: ModuleRef -> IO PassManagerRef
-foreign import ccall unsafe "LLVMRunPassManager" runPassManager
-    :: PassManagerRef -> ModuleRef -> IO LLVM.Bool
-foreign import ccall unsafe "LLVMInitializeFunctionPassManager" initializeFunctionPassManager
-    :: PassManagerRef -> IO LLVM.Bool
-foreign import ccall unsafe "LLVMRunFunctionPassManager" runFunctionPassManager
-    :: PassManagerRef -> ValueRef -> IO LLVM.Bool
-foreign import ccall unsafe "LLVMFinalizeFunctionPassManager" finalizeFunctionPassManager
-    :: PassManagerRef -> IO LLVM.Bool
-foreign import ccall unsafe "LLVMDisposePassManager" disposePassManager
-    :: PassManagerRef -> IO ()
-foreign import ccall unsafe "&LLVMDisposePassManager" ptrDisposePassManager
-    :: FunPtr (PassManagerRef -> IO ())
-
--- ** Functions from extras.cpp
-foreign import ccall unsafe "LLVMValueGetNumUses" getNumUses
-    :: ValueRef -> IO CInt
-foreign import ccall unsafe "LLVMInstGetOpcode" instGetOpcode
-    :: ValueRef -> IO CInt
-foreign import ccall unsafe "LLVMCmpInstGetPredicate" cmpInstGetPredicate
-    :: ValueRef -> IO CInt
+-- Raw.Module:      LLVM.FFI.Core
+-- Copyright:   Bryan O'Sullivan 2007, 2008
+-- License:     BSD-style (see the file LICENSE)
+--
+-- Maintainer:  bos@serpentine.com
+-- Stability:   experimental
+-- Portability: requires GHC 6.8, LLVM
+--
+-- This module provides direct access to the LLVM C bindings.
+
+module LLVM.FFI.Core
+    (
+      initializeCore
+    , Version.version
+
+    -- * Boolean values
+    , LLVM.Bool(LLVM.Bool)
+    , LLVM.false
+    , LLVM.true
+    , LLVM.consBool
+    , LLVM.deconsBool
+
+    -- * Error handling
+    , disposeMessage
+
+    -- * Raw.Context functions
+    , Raw.Context
+    , ContextRef
+    , contextCreate
+    , contextDispose
+    , getGlobalContext
+
+    , getMDKindID
+    , getMDKindIDInContext
+
+      -- * Modules
+    , Raw.Module
+    , ModuleRef
+    , moduleCreateWithName
+    , moduleCreateWithNameInContext
+    , disposeModule
+    , ptrDisposeModule
+
+    , getDataLayout
+    , setDataLayout
+
+    , getTarget
+    , setTarget
+
+    , defaultTargetTriple
+    , hostTriple
+
+    , dumpModule
+
+    , setModuleInlineAsm
+    , getModuleContext
+
+    -- * Types
+    , Raw.Type
+    , TypeRef
+    , TypeKind(..)
+
+    , getTypeKind
+    , typeIsSized
+    , getTypeContext
+
+    -- ** Integer types
+    , int1TypeInContext
+    , int8TypeInContext
+    , int16TypeInContext
+    , int32TypeInContext
+    , int64TypeInContext
+    , intTypeInContext
+
+    , int1Type
+    , int8Type
+    , int16Type
+    , int32Type
+    , int64Type
+    , integerType
+    , getIntTypeWidth
+
+    -- ** Real types
+    , floatTypeInContext
+    , doubleTypeInContext
+    , x86FP80TypeInContext
+    , fp128TypeInContext
+    , ppcFP128TypeInContext
+
+    , floatType
+    , doubleType
+    , x86FP80Type
+    , fp128Type
+    , ppcFP128Type
+
+    -- ** Function types
+    , functionType
+    , isFunctionVarArg
+    , getReturnType
+    , countParamTypes
+    , getParamTypes
+
+    -- ** Struct types
+    , structTypeInContext
+    , structType
+    , structCreateNamed
+    , getStructName
+    , structSetBody
+
+    , countStructElementTypes
+    , getStructElementTypes
+    , isPackedStruct
+    , isOpaqueStruct
+
+    , getTypeByName
+
+    -- ** Array, pointer, and vector types
+    , arrayType
+    , pointerType
+    , vectorType
+
+    , getElementType
+    , getArrayLength
+    , getPointerAddressSpace
+    , getVectorSize
+
+    -- ** Other types
+    , voidTypeInContext
+    , labelTypeInContext
+    , x86MMXTypeInContext
+
+    , voidType
+    , labelType
+    , x86MMXType
+
+    -- * Values
+    , Raw.Value
+    , ValueRef
+    , typeOf
+    , getValueName
+    , setValueName
+    , dumpValue
+    , replaceAllUsesWith
+    , hasMetadata
+    , getMetadata
+    , setMetadata
+
+    -- ** Uses
+    , Raw.OpaqueUse
+    , UseRef
+    , getFirstUse
+    , getNextUse
+    , getUser
+    , getUsedValue
+
+    -- ** Users
+    , getOperand
+    , setOperand
+    , getNumOperands
+
+    -- ** Constants
+    , constNull
+    , constAllOnes
+    , getUndef
+    , isConstant
+    , isNull
+    , isUndef
+    , constPointerNull
+
+    -- ** Metadata
+    , mDStringInContext
+    , mDString
+    , mDNodeInContext
+    , mDNode
+    , getMDString
+--    , getMDNodeNumOperands
+--    , getMDNodeOperand
+    , getNamedMetadataNumOperands
+    , getNamedMetadataOperands
+
+    -- ** Scalar constants
+    , constInt
+    , constIntOfArbitraryPrecision
+    , constIntOfString
+    , constIntOfStringAndSize
+    , constReal
+    , constRealOfString
+    , constRealOfStringAndSize
+    , constIntGetZExtValue
+    , constIntGetSExtValue
+
+    -- ** Composite constants
+    , constStringInContext
+    , constStructInContext
+    , constString
+    , constArray
+    , constStruct
+    , constNamedStruct
+    , constVector
+
+    -- ** Constant Expressions
+    , getConstOpcode
+    , alignOf
+    , sizeOf
+    , constNeg
+    , constNUWNeg
+    , constNSWNeg
+    , constFNeg
+    , constNot
+    , constAdd
+    , constNSWAdd
+    , constNUWAdd
+    , constFAdd
+    , constSub
+    , constNSWSub
+    , constNUWSub
+    , constFSub
+    , constMul
+    , constNSWMul
+    , constNUWMul
+    , constFMul
+    , constUDiv
+    , constSDiv
+    , constExactSDiv
+    , constFDiv
+    , constURem
+    , constSRem
+    , constFRem
+    , constAnd
+    , constOr
+    , constXor
+    , constICmp
+    , constFCmp
+    , constShl
+    , constLShr
+    , constAShr
+    , constGEP
+    , constInBoundsGEP
+    , constTrunc
+    , constSExt
+    , constZExt
+    , constFPTrunc
+    , constFPExt
+    , constUIToFP
+    , constSIToFP
+    , constFPToUI
+    , constFPToSI
+    , constPtrToInt
+    , constIntToPtr
+    , constBitCast
+    , constZExtOrBitCast
+    , constSExtOrBitCast
+    , constTruncOrBitCast
+    , constPointerCast
+    , constIntCast
+    , constFPCast
+    , constSelect
+    , constExtractElement
+    , constInsertElement
+    , constShuffleVector
+    , constExtractValue
+    , constInsertValue
+    , constInlineAsm
+    , blockAddress
+
+    -- ** Comparison predicates
+    , IntPredicate(..)
+    , fromIntPredicate
+    , toIntPredicate
+    , FPPredicate(..)
+    , fromRealPredicate
+    , toRealPredicate
+
+    -- ** Floating point attributes
+    , setFastMath
+    , setHasUnsafeAlgebra
+    , setHasNoNaNs
+    , setHasNoInfs
+    , setHasNoSignedZeros
+    , setHasAllowReciprocal
+    , setHasAllowReassoc
+    , setHasApproxFunc
+
+    -- ** Support operations and types
+    , Linkage(..)
+    , fromLinkage
+    , toLinkage
+
+    , Visibility(..)
+    , fromVisibility
+    , toVisibility
+
+    -- ** Global variables, functions, and aliases (globals)
+    , getGlobalParent
+    , isDeclaration
+    , getLinkage
+    , setLinkage
+    , getSection
+    , setSection
+    , getVisibility
+    , setVisibility
+    , getAlignment
+    , setAlignment
+
+    -- ** Global variables
+    , addGlobal
+    , addGlobalInAddressSpace
+    , getNamedGlobal
+    , getFirstGlobal
+    , getLastGlobal
+    , getNextGlobal
+    , getPreviousGlobal
+    , deleteGlobal
+    , getInitializer
+    , setInitializer
+    , isThreadLocal
+    , setThreadLocal
+    , isGlobalConstant
+    , setGlobalConstant
+
+    -- ** Aliases
+    , addAlias
+
+    -- * Parameter passing
+    , Raw.Attribute
+    , AttributeRef
+    , AttributeKind(..)
+
+    -- ** Calling conventions
+    , CallingConvention(..)
+    , fromCallingConvention
+    , toCallingConvention
+
+    -- ** Functions
+    , addFunction
+    , getNamedFunction
+    , getFirstFunction
+    , getLastFunction
+    , getNextFunction
+    , getPreviousFunction
+    , deleteFunction
+    , getIntrinsicID
+    , getFunctionCallConv
+    , setFunctionCallConv
+    , getGC
+    , setGC
+    , AttributeIndex(AttributeIndex)
+    , Raw.attributeReturnIndex, Raw.attributeFunctionIndex
+    , getEnumAttributeKindForName
+    , getLastEnumAttributeKind
+    , createEnumAttribute
+    , getEnumAttributeKind
+    , getEnumAttributeValue
+    , createStringAttribute
+    , getStringAttributeKind
+    , getStringAttributeValue
+    , isEnumAttribute
+    , isStringAttribute
+    , addAttributeAtIndex
+    , getAttributeCountAtIndex
+    , getAttributesAtIndex
+    , getEnumAttributeAtIndex
+    , getStringAttributeAtIndex
+    , removeEnumAttributeAtIndex
+    , removeStringAttributeAtIndex
+    , addTargetDependentFunctionAttr
+    , addCallSiteAttribute
+    , getCallSiteAttributeCount
+    , getCallSiteAttributes
+    , getCallSiteEnumAttribute
+    , getCallSiteStringAttribute
+    , removeCallSiteEnumAttribute
+    , removeCallSiteStringAttribute
+    , getCalledValue
+
+    -- ** Parameters
+    , countParams
+    , getParams
+    , getParam
+    , getParamParent
+    , getFirstParam
+    , getLastParam
+    , getNextParam
+    , getPreviousParam
+    , setParamAlignment
+
+    -- ** Basic blocks
+    , Raw.BasicBlock
+    , BasicBlockRef
+    , basicBlockAsValue
+    , valueIsBasicBlock
+    , valueAsBasicBlock
+    , getBasicBlockName
+    , getBasicBlockParent
+    , getBasicBlockTerminator
+    , countBasicBlocks
+    , getBasicBlocks
+    , getFirstBasicBlock
+    , getLastBasicBlock
+    , getNextBasicBlock
+    , getPreviousBasicBlock
+    , getEntryBasicBlock
+    , appendBasicBlockInContext
+    , insertBasicBlockInContext
+    , appendBasicBlock
+    , insertBasicBlock
+    , deleteBasicBlock
+    , removeBasicBlockFromParent
+    , moveBasicBlockBefore
+    , moveBasicBlockAfter
+    , getFirstInstruction
+    , getLastInstruction
+
+    -- ** Instructions
+    , getInstructionParent
+    , getNextInstruction
+    , getPreviousInstruction
+    , instructionEraseFromParent
+    , getInstructionOpcode
+    , getICmpPredicate
+
+    -- ** Call Sites
+    , getInstructionCallConv
+    , setInstructionCallConv
+    , setInstrParamAlignment
+
+    -- ** Call Instructions (only)
+    , isTailCall
+    , setTailCall
+
+    -- ** Switch Instructions (only)
+    , getSwitchDefaultDest
+
+    -- ** Phi nodes
+    , addIncoming
+    , countIncoming
+    , getIncomingValue
+    , getIncomingBlock
+
+    -- * Instruction building
+    , Raw.Builder
+    , BuilderRef
+    , createBuilderInContext
+    , createBuilder
+    , positionBuilder
+    , positionBefore
+    , positionAtEnd
+    , getInsertBlock
+    , clearInsertionPosition
+    , insertIntoBuilder
+    , insertIntoBuilderWithName
+    , ptrDisposeBuilder
+
+    -- ** Metadata
+    , setCurrentDebugLocation
+    , getCurrentDebugLocation
+    , setInstDebugLocation
+
+    -- ** Terminators
+    , buildRetVoid
+    , buildRet
+    , buildAggregateRet
+    , buildBr
+    , buildCondBr
+    , buildSwitch
+    , buildIndirectBr
+    , buildInvoke
+    , buildLandingPad
+    , buildResume
+    , buildUnreachable
+
+    , addCase
+    , addDestination
+    , addClause
+    , setCleanup
+
+    -- ** Arithmetic
+    , buildAdd
+    , buildNSWAdd
+    , buildNUWAdd
+    , buildFAdd
+    , buildSub
+    , buildNSWSub
+    , buildNUWSub
+    , buildFSub
+    , buildMul
+    , buildNSWMul
+    , buildNUWMul
+    , buildFMul
+    , buildUDiv
+    , buildSDiv
+    , buildExactSDiv
+    , buildFDiv
+    , buildURem
+    , buildSRem
+    , buildFRem
+    , buildShl
+    , buildLShr
+    , buildAShr
+    , buildAnd
+    , buildOr
+    , buildXor
+    , buildBinOp
+    , buildNeg
+    , buildNSWNeg
+    , buildNUWNeg
+    , buildFNeg
+    , buildNot
+
+    -- ** Memory
+    , buildMalloc
+    , buildArrayMalloc
+    , buildAlloca
+    , buildArrayAlloca
+    , buildFree
+    , buildLoad
+    , buildStore
+    , buildGEP
+    , buildInBoundsGEP
+    , buildStructGEP
+    , buildGlobalString
+    , buildGlobalStringPtr
+
+    -- ** Casts
+    , buildTrunc
+    , buildZExt
+    , buildSExt
+    , buildFPToUI
+    , buildFPToSI
+    , buildUIToFP
+    , buildSIToFP
+    , buildFPTrunc
+    , buildFPExt
+    , buildPtrToInt
+    , buildIntToPtr
+    , buildBitCast
+    , buildZExtOrBitCast
+    , buildSExtOrBitCast
+    , buildTruncOrBitCast
+    , buildCast
+    , buildPointerCast
+    , buildIntCast
+    , buildFPCast
+
+    -- ** Comparisons
+    , buildICmp
+    , buildFCmp
+
+    -- ** Miscellaneous instructions
+    , buildPhi
+    , buildCall
+    , buildSelect
+    , buildVAArg
+    , buildExtractElement
+    , buildInsertElement
+    , buildShuffleVector
+    , buildExtractValue
+    , buildInsertValue
+    , buildIsNull
+    , buildIsNotNull
+    , buildPtrDiff
+
+    -- * Memory buffers
+    , Raw.MemoryBuffer
+    , MemoryBufferRef
+    , createMemoryBufferWithContentsOfFile
+    , createMemoryBufferWithSTDIN
+    , disposeMemoryBuffer
+
+    -- ** Raw.PassRegistry
+    , Raw.PassRegistry
+    , PassRegistryRef
+    , getGlobalPassRegistry
+
+    -- ** Pass manager
+    , Raw.PassManager
+    , PassManagerRef
+    , ptrDisposePassManager
+
+    , createPassManager
+    , createFunctionPassManagerForModule
+    , runPassManager
+    , initializeFunctionPassManager
+    , runFunctionPassManager
+    , finalizeFunctionPassManager
+    , disposePassManager
+
+    -- ** Functions from extras.cpp
+    , getNumUses
+    , instGetOpcode
+    , cmpInstGetIntPredicate
+    , cmpInstGetRealPredicate
+
+    ) where
+
+import qualified LLVM.FFI.Version as Version
+import qualified LLVM.FFI.Base as LLVM
+import qualified LLVM.Raw.Core as Raw
+import LLVM.Raw.Core (
+         PassRegistryRef, ContextRef, AttributeRef, AttributeIndex,
+         ModuleRef, TypeRef,
+         BasicBlockRef, ValueRef, UseRef, BuilderRef,
+         MemoryBufferRef, PassManagerRef, PassRegistryRef, ContextRef)
+
+import qualified Foreign.C.Types as C
+import Foreign.C.String (CString)
+import Foreign.Ptr (Ptr, FunPtr)
+
+import Data.Typeable (Typeable)
+
+import Data.Word (Word8, Word64)
+
+import Prelude
+         (IO, Eq, Ord, Bounded, Enum, Show, Read, String,
+          ($), (++), (.), error,
+           fmap, fromIntegral, show, toEnum, )
+
+
+type CDouble  = C.CDouble
+type CInt     = C.CInt
+type CUInt    = C.CUInt
+type CLLong   = C.CLLong
+type CULLong  = C.CULLong
+
+type FunctionRef = ValueRef
+
+
+#include <llvm/Config/llvm-config.h>
+#include <llvm-c/Core.h>
+
+
+defaultTargetTriple, hostTriple :: String
+defaultTargetTriple = (#const_str LLVM_DEFAULT_TARGET_TRIPLE)
+hostTriple          = (#const_str LLVM_HOST_TRIPLE)
+
+
+data TypeKind
+    = VoidTypeKind
+    | FloatTypeKind
+    | DoubleTypeKind
+    | X86_FP80TypeKind
+    | FP128TypeKind
+    | PPC_FP128TypeKind
+    | LabelTypeKind
+    | IntegerTypeKind
+    | FunctionTypeKind
+    | StructTypeKind
+    | ArrayTypeKind
+    | PointerTypeKind
+    | OpaqueTypeKind
+    | VectorTypeKind
+    deriving (Eq, Ord, Enum, Bounded, Show, Read, Typeable)
+
+getTypeKind :: TypeRef -> IO TypeKind
+getTypeKind = fmap (toEnum . fromIntegral . Raw.unTypeKind) . getTypeKindRaw
+
+data CallingConvention = C
+                       | Fast
+                       | Cold
+                       | X86StdCall
+                       | X86FastCall
+                       | GHC
+                         deriving (Show, Eq, Ord, Enum, Bounded, Typeable)
+
+fromCallingConvention :: CallingConvention -> Raw.CallingConvention
+fromCallingConvention c =
+    Raw.CallingConvention $
+    case c of
+        C -> (#const LLVMCCallConv)
+        Fast -> (#const LLVMFastCallConv)
+        Cold -> (#const LLVMColdCallConv)
+        X86StdCall -> (#const LLVMX86FastcallCallConv)
+        X86FastCall -> (#const LLVMX86StdcallCallConv)
+        GHC -> 10
+
+toCallingConvention :: Raw.CallingConvention -> CallingConvention
+toCallingConvention (Raw.CallingConvention c) =
+    case c of
+        (#const LLVMCCallConv) -> C
+        (#const LLVMFastCallConv) -> Fast
+        (#const LLVMColdCallConv) -> Cold
+        (#const LLVMX86StdcallCallConv) -> X86StdCall
+        (#const LLVMX86FastcallCallConv) -> X86FastCall
+        10 -> GHC
+        _ ->
+            error $ "LLVM.Core.FFI.toCallingConvention: " ++
+                                "unsupported calling convention" ++ show c
+
+-- |An enumeration for the kinds of linkage for global values.
+data Linkage
+    = ExternalLinkage     -- ^Externally visible function
+    | AvailableExternallyLinkage
+    | LinkOnceAnyLinkage  -- ^Keep one copy of function when linking (inline)
+    | LinkOnceODRLinkage  -- ^Same, but only replaced by something equivalent.
+    | LinkOnceODRAutoHideLinkage -- ^Like LinkOnceODR, but possibly hidden.
+    | WeakAnyLinkage      -- ^Keep one copy of named function when linking (weak)
+    | WeakODRLinkage      -- ^Same, but only replaced by something equivalent.
+    | AppendingLinkage    -- ^Special purpose, only applies to global arrays
+    | InternalLinkage     -- ^Rename collisions when linking (static functions)
+    | PrivateLinkage      -- ^Like Internal, but omit from symbol table
+    | DLLImportLinkage    -- ^Function to be imported from DLL
+    | DLLExportLinkage    -- ^Function to be accessible from DLL
+    | ExternalWeakLinkage -- ^ExternalWeak linkage description
+    | GhostLinkage        -- ^Stand-in functions for streaming fns from BC files
+    | CommonLinkage       -- ^Tentative definitions
+    | LinkerPrivateLinkage -- ^Like Private, but linker removes.
+    | LinkerPrivateWeakLinkage -- ^Like LinkerPrivate, but is weak.
+    deriving (Show, Eq, Ord, Enum, Typeable)
+
+fromLinkage :: Linkage -> Raw.Linkage
+fromLinkage c =
+    Raw.Linkage $
+    case c of
+        ExternalLinkage             -> (#const LLVMExternalLinkage)
+        AvailableExternallyLinkage  -> (#const LLVMAvailableExternallyLinkage)
+        LinkOnceAnyLinkage          -> (#const LLVMLinkOnceAnyLinkage)
+        LinkOnceODRLinkage          -> (#const LLVMLinkOnceODRLinkage)
+        LinkOnceODRAutoHideLinkage  -> (#const LLVMLinkOnceODRAutoHideLinkage)
+        WeakAnyLinkage              -> (#const LLVMWeakAnyLinkage)
+        WeakODRLinkage              -> (#const LLVMWeakODRLinkage)
+        AppendingLinkage            -> (#const LLVMAppendingLinkage)
+        InternalLinkage             -> (#const LLVMInternalLinkage)
+        PrivateLinkage              -> (#const LLVMPrivateLinkage)
+        DLLImportLinkage            -> (#const LLVMDLLImportLinkage)
+        DLLExportLinkage            -> (#const LLVMDLLExportLinkage)
+        ExternalWeakLinkage         -> (#const LLVMExternalWeakLinkage)
+        GhostLinkage                -> (#const LLVMGhostLinkage)
+        CommonLinkage               -> (#const LLVMCommonLinkage)
+        LinkerPrivateLinkage        -> (#const LLVMLinkerPrivateLinkage)
+        LinkerPrivateWeakLinkage    -> (#const LLVMLinkerPrivateWeakLinkage)
+
+toLinkage :: Raw.Linkage -> Linkage
+toLinkage (Raw.Linkage c) =
+    case c of
+        (#const LLVMExternalLinkage)             -> ExternalLinkage
+        (#const LLVMAvailableExternallyLinkage)  -> AvailableExternallyLinkage
+        (#const LLVMLinkOnceAnyLinkage)          -> LinkOnceAnyLinkage
+        (#const LLVMLinkOnceODRLinkage)          -> LinkOnceODRLinkage
+        (#const LLVMLinkOnceODRAutoHideLinkage)  -> LinkOnceODRAutoHideLinkage
+        (#const LLVMWeakAnyLinkage)              -> WeakAnyLinkage
+        (#const LLVMWeakODRLinkage)              -> WeakODRLinkage
+        (#const LLVMAppendingLinkage)            -> AppendingLinkage
+        (#const LLVMInternalLinkage)             -> InternalLinkage
+        (#const LLVMPrivateLinkage)              -> PrivateLinkage
+        (#const LLVMDLLImportLinkage)            -> DLLImportLinkage
+        (#const LLVMDLLExportLinkage)            -> DLLExportLinkage
+        (#const LLVMExternalWeakLinkage)         -> ExternalWeakLinkage
+        (#const LLVMGhostLinkage)                -> GhostLinkage
+        (#const LLVMCommonLinkage)               -> CommonLinkage
+        (#const LLVMLinkerPrivateLinkage)        -> LinkerPrivateLinkage
+        (#const LLVMLinkerPrivateWeakLinkage)    -> LinkerPrivateWeakLinkage
+        _ -> error "toLinkage: bad value"
+
+-- |An enumeration for the kinds of visibility of global values.
+data Visibility
+    = DefaultVisibility   -- ^The GV is visible
+    | HiddenVisibility    -- ^The GV is hidden
+    | ProtectedVisibility -- ^The GV is protected
+    deriving (Show, Eq, Ord, Enum)
+
+fromVisibility :: Visibility -> Raw.Visibility
+fromVisibility c =
+    Raw.Visibility $
+    case c of
+        DefaultVisibility   -> (#const LLVMDefaultVisibility)
+        HiddenVisibility    -> (#const LLVMHiddenVisibility)
+        ProtectedVisibility -> (#const LLVMProtectedVisibility)
+
+toVisibility :: Raw.Visibility -> Visibility
+toVisibility (Raw.Visibility c) =
+    case c of
+        (#const LLVMDefaultVisibility)   -> DefaultVisibility
+        (#const LLVMHiddenVisibility)    -> HiddenVisibility
+        (#const LLVMProtectedVisibility) -> ProtectedVisibility
+        _ -> error "toVisibility: bad value"
+
+
+data IntPredicate =
+      IntEQ   -- ^ equal
+    | IntNE   -- ^ not equal
+    | IntUGT  -- ^ unsigned greater than
+    | IntUGE  -- ^ unsigned greater or equal
+    | IntULT  -- ^ unsigned less than
+    | IntULE  -- ^ unsigned less or equal
+    | IntSGT  -- ^ signed greater than
+    | IntSGE  -- ^ signed greater or equal
+    | IntSLT  -- ^ signed less than
+    | IntSLE  -- ^ signed less or equal
+    deriving (Eq, Ord, Enum, Show, Typeable)
+
+fromIntPredicate :: IntPredicate -> Raw.IntPredicate
+fromIntPredicate p =
+    Raw.IntPredicate $
+    case p of
+        IntEQ  -> (#const LLVMIntEQ )
+        IntNE  -> (#const LLVMIntNE )
+        IntUGT -> (#const LLVMIntUGT)
+        IntUGE -> (#const LLVMIntUGE)
+        IntULT -> (#const LLVMIntULT)
+        IntULE -> (#const LLVMIntULE)
+        IntSGT -> (#const LLVMIntSGT)
+        IntSGE -> (#const LLVMIntSGE)
+        IntSLT -> (#const LLVMIntSLT)
+        IntSLE -> (#const LLVMIntSLE)
+
+toIntPredicate :: Raw.IntPredicate -> IntPredicate
+toIntPredicate (Raw.IntPredicate p) =
+    case p of
+        (#const LLVMIntEQ ) -> IntEQ
+        (#const LLVMIntNE ) -> IntNE
+        (#const LLVMIntUGT) -> IntUGT
+        (#const LLVMIntUGE) -> IntUGE
+        (#const LLVMIntULT) -> IntULT
+        (#const LLVMIntULE) -> IntULE
+        (#const LLVMIntSGT) -> IntSGT
+        (#const LLVMIntSGE) -> IntSGE
+        (#const LLVMIntSLT) -> IntSLT
+        (#const LLVMIntSLE) -> IntSLE
+        _ -> error "toIntPredicate: bad value"
+
+data FPPredicate =
+      FPFalse -- ^ Always false (always folded)
+    | FPOEQ   -- ^ True if ordered and equal
+    | FPOGT   -- ^ True if ordered and greater than
+    | FPOGE   -- ^ True if ordered and greater than or equal
+    | FPOLT   -- ^ True if ordered and less than
+    | FPOLE   -- ^ True if ordered and less than or equal
+    | FPONE   -- ^ True if ordered and operands are unequal
+    | FPORD   -- ^ True if ordered (no nans)
+    | FPUNO   -- ^ True if unordered: isnan(X) | isnan(Y)
+    | FPUEQ   -- ^ True if unordered or equal
+    | FPUGT   -- ^ True if unordered or greater than
+    | FPUGE   -- ^ True if unordered, greater than, or equal
+    | FPULT   -- ^ True if unordered or less than
+    | FPULE   -- ^ True if unordered, less than, or equal
+    | FPUNE   -- ^ True if unordered or not equal
+    | FPTrue  -- ^ Always true (always folded)
+    deriving (Eq, Ord, Enum, Show, Typeable)
+
+fromRealPredicate :: FPPredicate -> Raw.RealPredicate
+fromRealPredicate p =
+    Raw.RealPredicate $
+    case p of
+        FPFalse -> (#const LLVMRealPredicateFalse)
+        FPTrue  -> (#const LLVMRealPredicateTrue)
+        FPOEQ -> (#const LLVMRealOEQ)
+        FPOGT -> (#const LLVMRealOGT)
+        FPOGE -> (#const LLVMRealOGE)
+        FPOLT -> (#const LLVMRealOLT)
+        FPOLE -> (#const LLVMRealOLE)
+        FPONE -> (#const LLVMRealONE)
+        FPORD -> (#const LLVMRealORD)
+        FPUNO -> (#const LLVMRealUNO)
+        FPUEQ -> (#const LLVMRealUEQ)
+        FPUGT -> (#const LLVMRealUGT)
+        FPUGE -> (#const LLVMRealUGE)
+        FPULT -> (#const LLVMRealULT)
+        FPULE -> (#const LLVMRealULE)
+        FPUNE -> (#const LLVMRealUNE)
+
+toRealPredicate :: Raw.RealPredicate -> FPPredicate
+toRealPredicate (Raw.RealPredicate p) =
+    case p of
+        (#const LLVMRealPredicateFalse) -> FPFalse
+        (#const LLVMRealPredicateTrue) -> FPTrue
+        (#const LLVMRealOEQ) -> FPOEQ
+        (#const LLVMRealOGT) -> FPOGT
+        (#const LLVMRealOGE) -> FPOGE
+        (#const LLVMRealOLT) -> FPOLT
+        (#const LLVMRealOLE) -> FPOLE
+        (#const LLVMRealONE) -> FPONE
+        (#const LLVMRealORD) -> FPORD
+        (#const LLVMRealUNO) -> FPUNO
+        (#const LLVMRealUEQ) -> FPUEQ
+        (#const LLVMRealUGT) -> FPUGT
+        (#const LLVMRealUGE) -> FPUGE
+        (#const LLVMRealULT) -> FPULT
+        (#const LLVMRealULE) -> FPULE
+        (#const LLVMRealUNE) -> FPUNE
+        _ -> error "toRealPredicate: bad value"
+
+
+
+-- ** Initialization
+initializeCore :: PassRegistryRef -> IO ()
+initializeCore = Raw.initializeCore
+
+-- ** Error Handling
+disposeMessage :: CString -> IO ()
+disposeMessage = Raw.disposeMessage
+
+-- ** Contexts
+contextCreate :: IO ContextRef
+contextCreate = Raw.contextCreate
+
+getGlobalContext :: IO ContextRef
+getGlobalContext = Raw.getGlobalContext
+
+contextDispose :: ContextRef -> IO ()
+contextDispose = Raw.contextDispose
+
+getMDKindIDInContext :: ContextRef -> CString -> CUInt -> IO CUInt
+getMDKindIDInContext = Raw.getMDKindIDInContext
+
+getMDKindID :: CString -> CUInt -> IO CUInt
+getMDKindID = Raw.getMDKindID
+
+-- ** Attributes
+
+newtype AttributeKind = AttributeKind CUInt
+
+getEnumAttributeKindForName :: CString -> C.CSize -> IO AttributeKind
+getEnumAttributeKindForName name slen =
+   fmap AttributeKind $ Raw.getEnumAttributeKindForName name slen
+
+getLastEnumAttributeKind :: IO AttributeKind
+getLastEnumAttributeKind = fmap AttributeKind $ Raw.getLastEnumAttributeKind
+
+createEnumAttribute :: ContextRef -> AttributeKind -> Word64 -> IO AttributeRef
+createEnumAttribute c (AttributeKind kindId) = Raw.createEnumAttribute c kindId
+
+getEnumAttributeKind :: AttributeRef -> IO AttributeKind
+getEnumAttributeKind = fmap AttributeKind . Raw.getEnumAttributeKind
+
+getEnumAttributeValue :: AttributeRef -> IO Word64
+getEnumAttributeValue = Raw.getEnumAttributeValue
+
+createStringAttribute ::
+   ContextRef -> CString -> CUInt -> CString -> CUInt -> IO AttributeRef
+createStringAttribute = Raw.createStringAttribute
+
+getStringAttributeKind :: AttributeRef -> Ptr CUInt -> IO CString
+getStringAttributeKind = Raw.getStringAttributeKind
+
+getStringAttributeValue :: AttributeRef -> Ptr CUInt -> IO CString
+getStringAttributeValue = Raw.getStringAttributeValue
+
+isEnumAttribute :: AttributeRef -> IO LLVM.Bool
+isEnumAttribute = Raw.isEnumAttribute
+
+isStringAttribute :: AttributeRef -> IO LLVM.Bool
+isStringAttribute = Raw.isStringAttribute
+
+-- ** Modules
+moduleCreateWithName :: CString -> IO ModuleRef
+moduleCreateWithName = Raw.moduleCreateWithName
+
+moduleCreateWithNameInContext :: CString -> ContextRef -> IO ModuleRef
+moduleCreateWithNameInContext = Raw.moduleCreateWithNameInContext
+
+disposeModule :: ModuleRef -> IO ()
+disposeModule = Raw.disposeModule
+
+foreign import ccall unsafe "&LLVMDisposeModule" ptrDisposeModule
+    :: FunPtr (ModuleRef -> IO ())
+
+-- ** Data Layout
+getDataLayout :: ModuleRef -> IO CString
+getDataLayout = Raw.getDataLayout
+
+setDataLayout :: ModuleRef -> CString -> IO ()
+setDataLayout = Raw.setDataLayout
+
+
+-- ** Targets
+getTarget :: ModuleRef -> IO CString
+getTarget = Raw.getTarget
+
+setTarget :: ModuleRef -> CString -> IO ()
+setTarget = Raw.setTarget
+
+
+-- ** Dump module
+dumpModule :: ModuleRef -> IO ()
+dumpModule = Raw.dumpModule
+
+setModuleInlineAsm :: ModuleRef -> CString -> IO ()
+setModuleInlineAsm = Raw.setModuleInlineAsm
+
+getModuleContext :: ModuleRef -> IO ContextRef
+getModuleContext = Raw.getModuleContext
+
+
+-- ** Functions
+addFunction :: ModuleRef -> CString -> TypeRef -> IO FunctionRef
+addFunction = Raw.addFunction
+
+getNamedFunction :: ModuleRef -> CString -> IO FunctionRef
+getNamedFunction = Raw.getNamedFunction
+
+getFirstFunction :: ModuleRef -> IO ValueRef
+getFirstFunction = Raw.getFirstFunction
+
+getLastFunction :: ModuleRef -> IO ValueRef
+getLastFunction = Raw.getLastFunction
+
+getNextFunction :: ValueRef -> IO ValueRef
+getNextFunction = Raw.getNextFunction
+
+getPreviousFunction :: ValueRef -> IO ValueRef
+getPreviousFunction = Raw.getPreviousFunction
+
+
+-- ** Types
+getTypeKindRaw :: TypeRef -> IO Raw.TypeKind
+getTypeKindRaw = Raw.getTypeKind
+
+typeIsSized :: TypeRef -> IO LLVM.Bool
+typeIsSized = Raw.typeIsSized
+
+getTypeContext :: TypeRef -> IO ContextRef
+getTypeContext = Raw.getTypeContext
+
+
+-- ** Integer types
+int1TypeInContext :: ContextRef -> IO TypeRef
+int1TypeInContext = Raw.int1TypeInContext
+
+int8TypeInContext :: ContextRef -> IO TypeRef
+int8TypeInContext = Raw.int8TypeInContext
+
+int16TypeInContext :: ContextRef -> IO TypeRef
+int16TypeInContext = Raw.int16TypeInContext
+
+int32TypeInContext :: ContextRef -> IO TypeRef
+int32TypeInContext = Raw.int32TypeInContext
+
+int64TypeInContext :: ContextRef -> IO TypeRef
+int64TypeInContext = Raw.int64TypeInContext
+
+intTypeInContext :: ContextRef -> CUInt -> IO TypeRef
+intTypeInContext = Raw.intTypeInContext
+
+
+int1Type :: IO TypeRef
+int1Type = Raw.int1Type
+int8Type :: IO TypeRef
+int8Type = Raw.int8Type
+int16Type :: IO TypeRef
+int16Type = Raw.int16Type
+int32Type :: IO TypeRef
+int32Type = Raw.int32Type
+int64Type :: IO TypeRef
+int64Type = Raw.int64Type
+integerType :: CUInt -> IO TypeRef
+integerType = Raw.intType
+getIntTypeWidth :: TypeRef -> IO CUInt
+getIntTypeWidth = Raw.getIntTypeWidth
+
+
+-- ** Real types
+floatTypeInContext :: ContextRef -> IO TypeRef
+floatTypeInContext = Raw.floatTypeInContext
+
+doubleTypeInContext :: ContextRef -> IO TypeRef
+doubleTypeInContext = Raw.doubleTypeInContext
+
+x86FP80TypeInContext :: ContextRef -> IO TypeRef
+x86FP80TypeInContext = Raw.x86FP80TypeInContext
+
+fp128TypeInContext :: ContextRef -> IO TypeRef
+fp128TypeInContext = Raw.fP128TypeInContext
+
+ppcFP128TypeInContext :: ContextRef -> IO TypeRef
+ppcFP128TypeInContext = Raw.pPCFP128TypeInContext
+
+
+floatType :: IO TypeRef
+floatType = Raw.floatType
+
+doubleType :: IO TypeRef
+doubleType = Raw.doubleType
+
+x86FP80Type :: IO TypeRef
+x86FP80Type = Raw.x86FP80Type
+
+fp128Type :: IO TypeRef
+fp128Type = Raw.fP128Type
+
+ppcFP128Type :: IO TypeRef
+ppcFP128Type = Raw.pPCFP128Type
+
+
+-- ** Function types
+-- | Create a function type.
+functionType
+        :: TypeRef              -- ^ return type
+        -> Ptr TypeRef          -- ^ array of argument types
+        -> CUInt                -- ^ number of elements in array
+        -> LLVM.Bool            -- ^ non-zero if function is varargs
+        -> IO TypeRef
+functionType = Raw.functionType
+
+-- | Indicate whether a function takes varargs.
+isFunctionVarArg :: TypeRef -> IO LLVM.Bool
+isFunctionVarArg = Raw.isFunctionVarArg
+
+-- | Give a function's return type.
+getReturnType :: TypeRef -> IO TypeRef
+getReturnType = Raw.getReturnType
+
+-- | Give the number of fixed parameters that a function takes.
+countParamTypes :: TypeRef -> IO CUInt
+countParamTypes = Raw.countParamTypes
+
+-- | Fill out an array with the types of a function's fixed
+-- parameters.
+getParamTypes     :: TypeRef -> Ptr TypeRef -> IO ()
+getParamTypes = Raw.getParamTypes
+
+
+-- ** Struct Raw.Type
+structTypeInContext :: ContextRef -> Ptr TypeRef -> CUInt -> LLVM.Bool -> IO TypeRef
+structTypeInContext = Raw.structTypeInContext
+
+structType :: Ptr TypeRef -> CUInt -> LLVM.Bool -> IO TypeRef
+structType = Raw.structType
+
+structCreateNamed :: ContextRef -> CString -> IO TypeRef
+structCreateNamed = Raw.structCreateNamed
+
+getStructName :: TypeRef -> IO CString
+getStructName = Raw.getStructName
+
+structSetBody :: TypeRef -> Ptr TypeRef -> CUInt -> LLVM.Bool -> IO ()
+structSetBody = Raw.structSetBody
+
+countStructElementTypes :: TypeRef -> IO CUInt
+countStructElementTypes = Raw.countStructElementTypes
+
+getStructElementTypes :: TypeRef -> Ptr TypeRef -> IO ()
+getStructElementTypes = Raw.getStructElementTypes
+
+isPackedStruct :: TypeRef -> IO LLVM.Bool
+isPackedStruct = Raw.isPackedStruct
+
+isOpaqueStruct :: TypeRef -> IO LLVM.Bool
+isOpaqueStruct = Raw.isOpaqueStruct
+
+getTypeByName :: ModuleRef -> CString -> IO TypeRef
+getTypeByName = Raw.getTypeByName
+
+
+-- ** Array, Pointer, and Vector types
+arrayType
+    :: TypeRef                  -- ^ element type
+    -> CUInt                    -- ^ element count
+    -> IO TypeRef
+arrayType = Raw.arrayType
+
+pointerType
+    :: TypeRef                  -- ^ pointed-to type
+    -> CUInt                    -- ^ address space
+    -> IO TypeRef
+pointerType = Raw.pointerType
+
+vectorType
+    :: TypeRef                  -- ^ element type
+    -> CUInt                    -- ^ element count
+    -> IO TypeRef
+vectorType = Raw.vectorType
+
+
+-- | Get the type of a sequential type's elements.
+getElementType :: TypeRef -> IO TypeRef
+getElementType = Raw.getElementType
+
+getArrayLength :: TypeRef -> IO CUInt
+getArrayLength = Raw.getArrayLength
+
+getPointerAddressSpace :: TypeRef -> IO CUInt
+getPointerAddressSpace = Raw.getPointerAddressSpace
+
+getVectorSize :: TypeRef -> IO CUInt
+getVectorSize = Raw.getVectorSize
+
+
+-- ** Other Types
+
+voidTypeInContext :: ContextRef -> IO TypeRef
+voidTypeInContext = Raw.voidTypeInContext
+
+labelTypeInContext :: ContextRef -> IO TypeRef
+labelTypeInContext = Raw.labelTypeInContext
+
+x86MMXTypeInContext :: ContextRef -> IO TypeRef
+x86MMXTypeInContext = Raw.x86MMXTypeInContext
+
+
+foreign import ccall unsafe "LLVMVoidType" voidType :: IO TypeRef
+foreign import ccall unsafe "LLVMLabelType" labelType :: IO TypeRef
+foreign import ccall unsafe "LLVMX86MMXType" x86MMXType :: IO TypeRef
+
+-- ** Values
+typeOf :: ValueRef -> IO TypeRef
+typeOf = Raw.typeOf
+
+getValueName :: ValueRef -> IO CString
+getValueName = Raw.getValueName
+
+setValueName :: ValueRef -> CString -> IO ()
+setValueName = Raw.setValueName
+
+dumpValue :: ValueRef -> IO ()
+dumpValue = Raw.dumpValue
+
+replaceAllUsesWith :: ValueRef -> ValueRef -> IO ()
+replaceAllUsesWith = Raw.replaceAllUsesWith
+
+hasMetadata :: ValueRef -> IO LLVM.Bool
+hasMetadata = fmap (LLVM.Bool . fromIntegral) . Raw.hasMetadata
+
+getMetadata :: ValueRef -> CUInt -> IO ValueRef
+getMetadata = Raw.getMetadata
+
+setMetadata :: ValueRef -> CUInt -> ValueRef -> IO ()
+setMetadata = Raw.setMetadata
+
+
+-- ** Uses
+getFirstUse :: ValueRef -> IO UseRef
+getFirstUse = Raw.getFirstUse
+
+getNextUse :: UseRef -> IO UseRef
+getNextUse = Raw.getNextUse
+
+getUser :: UseRef -> IO ValueRef
+getUser = Raw.getUser
+
+getUsedValue :: UseRef -> IO ValueRef
+getUsedValue = Raw.getUsedValue
+
+
+-- ** Users
+getOperand :: ValueRef -> CUInt -> IO ValueRef
+getOperand = Raw.getOperand
+
+setOperand :: ValueRef -> CUInt -> ValueRef -> IO ()
+setOperand = Raw.setOperand
+
+getNumOperands :: ValueRef -> IO CUInt
+getNumOperands = fmap fromIntegral . Raw.getNumOperands
+
+
+-- ** Constants
+constNull :: TypeRef -> IO ValueRef
+constNull = Raw.constNull
+
+constAllOnes :: TypeRef -> IO ValueRef
+constAllOnes = Raw.constAllOnes
+
+getUndef :: TypeRef -> IO ValueRef
+getUndef = Raw.getUndef
+
+isConstant :: ValueRef -> IO LLVM.Bool
+isConstant = Raw.isConstant
+
+isUndef :: ValueRef -> IO LLVM.Bool
+isUndef = Raw.isUndef
+
+isNull :: ValueRef -> IO LLVM.Bool
+isNull = Raw.isNull
+
+constPointerNull :: TypeRef -> IO ValueRef
+constPointerNull = Raw.constPointerNull
+
+
+-- ** Metadata
+mDStringInContext :: ContextRef -> CString -> CUInt -> IO ValueRef
+mDStringInContext = Raw.mDStringInContext
+
+mDString :: CString -> CUInt -> IO ValueRef
+mDString = Raw.mDString
+
+mDNodeInContext :: ContextRef -> Ptr ValueRef -> CUInt -> IO ValueRef
+mDNodeInContext = Raw.mDNodeInContext
+
+mDNode :: Ptr ValueRef -> CUInt -> IO ValueRef
+mDNode = Raw.mDNode
+
+getMDString :: ValueRef -> Ptr CUInt -> IO CString
+getMDString = Raw.getMDString
+
+{-
+getMDNodeNumOperands :: ValueRef -> IO CInt
+getMDNodeNumOperands = Raw.getMDNodeNumOperands
+
+getMDNodeOperand :: ValueRef -> CUInt -> IO (Ptr ValueRef)
+getMDNodeOperand = Raw.getMDNodeOperand
+-}
+
+getNamedMetadataNumOperands :: ModuleRef -> CString -> IO CUInt
+getNamedMetadataNumOperands = Raw.getNamedMetadataNumOperands
+
+getNamedMetadataOperands :: ModuleRef -> CString -> Ptr ValueRef -> IO ()
+getNamedMetadataOperands = Raw.getNamedMetadataOperands
+
+
+-- ** Scalar Constants
+constInt :: TypeRef -> CULLong -> LLVM.Bool -> IO ValueRef
+constInt = Raw.constInt
+
+constIntOfArbitraryPrecision :: TypeRef -> CUInt -> Ptr Word64 -> IO ValueRef
+constIntOfArbitraryPrecision = Raw.constIntOfArbitraryPrecision
+
+constIntOfString :: TypeRef -> CString -> Word8 -> IO ValueRef
+constIntOfString = Raw.constIntOfString
+
+constIntOfStringAndSize :: TypeRef -> CString -> CUInt -> Word8 -> IO ValueRef
+constIntOfStringAndSize = Raw.constIntOfStringAndSize
+
+constReal :: TypeRef -> CDouble -> IO ValueRef
+constReal = Raw.constReal
+
+constRealOfString :: TypeRef -> CString -> IO ValueRef
+constRealOfString = Raw.constRealOfString
+
+constRealOfStringAndSize :: TypeRef -> CString -> CUInt -> IO ValueRef
+constRealOfStringAndSize = Raw.constRealOfStringAndSize
+
+constIntGetZExtValue :: ValueRef -> IO CULLong
+constIntGetZExtValue = Raw.constIntGetZExtValue
+
+constIntGetSExtValue :: ValueRef -> IO CLLong
+constIntGetSExtValue = Raw.constIntGetSExtValue
+
+
+-- ** Composite Constants
+constStringInContext :: ContextRef -> CString -> CUInt -> LLVM.Bool -> IO ValueRef
+constStringInContext = Raw.constStringInContext
+
+constStructInContext :: ContextRef -> Ptr ValueRef -> CUInt -> LLVM.Bool -> IO ValueRef
+constStructInContext = Raw.constStructInContext
+
+constString :: CString -> CUInt -> LLVM.Bool -> IO ValueRef
+constString = Raw.constString
+
+constArray :: TypeRef -> Ptr ValueRef -> CUInt -> IO ValueRef
+constArray = Raw.constArray
+
+constStruct :: Ptr ValueRef -> CUInt -> LLVM.Bool -> IO ValueRef
+constStruct = Raw.constStruct
+
+constNamedStruct :: TypeRef -> Ptr ValueRef -> CUInt -> IO ValueRef
+constNamedStruct = Raw.constNamedStruct
+
+constVector :: Ptr ValueRef -> CUInt -> IO ValueRef
+constVector = Raw.constVector
+
+
+-- ** Constant expressions
+getConstOpcode :: ValueRef -> IO Raw.Opcode
+getConstOpcode = Raw.getConstOpcode
+
+alignOf :: TypeRef -> IO ValueRef
+alignOf = Raw.alignOf
+
+sizeOf :: TypeRef -> IO ValueRef
+sizeOf = Raw.sizeOf
+
+constNeg :: ValueRef -> IO ValueRef
+constNeg = Raw.constNeg
+
+constNSWNeg :: ValueRef -> IO ValueRef
+constNSWNeg = Raw.constNSWNeg
+
+constNUWNeg :: ValueRef -> IO ValueRef
+constNUWNeg = Raw.constNUWNeg
+
+constFNeg :: ValueRef -> IO ValueRef
+constFNeg = Raw.constFNeg
+
+constNot :: ValueRef -> IO ValueRef
+constNot = Raw.constNot
+
+constAdd :: ValueRef -> ValueRef -> IO ValueRef
+constAdd = Raw.constAdd
+
+constNSWAdd :: ValueRef -> ValueRef -> IO ValueRef
+constNSWAdd = Raw.constNSWAdd
+
+constNUWAdd :: ValueRef -> ValueRef -> IO ValueRef
+constNUWAdd = Raw.constNUWAdd
+
+constFAdd :: ValueRef -> ValueRef -> IO ValueRef
+constFAdd = Raw.constFAdd
+
+constSub :: ValueRef -> ValueRef -> IO ValueRef
+constSub = Raw.constSub
+
+constNSWSub :: ValueRef -> ValueRef -> IO ValueRef
+constNSWSub = Raw.constNSWSub
+
+constNUWSub :: ValueRef -> ValueRef -> IO ValueRef
+constNUWSub = Raw.constNUWSub
+
+constFSub :: ValueRef -> ValueRef -> IO ValueRef
+constFSub = Raw.constFSub
+
+constMul :: ValueRef -> ValueRef -> IO ValueRef
+constMul = Raw.constMul
+
+constNSWMul :: ValueRef -> ValueRef -> IO ValueRef
+constNSWMul = Raw.constNSWMul
+
+constNUWMul :: ValueRef -> ValueRef -> IO ValueRef
+constNUWMul = Raw.constNUWMul
+
+constFMul :: ValueRef -> ValueRef -> IO ValueRef
+constFMul = Raw.constFMul
+
+constUDiv :: ValueRef -> ValueRef -> IO ValueRef
+constUDiv = Raw.constUDiv
+
+constSDiv :: ValueRef -> ValueRef -> IO ValueRef
+constSDiv = Raw.constSDiv
+
+constExactSDiv :: ValueRef -> ValueRef -> IO ValueRef
+constExactSDiv = Raw.constExactSDiv
+
+constFDiv :: ValueRef -> ValueRef -> IO ValueRef
+constFDiv = Raw.constFDiv
+
+constURem :: ValueRef -> ValueRef -> IO ValueRef
+constURem = Raw.constURem
+
+constSRem :: ValueRef -> ValueRef -> IO ValueRef
+constSRem = Raw.constSRem
+
+constFRem :: ValueRef -> ValueRef -> IO ValueRef
+constFRem = Raw.constFRem
+
+constAnd :: ValueRef -> ValueRef -> IO ValueRef
+constAnd = Raw.constAnd
+
+constOr :: ValueRef -> ValueRef -> IO ValueRef
+constOr = Raw.constOr
+
+constXor :: ValueRef -> ValueRef -> IO ValueRef
+constXor = Raw.constXor
+
+constICmp :: Raw.IntPredicate -> ValueRef -> ValueRef -> IO ValueRef
+constICmp = Raw.constICmp
+
+constFCmp :: Raw.RealPredicate -> ValueRef -> ValueRef -> IO ValueRef
+constFCmp = Raw.constFCmp
+
+constShl :: ValueRef -> ValueRef -> IO ValueRef
+constShl = Raw.constShl
+
+constLShr :: ValueRef -> ValueRef -> IO ValueRef
+constLShr = Raw.constLShr
+
+constAShr :: ValueRef -> ValueRef -> IO ValueRef
+constAShr = Raw.constAShr
+
+constGEP :: ValueRef -> Ptr ValueRef -> CUInt -> IO ValueRef
+constGEP = Raw.constGEP
+
+constInBoundsGEP :: ValueRef -> Ptr ValueRef -> CUInt -> IO ValueRef
+constInBoundsGEP = Raw.constInBoundsGEP
+
+constTrunc :: ValueRef -> TypeRef -> IO ValueRef
+constTrunc = Raw.constTrunc
+
+constSExt :: ValueRef -> TypeRef -> IO ValueRef
+constSExt = Raw.constSExt
+
+constZExt :: ValueRef -> TypeRef -> IO ValueRef
+constZExt = Raw.constZExt
+
+constFPTrunc :: ValueRef -> TypeRef -> IO ValueRef
+constFPTrunc = Raw.constFPTrunc
+
+constFPExt :: ValueRef -> TypeRef -> IO ValueRef
+constFPExt = Raw.constFPExt
+
+constUIToFP :: ValueRef -> TypeRef -> IO ValueRef
+constUIToFP = Raw.constUIToFP
+
+constSIToFP :: ValueRef -> TypeRef -> IO ValueRef
+constSIToFP = Raw.constSIToFP
+
+constFPToUI :: ValueRef -> TypeRef -> IO ValueRef
+constFPToUI = Raw.constFPToUI
+
+constFPToSI :: ValueRef -> TypeRef -> IO ValueRef
+constFPToSI = Raw.constFPToSI
+
+constPtrToInt :: ValueRef -> TypeRef -> IO ValueRef
+constPtrToInt = Raw.constPtrToInt
+
+constIntToPtr :: ValueRef -> TypeRef -> IO ValueRef
+constIntToPtr = Raw.constIntToPtr
+
+constBitCast :: ValueRef -> TypeRef -> IO ValueRef
+constBitCast = Raw.constBitCast
+
+constSExtOrBitCast :: ValueRef -> TypeRef -> IO ValueRef
+constSExtOrBitCast = Raw.constSExtOrBitCast
+
+constZExtOrBitCast :: ValueRef -> TypeRef -> IO ValueRef
+constZExtOrBitCast = Raw.constZExtOrBitCast
+
+constTruncOrBitCast :: ValueRef -> TypeRef -> IO ValueRef
+constTruncOrBitCast = Raw.constTruncOrBitCast
+
+constPointerCast :: ValueRef -> TypeRef -> IO ValueRef
+constPointerCast = Raw.constPointerCast
+
+constIntCast :: ValueRef -> TypeRef -> LLVM.Bool -> IO ValueRef
+constIntCast = Raw.constIntCast
+
+constFPCast :: ValueRef -> TypeRef -> IO ValueRef
+constFPCast = Raw.constFPCast
+
+constSelect :: ValueRef -> ValueRef -> ValueRef -> IO ValueRef
+constSelect = Raw.constSelect
+
+constExtractElement :: ValueRef -> ValueRef -> IO ValueRef
+constExtractElement = Raw.constExtractElement
+
+constInsertElement :: ValueRef -> ValueRef -> ValueRef -> IO ValueRef
+constInsertElement = Raw.constInsertElement
+
+constShuffleVector :: ValueRef -> ValueRef -> ValueRef -> IO ValueRef
+constShuffleVector = Raw.constShuffleVector
+
+constExtractValue :: ValueRef -> Ptr CUInt -> CUInt -> IO ValueRef
+constExtractValue = Raw.constExtractValue
+
+constInsertValue :: ValueRef -> ValueRef -> Ptr CUInt -> CUInt -> IO ValueRef
+constInsertValue = Raw.constInsertValue
+
+constInlineAsm :: TypeRef -> CString -> CString -> LLVM.Bool -> LLVM.Bool -> IO ValueRef
+constInlineAsm = Raw.constInlineAsm
+
+blockAddress :: ValueRef -> BasicBlockRef -> IO ValueRef
+blockAddress = Raw.blockAddress
+
+
+-- ** Operations on globals
+getGlobalParent :: ValueRef -> IO ModuleRef
+getGlobalParent = Raw.getGlobalParent
+
+isDeclaration :: ValueRef -> IO LLVM.Bool
+isDeclaration = Raw.isDeclaration
+
+getLinkage :: ValueRef -> IO Raw.Linkage
+getLinkage = Raw.getLinkage
+
+setLinkage :: ValueRef -> Raw.Linkage -> IO ()
+setLinkage = Raw.setLinkage
+
+getSection :: ValueRef -> IO CString
+getSection = Raw.getSection
+
+setSection :: ValueRef -> CString -> IO ()
+setSection = Raw.setSection
+
+getVisibility :: ValueRef -> IO Raw.Visibility
+getVisibility = Raw.getVisibility
+
+setVisibility :: ValueRef -> Raw.Visibility -> IO ()
+setVisibility = Raw.setVisibility
+
+getAlignment :: ValueRef -> IO CUInt
+getAlignment = Raw.getAlignment
+
+setAlignment :: ValueRef -> CUInt -> IO ()
+setAlignment = Raw.setAlignment
+
+
+-- ** Global Variables
+addGlobal :: ModuleRef -> TypeRef -> CString -> IO ValueRef
+addGlobal = Raw.addGlobal
+
+addGlobalInAddressSpace :: ModuleRef -> TypeRef -> CString -> CUInt -> IO ValueRef
+addGlobalInAddressSpace = Raw.addGlobalInAddressSpace
+
+getNamedGlobal :: ModuleRef -> CString -> IO ValueRef
+getNamedGlobal = Raw.getNamedGlobal
+
+getFirstGlobal :: ModuleRef -> IO ValueRef
+getFirstGlobal = Raw.getFirstGlobal
+
+getLastGlobal :: ModuleRef -> IO ValueRef
+getLastGlobal = Raw.getLastGlobal
+
+getNextGlobal :: ValueRef -> IO ValueRef
+getNextGlobal = Raw.getNextGlobal
+
+getPreviousGlobal :: ValueRef -> IO ValueRef
+getPreviousGlobal = Raw.getPreviousGlobal
+
+deleteGlobal :: ValueRef -> IO ()
+deleteGlobal = Raw.deleteGlobal
+
+setInitializer :: ValueRef -> ValueRef -> IO ()
+setInitializer = Raw.setInitializer
+
+getInitializer :: ValueRef -> IO ValueRef
+getInitializer = Raw.getInitializer
+
+isThreadLocal :: ValueRef -> IO LLVM.Bool
+isThreadLocal = Raw.isThreadLocal
+
+setThreadLocal :: ValueRef -> LLVM.Bool -> IO ()
+setThreadLocal = Raw.setThreadLocal
+
+isGlobalConstant :: ValueRef -> IO LLVM.Bool
+isGlobalConstant = Raw.isGlobalConstant
+
+setGlobalConstant :: ValueRef -> LLVM.Bool -> IO ()
+setGlobalConstant = Raw.setGlobalConstant
+
+
+-- ** Aliases
+addAlias :: ModuleRef -> TypeRef -> ValueRef -> CString -> IO ValueRef
+addAlias = Raw.addAlias
+
+deleteFunction :: FunctionRef -> IO ()
+deleteFunction = Raw.deleteFunction
+
+getIntrinsicID :: FunctionRef -> IO CUInt
+getIntrinsicID = Raw.getIntrinsicID
+
+getFunctionCallConv :: FunctionRef -> IO Raw.CallingConvention
+getFunctionCallConv = fmap Raw.CallingConvention . Raw.getFunctionCallConv
+
+setFunctionCallConv :: FunctionRef -> Raw.CallingConvention -> IO ()
+setFunctionCallConv f = Raw.setFunctionCallConv f . Raw.unCallingConvention
+
+getGC :: ValueRef -> IO CString
+getGC = Raw.getGC
+
+setGC :: ValueRef -> CString -> IO ()
+setGC = Raw.setGC
+
+
+-- ** Raw.Attribute attachment
+
+addAttributeAtIndex :: ValueRef -> AttributeIndex -> AttributeRef -> IO ()
+addAttributeAtIndex = Raw.addAttributeAtIndex
+
+getAttributeCountAtIndex :: ValueRef -> AttributeIndex -> IO CUInt
+getAttributeCountAtIndex = Raw.getAttributeCountAtIndex
+
+getAttributesAtIndex :: ValueRef -> AttributeIndex -> Ptr AttributeRef -> IO ()
+getAttributesAtIndex = Raw.getAttributesAtIndex
+
+getEnumAttributeAtIndex :: ValueRef -> AttributeIndex -> AttributeKind -> IO AttributeRef
+getEnumAttributeAtIndex v i (AttributeKind kindId) = Raw.getEnumAttributeAtIndex v i kindId
+
+getStringAttributeAtIndex :: ValueRef -> AttributeIndex -> CString -> CUInt -> IO AttributeRef
+getStringAttributeAtIndex = Raw.getStringAttributeAtIndex
+
+removeEnumAttributeAtIndex :: ValueRef -> AttributeIndex -> AttributeKind -> IO ()
+removeEnumAttributeAtIndex v i (AttributeKind kindId) = Raw.removeEnumAttributeAtIndex v i kindId
+
+removeStringAttributeAtIndex :: ValueRef -> AttributeIndex -> CString -> CUInt -> IO ()
+removeStringAttributeAtIndex = Raw.removeStringAttributeAtIndex
+
+addTargetDependentFunctionAttr :: ValueRef -> CString -> CString -> IO ()
+addTargetDependentFunctionAttr = Raw.addTargetDependentFunctionAttr
+
+
+-- ** Parameters
+countParams :: FunctionRef -> IO CUInt
+countParams = Raw.countParams
+
+getParams
+    :: FunctionRef
+    -> Ptr ValueRef             -- ^ array to fill out
+    -> IO ()
+getParams = Raw.getParams
+
+getParam
+    :: FunctionRef
+    -> CUInt                    -- ^ offset into array
+    -> IO ValueRef
+getParam = Raw.getParam
+
+getParamParent :: ValueRef -> IO ValueRef
+getParamParent = Raw.getParamParent
+
+getFirstParam :: ValueRef -> IO ValueRef
+getFirstParam = Raw.getFirstParam
+
+getLastParam :: ValueRef -> IO ValueRef
+getLastParam = Raw.getLastParam
+
+getNextParam :: ValueRef -> IO ValueRef
+getNextParam = Raw.getNextParam
+
+getPreviousParam :: ValueRef -> IO ValueRef
+getPreviousParam = Raw.getPreviousParam
+
+setParamAlignment :: ValueRef -> CUInt -> IO ()
+setParamAlignment = Raw.setParamAlignment
+
+
+-- ** Basic Blocks
+basicBlockAsValue :: BasicBlockRef -> IO ValueRef
+basicBlockAsValue = Raw.basicBlockAsValue
+
+valueIsBasicBlock :: ValueRef -> IO LLVM.Bool
+valueIsBasicBlock = Raw.valueIsBasicBlock
+
+valueAsBasicBlock
+    :: ValueRef                 -- ^ basic block
+    -> IO BasicBlockRef
+valueAsBasicBlock = Raw.valueAsBasicBlock
+
+getBasicBlockName :: BasicBlockRef -> IO CString
+getBasicBlockName = Raw.getBasicBlockName
+
+getBasicBlockParent :: BasicBlockRef -> IO ValueRef
+getBasicBlockParent = Raw.getBasicBlockParent
+
+getBasicBlockTerminator :: BasicBlockRef -> IO ValueRef
+getBasicBlockTerminator = Raw.getBasicBlockTerminator
+
+countBasicBlocks
+    :: ValueRef                 -- ^ function
+    -> IO CUInt
+countBasicBlocks = Raw.countBasicBlocks
+
+getBasicBlocks
+    :: ValueRef                 -- ^ function
+    -> Ptr BasicBlockRef        -- ^ array to fill out
+    -> IO ()
+getBasicBlocks = Raw.getBasicBlocks
+
+getFirstBasicBlock :: ValueRef -> IO BasicBlockRef
+getFirstBasicBlock = Raw.getFirstBasicBlock
+
+getLastBasicBlock :: ValueRef -> IO BasicBlockRef
+getLastBasicBlock = Raw.getLastBasicBlock
+
+getNextBasicBlock :: BasicBlockRef -> IO BasicBlockRef
+getNextBasicBlock = Raw.getNextBasicBlock
+
+getPreviousBasicBlock :: BasicBlockRef -> IO BasicBlockRef
+getPreviousBasicBlock = Raw.getPreviousBasicBlock
+
+getEntryBasicBlock
+    :: ValueRef                 -- ^ function
+    -> IO BasicBlockRef
+getEntryBasicBlock = Raw.getEntryBasicBlock
+
+appendBasicBlockInContext :: ContextRef -> ValueRef -> CString -> IO BasicBlockRef
+appendBasicBlockInContext = Raw.appendBasicBlockInContext
+
+insertBasicBlockInContext :: ContextRef -> BasicBlockRef -> CString -> IO BasicBlockRef
+insertBasicBlockInContext = Raw.insertBasicBlockInContext
+
+appendBasicBlock
+    :: ValueRef                 -- ^ function
+    -> CString                  -- ^ name for label
+    -> IO BasicBlockRef
+appendBasicBlock = Raw.appendBasicBlock
+
+insertBasicBlock
+    :: BasicBlockRef            -- ^ insert before this one
+    -> CString                  -- ^ name for label
+    -> IO BasicBlockRef
+insertBasicBlock = Raw.insertBasicBlock
+
+deleteBasicBlock :: BasicBlockRef -> IO ()
+deleteBasicBlock = Raw.deleteBasicBlock
+
+removeBasicBlockFromParent :: BasicBlockRef -> IO ()
+removeBasicBlockFromParent = Raw.removeBasicBlockFromParent
+
+moveBasicBlockBefore :: BasicBlockRef -> BasicBlockRef -> IO ()
+moveBasicBlockBefore = Raw.moveBasicBlockBefore
+
+moveBasicBlockAfter :: BasicBlockRef -> BasicBlockRef -> IO ()
+moveBasicBlockAfter = Raw.moveBasicBlockAfter
+
+getFirstInstruction :: BasicBlockRef -> IO ValueRef
+getFirstInstruction = Raw.getFirstInstruction
+
+getLastInstruction :: BasicBlockRef -> IO ValueRef
+getLastInstruction = Raw.getLastInstruction
+
+
+-- ** Instructions
+getInstructionParent :: ValueRef -> IO BasicBlockRef
+getInstructionParent = Raw.getInstructionParent
+
+getNextInstruction :: ValueRef -> IO ValueRef
+getNextInstruction = Raw.getNextInstruction
+
+getPreviousInstruction :: ValueRef -> IO ValueRef
+getPreviousInstruction = Raw.getPreviousInstruction
+
+instructionEraseFromParent :: ValueRef -> IO ()
+instructionEraseFromParent = Raw.instructionEraseFromParent
+
+getInstructionOpcode :: ValueRef -> IO Raw.Opcode
+getInstructionOpcode = Raw.getInstructionOpcode
+
+getICmpPredicate :: ValueRef -> IO Raw.IntPredicate
+getICmpPredicate = Raw.getICmpPredicate
+
+
+-- ** Call sites
+setInstructionCallConv :: ValueRef -> Raw.CallingConvention -> IO ()
+setInstructionCallConv v =
+   Raw.setInstructionCallConv v . Raw.unCallingConvention
+
+getInstructionCallConv :: ValueRef -> IO Raw.CallingConvention
+getInstructionCallConv =
+   fmap Raw.CallingConvention . Raw.getInstructionCallConv
+
+setInstrParamAlignment :: ValueRef -> CUInt -> CUInt -> IO ()
+setInstrParamAlignment = Raw.setInstrParamAlignment
+
+
+addCallSiteAttribute :: ValueRef -> AttributeIndex -> AttributeRef -> IO ()
+addCallSiteAttribute = Raw.addCallSiteAttribute
+
+getCallSiteAttributeCount :: ValueRef -> AttributeIndex -> IO CUInt
+getCallSiteAttributeCount = Raw.getCallSiteAttributeCount
+
+getCallSiteAttributes :: ValueRef -> AttributeIndex -> Ptr AttributeRef -> IO ()
+getCallSiteAttributes = Raw.getCallSiteAttributes
+
+getCallSiteEnumAttribute :: ValueRef -> AttributeIndex -> AttributeKind -> IO AttributeRef
+getCallSiteEnumAttribute v i (AttributeKind kindId) = Raw.getCallSiteEnumAttribute v i kindId
+
+getCallSiteStringAttribute :: ValueRef -> AttributeIndex -> CString -> CUInt -> IO AttributeRef
+getCallSiteStringAttribute = Raw.getCallSiteStringAttribute
+
+removeCallSiteEnumAttribute :: ValueRef -> AttributeIndex -> AttributeKind -> IO ()
+removeCallSiteEnumAttribute v i (AttributeKind kindId) = Raw.removeCallSiteEnumAttribute v i kindId
+
+removeCallSiteStringAttribute :: ValueRef -> AttributeIndex -> CString -> CUInt -> IO ()
+removeCallSiteStringAttribute = Raw.removeCallSiteStringAttribute
+
+getCalledValue :: ValueRef -> IO ValueRef
+getCalledValue = Raw.getCalledValue
+
+
+-- ** Call instructions
+isTailCall :: ValueRef -> IO LLVM.Bool
+isTailCall = Raw.isTailCall
+
+setTailCall :: ValueRef -> LLVM.Bool -> IO ()
+setTailCall = Raw.setTailCall
+
+
+-- ** Switch Instructions
+getSwitchDefaultDest :: ValueRef -> IO BasicBlockRef
+getSwitchDefaultDest = Raw.getSwitchDefaultDest
+
+
+-- ** Phi Nodes
+addIncoming :: ValueRef -> Ptr ValueRef -> Ptr BasicBlockRef -> CUInt -> IO ()
+addIncoming = Raw.addIncoming
+
+countIncoming :: ValueRef -> IO CUInt
+countIncoming = Raw.countIncoming
+
+getIncomingValue :: ValueRef -> CUInt -> IO ValueRef
+getIncomingValue = Raw.getIncomingValue
+
+getIncomingBlock :: ValueRef -> CUInt -> IO BasicBlockRef
+getIncomingBlock = Raw.getIncomingBlock
+
+
+-- ** Builders
+createBuilderInContext :: ContextRef -> IO BuilderRef
+createBuilderInContext = Raw.createBuilderInContext
+
+createBuilder :: IO BuilderRef
+createBuilder = Raw.createBuilder
+
+positionBuilder :: BuilderRef -> BasicBlockRef -> ValueRef -> IO ()
+positionBuilder = Raw.positionBuilder
+
+positionBefore :: BuilderRef -> ValueRef -> IO ()
+positionBefore = Raw.positionBuilderBefore
+
+positionAtEnd :: BuilderRef -> BasicBlockRef -> IO ()
+positionAtEnd = Raw.positionBuilderAtEnd
+
+getInsertBlock :: BuilderRef -> IO BasicBlockRef
+getInsertBlock = Raw.getInsertBlock
+
+clearInsertionPosition :: BuilderRef -> IO ()
+clearInsertionPosition = Raw.clearInsertionPosition
+
+insertIntoBuilder :: BuilderRef -> ValueRef -> IO ()
+insertIntoBuilder = Raw.insertIntoBuilder
+
+insertIntoBuilderWithName :: BuilderRef -> ValueRef -> CString -> IO ()
+insertIntoBuilderWithName = Raw.insertIntoBuilderWithName
+
+foreign import ccall unsafe "&LLVMDisposeBuilder" ptrDisposeBuilder
+    :: FunPtr (BuilderRef -> IO ())
+
+
+-- ** Metadata
+getCurrentDebugLocation :: BuilderRef -> IO ValueRef
+getCurrentDebugLocation = Raw.getCurrentDebugLocation
+
+setCurrentDebugLocation :: BuilderRef -> ValueRef -> IO ()
+setCurrentDebugLocation = Raw.setCurrentDebugLocation
+
+setInstDebugLocation :: BuilderRef -> ValueRef -> IO ()
+setInstDebugLocation = Raw.setInstDebugLocation
+
+
+-- ** Terminators
+buildRetVoid :: BuilderRef -> IO ValueRef
+buildRetVoid = Raw.buildRetVoid
+
+buildRet :: BuilderRef -> ValueRef -> IO ValueRef
+buildRet = Raw.buildRet
+
+buildAggregateRet :: BuilderRef -> (Ptr ValueRef) -> CUInt -> IO ValueRef
+buildAggregateRet = Raw.buildAggregateRet
+
+buildBr :: BuilderRef -> BasicBlockRef -> IO ValueRef
+buildBr = Raw.buildBr
+
+buildCondBr :: BuilderRef -> ValueRef -> BasicBlockRef -> BasicBlockRef -> IO ValueRef
+buildCondBr = Raw.buildCondBr
+
+buildSwitch :: BuilderRef -> ValueRef -> BasicBlockRef -> CUInt -> IO ValueRef
+buildSwitch = Raw.buildSwitch
+
+buildIndirectBr :: BuilderRef -> ValueRef -> CUInt -> IO ValueRef
+buildIndirectBr = Raw.buildIndirectBr
+
+buildInvoke :: BuilderRef -> ValueRef -> Ptr ValueRef -> CUInt -> BasicBlockRef -> BasicBlockRef -> CString -> IO ValueRef
+buildInvoke = Raw.buildInvoke
+
+buildLandingPad :: BuilderRef -> TypeRef -> ValueRef -> CUInt -> CString -> IO ValueRef
+buildLandingPad = Raw.buildLandingPad
+
+buildResume :: BuilderRef -> ValueRef -> IO ValueRef
+buildResume = Raw.buildResume
+
+buildUnreachable :: BuilderRef -> IO ValueRef
+buildUnreachable = Raw.buildUnreachable
+
+
+-- ** Switch instructions
+addCase :: ValueRef -> ValueRef -> BasicBlockRef -> IO ()
+addCase = Raw.addCase
+
+
+-- ** IndirectBr instructions
+addDestination :: ValueRef -> BasicBlockRef -> IO ()
+addDestination = Raw.addDestination
+
+
+-- ** LandingPad instructions
+addClause :: ValueRef -> ValueRef -> IO ()
+addClause = Raw.addClause
+
+
+-- ** Resume instructions
+setCleanup :: ValueRef -> LLVM.Bool -> IO ()
+setCleanup = Raw.setCleanup
+
+
+-- ** Arithmetic
+buildAdd :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+buildAdd = Raw.buildAdd
+
+buildNSWAdd :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+buildNSWAdd = Raw.buildNSWAdd
+
+buildNUWAdd :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+buildNUWAdd = Raw.buildNUWAdd
+
+buildFAdd :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+buildFAdd = Raw.buildFAdd
+
+buildSub :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+buildSub = Raw.buildSub
+
+buildNSWSub :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+buildNSWSub = Raw.buildNSWSub
+
+buildNUWSub :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+buildNUWSub = Raw.buildNUWSub
+
+buildFSub :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+buildFSub = Raw.buildFSub
+
+buildMul :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+buildMul = Raw.buildMul
+
+buildNSWMul :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+buildNSWMul = Raw.buildNSWMul
+
+buildNUWMul :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+buildNUWMul = Raw.buildNUWMul
+
+buildFMul :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+buildFMul = Raw.buildFMul
+
+buildUDiv :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+buildUDiv = Raw.buildUDiv
+
+buildSDiv :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+buildSDiv = Raw.buildSDiv
+
+buildExactSDiv :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+buildExactSDiv = Raw.buildExactSDiv
+
+buildFDiv :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+buildFDiv = Raw.buildFDiv
+
+buildURem :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+buildURem = Raw.buildURem
+
+buildSRem :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+buildSRem = Raw.buildSRem
+
+buildFRem :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+buildFRem = Raw.buildFRem
+
+buildShl :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+buildShl = Raw.buildShl
+
+buildLShr :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+buildLShr = Raw.buildLShr
+
+buildAShr :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+buildAShr = Raw.buildAShr
+
+buildAnd :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+buildAnd = Raw.buildAnd
+
+buildOr :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+buildOr = Raw.buildOr
+
+buildXor :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+buildXor = Raw.buildXor
+
+buildBinOp :: BuilderRef -> Raw.Opcode -> ValueRef -> ValueRef -> CString -> IO ValueRef
+buildBinOp = Raw.buildBinOp
+
+buildNeg :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+buildNeg = Raw.buildNeg
+
+buildNSWNeg :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+buildNSWNeg = Raw.buildNSWNeg
+
+buildNUWNeg :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+buildNUWNeg = Raw.buildNUWNeg
+
+buildFNeg :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+buildFNeg = Raw.buildFNeg
+
+buildNot :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+buildNot = Raw.buildNot
+
+
+-- ** Floating point attributes
+foreign import ccall unsafe "LLVMSetHasUnsafeAlgebra" setFastMath
+    :: ValueRef -> LLVM.Bool -> IO ()
+foreign import ccall unsafe "LLVMSetHasUnsafeAlgebra" setHasUnsafeAlgebra
+    :: ValueRef -> LLVM.Bool -> IO ()
+foreign import ccall unsafe "LLVMSetHasNoNaNs" setHasNoNaNs
+    :: ValueRef -> LLVM.Bool -> IO ()
+foreign import ccall unsafe "LLVMSetHasNoInfs" setHasNoInfs
+    :: ValueRef -> LLVM.Bool -> IO ()
+foreign import ccall unsafe "LLVMSetHasNoSignedZeros" setHasNoSignedZeros
+    :: ValueRef -> LLVM.Bool -> IO ()
+foreign import ccall unsafe "LLVMSetHasAllowReciprocal" setHasAllowReciprocal
+    :: ValueRef -> LLVM.Bool -> IO ()
+foreign import ccall unsafe "LLVMSetHasAllowReassoc" setHasAllowReassoc
+    :: ValueRef -> LLVM.Bool -> IO ()
+foreign import ccall unsafe "LLVMSetHasApproxFunc" setHasApproxFunc
+    :: ValueRef -> LLVM.Bool -> IO ()
+
+
+-- ** Memory
+buildMalloc :: BuilderRef -> TypeRef -> CString -> IO ValueRef
+buildMalloc = Raw.buildMalloc
+
+buildArrayMalloc :: BuilderRef -> TypeRef -> ValueRef -> CString -> IO ValueRef
+buildArrayMalloc = Raw.buildArrayMalloc
+
+buildAlloca :: BuilderRef -> TypeRef -> CString -> IO ValueRef
+buildAlloca = Raw.buildAlloca
+
+buildArrayAlloca :: BuilderRef -> TypeRef -> ValueRef -> CString -> IO ValueRef
+buildArrayAlloca = Raw.buildArrayAlloca
+
+buildFree :: BuilderRef -> ValueRef -> IO ValueRef
+buildFree = Raw.buildFree
+
+buildLoad :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+buildLoad = Raw.buildLoad
+
+buildStore :: BuilderRef -> ValueRef -> ValueRef -> IO ValueRef
+buildStore = Raw.buildStore
+
+buildGEP :: BuilderRef -> ValueRef -> Ptr ValueRef -> CUInt -> CString -> IO ValueRef
+buildGEP = Raw.buildGEP
+
+buildInBoundsGEP :: BuilderRef -> ValueRef -> Ptr ValueRef -> CUInt -> CString -> IO ValueRef
+buildInBoundsGEP = Raw.buildInBoundsGEP
+
+buildStructGEP :: BuilderRef -> ValueRef -> CUInt -> CString -> IO ValueRef
+buildStructGEP = Raw.buildStructGEP
+
+buildGlobalString :: BuilderRef -> CString -> CString -> IO ValueRef
+buildGlobalString = Raw.buildGlobalString
+
+buildGlobalStringPtr :: BuilderRef -> CString -> CString -> IO ValueRef
+buildGlobalStringPtr = Raw.buildGlobalStringPtr
+
+
+-- Casts
+buildTrunc :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+buildTrunc = Raw.buildTrunc
+
+buildZExt :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+buildZExt = Raw.buildZExt
+
+buildSExt :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+buildSExt = Raw.buildSExt
+
+buildFPToUI :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+buildFPToUI = Raw.buildFPToUI
+
+buildFPToSI :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+buildFPToSI = Raw.buildFPToSI
+
+buildUIToFP :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+buildUIToFP = Raw.buildUIToFP
+
+buildSIToFP :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+buildSIToFP = Raw.buildSIToFP
+
+buildFPTrunc :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+buildFPTrunc = Raw.buildFPTrunc
+
+buildFPExt :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+buildFPExt = Raw.buildFPExt
+
+buildPtrToInt :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+buildPtrToInt = Raw.buildPtrToInt
+
+buildIntToPtr :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+buildIntToPtr = Raw.buildIntToPtr
+
+buildBitCast :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+buildBitCast = Raw.buildBitCast
+
+buildZExtOrBitCast :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+buildZExtOrBitCast = Raw.buildZExtOrBitCast
+
+buildSExtOrBitCast :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+buildSExtOrBitCast = Raw.buildSExtOrBitCast
+
+buildTruncOrBitCast :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+buildTruncOrBitCast = Raw.buildTruncOrBitCast
+
+buildCast :: BuilderRef -> Raw.Opcode -> ValueRef -> TypeRef -> CString -> IO ValueRef
+buildCast = Raw.buildCast
+
+buildPointerCast :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+buildPointerCast = Raw.buildPointerCast
+
+foreign import ccall unsafe "LLVMBuildIntCast" buildIntCast
+    :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+
+buildFPCast :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+buildFPCast = Raw.buildFPCast
+
+
+-- Comparisons
+buildICmp :: BuilderRef -> Raw.IntPredicate -> ValueRef -> ValueRef -> CString -> IO ValueRef
+buildICmp = Raw.buildICmp
+
+buildFCmp :: BuilderRef -> Raw.RealPredicate -> ValueRef -> ValueRef -> CString -> IO ValueRef
+buildFCmp = Raw.buildFCmp
+
+
+-- Miscellaneous instructions
+buildPhi :: BuilderRef -> TypeRef -> CString -> IO ValueRef
+buildPhi = Raw.buildPhi
+
+buildCall :: BuilderRef -> ValueRef -> Ptr ValueRef -> CUInt -> CString -> IO ValueRef
+buildCall = Raw.buildCall
+
+buildSelect :: BuilderRef -> ValueRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+buildSelect = Raw.buildSelect
+
+buildVAArg :: BuilderRef -> ValueRef -> TypeRef -> CString -> IO ValueRef
+buildVAArg = Raw.buildVAArg
+
+buildExtractElement :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+buildExtractElement = Raw.buildExtractElement
+
+buildInsertElement :: BuilderRef -> ValueRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+buildInsertElement = Raw.buildInsertElement
+
+buildShuffleVector :: BuilderRef -> ValueRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+buildShuffleVector = Raw.buildShuffleVector
+
+buildExtractValue :: BuilderRef -> ValueRef -> CUInt -> CString -> IO ValueRef
+buildExtractValue = Raw.buildExtractValue
+
+buildInsertValue :: BuilderRef -> ValueRef -> ValueRef -> CUInt -> CString -> IO ValueRef
+buildInsertValue = Raw.buildInsertValue
+
+buildIsNull :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+buildIsNull = Raw.buildIsNull
+
+buildIsNotNull :: BuilderRef -> ValueRef -> CString -> IO ValueRef
+buildIsNotNull = Raw.buildIsNotNull
+
+buildPtrDiff :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef
+buildPtrDiff = Raw.buildPtrDiff
+
+
+-- ** Memory Buffers
+createMemoryBufferWithContentsOfFile :: CString -> Ptr MemoryBufferRef -> Ptr CString -> IO LLVM.Bool
+createMemoryBufferWithContentsOfFile = Raw.createMemoryBufferWithContentsOfFile
+
+createMemoryBufferWithSTDIN :: Ptr MemoryBufferRef -> Ptr CString -> IO LLVM.Bool
+createMemoryBufferWithSTDIN = Raw.createMemoryBufferWithSTDIN
+
+disposeMemoryBuffer :: MemoryBufferRef -> IO ()
+disposeMemoryBuffer = Raw.disposeMemoryBuffer
+
+
+-- ** Pass Registry
+getGlobalPassRegistry :: IO PassRegistryRef
+getGlobalPassRegistry = Raw.getGlobalPassRegistry
+
+
+-- ** Pass Managers
+createPassManager :: IO PassManagerRef
+createPassManager = Raw.createPassManager
+
+createFunctionPassManagerForModule :: ModuleRef -> IO PassManagerRef
+createFunctionPassManagerForModule = Raw.createFunctionPassManagerForModule
+
+runPassManager :: PassManagerRef -> ModuleRef -> IO LLVM.Bool
+runPassManager = Raw.runPassManager
+
+initializeFunctionPassManager :: PassManagerRef -> IO LLVM.Bool
+initializeFunctionPassManager = Raw.initializeFunctionPassManager
+
+runFunctionPassManager :: PassManagerRef -> ValueRef -> IO LLVM.Bool
+runFunctionPassManager = Raw.runFunctionPassManager
+
+finalizeFunctionPassManager :: PassManagerRef -> IO LLVM.Bool
+finalizeFunctionPassManager = Raw.finalizeFunctionPassManager
+
+disposePassManager :: PassManagerRef -> IO ()
+disposePassManager = Raw.disposePassManager
+
+foreign import ccall unsafe "&LLVMDisposePassManager" ptrDisposePassManager
+    :: FunPtr (PassManagerRef -> IO ())
+
+
+-- ** Functions from extras.cpp
+foreign import ccall unsafe "LLVMValueGetNumUses" getNumUses
+    :: ValueRef -> IO CInt
+foreign import ccall unsafe "LLVMInstGetOpcode" instGetOpcode
+    :: ValueRef -> IO CInt
+foreign import ccall unsafe "LLVMCmpInstGetPredicate" cmpInstGetIntPredicate
+    :: ValueRef -> IO Raw.IntPredicate
+foreign import ccall unsafe "LLVMCmpInstGetPredicate" cmpInstGetRealPredicate
+    :: ValueRef -> IO Raw.RealPredicate
