Now that the standard library is loaded into our process, we can finally
being to fill out our symbol resolver. The symbol resolver takes in a
symbol, and returns a pointer wrapped inside a JITSymbol if it can find
the address of it. Otherwise it returns an error.
You can use the symbol resolver to do much fancier stuff in OrcJIT, but
for now we are just going to look up symbols that we have previously
loaded into our process via loadLibraryPermanently.
import LLVM.PassManager
import LLVM.Pretty
import LLVM.Target
+import Numeric
import System.IO
import System.IO.Error
import Text.Read (readMaybe)
-- This can eventually be used to resolve external functions, e.g. a stdlib call
symResolver :: MangledSymbol -> IO (Either JITSymbolError JITSymbol)
-symResolver sym = undefined
+symResolver sym = do
+ ptr <- getSymbolAddressInProcess sym
+ putStrLn $ "Resolving " <> show sym <> " to 0x" <> showHex ptr ""
+ return (Right (JITSymbol ptr defaultJITSymbolFlags))
repl :: ModuleBuilderT (ReaderT JITEnv IO) ()
repl = do