import LLVM.AST.Type as Type
import LLVM.Context
import LLVM.IRBuilder
+import LLVM.Linking
import LLVM.Module
import LLVM.OrcJIT
import LLVM.OrcJIT.CompileLayer
import LLVM.PassManager
import LLVM.Pretty
import LLVM.Target
+import Numeric
import System.IO
import System.IO.Error
import Text.Read (readMaybe)
}
main :: IO ()
-main =
+main = do
+ loadLibraryPermanently (Just "stdlib.dylib")
withContext $ \ctx -> withHostTargetMachineDefault $ \tm ->
withExecutionSession $ \exSession ->
withSymbolResolver exSession (SymbolResolver symResolver) $ \symResolverPtr ->
-- 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