{-# LANGUAGE ScopedTypeVariables #-} module LLVM.Util.Memory ( memcpy, memmove, memset, IsLengthType, ) where import LLVM.Core import Data.Word (Word8, Word32, Word64, ) class IsFirstClass len => IsLengthType len where instance IsLengthType Word32 where instance IsLengthType Word64 where memcpyFunc :: forall len. IsLengthType len => TFunction (Ptr Word8 -> Ptr Word8 -> len -> Word32 -> Bool -> IO ()) memcpyFunc = newNamedFunction ExternalLinkage $ "llvm.memcpy.p0i8.p0i8." ++ typeName (undefined :: len) memcpy :: IsLengthType len => CodeGenModule (Value (Ptr Word8) -> Value (Ptr Word8) -> Value len -> Value Word32 -> Value Bool -> CodeGenFunction r ()) memcpy = fmap (\f dest src len align volatile -> fmap (const()) $ call f dest src len align volatile) memcpyFunc memmoveFunc :: forall len. IsLengthType len => TFunction (Ptr Word8 -> Ptr Word8 -> len -> Word32 -> Bool -> IO ()) memmoveFunc = newNamedFunction ExternalLinkage $ "llvm.memmove.p0i8.p0i8." ++ typeName (undefined :: len) memmove :: IsLengthType len => CodeGenModule (Value (Ptr Word8) -> Value (Ptr Word8) -> Value len -> Value Word32 -> Value Bool -> CodeGenFunction r ()) memmove = fmap (\f dest src len align volatile -> fmap (const()) $ call f dest src len align volatile) memmoveFunc memsetFunc :: forall len. IsLengthType len => TFunction (Ptr Word8 -> Word8 -> len -> Word32 -> Bool -> IO ()) memsetFunc = newNamedFunction ExternalLinkage $ "llvm.memset.p0i8." ++ typeName (undefined :: len) memset :: IsLengthType len => CodeGenModule (Value (Ptr Word8) -> Value Word8 -> Value len -> Value Word32 -> Value Bool -> CodeGenFunction r ()) memset = fmap (\f dest val len align volatile -> fmap (const()) $ call f dest val len align volatile) memsetFunc