module LLVM.Extra.MemoryPrivate where

import qualified LLVM.Core as LLVM
import LLVM.Core (CodeGenFunction, Value, )

import Foreign.Ptr (Ptr, )


decomposeFromLoad ::
   LLVM.IsSized struct =>
   (Value (Ptr struct) -> CodeGenFunction r a) ->
   Value struct -> CodeGenFunction r a
decomposeFromLoad loadStruct struct = do
   ptr <- LLVM.alloca
   LLVM.store struct ptr
   loadStruct ptr

composeFromStore ::
   LLVM.IsSized struct =>
   (a -> Value (Ptr struct) -> CodeGenFunction r ()) ->
   a -> CodeGenFunction r (Value struct)
composeFromStore storeStruct x = do
   ptr <- LLVM.alloca
   storeStruct x ptr
   LLVM.load ptr