{-# LANGUAGE EmptyDataDecls #-} module LLVM.Core.FFI ( -- * Modules Module , ModuleRef , moduleCreateWithName , disposeModule -- * Module providers , ModuleProvider , ModuleProviderRef , createModuleProviderForExistingModule , disposeModuleProvider -- * Types , Type , TypeRef , addTypeName , deleteTypeName , getElementType -- ** Integer types , int1Type , int8Type , int16Type , int32Type , int64Type , integerType -- ** Real types , floatType , doubleType , x86FP80Type , fp128Type , ppcFP128Type -- ** Function types , functionType , isFunctionVarArg , getReturnType , countParamTypes , getParamTypes -- ** Other types , voidType -- ** Array, pointer, and vector types , arrayType , pointerType , vectorType -- * Values , Value , ValueRef , addGlobal , deleteGlobal , setInitializer , typeOf , getValueName , setValueName , dumpValue -- ** Functions , addFunction , deleteFunction , getNamedFunction , countParams , getParam , getParams -- * Constants -- ** Scalar constants , constInt , constReal -- ** Composite constants , constString -- ** Constant expressions , constNeg , constNot , constAdd , constSub , constMul , constUDiv , constSDiv , constFDiv , constURem , constSRem , constFRem , constAnd , constOr , constXor , constICmp , constFCmp , constShl , constLShr , constAShr , constGEP , constTrunc , constSExt , constZExt , constFPTrunc , constFPExt , constUIToFP , constSIToFP , constFPToUI , constFPToSI , constPtrToInt , constIntToPtr , constBitCast , constSelect , constExtractElement , constInsertElement , constShuffleVector -- * Basic blocks , BasicBlock , BasicBlockRef , appendBasicBlock , insertBasicBlock , deleteBasicBlock , getEntryBasicBlock -- * Instruction building , Builder , BuilderRef , createBuilder , disposeBuilder , positionBefore , positionAtEnd -- ** Terminators , buildRetVoid , buildRet , buildBr , buildCondBr , buildSwitch , buildInvoke , buildUnwind , buildUnreachable -- ** Arithmetic , buildAdd , buildSub , buildMul , buildUDiv , buildSDiv , buildFDiv , buildURem , buildSRem , buildFRem , buildShl , buildLShr , buildAShr , buildAnd , buildOr , buildXor , buildNeg , buildNot -- ** Memory , buildMalloc , buildArrayMalloc , buildAlloca , buildArrayAlloca , buildFree , buildLoad , buildStore , buildGEP -- ** Casts , buildTrunc , buildZExt , buildSExt , buildFPToUI , buildFPToSI , buildUIToFP , buildSIToFP , buildFPTrunc , buildFPExt , buildPtrToInt , buildIntToPtr , buildBitCast -- ** Comparisons , buildICmp , buildFCmp -- ** Miscellaneous instructions , buildPhi , buildCall , buildSelect , buildVAArg , buildExtractElement , buildInsertElement , buildShuffleVector -- ** Other helpers , addCase , addIncoming ) where import Foreign.C.String (CString) import Foreign.C.Types (CDouble, CInt, CUInt, CULLong) import Foreign.Ptr (Ptr) #include data Module type ModuleRef = Ptr Module foreign import ccall unsafe "LLVMModuleCreateWithName" moduleCreateWithName :: CString -> IO ModuleRef foreign import ccall unsafe "LLVMDisposeModule" disposeModule :: ModuleRef -> IO () data ModuleProvider type ModuleProviderRef = Ptr ModuleProvider foreign import ccall unsafe "LLVMCreateModuleProviderForExistingModule" createModuleProviderForExistingModule :: ModuleRef -> IO ModuleProviderRef foreign import ccall unsafe "LLVMDisposeModuleProvider" disposeModuleProvider :: ModuleProviderRef -> IO () data Type type TypeRef = Ptr Type foreign import ccall unsafe "LLVMInt1Type" int1Type :: TypeRef foreign import ccall unsafe "LLVMInt8Type" int8Type :: TypeRef foreign import ccall unsafe "LLVMInt16Type" int16Type :: TypeRef foreign import ccall unsafe "LLVMInt32Type" int32Type :: TypeRef foreign import ccall unsafe "LLVMInt64Type" int64Type :: TypeRef -- | An integer type of the given width. foreign import ccall unsafe "LLVMIntType" integerType :: CUInt -- ^ width in bits -> TypeRef foreign import ccall unsafe "LLVMFloatType" floatType :: TypeRef foreign import ccall unsafe "LLVMDoubleType" doubleType :: TypeRef foreign import ccall unsafe "LLVMX86FP80Type" x86FP80Type :: TypeRef foreign import ccall unsafe "LLVMFP128Type" fp128Type :: TypeRef foreign import ccall unsafe "LLVMPPCFP128Type" ppcFP128Type :: TypeRef foreign import ccall unsafe "LLVMVoidType" voidType :: TypeRef -- | 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 -> CInt -- ^ non-zero if function is varargs -> TypeRef -- | Indicate whether a function takes varargs. foreign import ccall unsafe "LLVMIsFunctionVarArg" isFunctionVarArg :: TypeRef -> CInt -- | Give a function's return type. foreign import ccall unsafe "LLVMGetReturnType" getReturnType :: TypeRef -> TypeRef -- | Give the number of fixed parameters that a function takes. foreign import ccall unsafe "LLVMCountParamTypes" countParamTypes :: TypeRef -> CUInt -- | Fill out an array with the types of a function's fixed -- parameters. foreign import ccall unsafe "LLVMGetParamTypes" getParamTypes :: TypeRef -> Ptr TypeRef -> IO () foreign import ccall unsafe "LLVMArrayType" arrayType :: TypeRef -- ^ element type -> CUInt -- ^ element count -> TypeRef foreign import ccall unsafe "LLVMPointerType" pointerType :: TypeRef -- ^ pointed-to type -> CUInt -- ^ address space -> TypeRef foreign import ccall unsafe "LLVMVectorType" vectorType :: TypeRef -- ^ element type -> CUInt -- ^ element count -> TypeRef foreign import ccall unsafe "LLVMAddTypeName" addTypeName :: ModuleRef -> CString -> TypeRef -> IO CInt foreign import ccall unsafe "LLVMDeleteTypeName" deleteTypeName :: ModuleRef -> CString -> IO () -- | Give the type of a sequential type's elements. foreign import ccall unsafe "LLVMGetElementType" getElementType :: TypeRef -> TypeRef data Value type ValueRef = Ptr Value foreign import ccall unsafe "LLVMAddGlobal" addGlobal :: ModuleRef -> TypeRef -> CString -> IO ValueRef foreign import ccall unsafe "LLVMDeleteGlobal" deleteGlobal :: ValueRef -> IO () foreign import ccall unsafe "LLVMSetInitializer" setInitializer :: ValueRef -> ValueRef -> IO () 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 "LLVMGetNamedFunction" getNamedFunction :: ModuleRef -> CString -> IO ValueRef foreign import ccall unsafe "LLVMAddFunction" addFunction :: ModuleRef -> CString -> TypeRef -> IO ValueRef foreign import ccall unsafe "LLVMDeleteFunction" deleteFunction :: ValueRef -> IO () foreign import ccall unsafe "LLVMCountParams" countParams :: ValueRef -> CUInt foreign import ccall unsafe "LLVMGetParam" getParam :: ValueRef -> CUInt -> ValueRef foreign import ccall unsafe "LLVMGetParams" getParams :: ValueRef -> Ptr ValueRef -> IO () foreign import ccall unsafe "LLVMConstInt" constInt :: TypeRef -> CULLong -> CInt -> ValueRef foreign import ccall unsafe "LLVMConstReal" constReal :: TypeRef -> CDouble -> ValueRef foreign import ccall unsafe "LLVMConstString" constString :: CString -> CUInt -> CInt -> ValueRef foreign import ccall unsafe "LLVMConstNeg" constNeg :: ValueRef -> ValueRef foreign import ccall unsafe "LLVMConstNot" constNot :: ValueRef -> ValueRef foreign import ccall unsafe "LLVMConstAdd" constAdd :: ValueRef -> ValueRef -> ValueRef foreign import ccall unsafe "LLVMConstSub" constSub :: ValueRef -> ValueRef -> ValueRef foreign import ccall unsafe "LLVMConstMul" constMul :: ValueRef -> ValueRef -> ValueRef foreign import ccall unsafe "LLVMConstUDiv" constUDiv :: ValueRef -> ValueRef -> ValueRef foreign import ccall unsafe "LLVMConstSDiv" constSDiv :: ValueRef -> ValueRef -> ValueRef foreign import ccall unsafe "LLVMConstFDiv" constFDiv :: ValueRef -> ValueRef -> ValueRef foreign import ccall unsafe "LLVMConstURem" constURem :: ValueRef -> ValueRef -> ValueRef foreign import ccall unsafe "LLVMConstSRem" constSRem :: ValueRef -> ValueRef -> ValueRef foreign import ccall unsafe "LLVMConstFRem" constFRem :: ValueRef -> ValueRef -> ValueRef foreign import ccall unsafe "LLVMConstAnd" constAnd :: ValueRef -> ValueRef -> ValueRef foreign import ccall unsafe "LLVMConstOr" constOr :: ValueRef -> ValueRef -> ValueRef foreign import ccall unsafe "LLVMConstXor" constXor :: ValueRef -> ValueRef -> ValueRef foreign import ccall unsafe "LLVMConstICmp" constICmp :: CInt -> ValueRef -> ValueRef -> ValueRef foreign import ccall unsafe "LLVMConstFCmp" constFCmp :: CInt -> ValueRef -> ValueRef -> ValueRef foreign import ccall unsafe "LLVMConstShl" constShl :: ValueRef -> ValueRef -> ValueRef foreign import ccall unsafe "LLVMConstLShr" constLShr :: ValueRef -> ValueRef -> ValueRef foreign import ccall unsafe "LLVMConstAShr" constAShr :: ValueRef -> ValueRef -> ValueRef foreign import ccall unsafe "LLVMConstGEP" constGEP :: ValueRef -> Ptr ValueRef -> CUInt -> ValueRef foreign import ccall unsafe "LLVMConstTrunc" constTrunc :: ValueRef -> TypeRef -> ValueRef foreign import ccall unsafe "LLVMConstSExt" constSExt :: ValueRef -> TypeRef -> ValueRef foreign import ccall unsafe "LLVMConstZExt" constZExt :: ValueRef -> TypeRef -> ValueRef foreign import ccall unsafe "LLVMConstFPTrunc" constFPTrunc :: ValueRef -> TypeRef -> ValueRef foreign import ccall unsafe "LLVMConstFPExt" constFPExt :: ValueRef -> TypeRef -> ValueRef foreign import ccall unsafe "LLVMConstUIToFP" constUIToFP :: ValueRef -> TypeRef -> ValueRef foreign import ccall unsafe "LLVMConstSIToFP" constSIToFP :: ValueRef -> TypeRef -> ValueRef foreign import ccall unsafe "LLVMConstFPToUI" constFPToUI :: ValueRef -> TypeRef -> ValueRef foreign import ccall unsafe "LLVMConstFPToSI" constFPToSI :: ValueRef -> TypeRef -> ValueRef foreign import ccall unsafe "LLVMConstPtrToInt" constPtrToInt :: ValueRef -> TypeRef -> ValueRef foreign import ccall unsafe "LLVMConstIntToPtr" constIntToPtr :: ValueRef -> TypeRef -> ValueRef foreign import ccall unsafe "LLVMConstBitCast" constBitCast :: ValueRef -> TypeRef -> ValueRef foreign import ccall unsafe "LLVMConstSelect" constSelect :: ValueRef -> ValueRef -> ValueRef -> ValueRef foreign import ccall unsafe "LLVMConstExtractElement" constExtractElement :: ValueRef -> ValueRef -> ValueRef foreign import ccall unsafe "LLVMConstInsertElement" constInsertElement :: ValueRef -> ValueRef -> ValueRef -> ValueRef foreign import ccall unsafe "LLVMConstShuffleVector" constShuffleVector :: ValueRef -> ValueRef -> ValueRef -> ValueRef type BasicBlock = Value type BasicBlockRef = Ptr BasicBlock foreign import ccall unsafe "LLVMAppendBasicBlock" appendBasicBlock :: ValueRef -> 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 "LLVMGetEntryBasicBlock" getEntryBasicBlock :: ValueRef -> IO BasicBlockRef data Builder type BuilderRef = Ptr Builder foreign import ccall unsafe "LLVMCreateBuilder" createBuilder :: IO BuilderRef foreign import ccall unsafe "LLVMDisposeBuilder" disposeBuilder :: BuilderRef -> IO () foreign import ccall unsafe "LLVMPositionBuilderBefore" positionBefore :: BuilderRef -> ValueRef -> IO () foreign import ccall unsafe "LLVMPositionBuilderAtEnd" positionAtEnd :: BuilderRef -> BasicBlockRef -> IO () foreign import ccall unsafe "LLVMBuildRetVoid" buildRetVoid :: BuilderRef -> IO ValueRef foreign import ccall unsafe "LLVMBuildRet" buildRet :: BuilderRef -> ValueRef -> 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 "LLVMBuildInvoke" buildInvoke :: BuilderRef -> ValueRef -> Ptr ValueRef -> CUInt -> BasicBlockRef -> BasicBlockRef -> CString -> IO ValueRef foreign import ccall unsafe "LLVMBuildUnwind" buildUnwind :: BuilderRef -> IO ValueRef foreign import ccall unsafe "LLVMBuildUnreachable" buildUnreachable :: BuilderRef -> IO ValueRef foreign import ccall unsafe "LLVMBuildAdd" buildAdd :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef foreign import ccall unsafe "LLVMBuildSub" buildSub :: BuilderRef -> ValueRef -> ValueRef -> CString -> IO ValueRef foreign import ccall unsafe "LLVMBuildMul" buildMul :: 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 "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 "LLVMBuildNeg" buildNeg :: BuilderRef -> ValueRef -> CString -> IO ValueRef foreign import ccall unsafe "LLVMBuildNot" buildNot :: BuilderRef -> ValueRef -> CString -> IO ValueRef -- 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 -- 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 -- 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 "LLVMAddCase" addCase :: ValueRef -> ValueRef -> BasicBlockRef -> IO () foreign import ccall unsafe "LLVMAddIncoming" addIncoming :: ValueRef -> Ptr ValueRef -> Ptr ValueRef -> CUInt -> IO ()