packages feed

accelerate-llvm-native-1.4.0.0: src/Data/Array/Accelerate/LLVM/Native/Plugin/BuildInfo.hs

{-# LANGUAGE CPP #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
-- |
-- Module      : Data.Array.Accelerate.LLVM.Native.Plugin.BuildInfo
-- Copyright   : [2017..2020] The Accelerate Team
-- License     : BSD3
--
-- Maintainer  : Trevor L. McDonell <trevor.mcdonell@gmail.com>
-- Stability   : experimental
-- Portability : non-portable (GHC extensions)
--

module Data.Array.Accelerate.LLVM.Native.Plugin.BuildInfo
  where

#if __GLASGOW_HASKELL__ >= 900
import GHC.Unit
import GHC.Utils.Binary
#else
import Binary
import Module
#endif

import Data.Map                                                     ( Map )
import System.Directory
import System.FilePath
import qualified Data.Map                                           as Map
import qualified Data.Map.Internal                                  as Map

import Data.Array.Accelerate.Error


mkBuildInfoFileName :: FilePath -> FilePath
mkBuildInfoFileName path = path </> "accelerate-llvm-native.buildinfo"

readBuildInfo :: HasCallStack => FilePath -> IO (Map Module [FilePath])
readBuildInfo path = do
  exists <- doesFileExist path
  if not exists
    then return Map.empty
    else get =<< readBinMem path

writeBuildInfo :: FilePath -> Map Module [FilePath] -> IO ()
writeBuildInfo path objs = do
  h <- openBinMem 4096
  put_ h objs
  writeBinMem h path


instance (Binary k, Binary v) => Binary (Map k v) where
  get h = do
    t <- getByte h
    case t of
      0 -> return Map.Tip
      _ -> do
        s <- get h
        k <- get h
        a <- get h
        l <- get h
        r <- get h
        return $ Map.Bin s k a l r

  put_ h Map.Tip             = putByte h 0
  put_ h (Map.Bin s k a l r) = do
    putByte h 1
    put_ h s
    put_ h k
    put_ h a
    put_ h l
    put_ h r