{-# OPTIONS_HADDOCK hide #-}
module Data.Array.Accelerate.LLVM.Compile.Cache (
Persistent(..), UID,
cacheOfUID,
cacheOfOpenAcc,
removeCacheDirectory,
) where
import Data.Array.Accelerate.Debug
import Data.Array.Accelerate.Trafo
import Data.Array.Accelerate.Analysis.Hash
import Data.Array.Accelerate.LLVM.State
import Control.Monad.Trans
import Data.Version
import System.Directory
import System.FilePath
import Text.Printf
import Paths_accelerate_llvm
class Persistent arch where
targetCacheTemplate :: LLVM arch FilePath
type UID = Hash
{-# INLINEABLE cacheOfOpenAcc #-}
cacheOfOpenAcc
:: Persistent arch
=> DelayedOpenAcc aenv a
-> LLVM arch (UID, FilePath)
cacheOfOpenAcc acc = do
let uid = hashDelayedOpenAcc acc
cacheFile <- cacheOfUID uid
return (uid, cacheFile)
{-# INLINEABLE cacheOfUID #-}
cacheOfUID
:: Persistent arch
=> UID
-> LLVM arch FilePath
cacheOfUID uid = do
dbg <- liftIO $ if debuggingIsEnabled then getFlag debug else return False
appdir <- liftIO $ getAppUserDataDirectory "accelerate"
template <- targetCacheTemplate
let
(base, file) = splitFileName template
(name, ext) = splitExtensions file
cachepath = appdir </> "accelerate-llvm-" ++ showVersion version </> base </> if dbg then "dbg" else "rel"
cachefile = cachepath </> printf "%s%s" name (show uid) <.> ext
liftIO $ createDirectoryIfMissing True cachepath
return cachefile
{-# INLINEABLE removeCacheDirectory #-}
removeCacheDirectory :: Persistent arch => LLVM arch ()
removeCacheDirectory = do
appdir <- liftIO $ getAppUserDataDirectory "accelerate"
template <- targetCacheTemplate
let
(base, _) = splitFileName template
cachepath = appdir </> "accelerate-llvm-" ++ showVersion version </> base
liftIO $ removeDirectoryRecursive cachepath