mirror of
https://github.com/grin-compiler/grin.git
synced 2024-10-03 19:17:42 +03:00
fix: add __runtime_error to the hardwired JIT FFI
This commit is contained in:
parent
cefe5f2998
commit
a1ac1ce35c
@ -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
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user