packages feed

llvm-tf-3.0.3.1: src/LLVM/Util/File.hs

module LLVM.Util.File (writeCodeGenModule, optimizeFunction, optimizeFunctionCG) where

import qualified LLVM.ExecutionEngine as EE
import LLVM.ExecutionEngine (Translatable)
import LLVM.Core
          (CodeGenModule, IsFunction, Module, Function,
           newModule, defineModule,
           getValueName, getModuleValues, castModuleValue,
           writeBitcodeToFile, readBitcodeFromFile)

import System.Process (system)



writeCodeGenModule :: FilePath -> CodeGenModule a -> IO ()
writeCodeGenModule name f = do
    m <- newModule
    _ <- defineModule m f
    writeBitcodeToFile name m

optimize :: FilePath -> IO ()
optimize name = do
    _rc <- system $ "opt -std-compile-opts " ++ name ++ " -f -o " ++ name
    return ()

optimizeFunction ::
    (IsFunction t, Translatable t) =>
    CodeGenModule (Function t) -> IO (Function t)
optimizeFunction = fmap snd . optimizeFunction'

optimizeFunction' ::
    (IsFunction t, Translatable t) =>
    CodeGenModule (Function t) -> IO (Module, Function t)
optimizeFunction' mdl = do
    m <- newModule
    mf <- defineModule m mdl
    fName <- getValueName mf

    let name = "__tmp__" ++ fName ++ ".bc"
    writeBitcodeToFile name m

    optimize name

    m' <- readBitcodeFromFile name
    funcs <- getModuleValues m'

--    removeFile name

    let Just mf' = castModuleValue =<< lookup fName funcs

    return (m', mf')

optimizeFunctionCG ::
    (IsFunction t, Translatable t) =>
    CodeGenModule (Function t) -> IO t
optimizeFunctionCG mdl = do
    (m', mf') <- optimizeFunction' mdl
    EE.runEngineAccess $ do
        EE.addModule m'
        EE.generateFunction mf'