fix: add __runtime_error to the hardwired JIT FFI

This commit is contained in:
Csaba Hruska 2019-12-24 12:27:04 +01:00
parent cefe5f2998
commit a1ac1ce35c
2 changed files with 17 additions and 3 deletions

View File

@ -37,6 +37,7 @@ install:
script:
- mkdir .output
- stack test grin:grin-end-to-end-test grin:grin-test --coverage
- stack exec grin -- grin/grin/sum_simple.grin --quiet
after_script:
- travis_retry curl -L https://github.com/rubik/stack-hpc-coveralls/releases/download/v0.0.4.0/shc-linux-x64-8.0.1.tar.bz2 | tar -xj

View File

@ -17,6 +17,7 @@ import qualified LLVM.Internal.OrcJIT.CompileLayer as CL
import Control.Monad.Except
import qualified Data.ByteString.Char8 as BS
import System.Exit
import Data.Int
import Data.IORef
@ -31,18 +32,28 @@ foreign import ccall "dynamic"
foreign import ccall "wrapper"
wrapIntPrint :: (Int64 -> IO ()) -> IO (FunPtr (Int64 -> IO ()))
foreign import ccall "wrapper"
wrapRuntimeError :: (Int64 -> IO ()) -> IO (FunPtr (Int64 -> IO ()))
withTestModule :: AST.Module -> (LLVM.Module.Module -> IO a) -> IO a
withTestModule mod f = withContext $ \context -> withModuleFromAST context mod f
myIntPrintImpl :: Int64 -> IO ()
myIntPrintImpl i = print i
resolver :: CompileLayer l => MangledSymbol -> l -> MangledSymbol -> IO (Either JITSymbolError JITSymbol)
resolver intPrint compileLayer symbol
myRuntimeErrorImpl :: Int64 -> IO ()
myRuntimeErrorImpl i = exitWith $ ExitFailure (fromIntegral i)
resolver :: CompileLayer l => MangledSymbol -> MangledSymbol -> l -> MangledSymbol -> IO (Either JITSymbolError JITSymbol)
resolver intPrint runtimeError compileLayer symbol
| symbol == intPrint = do
funPtr <- wrapIntPrint myIntPrintImpl
let addr = ptrToWordPtr (castFunPtrToPtr funPtr)
pure $ Right (JITSymbol addr defaultJITSymbolFlags)
| symbol == runtimeError = do
funPtr <- wrapIntPrint myRuntimeErrorImpl
let addr = ptrToWordPtr (castFunPtrToPtr funPtr)
pure $ Right (JITSymbol addr defaultJITSymbolFlags)
| otherwise = CL.findSymbol compileLayer symbol True
nullResolver :: MangledSymbol -> IO (Either JITSymbolError JITSymbol)
@ -54,6 +65,7 @@ failInIO = either fail pure <=< runExceptT
grinHeapSize :: Int
grinHeapSize = 100 * 1024 * 1024
-- IMPORTANT: JIT does not support FFI yet, only _prim_int_print and __runtime_error are hardwired
eagerJit :: AST.Module -> String -> IO RTVal
eagerJit amod mainName = do
resolvers <- newIORef Map.empty
@ -63,8 +75,9 @@ eagerJit amod mainName = do
withObjectLinkingLayer es (\k -> fmap (\rs -> rs Map.! k) (readIORef resolvers)) $ \linkingLayer ->
withIRCompileLayer linkingLayer tm $ \compileLayer -> do
intPrint <- mangleSymbol compileLayer "_prim_int_print"
runtimeError <- mangleSymbol compileLayer "__runtime_error"
withModuleKey es $ \k ->
withSymbolResolver es (SymbolResolver (resolver intPrint compileLayer)) $ \resolver -> do
withSymbolResolver es (SymbolResolver (resolver intPrint runtimeError compileLayer)) $ \resolver -> do
modifyIORef' resolvers (Map.insert k resolver)
withModule compileLayer k mod $ do
mainSymbol <- mangleSymbol compileLayer (fromString mainName)