Find our JIT'ed function and run it master
authorLuke Lau <luke_lau@icloud.com>
Sun, 2 Jun 2019 18:33:35 +0000 (19:33 +0100)
committerLuke Lau <luke_lau@icloud.com>
Sun, 2 Jun 2019 18:33:35 +0000 (19:33 +0100)
Here is where the magic happens. We first mangle the symbol before
passing it to findSymbolIn: The compilation then happens here. It will
spit back a FFI pointer, which we then need to invoke ourselves.

In order to do this we have to specify the Haskell type of the function
that we're pointing to, which resides in C-land, hence the ccall
attribute in our foreign declaration.

Try it out!

Main.hs

diff --git a/Main.hs b/Main.hs
index 5bc3a3e0bde961a310f4d1e1a7fce733e20917d1..48d93a224de17958d9f4586bc1aa079e43aee5c5 100644 (file)
--- a/Main.hs
+++ b/Main.hs
@@ -9,6 +9,7 @@ import Control.Monad.IO.Class
 import Data.String
 import qualified Data.Map as Map
 import qualified Data.Text.Lazy.IO as Text
+import Foreign.Ptr
 import LLVM.AST.AddrSpace
 import LLVM.AST.Constant
 import LLVM.AST.Float
@@ -27,6 +28,8 @@ import System.IO
 import System.IO.Error
 import Text.Read (readMaybe)
 
+foreign import ccall "dynamic" mkFun :: FunPtr (IO Double) -> IO Double
+
 data JITEnv = JITEnv
   { jitEnvContext :: Context
   , jitEnvCompileLayer :: IRCompileLayer ObjectLinkingLayer
@@ -84,7 +87,9 @@ repl = do
 jit :: JITEnv -> Module -> IO Double
 jit JITEnv{jitEnvCompileLayer=compLayer, jitEnvModuleKey=mdlKey} mdl =
   withModule compLayer mdlKey mdl $ do
-    return 0
+    mangled <- mangleSymbol compLayer "__anon_expr"
+    Right (JITSymbol fPtr _) <- findSymbolIn compLayer mdlKey mangled False
+    mkFun (castPtrToFunPtr (wordPtrToPtr fPtr))
 
 type Binds = Map.Map String Operand