packages feed

llvm-hs 6.3.0 → 7.0.0

raw patch · 34 files changed

+564/−373 lines, 34 filesdep ~basedep ~llvm-hs-puresetup-changedPVP ok

version bump matches the API change (PVP)

Dependency ranges changed: base, llvm-hs-pure

API changes (from Hackage documentation)

- LLVM.Internal.FFI.LLVMCTypes: unnamedAddrNone :: UnnamedAddr
- LLVM.Internal.FFI.Metadata: getDISubprogramVariables :: Ptr DISubprogram -> IO (TupleArray DILocalVariable)
- LLVM.Internal.FFI.Metadata: getDISubrange :: Ptr Context -> Int64 -> Int64 -> IO (Ptr DISubrange)
- LLVM.Internal.FFI.Metadata: getDISubrangeCount :: Ptr DISubrange -> IO Int64
- LLVM.Internal.FFI.Metadata: getFileChecksum :: Ptr DIFile -> IO (Ptr MDString)
- LLVM.Internal.FFI.OrcJIT: data LambdaResolver
- LLVM.Internal.FFI.OrcJIT: disposeLambdaResolver :: Ptr LambdaResolver -> IO ()
- LLVM.Internal.FFI.OrcJIT.CompileLayer: ModuleHandle :: Word -> ModuleHandle
- LLVM.Internal.FFI.OrcJIT.CompileLayer: newtype ModuleHandle
- LLVM.Internal.FFI.OrcJIT.LinkingLayer: ObjectHandle :: Word -> ObjectHandle
- LLVM.Internal.FFI.OrcJIT.LinkingLayer: newtype ObjectHandle
- LLVM.Internal.OrcJIT: [dylibResolver] :: SymbolResolver -> !SymbolResolverFn
- LLVM.Internal.OrcJIT: [externalResolver] :: SymbolResolver -> !SymbolResolverFn
- LLVM.Internal.OrcJIT: data SymbolResolver
- LLVM.Internal.OrcJIT: instance Control.Monad.IO.Class.MonadIO m => LLVM.Internal.Coding.EncodeM m LLVM.Internal.OrcJIT.SymbolResolver (GHC.IORef.IORef [GHC.Types.IO ()] -> GHC.Types.IO (GHC.Ptr.Ptr LLVM.Internal.FFI.OrcJIT.LambdaResolver))
- LLVM.Internal.OrcJIT: instance Control.Monad.IO.Class.MonadIO m => LLVM.Internal.Coding.EncodeM m LLVM.Internal.OrcJIT.SymbolResolverFn (GHC.Ptr.FunPtr LLVM.Internal.FFI.OrcJIT.SymbolResolverFn)
- LLVM.Internal.OrcJIT: type SymbolResolverFn = MangledSymbol -> IO (Either JITSymbolError JITSymbol)
- LLVM.Internal.OrcJIT.CompileLayer: data ModuleHandle
- LLVM.OrcJIT: [dylibResolver] :: SymbolResolver -> !SymbolResolverFn
- LLVM.OrcJIT: [externalResolver] :: SymbolResolver -> !SymbolResolverFn
- LLVM.OrcJIT: data ModuleHandle
- LLVM.OrcJIT: data SymbolResolver
+ LLVM.Internal.DecodeAST: instance Control.Monad.Fail.MonadFail LLVM.Internal.DecodeAST.DecodeAST
+ LLVM.Internal.FFI.LLVMCTypes: functionAttributeKindNoCfCheck :: FunctionAttributeKind
+ LLVM.Internal.FFI.LLVMCTypes: functionAttributeKindOptForFuzzing :: FunctionAttributeKind
+ LLVM.Internal.FFI.LLVMCTypes: functionAttributeKindShadowCallStack :: FunctionAttributeKind
+ LLVM.Internal.FFI.LLVMCTypes: unnamedAddrNo :: UnnamedAddr
+ LLVM.Internal.FFI.Metadata: getDIEnumeratorIsUnsigned :: Ptr DIEnumerator -> IO LLVMBool
+ LLVM.Internal.FFI.Metadata: getDISubprogramRetainedNodes :: Ptr DISubprogram -> IO (TupleArray DILocalVariable)
+ LLVM.Internal.FFI.Metadata: getDISubrangeConstantCount :: Ptr Context -> Int64 -> Int64 -> IO (Ptr DISubrange)
+ LLVM.Internal.FFI.Metadata: getDISubrangeCountConstant :: Ptr DISubrange -> IO Int64
+ LLVM.Internal.FFI.Metadata: getDISubrangeCountVariable :: Ptr DISubrange -> IO (Ptr DIVariable)
+ LLVM.Internal.FFI.Metadata: getDISubrangeHasConstantCount :: Ptr DISubrange -> IO LLVMBool
+ LLVM.Internal.FFI.Metadata: getDISubrangeVariableCount :: Ptr Context -> Ptr DIVariable -> Int64 -> IO (Ptr DISubrange)
+ LLVM.Internal.FFI.Metadata: getFileChecksumValue :: Ptr DIFile -> IO (Ptr MDString)
+ LLVM.Internal.FFI.OrcJIT: ModuleKey :: Word64 -> ModuleKey
+ LLVM.Internal.FFI.OrcJIT: allocateVModule :: Ptr ExecutionSession -> IO ModuleKey
+ LLVM.Internal.FFI.OrcJIT: createExecutionSession :: IO (Ptr ExecutionSession)
+ LLVM.Internal.FFI.OrcJIT: data ExecutionSession
+ LLVM.Internal.FFI.OrcJIT: data SymbolResolver
+ LLVM.Internal.FFI.OrcJIT: disposeExecutionSession :: Ptr ExecutionSession -> IO ()
+ LLVM.Internal.FFI.OrcJIT: disposeSymbolResolver :: Ptr SymbolResolver -> IO ()
+ LLVM.Internal.FFI.OrcJIT: instance GHC.Classes.Eq LLVM.Internal.FFI.OrcJIT.ModuleKey
+ LLVM.Internal.FFI.OrcJIT: instance GHC.Classes.Ord LLVM.Internal.FFI.OrcJIT.ModuleKey
+ LLVM.Internal.FFI.OrcJIT: instance GHC.Show.Show LLVM.Internal.FFI.OrcJIT.ModuleKey
+ LLVM.Internal.FFI.OrcJIT: newtype ModuleKey
+ LLVM.Internal.FFI.OrcJIT: releaseVModule :: Ptr ExecutionSession -> ModuleKey -> IO ()
+ LLVM.Internal.FFI.OrcJIT: wrapGetSymbolResolver :: (ModuleKey -> IO (Ptr SymbolResolver)) -> IO (FunPtr (ModuleKey -> IO (Ptr SymbolResolver)))
+ LLVM.Internal.FFI.OrcJIT: wrapSetSymbolResolver :: (ModuleKey -> Ptr SymbolResolver -> IO ()) -> IO (FunPtr (ModuleKey -> Ptr SymbolResolver -> IO ()))
+ LLVM.Internal.OrcJIT: ExecutionSession :: (Ptr ExecutionSession) -> ExecutionSession
+ LLVM.Internal.OrcJIT: allocateModuleKey :: ExecutionSession -> IO ModuleKey
+ LLVM.Internal.OrcJIT: createExecutionSession :: IO ExecutionSession
+ LLVM.Internal.OrcJIT: disposeExecutionSession :: ExecutionSession -> IO ()
+ LLVM.Internal.OrcJIT: instance Control.Monad.IO.Class.MonadIO m => LLVM.Internal.Coding.EncodeM m (LLVM.Internal.OrcJIT.MangledSymbol -> GHC.Types.IO (Data.Either.Either LLVM.Internal.OrcJIT.JITSymbolError LLVM.Internal.OrcJIT.JITSymbol)) (GHC.Ptr.FunPtr LLVM.Internal.FFI.OrcJIT.SymbolResolverFn)
+ LLVM.Internal.OrcJIT: instance Control.Monad.IO.Class.MonadIO m => LLVM.Internal.Coding.EncodeM m LLVM.Internal.OrcJIT.SymbolResolver (GHC.IORef.IORef [GHC.Types.IO ()] -> GHC.Ptr.Ptr LLVM.Internal.FFI.OrcJIT.ExecutionSession -> GHC.Types.IO (GHC.Ptr.Ptr LLVM.Internal.FFI.OrcJIT.SymbolResolver))
+ LLVM.Internal.OrcJIT: newtype ExecutionSession
+ LLVM.Internal.OrcJIT: newtype SymbolResolver
+ LLVM.Internal.OrcJIT: releaseModuleKey :: ExecutionSession -> ModuleKey -> IO ()
+ LLVM.Internal.OrcJIT: withExecutionSession :: (ExecutionSession -> IO a) -> IO a
+ LLVM.Internal.OrcJIT: withModuleKey :: ExecutionSession -> (ModuleKey -> IO a) -> IO a
+ LLVM.Internal.OrcJIT: withSymbolResolver :: ExecutionSession -> SymbolResolver -> (Ptr SymbolResolver -> IO a) -> IO a
+ LLVM.Internal.OrcJIT.CompileLayer: data ModuleKey
+ LLVM.OrcJIT: allocateModuleKey :: ExecutionSession -> IO ModuleKey
+ LLVM.OrcJIT: createExecutionSession :: IO ExecutionSession
+ LLVM.OrcJIT: data ExecutionSession
+ LLVM.OrcJIT: data ModuleKey
+ LLVM.OrcJIT: disposeExecutionSession :: ExecutionSession -> IO ()
+ LLVM.OrcJIT: newtype SymbolResolver
+ LLVM.OrcJIT: releaseModuleKey :: ExecutionSession -> ModuleKey -> IO ()
+ LLVM.OrcJIT: withExecutionSession :: (ExecutionSession -> IO a) -> IO a
+ LLVM.OrcJIT: withModuleKey :: ExecutionSession -> (ModuleKey -> IO a) -> IO a
+ LLVM.OrcJIT: withSymbolResolver :: ExecutionSession -> SymbolResolver -> (Ptr SymbolResolver -> IO a) -> IO a
- LLVM.Internal.FFI.Metadata: getDIEnumerator :: Ptr Context -> Int64 -> Ptr MDString -> IO (Ptr DIEnumerator)
+ LLVM.Internal.FFI.Metadata: getDIEnumerator :: Ptr Context -> Int64 -> LLVMBool -> Ptr MDString -> IO (Ptr DIEnumerator)
- LLVM.Internal.FFI.OrcJIT: createLambdaResolver :: FunPtr SymbolResolverFn -> FunPtr SymbolResolverFn -> IO (Ptr LambdaResolver)
+ LLVM.Internal.FFI.OrcJIT: createLambdaResolver :: Ptr ExecutionSession -> FunPtr SymbolResolverFn -> IO (Ptr SymbolResolver)
- LLVM.Internal.FFI.OrcJIT.CompileLayer: addModule :: Ptr CompileLayer -> Ptr DataLayout -> Ptr Module -> Ptr LambdaResolver -> Ptr (OwnerTransfered CString) -> IO ModuleHandle
+ LLVM.Internal.FFI.OrcJIT.CompileLayer: addModule :: Ptr CompileLayer -> Ptr DataLayout -> ModuleKey -> Ptr Module -> Ptr (OwnerTransfered CString) -> IO ()
- LLVM.Internal.FFI.OrcJIT.CompileLayer: findSymbolIn :: Ptr CompileLayer -> ModuleHandle -> CString -> LLVMBool -> IO (Ptr JITSymbol)
+ LLVM.Internal.FFI.OrcJIT.CompileLayer: findSymbolIn :: Ptr CompileLayer -> ModuleKey -> CString -> LLVMBool -> IO (Ptr JITSymbol)
- LLVM.Internal.FFI.OrcJIT.CompileLayer: removeModule :: Ptr CompileLayer -> ModuleHandle -> IO ()
+ LLVM.Internal.FFI.OrcJIT.CompileLayer: removeModule :: Ptr CompileLayer -> ModuleKey -> IO ()
- LLVM.Internal.FFI.OrcJIT.CompileOnDemandLayer: createCompileOnDemandLayer :: Ptr CompileLayer -> FunPtr PartitioningFn -> Ptr JITCompileCallbackManager -> Ptr IndirectStubsManagerBuilder -> LLVMBool -> IO (Ptr CompileOnDemandLayer)
+ LLVM.Internal.FFI.OrcJIT.CompileOnDemandLayer: createCompileOnDemandLayer :: Ptr ExecutionSession -> Ptr CompileLayer -> FunPtr (ModuleKey -> IO (Ptr SymbolResolver)) -> FunPtr (ModuleKey -> Ptr SymbolResolver -> IO ()) -> FunPtr PartitioningFn -> Ptr JITCompileCallbackManager -> Ptr IndirectStubsManagerBuilder -> LLVMBool -> IO (Ptr CompileOnDemandLayer)
- LLVM.Internal.FFI.OrcJIT.CompileOnDemandLayer: createLocalCompileCallbackManager :: CString -> TargetAddress -> IO (Ptr JITCompileCallbackManager)
+ LLVM.Internal.FFI.OrcJIT.CompileOnDemandLayer: createLocalCompileCallbackManager :: Ptr ExecutionSession -> CString -> TargetAddress -> IO (Ptr JITCompileCallbackManager)
- LLVM.Internal.FFI.OrcJIT.LinkingLayer: addObjectFile :: Ptr LinkingLayer -> Ptr ObjectFile -> Ptr LambdaResolver -> Ptr (OwnerTransfered CString) -> IO ObjectHandle
+ LLVM.Internal.FFI.OrcJIT.LinkingLayer: addObjectFile :: Ptr LinkingLayer -> ModuleKey -> Ptr ObjectFile -> Ptr (OwnerTransfered CString) -> IO ()
- LLVM.Internal.FFI.OrcJIT.LinkingLayer: createObjectLinkingLayer :: IO (Ptr ObjectLinkingLayer)
+ LLVM.Internal.FFI.OrcJIT.LinkingLayer: createObjectLinkingLayer :: Ptr ExecutionSession -> FunPtr (ModuleKey -> IO (Ptr SymbolResolver)) -> IO (Ptr ObjectLinkingLayer)
- LLVM.Internal.FFI.OrcJIT.LinkingLayer: findSymbolIn :: Ptr LinkingLayer -> ObjectHandle -> CString -> LLVMBool -> IO (Ptr JITSymbol)
+ LLVM.Internal.FFI.OrcJIT.LinkingLayer: findSymbolIn :: Ptr LinkingLayer -> ModuleKey -> CString -> LLVMBool -> IO (Ptr JITSymbol)
- LLVM.Internal.OrcJIT: SymbolResolver :: !SymbolResolverFn -> !SymbolResolverFn -> SymbolResolver
+ LLVM.Internal.OrcJIT: SymbolResolver :: (MangledSymbol -> IO (Either JITSymbolError JITSymbol)) -> SymbolResolver
- LLVM.Internal.OrcJIT.CompileLayer: addModule :: CompileLayer l => l -> Module -> SymbolResolver -> IO ModuleHandle
+ LLVM.Internal.OrcJIT.CompileLayer: addModule :: CompileLayer l => l -> ModuleKey -> Module -> IO ()
- LLVM.Internal.OrcJIT.CompileLayer: findSymbolIn :: CompileLayer l => l -> ModuleHandle -> MangledSymbol -> Bool -> IO (Either JITSymbolError JITSymbol)
+ LLVM.Internal.OrcJIT.CompileLayer: findSymbolIn :: CompileLayer l => l -> ModuleKey -> MangledSymbol -> Bool -> IO (Either JITSymbolError JITSymbol)
- LLVM.Internal.OrcJIT.CompileLayer: removeModule :: CompileLayer l => l -> ModuleHandle -> IO ()
+ LLVM.Internal.OrcJIT.CompileLayer: removeModule :: CompileLayer l => l -> ModuleKey -> IO ()
- LLVM.Internal.OrcJIT.CompileLayer: withModule :: CompileLayer l => l -> Module -> SymbolResolver -> (ModuleHandle -> IO a) -> IO a
+ LLVM.Internal.OrcJIT.CompileLayer: withModule :: CompileLayer l => l -> ModuleKey -> Module -> IO a -> IO a
- LLVM.Internal.OrcJIT.CompileOnDemandLayer: newCompileOnDemandLayer :: CompileLayer l => l -> TargetMachine -> (Ptr Function -> IO [Ptr Function]) -> JITCompileCallbackManager -> IndirectStubsManagerBuilder -> Bool -> IO (CompileOnDemandLayer l)
+ LLVM.Internal.OrcJIT.CompileOnDemandLayer: newCompileOnDemandLayer :: CompileLayer l => ExecutionSession -> l -> TargetMachine -> (ModuleKey -> IO (Ptr SymbolResolver)) -> (ModuleKey -> Ptr SymbolResolver -> IO ()) -> (Ptr Function -> IO [Ptr Function]) -> JITCompileCallbackManager -> IndirectStubsManagerBuilder -> Bool -> IO (CompileOnDemandLayer l)
- LLVM.Internal.OrcJIT.CompileOnDemandLayer: newJITCompileCallbackManager :: ShortByteString -> Maybe (IO ()) -> IO JITCompileCallbackManager
+ LLVM.Internal.OrcJIT.CompileOnDemandLayer: newJITCompileCallbackManager :: ExecutionSession -> ShortByteString -> Maybe (IO ()) -> IO JITCompileCallbackManager
- LLVM.Internal.OrcJIT.CompileOnDemandLayer: withCompileOnDemandLayer :: CompileLayer l => l -> TargetMachine -> (Ptr Function -> IO [Ptr Function]) -> JITCompileCallbackManager -> IndirectStubsManagerBuilder -> Bool -> (CompileOnDemandLayer l -> IO a) -> IO a
+ LLVM.Internal.OrcJIT.CompileOnDemandLayer: withCompileOnDemandLayer :: CompileLayer l => ExecutionSession -> l -> TargetMachine -> (ModuleKey -> IO (Ptr SymbolResolver)) -> (ModuleKey -> Ptr SymbolResolver -> IO ()) -> (Ptr Function -> IO [Ptr Function]) -> JITCompileCallbackManager -> IndirectStubsManagerBuilder -> Bool -> (CompileOnDemandLayer l -> IO a) -> IO a
- LLVM.Internal.OrcJIT.CompileOnDemandLayer: withJITCompileCallbackManager :: ShortByteString -> Maybe (IO ()) -> (JITCompileCallbackManager -> IO a) -> IO a
+ LLVM.Internal.OrcJIT.CompileOnDemandLayer: withJITCompileCallbackManager :: ExecutionSession -> ShortByteString -> Maybe (IO ()) -> (JITCompileCallbackManager -> IO a) -> IO a
- LLVM.Internal.OrcJIT.LinkingLayer: addObjectFile :: LinkingLayer l => l -> ObjectFile -> SymbolResolver -> IO ObjectHandle
+ LLVM.Internal.OrcJIT.LinkingLayer: addObjectFile :: LinkingLayer l => l -> ModuleKey -> ObjectFile -> IO ()
- LLVM.Internal.OrcJIT.LinkingLayer: findSymbolIn :: LinkingLayer l => l -> ObjectHandle -> ShortByteString -> Bool -> IO (Either JITSymbolError JITSymbol)
+ LLVM.Internal.OrcJIT.LinkingLayer: findSymbolIn :: LinkingLayer l => l -> ModuleKey -> ShortByteString -> Bool -> IO (Either JITSymbolError JITSymbol)
- LLVM.Internal.OrcJIT.LinkingLayer: newObjectLinkingLayer :: IO ObjectLinkingLayer
+ LLVM.Internal.OrcJIT.LinkingLayer: newObjectLinkingLayer :: ExecutionSession -> (ModuleKey -> IO (Ptr SymbolResolver)) -> IO ObjectLinkingLayer
- LLVM.Internal.OrcJIT.LinkingLayer: withObjectLinkingLayer :: (ObjectLinkingLayer -> IO a) -> IO a
+ LLVM.Internal.OrcJIT.LinkingLayer: withObjectLinkingLayer :: ExecutionSession -> (ModuleKey -> IO (Ptr SymbolResolver)) -> (ObjectLinkingLayer -> IO a) -> IO a
- LLVM.OrcJIT: SymbolResolver :: !SymbolResolverFn -> !SymbolResolverFn -> SymbolResolver
+ LLVM.OrcJIT: SymbolResolver :: (MangledSymbol -> IO (Either JITSymbolError JITSymbol)) -> SymbolResolver
- LLVM.OrcJIT: addModule :: CompileLayer l => l -> Module -> SymbolResolver -> IO ModuleHandle
+ LLVM.OrcJIT: addModule :: CompileLayer l => l -> ModuleKey -> Module -> IO ()
- LLVM.OrcJIT: addObjectFile :: LinkingLayer l => l -> ObjectFile -> SymbolResolver -> IO ObjectHandle
+ LLVM.OrcJIT: addObjectFile :: LinkingLayer l => l -> ModuleKey -> ObjectFile -> IO ()
- LLVM.OrcJIT: newCompileOnDemandLayer :: CompileLayer l => l -> TargetMachine -> (Ptr Function -> IO [Ptr Function]) -> JITCompileCallbackManager -> IndirectStubsManagerBuilder -> Bool -> IO (CompileOnDemandLayer l)
+ LLVM.OrcJIT: newCompileOnDemandLayer :: CompileLayer l => ExecutionSession -> l -> TargetMachine -> (ModuleKey -> IO (Ptr SymbolResolver)) -> (ModuleKey -> Ptr SymbolResolver -> IO ()) -> (Ptr Function -> IO [Ptr Function]) -> JITCompileCallbackManager -> IndirectStubsManagerBuilder -> Bool -> IO (CompileOnDemandLayer l)
- LLVM.OrcJIT: newJITCompileCallbackManager :: ShortByteString -> Maybe (IO ()) -> IO JITCompileCallbackManager
+ LLVM.OrcJIT: newJITCompileCallbackManager :: ExecutionSession -> ShortByteString -> Maybe (IO ()) -> IO JITCompileCallbackManager
- LLVM.OrcJIT: newObjectLinkingLayer :: IO ObjectLinkingLayer
+ LLVM.OrcJIT: newObjectLinkingLayer :: ExecutionSession -> (ModuleKey -> IO (Ptr SymbolResolver)) -> IO ObjectLinkingLayer
- LLVM.OrcJIT: removeModule :: CompileLayer l => l -> ModuleHandle -> IO ()
+ LLVM.OrcJIT: removeModule :: CompileLayer l => l -> ModuleKey -> IO ()
- LLVM.OrcJIT: withCompileOnDemandLayer :: CompileLayer l => l -> TargetMachine -> (Ptr Function -> IO [Ptr Function]) -> JITCompileCallbackManager -> IndirectStubsManagerBuilder -> Bool -> (CompileOnDemandLayer l -> IO a) -> IO a
+ LLVM.OrcJIT: withCompileOnDemandLayer :: CompileLayer l => ExecutionSession -> l -> TargetMachine -> (ModuleKey -> IO (Ptr SymbolResolver)) -> (ModuleKey -> Ptr SymbolResolver -> IO ()) -> (Ptr Function -> IO [Ptr Function]) -> JITCompileCallbackManager -> IndirectStubsManagerBuilder -> Bool -> (CompileOnDemandLayer l -> IO a) -> IO a
- LLVM.OrcJIT: withJITCompileCallbackManager :: ShortByteString -> Maybe (IO ()) -> (JITCompileCallbackManager -> IO a) -> IO a
+ LLVM.OrcJIT: withJITCompileCallbackManager :: ExecutionSession -> ShortByteString -> Maybe (IO ()) -> (JITCompileCallbackManager -> IO a) -> IO a
- LLVM.OrcJIT: withModule :: CompileLayer l => l -> Module -> SymbolResolver -> (ModuleHandle -> IO a) -> IO a
+ LLVM.OrcJIT: withModule :: CompileLayer l => l -> ModuleKey -> Module -> IO a -> IO a
- LLVM.OrcJIT: withObjectLinkingLayer :: (ObjectLinkingLayer -> IO a) -> IO a
+ LLVM.OrcJIT: withObjectLinkingLayer :: ExecutionSession -> (ModuleKey -> IO (Ptr SymbolResolver)) -> (ObjectLinkingLayer -> IO a) -> IO a
- LLVM.OrcJIT.CompileLayer: addModule :: CompileLayer l => l -> Module -> SymbolResolver -> IO ModuleHandle
+ LLVM.OrcJIT.CompileLayer: addModule :: CompileLayer l => l -> ModuleKey -> Module -> IO ()
- LLVM.OrcJIT.CompileLayer: findSymbolIn :: CompileLayer l => l -> ModuleHandle -> MangledSymbol -> Bool -> IO (Either JITSymbolError JITSymbol)
+ LLVM.OrcJIT.CompileLayer: findSymbolIn :: CompileLayer l => l -> ModuleKey -> MangledSymbol -> Bool -> IO (Either JITSymbolError JITSymbol)
- LLVM.OrcJIT.CompileLayer: removeModule :: CompileLayer l => l -> ModuleHandle -> IO ()
+ LLVM.OrcJIT.CompileLayer: removeModule :: CompileLayer l => l -> ModuleKey -> IO ()
- LLVM.OrcJIT.CompileLayer: withModule :: CompileLayer l => l -> Module -> SymbolResolver -> (ModuleHandle -> IO a) -> IO a
+ LLVM.OrcJIT.CompileLayer: withModule :: CompileLayer l => l -> ModuleKey -> Module -> IO a -> IO a
- LLVM.OrcJIT.LinkingLayer: addObjectFile :: LinkingLayer l => l -> ObjectFile -> SymbolResolver -> IO ObjectHandle
+ LLVM.OrcJIT.LinkingLayer: addObjectFile :: LinkingLayer l => l -> ModuleKey -> ObjectFile -> IO ()
- LLVM.OrcJIT.LinkingLayer: findSymbolIn :: LinkingLayer l => l -> ObjectHandle -> ShortByteString -> Bool -> IO (Either JITSymbolError JITSymbol)
+ LLVM.OrcJIT.LinkingLayer: findSymbolIn :: LinkingLayer l => l -> ModuleKey -> ShortByteString -> Bool -> IO (Either JITSymbolError JITSymbol)
- LLVM.OrcJIT.LinkingLayer: newObjectLinkingLayer :: IO ObjectLinkingLayer
+ LLVM.OrcJIT.LinkingLayer: newObjectLinkingLayer :: ExecutionSession -> (ModuleKey -> IO (Ptr SymbolResolver)) -> IO ObjectLinkingLayer
- LLVM.OrcJIT.LinkingLayer: withObjectLinkingLayer :: (ObjectLinkingLayer -> IO a) -> IO a
+ LLVM.OrcJIT.LinkingLayer: withObjectLinkingLayer :: ExecutionSession -> (ModuleKey -> IO (Ptr SymbolResolver)) -> (ObjectLinkingLayer -> IO a) -> IO a

Files

CHANGELOG.md view
@@ -1,3 +1,19 @@+## 7.0.0 (2018-09-28)++* Throw an `EncodeException` if a local variable is defined multiple+  times. This is consistent with `llc` which also forbids reusing+  variable names.+* Update for LLVM 7.0:+  * The ORC JIT API has been changed to reflect the changes in LLVM+    itself. The test suite should give you a good idea of how to adapt+    your code but here is a summary:+    * There is now a separate `ExecutionSession` that tracks module handles.+    * `SymbolResolver` only has a single resolver function.+    * Creating an `ObjectLinkingLayer` requires a way to get the+      symbol resolver for a module.+    * Creating a `CompileOnDemandLayer` requires a way to set and get+      the symbol resolver for a module.+ ## 6.3.0 (2018-06-12)  * `findSymbol` and `findSymbolIn` now return `Either JITSymbolError
Setup.hs view
@@ -41,7 +41,7 @@ #endif  llvmVersion :: Version-llvmVersion = mkVersion [6,0]+llvmVersion = mkVersion [7,0]  llvmConfigNames :: [String] llvmConfigNames = [
llvm-hs.cabal view
@@ -1,5 +1,5 @@ name: llvm-hs-version: 6.3.0+version: 7.0.0 license: BSD3 license-file: LICENSE author: Anthony Cowley, Stephen Diehl, Moritz Kiefer <moritz.kiefer@purelyfunctional.org>, Benjamin S. Scarlet@@ -45,7 +45,7 @@ source-repository head   type: git   location: git://github.com/llvm-hs/llvm-hs.git-  branch: llvm-4+  branch: llvm-7  flag shared-llvm   description: link against llvm shared rather than static library@@ -76,7 +76,7 @@     template-haskell >= 2.5.0.0,     containers >= 0.4.2.1,     array >= 0.4.0.0,-    llvm-hs-pure == 6.2.*+    llvm-hs-pure == 7.0.*   hs-source-dirs: src   default-extensions:     NoImplicitPrelude@@ -252,7 +252,7 @@     mtl >= 2.1,     transformers >= 0.3.0.0,     temporary >= 1.2 && < 1.4,-    pretty-show >= 1.6 && < 1.8,+    pretty-show >= 1.6 && < 1.9,     process,     temporary   hs-source-dirs: test
src/Control/Monad/Trans/AnyCont.hs view
@@ -6,7 +6,8 @@ import LLVM.Prelude  import Control.Monad.Catch-import Control.Monad.Cont+import Control.Monad.Cont as Cont+import Control.Monad.Fail as Fail  newtype AnyContT m a = AnyContT { unAnyContT :: forall r . ContT r m a } @@ -20,8 +21,11 @@ instance Monad m => Monad (AnyContT m) where   AnyContT f >>= k = AnyContT $ f >>= unAnyContT . k   return a = AnyContT $ return a-  fail s = AnyContT (ContT (\_ -> fail s))-  +  fail s = AnyContT (ContT (\_ -> Cont.fail s))++instance MonadFail m => MonadFail (AnyContT m) where+  fail s = AnyContT (ContT (\_ -> Fail.fail s))+ instance MonadIO m => MonadIO (AnyContT m) where   liftIO = lift . liftIO @@ -33,6 +37,7 @@  runAnyContT :: AnyContT m a -> (forall r . (a -> m r) -> m r) runAnyContT = runContT . unAnyContT+ anyContT :: (forall r . (a -> m r) -> m r) -> AnyContT m a anyContT f = AnyContT (ContT f) 
src/LLVM/Internal/DecodeAST.hs view
@@ -8,6 +8,7 @@  import LLVM.Prelude +import Control.Monad.Fail import Control.Monad.Catch import Control.Monad.State import Control.Monad.AnyCont@@ -72,6 +73,7 @@     Functor,     Monad,     MonadIO,+    MonadFail,     MonadState DecodeState,     MonadThrow,     MonadAnyCont IO,
src/LLVM/Internal/EncodeAST.hs view
@@ -122,6 +122,7 @@   def <- gets $ Map.lookup n . encodeStateLocals   case def of     Just (ForwardValue dummy) -> liftIO $ FFI.replaceAllUsesWith dummy v+    Just _ -> throwM (EncodeException ("Duplicate definition of local variable: " <> show n <> "."))     _ -> return ()   modify $ \b -> b { encodeStateLocals = Map.insert n (DefinedValue v) (encodeStateLocals b) } 
src/LLVM/Internal/FFI/Attribute.h view
@@ -28,6 +28,7 @@ 	macro(NoAlias,T,T,F)                              \ 	macro(NoBuiltin,F,F,T)                            \ 	macro(NoCapture,T,F,F)                            \+    macro(NoCfCheck,F,F,T)                            \ 	macro(NoDuplicate,F,F,T)                          \ 	macro(NoImplicitFloat,F,F,T)                      \ 	macro(NoInline,F,F,T)                             \@@ -37,6 +38,7 @@ 	macro(NoUnwind,F,F,T)                             \ 	macro(NonLazyBind,F,F,T)                          \ 	macro(NonNull,T,T,F)                              \+    macro(OptForFuzzing,F,F,T)                        \ 	macro(OptimizeForSize,F,F,T)                      \ 	macro(OptimizeNone,F,F,T)                         \ 	macro(ReadNone,T,F,T)                             \@@ -49,6 +51,7 @@     macro(SanitizeHWAddress,F,F,T)                    \ 	macro(SanitizeMemory,F,F,T)                       \ 	macro(SanitizeThread,F,F,T)                       \+    macro(ShadowCallStack,F,F,T)                      \     macro(Speculatable,F,F,T)                         \ 	macro(StackAlignment,F,F,T)                       \ 	macro(StackProtect,F,F,T)                         \
src/LLVM/Internal/FFI/BitcodeC.cpp view
@@ -27,7 +27,7 @@ }  void LLVM_Hs_WriteBitcode(LLVMModuleRef m, raw_ostream &os) {-	WriteBitcodeToFile(unwrap(m), os);+	WriteBitcodeToFile(*unwrap(m), os); }  }
src/LLVM/Internal/FFI/GlobalValue.h view
@@ -45,14 +45,7 @@ 	macro(LocalExecTLSModel)  #define LLVM_HS_FOR_EACH_UNNAMED_ADDR(macro) \-	macro(None)                                   \-	macro(Local)                                  \+	macro(No)                                \+	macro(Local)                             \ 	macro(Global)--typedef enum {-#define ENUM_CASE(x) LLVMUnnamedAddr ## x,-LLVM_HS_FOR_EACH_UNNAMED_ADDR(ENUM_CASE)-#undef ENUM_CASE-} LLVMUnnamedAddr;- #endif
src/LLVM/Internal/FFI/GlobalValue.hs view
@@ -64,10 +64,10 @@ foreign import ccall unsafe "LLVMSetAlignment" setAlignment ::   Ptr GlobalValue -> CUInt -> IO () -foreign import ccall unsafe "LLVM_Hs_GetUnnamedAddr" getUnnamedAddr ::+foreign import ccall unsafe "LLVMGetUnnamedAddress" getUnnamedAddr ::   Ptr GlobalValue -> IO UnnamedAddr -foreign import ccall unsafe "LLVM_Hs_SetUnnamedAddr" setUnnamedAddr ::+foreign import ccall unsafe "LLVMSetUnnamedAddress" setUnnamedAddr ::   Ptr GlobalValue -> UnnamedAddr -> IO ()  foreign import ccall unsafe "LLVM_Hs_GetThreadLocalMode" getThreadLocalMode ::
src/LLVM/Internal/FFI/GlobalValueC.cpp view
@@ -45,32 +45,6 @@   comdat.setSelectionKind(Comdat::SelectionKind(csk)); } -static LLVMUnnamedAddr unwrap(GlobalValue::UnnamedAddr a) {-    switch (a) {-#define ENUM_CASE(x) case GlobalValue::UnnamedAddr::x: return LLVMUnnamedAddr ## x;-LLVM_HS_FOR_EACH_UNNAMED_ADDR(ENUM_CASE)-#undef ENUM_CASE-    default: return LLVMUnnamedAddrNone;-    }-}--static GlobalValue::UnnamedAddr wrap(LLVMUnnamedAddr a) {-    switch (a) {-#define ENUM_CASE(x) case LLVMUnnamedAddr ## x: return GlobalValue::UnnamedAddr::x;-LLVM_HS_FOR_EACH_UNNAMED_ADDR(ENUM_CASE)-#undef ENUM_CASE-    default: return GlobalValue::UnnamedAddr::None;-    }-}--LLVMUnnamedAddr LLVM_Hs_GetUnnamedAddr(LLVMValueRef globalVal) {-    return unwrap(unwrap<GlobalValue>(globalVal)->getUnnamedAddr());-}--void LLVM_Hs_SetUnnamedAddr(LLVMValueRef globalVal, LLVMUnnamedAddr attr) {-    unwrap<GlobalValue>(globalVal)->setUnnamedAddr(wrap(attr));-}- #define ENUM_CASE(n)                                                           \     static_assert(unsigned(GlobalValue::n) == unsigned(LLVM##n),               \                   "TLS Model Enum mismatch");
src/LLVM/Internal/FFI/LLVMCTypes.hsc view
@@ -165,7 +165,7 @@  newtype UnnamedAddr = UnnamedAddr CUInt   deriving (Eq, Show, Typeable, Data, Generic)-#define UA_Rec(n) { #n, LLVMUnnamedAddr ## n },+#define UA_Rec(n) { #n, LLVM ## n ## UnnamedAddr }, #{inject UNNAMED_ADDR, UnnamedAddr, UnnamedAddr, unnamedAddr, UA_Rec}  newtype SynchronizationScope = SynchronizationScope CUInt
src/LLVM/Internal/FFI/Metadata.hs view
@@ -120,11 +120,14 @@ -- DIEnumerator  foreign import ccall unsafe "LLVM_Hs_Get_DIEnumerator" getDIEnumerator ::-  Ptr Context -> Int64 -> Ptr MDString -> IO (Ptr DIEnumerator)+  Ptr Context -> Int64 -> LLVMBool -> Ptr MDString -> IO (Ptr DIEnumerator)  foreign import ccall unsafe "LLVM_Hs_DIEnumerator_GetValue" getDIEnumeratorValue ::   Ptr DIEnumerator -> IO Int64 +foreign import ccall unsafe "LLVM_Hs_DIEnumerator_GetIsUnsigned" getDIEnumeratorIsUnsigned ::+  Ptr DIEnumerator -> IO LLVMBool+ foreign import ccall unsafe "LLVM_Hs_DIEnumerator_GetName" getDIEnumeratorName ::   Ptr DIEnumerator -> IO (Ptr MDString) @@ -135,7 +138,7 @@ foreign import ccall unsafe "LLVM_Hs_DIFileGetDirectory" getFileDirectory ::   Ptr DIFile -> IO (Ptr MDString) -foreign import ccall unsafe "LLVM_Hs_DIFileGetChecksum" getFileChecksum ::+foreign import ccall unsafe "LLVM_Hs_DIFileGetChecksum" getFileChecksumValue ::   Ptr DIFile -> IO (Ptr MDString)  foreign import ccall unsafe "LLVM_Hs_DIFileGetChecksumKind" getFileChecksumKind ::@@ -282,10 +285,19 @@   Ptr Context -> Ptr MDString -> Ptr MDString -> ChecksumKind -> Ptr MDString -> IO (Ptr DIFile)  -- DISubrange-foreign import ccall unsafe "LLVM_Hs_Get_DISubrange" getDISubrange ::+foreign import ccall unsafe "LLVM_Hs_Get_DISubrangeConstantCount" getDISubrangeConstantCount ::   Ptr Context -> Int64 -> Int64 -> IO (Ptr DISubrange) -foreign import ccall unsafe "LLVM_Hs_DISubrange_GetCount" getDISubrangeCount ::+foreign import ccall unsafe "LLVM_Hs_Get_DISubrangeVariableCount" getDISubrangeVariableCount ::+  Ptr Context -> Ptr DIVariable -> Int64 -> IO (Ptr DISubrange)++foreign import ccall unsafe "LLVM_Hs_DISubrange_HasConstantCount" getDISubrangeHasConstantCount ::+  Ptr DISubrange -> IO LLVMBool++foreign import ccall unsafe "LLVM_Hs_DISubrange_GetVariableCount" getDISubrangeCountVariable ::+  Ptr DISubrange -> IO (Ptr DIVariable)++foreign import ccall unsafe "LLVM_Hs_DISubrange_GetConstantCount" getDISubrangeCountConstant ::   Ptr DISubrange -> IO Int64  foreign import ccall unsafe "LLVM_Hs_DISubrange_GetLowerBound" getDISubrangeLowerBound ::@@ -335,7 +347,7 @@ foreign import ccall unsafe "LLVM_Hs_DISubprogram_GetTemplateParams" getDISubprogramTemplateParams ::   Ptr DISubprogram -> IO (TupleArray DITemplateParameter) -foreign import ccall unsafe "LLVM_Hs_DISubprogram_GetVariables" getDISubprogramVariables ::+foreign import ccall unsafe "LLVM_Hs_DISubprogram_GetRetainedNodes" getDISubprogramRetainedNodes ::   Ptr DISubprogram -> IO (TupleArray DILocalVariable)  foreign import ccall unsafe "LLVM_Hs_DISubprogram_GetThrownTypes" getDISubprogramThrownTypes ::
src/LLVM/Internal/FFI/MetadataC.cpp view
@@ -195,15 +195,19 @@  // DIEnumerator -DIEnumerator* LLVM_Hs_Get_DIEnumerator(LLVMContextRef cxt, int64_t value, MDString* name) {+DIEnumerator* LLVM_Hs_Get_DIEnumerator(LLVMContextRef cxt, int64_t value, LLVMBool isUnsigned, MDString* name) {     LLVMContext& c = *unwrap(cxt);-    return DIEnumerator::get(c, value, name);+    return DIEnumerator::get(c, value, isUnsigned, name); }  int64_t LLVM_Hs_DIEnumerator_GetValue(DIEnumerator* md) {     return md->getValue(); } +LLVMBool LLVM_Hs_DIEnumerator_GetIsUnsigned(DIEnumerator* md) {+    return md->isUnsigned();+}+ MDString* LLVM_Hs_DIEnumerator_GetName(DIEnumerator* md) {     return md->getRawName(); }@@ -217,11 +221,19 @@ }  MDString* LLVM_Hs_DIFileGetChecksum(DIFile *di) {-    return di->getRawChecksum();+    auto checksumInfo = di->getRawChecksum();+    if (checksumInfo.hasValue()) {+        return checksumInfo->Value;+    }+    return nullptr; }  llvm::DIFile::ChecksumKind LLVM_Hs_DIFileGetChecksumKind(DIFile *di) {-    return di->getChecksumKind();+    auto checksumInfo = di->getRawChecksum();+    if (checksumInfo.hasValue()) {+        return checksumInfo->Kind;+    }+    return static_cast<llvm::DIFile::ChecksumKind>(0); }  // DIScope@@ -293,17 +305,33 @@  DIFile* LLVM_Hs_Get_DIFile(LLVMContextRef ctx, MDString* filename, MDString* directory, unsigned checksumKind, MDString* checksum) {     LLVMContext& c = *unwrap(ctx);-    return DIFile::get(c, filename, directory, static_cast<DIFile::ChecksumKind>(checksumKind), checksum);+    if (!checksum) {+        return DIFile::get(c, filename, directory);+    }+    return DIFile::get(c, filename, directory, DIFile::ChecksumInfo<MDString*>(static_cast<llvm::DIFile::ChecksumKind>(checksumKind), checksum)); } -DISubrange* LLVM_Hs_Get_DISubrange(LLVMContextRef ctx, int64_t count, int64_t lowerBound) {+DISubrange* LLVM_Hs_Get_DISubrangeConstantCount(LLVMContextRef ctx, int64_t count, int64_t lowerBound) {     return DISubrange::get(*unwrap(ctx), count, lowerBound); } -int64_t LLVM_Hs_DISubrange_GetCount(DISubrange* range) {-    return range->getCount();+DISubrange* LLVM_Hs_Get_DISubrangeVariableCount(LLVMContextRef ctx, DIVariable* count, int64_t lowerBound) {+    return DISubrange::get(*unwrap(ctx), count, lowerBound); } +LLVMBool LLVM_Hs_DISubrange_HasConstantCount(DISubrange* range) {+    return range->getCount().is<ConstantInt*>();+}++int64_t LLVM_Hs_DISubrange_GetConstantCount(DISubrange* range) {+    return range->getCount().dyn_cast<ConstantInt*>()->getSExtValue();+}++DIVariable* LLVM_Hs_DISubrange_GetVariableCount(DISubrange* range) {+    return range->getCount().dyn_cast<DIVariable*>();+}++ int64_t LLVM_Hs_DISubrange_GetLowerBound(DISubrange* range) {     return range->getLowerBound(); }@@ -490,8 +518,8 @@     return cast_or_null<MDTuple>(p->getRawTemplateParams()); } -MDTuple* LLVM_Hs_DISubprogram_GetVariables(DISubprogram* p) {-    return cast_or_null<MDTuple>(p->getRawVariables());+MDTuple* LLVM_Hs_DISubprogram_GetRetainedNodes(DISubprogram* p) {+    return cast_or_null<MDTuple>(p->getRawRetainedNodes()); }  MDTuple* LLVM_Hs_DISubprogram_GetThrownTypes(DISubprogram* p) {
src/LLVM/Internal/FFI/OrcJIT.hs view
@@ -10,8 +10,12 @@ import LLVM.Internal.FFI.DataLayout import LLVM.Internal.FFI.LLVMCTypes +-- | Abstract type used as the identifier for a module.+newtype ModuleKey = ModuleKey Word64 deriving (Eq, Ord, Show)+ data JITSymbol-data LambdaResolver+data SymbolResolver+data ExecutionSession  newtype TargetAddress = TargetAddress Word64 @@ -24,12 +28,12 @@   Ptr JITSymbol -> IO ()  foreign import ccall safe "LLVM_Hs_createLambdaResolver" createLambdaResolver ::-  FunPtr SymbolResolverFn ->+  Ptr ExecutionSession ->   FunPtr SymbolResolverFn ->-  IO (Ptr LambdaResolver)+  IO (Ptr SymbolResolver) -foreign import ccall safe "LLVM_Hs_disposeLambdaResolver" disposeLambdaResolver ::-  Ptr LambdaResolver -> IO ()+foreign import ccall safe "LLVM_Hs_disposeSymbolResolver" disposeSymbolResolver ::+  Ptr SymbolResolver -> IO ()  foreign import ccall safe "LLVM_Hs_JITSymbol_getAddress" getAddress ::   Ptr JITSymbol -> Ptr (OwnerTransfered CString) -> IO TargetAddress@@ -48,3 +52,21 @@  foreign import ccall safe "LLVM_Hs_disposeMangledSymbol" disposeMangledSymbol ::   CString -> IO ()++foreign import ccall safe "LLVM_Hs_createExecutionSession" createExecutionSession ::+  IO (Ptr ExecutionSession)++foreign import ccall safe "LLVM_Hs_disposeExecutionSession" disposeExecutionSession ::+  Ptr ExecutionSession -> IO ()++foreign import ccall safe "LLVM_Hs_allocateVModule" allocateVModule ::+  Ptr ExecutionSession -> IO ModuleKey++foreign import ccall safe "LLVM_Hs_releaseVModule" releaseVModule ::+  Ptr ExecutionSession -> ModuleKey -> IO ()++foreign import ccall "wrapper" wrapGetSymbolResolver ::+  (ModuleKey -> IO (Ptr SymbolResolver)) -> IO (FunPtr (ModuleKey -> IO (Ptr SymbolResolver)))++foreign import ccall "wrapper" wrapSetSymbolResolver ::+  (ModuleKey -> Ptr SymbolResolver -> IO ()) -> IO (FunPtr (ModuleKey -> Ptr SymbolResolver -> IO ()))
src/LLVM/Internal/FFI/OrcJIT/CompileLayer.hs view
@@ -13,25 +13,22 @@  data CompileLayer --- | Abstract type representing a module in a 'LLVM.OrcJIT.CompileLayer'.-newtype ModuleHandle = ModuleHandle Word- foreign import ccall safe "LLVM_Hs_CompileLayer_dispose" disposeCompileLayer ::   Ptr CompileLayer -> IO ()  foreign import ccall safe "LLVM_Hs_CompileLayer_addModule" addModule ::   Ptr CompileLayer ->   Ptr DataLayout ->+  ModuleKey ->   Ptr Module ->-  Ptr LambdaResolver ->   Ptr (OwnerTransfered CString) ->-  IO ModuleHandle+  IO ()  foreign import ccall safe "LLVM_Hs_CompileLayer_removeModule" removeModule ::-  Ptr CompileLayer -> ModuleHandle -> IO ()+  Ptr CompileLayer -> ModuleKey -> IO ()  foreign import ccall safe "LLVM_Hs_CompileLayer_findSymbol" findSymbol ::   Ptr CompileLayer -> CString -> LLVMBool -> IO (Ptr JITSymbol)  foreign import ccall safe "LLVM_Hs_CompileLayer_findSymbolIn" findSymbolIn ::-  Ptr CompileLayer -> ModuleHandle -> CString -> LLVMBool -> IO (Ptr JITSymbol)+  Ptr CompileLayer -> ModuleKey -> CString -> LLVMBool -> IO (Ptr JITSymbol)
src/LLVM/Internal/FFI/OrcJIT/CompileOnDemandLayer.hs view
@@ -26,7 +26,7 @@   IO () -> IO (FunPtr (IO ()))  foreign import ccall safe "LLVM_Hs_createLocalCompileCallbackManager" createLocalCompileCallbackManager ::-  CString -> TargetAddress -> IO (Ptr JITCompileCallbackManager)+  Ptr ExecutionSession -> CString -> TargetAddress -> IO (Ptr JITCompileCallbackManager)  foreign import ccall safe "LLVM_Hs_disposeCallbackManager" disposeCallbackManager ::   Ptr JITCompileCallbackManager -> IO ()@@ -41,7 +41,10 @@   Ptr (Set (Ptr Function)) -> Ptr Function -> IO ()  foreign import ccall safe "LLVM_Hs_createCompileOnDemandLayer" createCompileOnDemandLayer ::+  Ptr ExecutionSession ->   Ptr CompileLayer ->+  FunPtr (ModuleKey -> IO (Ptr SymbolResolver)) ->+  FunPtr (ModuleKey -> Ptr SymbolResolver -> IO ()) ->   FunPtr PartitioningFn ->   Ptr JITCompileCallbackManager ->   Ptr IndirectStubsManagerBuilder ->
src/LLVM/Internal/FFI/OrcJIT/LinkingLayer.hs view
@@ -16,20 +16,18 @@ data ObjectLinkingLayer instance ChildOf LinkingLayer ObjectLinkingLayer -newtype ObjectHandle = ObjectHandle Word- foreign import ccall safe "LLVM_Hs_createObjectLinkingLayer" createObjectLinkingLayer ::-  IO (Ptr ObjectLinkingLayer)+  Ptr ExecutionSession -> FunPtr (ModuleKey -> IO (Ptr SymbolResolver)) -> IO (Ptr ObjectLinkingLayer)  foreign import ccall safe "LLVM_Hs_LinkingLayer_dispose" disposeLinkingLayer ::   Ptr LinkingLayer -> IO ()  foreign import ccall safe "LLVM_Hs_LinkingLayer_addObject" addObjectFile ::   Ptr LinkingLayer ->+  ModuleKey ->   Ptr ObjectFile ->-  Ptr LambdaResolver ->   Ptr (OwnerTransfered CString) ->-  IO ObjectHandle+  IO ()  foreign import ccall safe "LLVM_Hs_LinkingLayer_findSymbol" findSymbol ::   Ptr LinkingLayer ->@@ -39,7 +37,7 @@  foreign import ccall safe "LLVM_Hs_LinkingLayer_findSymbolIn" findSymbolIn ::   Ptr LinkingLayer ->-  ObjectHandle ->+  ModuleKey ->   CString ->   LLVMBool ->   IO (Ptr JITSymbol)
src/LLVM/Internal/FFI/OrcJITC.cpp view
@@ -22,16 +22,16 @@ using namespace llvm; using namespace orc; -#define SYMBOL_CASE(x) static_assert((unsigned)LLVMJITSymbolFlag ## x == (unsigned) llvm::JITSymbolFlags::FlagNames::x, "JITSymbolFlag values should agree");+static_assert(std::is_same<VModuleKey, uint64_t>::value,+              "VModuleKey should be uint64_t");++#define SYMBOL_CASE(x)                                                         \+    static_assert((unsigned)LLVMJITSymbolFlag##x ==                            \+                      (unsigned)llvm::JITSymbolFlags::FlagNames::x,            \+                  "JITSymbolFlag values should agree"); LLVM_HS_FOR_EACH_JIT_SYMBOL_FLAG(SYMBOL_CASE) -typedef unsigned LLVMModuleHandle;-typedef unsigned LLVMObjectHandle;-typedef llvm::orc::LambdaResolver<-    std::function<JITSymbol(const std::string &name)>,-    std::function<JITSymbol(const std::string &name)>>-    LLVMLambdaResolver;-typedef std::shared_ptr<LLVMLambdaResolver> *LLVMLambdaResolverRef;+typedef std::shared_ptr<SymbolResolver> *LLVMSymbolResolverRef;  // We want to allow users to choose themselves which layers they want to use. // However, the LLVM API requires that this is selected statically via template@@ -39,84 +39,48 @@ // creating an LinkingLayer and a CompileLayer class which use virtual dispatch // to select the concrete layer. -template <typename T> class HandleSet {-  public:-    unsigned insert(T t) {-        unsigned handle = handles.insert({nextFree, t}).first->first;-        ++nextFree;-        return handle;-    }-    T &lookup(unsigned i) { return handles.at(i); }--    void remove(unsigned i) { handles.erase(i); }--  private:-    std::unordered_map<unsigned, T> handles;-    unsigned nextFree = 0;-};- class LinkingLayer {   public:+    using ObjectPtr = std::unique_ptr<MemoryBuffer>;     virtual ~LinkingLayer(){};-    typedef unsigned ObjHandleT;-    virtual Expected<ObjHandleT>-    addObject(std::shared_ptr<object::OwningBinary<object::ObjectFile>> object,-              std::shared_ptr<JITSymbolResolver> resolver) = 0;-    virtual Error removeObject(ObjHandleT H) = 0;+    virtual Error addObject(VModuleKey k, ObjectPtr objBuffer) = 0;+    virtual Error removeObject(VModuleKey k) = 0;     virtual JITSymbol findSymbol(StringRef name, bool exportedSymbolsOnly) = 0;-    virtual JITSymbol findSymbolIn(ObjHandleT h, StringRef name,+    virtual JITSymbol findSymbolIn(VModuleKey k, StringRef name,                                    bool exportedSymbolsOnly) = 0;-    virtual void emitAndFinalize(ObjHandleT h) = 0;+    virtual Error emitAndFinalize(VModuleKey k) = 0; };  template <typename T> class LinkingLayerT : public LinkingLayer {   public:     LinkingLayerT(T data_) : data(std::move(data_)) {}-    Expected<ObjHandleT>-    addObject(std::shared_ptr<object::OwningBinary<object::ObjectFile>> object,-              std::shared_ptr<JITSymbolResolver> resolver) override {-        if (auto handleOrErr =-                data.addObject(std::move(object), std::move(resolver))) {-            return handles.insert(*handleOrErr);-        } else {-            return handleOrErr.takeError();-        }-    }-    Error removeObject(ObjHandleT h) override {-        if (auto err = data.removeObject(handles.lookup(h))) {-            return err;-        } else {-            handles.remove(h);-            return err;-        }+    Error addObject(VModuleKey k, ObjectPtr objBuffer) override {+        return data.addObject(k, std::move(objBuffer));     }+    Error removeObject(VModuleKey k) override { return data.removeObject(k); }     JITSymbol findSymbol(StringRef name, bool exportedSymbolsOnly) override {         return data.findSymbol(name, exportedSymbolsOnly);     }-    JITSymbol findSymbolIn(ObjHandleT h, StringRef name,+    JITSymbol findSymbolIn(VModuleKey k, StringRef name,                            bool exportedSymbolsOnly) override {-        return data.findSymbolIn(handles.lookup(h), name, exportedSymbolsOnly);+        return data.findSymbolIn(k, name, exportedSymbolsOnly);     }-    void emitAndFinalize(ObjHandleT h) override {-        data.emitAndFinalize(handles.lookup(h));+    Error emitAndFinalize(VModuleKey k) override {+        return data.emitAndFinalize(k);     }    private:     T data;-    HandleSet<typename T::ObjHandleT> handles; };  class CompileLayer {   public:-    typedef LLVMModuleHandle ModuleHandleT;     virtual ~CompileLayer(){};     virtual JITSymbol findSymbol(StringRef Name, bool ExportedSymbolsOnly) = 0;-    virtual JITSymbol findSymbolIn(ModuleHandleT H, StringRef Name,+    virtual JITSymbol findSymbolIn(VModuleKey K, StringRef Name,                                    bool ExportedSymbolsOnly) = 0;-    virtual Expected<ModuleHandleT>-    addModule(std::shared_ptr<Module> Modules,-              std::shared_ptr<JITSymbolResolver> Resolver) = 0;-    virtual Error removeModule(ModuleHandleT H) = 0;+    virtual Error addModule(VModuleKey K, std::unique_ptr<Module> Module) = 0;+    virtual Error removeModule(VModuleKey K) = 0; };  template <typename T> class CompileLayerT : public CompileLayer {@@ -126,29 +90,17 @@     JITSymbol findSymbol(StringRef Name, bool ExportedSymbolsOnly) override {         return data.findSymbol(Name, ExportedSymbolsOnly);     }-    JITSymbol findSymbolIn(ModuleHandleT H, StringRef Name,+    JITSymbol findSymbolIn(VModuleKey K, StringRef Name,                            bool ExportedSymbolsOnly) override {-        return data.findSymbolIn(handles.lookup(H), Name, ExportedSymbolsOnly);-    }-    Expected<ModuleHandleT>-    addModule(std::shared_ptr<Module> Module,-              std::shared_ptr<JITSymbolResolver> Resolver) override {-        if (auto handleOrErr =-                data.addModule(std::move(Module), std::move(Resolver))) {-            return handles.insert(*handleOrErr);-        } else {-            return handleOrErr.takeError();-        }+        return data.findSymbolIn(K, Name, ExportedSymbolsOnly);     }-    Error removeModule(ModuleHandleT H) override {-        auto handle = handles.lookup(H);-        handles.remove(H);-        return data.removeModule(handle);+    Error addModule(VModuleKey K, std::unique_ptr<Module> Module) override {+        return data.addModule(K, std::move(Module));     }+    Error removeModule(VModuleKey K) override { return data.removeModule(K); }    private:     T data;-    HandleSet<typename T::ModuleHandleT> handles; };  typedef llvm::orc::CompileOnDemandLayer<CompileLayer> LLVMCompileOnDemandLayer;@@ -156,7 +108,7 @@  typedef llvm::orc::IRTransformLayer<     CompileLayer,-    std::function<std::shared_ptr<Module>(std::shared_ptr<Module>)>>+    std::function<std::unique_ptr<Module>(std::unique_ptr<Module>)>>     LLVMIRTransformLayer;  typedef llvm::orc::JITCompileCallbackManager *LLVMJITCompileCallbackManagerRef;@@ -205,6 +157,20 @@  extern "C" { +ExecutionSession *LLVM_Hs_createExecutionSession() {+    return new ExecutionSession();+}++void LLVM_Hs_disposeExecutionSession(ExecutionSession *es) { delete es; }++VModuleKey LLVM_Hs_allocateVModule(ExecutionSession *es) {+    return es->allocateVModule();+}++void LLVM_Hs_releaseVModule(ExecutionSession *es, VModuleKey k) {+    es->releaseVModule(k);+}+ /* Constructor functions for the different compile layers */  CompileLayer *LLVM_Hs_createIRCompileLayer(LinkingLayer *linkingLayer,@@ -216,13 +182,24 @@ }  CompileLayer *LLVM_Hs_createCompileOnDemandLayer(-    CompileLayer *compileLayer,+    ExecutionSession *es, CompileLayer *compileLayer,+    LLVMSymbolResolverRef (*getSymbolResolver)(VModuleKey k),+    void (*setSymbolResolver)(VModuleKey k, LLVMSymbolResolverRef r),     void (*partitioningFtor)(llvm::Function *, std::set<llvm::Function *> *set),     LLVMJITCompileCallbackManagerRef callbackManager,     LLVMIndirectStubsManagerBuilderRef stubsManager,     LLVMBool cloneStubsIntoPartitions) {+    std::function<std::shared_ptr<SymbolResolver>(VModuleKey)>+        getSymbolResolverFn =+            [getSymbolResolver](VModuleKey k) { return *getSymbolResolver(k); };+    std::function<void(VModuleKey, std::shared_ptr<SymbolResolver>)>+        setSymbolResolverFn =+            [setSymbolResolver](VModuleKey k,+                                std::shared_ptr<SymbolResolver> r) {+                setSymbolResolver(k, new std::shared_ptr<SymbolResolver>(r));+            };     return new CompileLayerT<LLVMCompileOnDemandLayer>(-        *compileLayer,+        *es, *compileLayer, getSymbolResolverFn, setSymbolResolverFn,         [partitioningFtor](llvm::Function &f) -> std::set<llvm::Function *> {             std::set<llvm::Function *> result;             partitioningFtor(&f, &result);@@ -234,9 +211,9 @@  CompileLayer *LLVM_Hs_createIRTransformLayer(CompileLayer *compileLayer,                                              Module *(*transform)(Module *)) {-    std::function<std::shared_ptr<Module>(std::shared_ptr<Module>)> transform_ =-        [transform](std::shared_ptr<Module> module) {-            return std::shared_ptr<Module>(transform(module.get()));+    std::function<std::unique_ptr<Module>(std::unique_ptr<Module>)> transform_ =+        [transform](std::unique_ptr<Module> module) {+            return std::unique_ptr<Module>(transform(module.release()));         };     return new CompileLayerT<LLVMIRTransformLayer>(*compileLayer, transform_); }@@ -255,48 +232,46 @@ }  LLVMJITSymbolRef-LLVM_Hs_CompileLayer_findSymbolIn(CompileLayer *compileLayer,-                                  LLVMModuleHandle handle, const char *name,+LLVM_Hs_CompileLayer_findSymbolIn(CompileLayer *compileLayer, VModuleKey k,+                                  const char *name,                                   LLVMBool exportedSymbolsOnly) {-    JITSymbol symbol =-        compileLayer->findSymbolIn(handle, name, exportedSymbolsOnly);+    JITSymbol symbol = compileLayer->findSymbolIn(k, name, exportedSymbolsOnly);     return new JITSymbol(std::move(symbol)); } -LLVMModuleHandle LLVM_Hs_CompileLayer_addModule(CompileLayer *compileLayer,-                                                LLVMTargetDataRef dataLayout,-                                                LLVMModuleRef module,-                                                LLVMLambdaResolverRef resolver,-                                                char **errorMessage) {-    std::shared_ptr<Module> mod{unwrap(module), [](Module *) {}};+void LLVM_Hs_CompileLayer_addModule(CompileLayer *compileLayer,+                                    LLVMTargetDataRef dataLayout, VModuleKey k,+                                    LLVMModuleRef module, char **errorMessage) {+    std::unique_ptr<Module> mod{unwrap(module)};     if (mod->getDataLayout().isDefault()) {         mod->setDataLayout(*unwrap(dataLayout));     }-    if (auto handleOrErr = compileLayer->addModule(std::move(mod), *resolver)) {-        *errorMessage = nullptr;-        return *handleOrErr;-    } else {-        std::string errString = toString(handleOrErr.takeError());+    if (auto err = compileLayer->addModule(k, std::move(mod))) {+        std::string errString = toString(std::move(err));         *errorMessage = strdup(errString.c_str());-        return 0;     }+    *errorMessage = nullptr; }  void LLVM_Hs_CompileLayer_removeModule(CompileLayer *compileLayer,-                                       LLVMModuleHandle moduleSetHandle) {-    if (compileLayer->removeModule(moduleSetHandle)) {+                                       VModuleKey k) {+    if (compileLayer->removeModule(k)) {         // TODO handle failure     } }  /* Constructor functions for the different object layers */ -LinkingLayer *LLVM_Hs_createObjectLinkingLayer() {-    return new LinkingLayerT<RTDyldObjectLinkingLayer>(RTDyldObjectLinkingLayer(-        []() { return std::make_shared<SectionMemoryManager>(); }));+LinkingLayer *LLVM_Hs_createObjectLinkingLayer(+    ExecutionSession *es, LLVMSymbolResolverRef (*symbolResolver)(VModuleKey)) {+    return new LinkingLayerT<RTDyldObjectLinkingLayer>(+        RTDyldObjectLinkingLayer(*es, [symbolResolver](VModuleKey k) {+            return RTDyldObjectLinkingLayer::Resources{+                std::make_shared<SectionMemoryManager>(), *symbolResolver(k)};+        })); } -/* Fuctions that work on all object layers */+// /* Fuctions that work on all object layers */  void LLVM_Hs_LinkingLayer_dispose(LinkingLayer *linkingLayer) {     delete linkingLayer;@@ -305,57 +280,50 @@ void LLVM_Hs_disposeJITSymbol(LLVMJITSymbolRef symbol) { delete symbol; }  LLVMJITSymbolRef LLVM_Hs_LinkingLayer_findSymbol(LinkingLayer *linkingLayer,-                                     const char *name,-                                     LLVMBool exportedSymbolsOnly) {-  JITSymbol symbol = linkingLayer->findSymbol(name, exportedSymbolsOnly);-  return new JITSymbol(std::move(symbol));+                                                 const char *name,+                                                 LLVMBool exportedSymbolsOnly) {+    JITSymbol symbol = linkingLayer->findSymbol(name, exportedSymbolsOnly);+    return new JITSymbol(std::move(symbol)); } -LLVMJITSymbolRef LLVM_Hs_LinkingLayer_findSymbolIn(LinkingLayer *linkingLayer,-                                                   LLVMObjectHandle handle,-                                                   const char *name,-                                                   LLVMBool exportedSymbolsOnly) {-  JITSymbol symbol = linkingLayer->findSymbolIn(handle, name, exportedSymbolsOnly);-  return new JITSymbol(std::move(symbol));+LLVMJITSymbolRef+LLVM_Hs_LinkingLayer_findSymbolIn(LinkingLayer *linkingLayer, VModuleKey k,+                                  const char *name,+                                  LLVMBool exportedSymbolsOnly) {+    JITSymbol symbol = linkingLayer->findSymbolIn(k, name, exportedSymbolsOnly);+    return new JITSymbol(std::move(symbol)); } -LLVMLambdaResolverRef LLVM_Hs_createLambdaResolver(-    void (*dylibResolver)(const char *, LLVMJITSymbolRef),-    void (*externalResolver)(const char *, LLVMJITSymbolRef)) {-    std::function<JITSymbol(const std::string &name)> dylibResolverFun =-        [dylibResolver](const std::string &name) -> JITSymbol {-        JITSymbol symbol(nullptr);-        dylibResolver(name.c_str(), &symbol);-        return symbol;-    };-    std::function<JITSymbol(const std::string &name)> externalResolverFun =-        [externalResolver](const std::string &name) -> JITSymbol {+LLVMSymbolResolverRef LLVM_Hs_createLambdaResolver(+    ExecutionSession *es,+    void (*rawResolverFn)(const char *, LLVMJITSymbolRef)) {+    std::function<JITSymbol(const std::string &name)> resolverFn =+        [rawResolverFn](const std::string &name) -> JITSymbol {         JITSymbol symbol(nullptr);-        externalResolver(name.c_str(), &symbol);+        rawResolverFn(name.c_str(), &symbol);         return symbol;     };-    return new std::shared_ptr<LLVMLambdaResolver>(-        createLambdaResolver(dylibResolverFun, externalResolverFun));+    return new std::shared_ptr<SymbolResolver>(+        createLegacyLookupResolver(*es, resolverFn, [](Error err) {+            cantFail(std::move(err), "lookupFlags failed");+        })); } -void LLVM_Hs_disposeLambdaResolver(LLVMLambdaResolverRef resolver) {+void LLVM_Hs_disposeSymbolResolver(LLVMSymbolResolverRef resolver) {     delete resolver; } -LLVMObjectHandle LLVM_Hs_LinkingLayer_addObject(LinkingLayer *linkLayer,-                                                LLVMObjectFileRef objRef,-                                                LLVMLambdaResolverRef resolver,-                                                char **errorMessage) {+void LLVM_Hs_LinkingLayer_addObject(LinkingLayer *linkLayer, VModuleKey k,+                                    LLVMObjectFileRef objRef,+                                    char **errorMessage) { -    std::shared_ptr<object::OwningBinary<object::ObjectFile>> obj{-        unwrap(objRef), [](object::OwningBinary<object::ObjectFile> *) {}};-    if (auto handleOrErr = linkLayer->addObject(std::move(obj), *resolver)) {-        *errorMessage = nullptr;-        return *handleOrErr;-    } else {-        std::string errString = toString(handleOrErr.takeError());-        *errorMessage = strdup(errString.c_str());-        return 0;+    std::unique_ptr<MemoryBuffer> objBuffer =+        unwrap(objRef)->takeBinary().second;+    *errorMessage = nullptr;+    if (auto err = linkLayer->addObject(k, std::move(objBuffer))) {+        std::string error = toString(std::move(err));+        *errorMessage = strdup(error.c_str());+        return;     } } @@ -375,7 +343,7 @@     return wrap(symbol->getFlags()); } -const char* LLVM_Hs_JITSymbol_getErrorMsg(LLVMJITSymbolRef symbol) {+const char *LLVM_Hs_JITSymbol_getErrorMsg(LLVMJITSymbolRef symbol) {     if (!symbol) {         Error err = symbol->takeError();         return strdup(toString(std::move(err)).c_str());@@ -399,13 +367,12 @@     delete[] mangledSymbol; } -LLVMJITCompileCallbackManagerRef-LLVM_Hs_createLocalCompileCallbackManager(const char *triple,-                                          JITTargetAddress errorHandler) {+LLVMJITCompileCallbackManagerRef LLVM_Hs_createLocalCompileCallbackManager(+    ExecutionSession *es, const char *triple, JITTargetAddress errorHandler) {     // We copy the string so that it can be freed on the Haskell side.     std::string tripleStr(triple);     return llvm::orc::createLocalCompileCallbackManager(-               Triple(std::move(tripleStr)), errorHandler)+               Triple(std::move(tripleStr)), *es, errorHandler)         .release(); } 
src/LLVM/Internal/FFI/PassManagerC.cpp view
@@ -10,6 +10,7 @@ #include "llvm/Transforms/Vectorize.h" #include "llvm/Transforms/Instrumentation.h" #include "llvm/Transforms/Instrumentation/BoundsChecking.h"+#include "llvm/Transforms/Utils.h" #include "llvm/CodeGen/Passes.h" #include "llvm-c/Target.h" #include "llvm-c/Transforms/PassManagerBuilder.h"
src/LLVM/Internal/FFI/RawOStreamC.cpp view
@@ -4,9 +4,6 @@ #include "llvm/Support/raw_ostream.h"  using namespace llvm;-using sys::fs::F_None;-using sys::fs::F_Excl;-using sys::fs::F_Text;  extern "C" { @@ -16,7 +13,9 @@                                 void (&callback)(raw_pwrite_stream &ostream)) {     std::error_code e;     raw_fd_ostream os(filename, e,-                      (excl ? F_Excl : F_None) | (text ? F_Text : F_None));+                      excl ? sys::fs::CD_CreateNew : sys::fs::CD_OpenAlways,+                      sys::fs::FA_Write,+                      text ? sys::fs::OF_Text : sys::fs::OF_None);     if (e) {         *error = strdup(e.message().c_str());         return false;
src/LLVM/Internal/FFI/TargetC.cpp view
@@ -12,11 +12,11 @@ #include "llvm/IR/DataLayout.h" #include "llvm/IR/LegacyPassManager.h" #include "llvm/IR/Module.h"-#include "llvm/Support/CodeGenCWrappers.h" #include "llvm/Support/FormattedStream.h" #include "llvm/Support/Host.h" #include "llvm/Support/TargetRegistry.h" #include "llvm/Support/TargetSelect.h"+#include "llvm/Target/CodeGenCWrappers.h" #include "llvm/Target/TargetMachine.h"  using namespace llvm;@@ -568,7 +568,7 @@         ft = TargetMachine::CGFT_ObjectFile;         break;     }-    if (TM->addPassesToEmitFile(pass, *OS, ft)) {+    if (TM->addPassesToEmitFile(pass, *OS, nullptr, ft)) {         error = "TargetMachine can't emit a file of this type";         *ErrorMessage = strdup(error.c_str());         return true;
src/LLVM/Internal/Global.hs view
@@ -142,7 +142,7 @@ setThreadLocalMode g m = liftIO . FFI.setThreadLocalMode (FFI.upCast g) =<< encodeM m  genCodingInstance [t| Maybe A.G.UnnamedAddr |] ''FFI.UnnamedAddr [-  (FFI.unnamedAddrNone, Nothing),+  (FFI.unnamedAddrNo, Nothing),   (FFI.unnamedAddrLocal, Just A.G.LocalAddr),   (FFI.unnamedAddrGlobal, Just A.G.GlobalAddr)  ]
src/LLVM/Internal/Operand.hs view
@@ -182,25 +182,37 @@ instance EncodeM EncodeAST A.DISubrange (Ptr FFI.DISubrange) where   encodeM (A.Subrange {..}) = do     Context c <- gets encodeStateContext-    liftIO (FFI.getDISubrange c count lowerBound)+    case count of+      A.DICountConstant i -> liftIO (FFI.getDISubrangeConstantCount c i lowerBound)+      A.DICountVariable v -> do+        v' <- encodeM v+        liftIO (FFI.getDISubrangeVariableCount c v' lowerBound)  instance DecodeM DecodeAST A.DISubrange (Ptr FFI.DISubrange) where   decodeM r = do-    count <- liftIO (FFI.getDISubrangeCount r)     lowerBound <- liftIO (FFI.getDISubrangeLowerBound r)-    pure (A.Subrange count lowerBound)+    hasConstantCount <- decodeM =<< liftIO (FFI.getDISubrangeHasConstantCount r)+    if hasConstantCount+      then do+        count <- liftIO (FFI.getDISubrangeCountConstant r)+        pure (A.Subrange (A.DICountConstant count) lowerBound)+      else do+        count <- decodeM =<< liftIO (FFI.getDISubrangeCountVariable r)+        pure (A.Subrange (A.DICountVariable count) lowerBound)  instance EncodeM EncodeAST A.DIEnumerator (Ptr FFI.DIEnumerator) where   encodeM (A.Enumerator {..}) = do     name <- encodeM name+    isUnsigned <- encodeM isUnsigned     Context c <- gets encodeStateContext-    liftIO (FFI.getDIEnumerator c value name)+    liftIO (FFI.getDIEnumerator c value isUnsigned name)  instance DecodeM DecodeAST A.DIEnumerator (Ptr FFI.DIEnumerator) where   decodeM e = do     value <- liftIO (FFI.getDIEnumeratorValue e)+    isUnsigned <- decodeM =<< liftIO (FFI.getDIEnumeratorIsUnsigned e)     name <- decodeM =<< liftIO (FFI.getDIEnumeratorName e)-    pure (A.Enumerator value name)+    pure (A.Enumerator value isUnsigned name)  instance EncodeM EncodeAST A.DINode (Ptr FFI.DINode) where   encodeM (A.DISubrange r) = do@@ -375,18 +387,24 @@   decodeM diF = do     fname <- decodeM =<< liftIO (FFI.getFileFilename diF)     dir   <- decodeM =<< liftIO (FFI.getFileDirectory diF)-    cksum <- decodeM =<< liftIO (FFI.getFileChecksum diF)-    csk   <- decodeM =<< liftIO (FFI.getFileChecksumKind diF)-    return $ A.File fname dir cksum csk+    mayChecksum <- decodeM =<< liftIO (FFI.getFileChecksumValue diF)+    case mayChecksum of+      Nothing -> pure (A.File fname dir Nothing)+      Just checksum -> do+        csk <- decodeM =<< liftIO (FFI.getFileChecksumKind diF)+        pure (A.File fname dir (Just (A.ChecksumInfo csk checksum)))  instance EncodeM EncodeAST A.DIFile (Ptr FFI.DIFile) where-  encodeM (A.File {A.filename, A.directory, A.checksum, A.checksumKind}) = do+  encodeM (A.File {..}) = do     filename <- encodeM filename     directory <- encodeM directory-    checksum <- encodeM checksum-    checksumKind <- encodeM checksumKind     Context c <- gets encodeStateContext-    liftIO (FFI.getDIFile c filename directory checksumKind checksum)+    case checksum of+      Nothing -> liftIO (FFI.getDIFile c filename directory (FFI.ChecksumKind 0) nullPtr)+      Just (A.ChecksumInfo {..}) -> do+        checksumValue <- encodeM checksumValue+        checksumKind <- encodeM checksumKind+        liftIO (FFI.getDIFile c filename directory checksumKind checksumValue)  instance EncodeM EncodeAST (Maybe A.Encoding) FFI.Encoding where   encodeM Nothing = pure (FFI.Encoding 0)@@ -407,8 +425,7 @@   ]  genCodingInstance [t|A.ChecksumKind|] ''FFI.ChecksumKind-  [ (FFI.ChecksumKind 0, A.None)-  , (FFI.ChecksumKind 1, A.MD5)+  [ (FFI.ChecksumKind 1, A.MD5)   , (FFI.ChecksumKind 2, A.SHA1)   ] @@ -769,7 +786,7 @@     containingType <- decodeM =<< liftIO (FFI.getDISubprogramContainingType p)     unit <- decodeM =<< liftIO (FFI.getDISubprogramUnit p)     templateParams <- decodeM =<< liftIO (FFI.getDISubprogramTemplateParams p)-    variables <- decodeM =<< liftIO (FFI.getDISubprogramVariables p)+    retainedNodes <- decodeM =<< liftIO (FFI.getDISubprogramRetainedNodes p)     thrownTypes <- decodeM =<< liftIO (FFI.getDISubprogramThrownTypes p)     decl <- decodeM =<< liftIO (FFI.getDISubprogramDeclaration p)     pure A.Subprogram@@ -789,7 +806,7 @@       , A.unit = unit       , A.templateParams = templateParams       , A.declaration = decl-      , A.variables = variables+      , A.retainedNodes = retainedNodes       , A.thrownTypes = thrownTypes       , A.localToUnit = localToUnit       , A.thisAdjustment = thisAdjustment@@ -814,7 +831,7 @@     unit <- encodeM unit     templateParams <- encodeM templateParams     declaration <- encodeM declaration-    variables <- encodeM variables+    retainedNodes <- encodeM retainedNodes     thrownTypes <- encodeM thrownTypes     Context c <- gets encodeStateContext     FFI.upCast <$> liftIO@@ -825,7 +842,7 @@         containingType virtuality virtualityIndex         thisAdjustment flags optimized         unit templateParams declaration-        variables thrownTypes)+        retainedNodes thrownTypes)  instance DecodeM DecodeAST A.DILocalScope (Ptr FFI.DILocalScope) where   decodeM ls = do
src/LLVM/Internal/OrcJIT.hs view
@@ -30,6 +30,8 @@ instance MonadIO m => DecodeM m MangledSymbol CString where   decodeM str = liftIO $ MangledSymbol <$> packCString str +newtype ExecutionSession = ExecutionSession (Ptr FFI.ExecutionSession)+ -- | Contrary to the C++ interface, we do not store the HasError flag -- here. Instead decoding a JITSymbol produces a sumtype based on -- whether that flag is set or not.@@ -60,20 +62,22 @@ data JITSymbolError = JITSymbolError ShortByteString   deriving (Show, Eq) -type SymbolResolverFn = MangledSymbol -> IO (Either JITSymbolError JITSymbol)- -- | Specifies how external symbols in a module added to a--- 'CompielLayer' should be resolved.-data SymbolResolver =-  SymbolResolver {-    -- | This is used to find symbols in the same logical dynamic-    -- library as the module referencing them.-    dylibResolver :: !SymbolResolverFn,-    -- | When 'dylibResolver' fails to resolve a symbol,-    -- 'externalResolver' is used as a fallback to find external symbols.-    externalResolver :: !SymbolResolverFn-  }+-- 'CompileLayer' should be resolved.+newtype SymbolResolver =+  SymbolResolver (MangledSymbol -> IO (Either JITSymbolError JITSymbol)) +-- | Create a `FFI.SymbolResolver` that can be used with the JIT.+withSymbolResolver :: ExecutionSession -> SymbolResolver -> (Ptr FFI.SymbolResolver -> IO a) -> IO a+withSymbolResolver (ExecutionSession es) (SymbolResolver resolverFn) f =+  bracket (FFI.wrapSymbolResolverFn resolverFn') freeHaskellFunPtr $ \resolverPtr ->+    bracket (FFI.createLambdaResolver es resolverPtr) FFI.disposeSymbolResolver $ \resolver ->+      f resolver+  where+    resolverFn' symbol result = do+      setSymbol <- encodeM =<< resolverFn =<< decodeM symbol+      setSymbol result+ instance Monad m => EncodeM m JITSymbolFlags FFI.JITSymbolFlags where   encodeM f = return $ foldr1 (.|.) [       if a f@@ -117,13 +121,12 @@         pure (Right (JITSymbol (fromIntegral addr) flags))  instance MonadIO m =>-  EncodeM m SymbolResolver (IORef [IO ()] -> IO (Ptr FFI.LambdaResolver)) where-  encodeM (SymbolResolver dylib external) = return $ \cleanups -> do-    dylib' <- allocFunPtr cleanups (encodeM dylib)-    external' <- allocFunPtr cleanups (encodeM external)-    allocWithCleanup cleanups (FFI.createLambdaResolver dylib' external') FFI.disposeLambdaResolver+  EncodeM m SymbolResolver (IORef [IO ()] -> Ptr FFI.ExecutionSession -> IO (Ptr FFI.SymbolResolver)) where+  encodeM (SymbolResolver resolverFn) = return $ \cleanups es -> do+    resolverFn' <- allocFunPtr cleanups (encodeM resolverFn)+    allocWithCleanup cleanups (FFI.createLambdaResolver es resolverFn') FFI.disposeSymbolResolver -instance MonadIO m => EncodeM m SymbolResolverFn (FunPtr FFI.SymbolResolverFn) where+instance MonadIO m => EncodeM m (MangledSymbol -> IO (Either JITSymbolError JITSymbol)) (FunPtr FFI.SymbolResolverFn) where   encodeM callback =     liftIO $ FFI.wrapSymbolResolverFn       (\symbol result -> do@@ -148,3 +151,31 @@         modifyIORef' cleanups (FFI.disposeDataLayout dl :)         pure dl   in anyContToM $ bracketOnError createDataLayout FFI.disposeDataLayout++-- | Create a new `ExecutionSession`.+createExecutionSession :: IO ExecutionSession+createExecutionSession = ExecutionSession <$> FFI.createExecutionSession++-- | Dispose of an `ExecutionSession`. This should be called when the+-- `ExecutionSession` is not needed anymore.+disposeExecutionSession :: ExecutionSession -> IO ()+disposeExecutionSession (ExecutionSession es) = FFI.disposeExecutionSession es++-- | `bracket`-style wrapper around `createExecutionSession` and+-- `disposeExecutionSession`.+withExecutionSession :: (ExecutionSession -> IO a) -> IO a+withExecutionSession = bracket createExecutionSession disposeExecutionSession++-- | Allocate a module key for a new module to add to the JIT.+allocateModuleKey :: ExecutionSession -> IO FFI.ModuleKey+allocateModuleKey (ExecutionSession es) = FFI.allocateVModule es++-- | Return a module key to the `ExecutionSession` so that it can be+-- re-used.+releaseModuleKey :: ExecutionSession -> FFI.ModuleKey -> IO ()+releaseModuleKey (ExecutionSession es) k = FFI.releaseVModule es k++-- | `bracket`-style wrapper around `allocateModuleKey` and+-- `releaseModuleKey`.+withModuleKey :: ExecutionSession -> (FFI.ModuleKey -> IO a) -> IO a+withModuleKey es = bracket (allocateModuleKey es) (releaseModuleKey es)
src/LLVM/Internal/OrcJIT/CompileLayer.hs view
@@ -1,6 +1,6 @@ module LLVM.Internal.OrcJIT.CompileLayer   ( module LLVM.Internal.OrcJIT.CompileLayer-  , FFI.ModuleHandle+  , FFI.ModuleKey   ) where  import LLVM.Prelude@@ -54,7 +54,7 @@ -- | @'findSymbolIn' layer handle symbol exportedSymbolsOnly@ searches for -- @symbol@ in the context of the module represented by @handle@. If -- @exportedSymbolsOnly@ is 'True' only exported symbols are searched.-findSymbolIn :: CompileLayer l => l -> FFI.ModuleHandle -> MangledSymbol -> Bool -> IO (Either JITSymbolError JITSymbol)+findSymbolIn :: CompileLayer l => l -> FFI.ModuleKey -> MangledSymbol -> Bool -> IO (Either JITSymbolError JITSymbol) findSymbolIn compileLayer handle symbol exportedSymbolsOnly = flip runAnyContT return $ do   symbol' <- encodeM symbol   exportedSymbolsOnly' <- encodeM exportedSymbolsOnly@@ -67,10 +67,8 @@ -- -- /Note:/ This function consumes the module passed to it and it must -- not be used after calling this method.-addModule :: CompileLayer l => l -> Module -> SymbolResolver -> IO FFI.ModuleHandle-addModule compileLayer mod resolver = flip runAnyContT return $ do-  resolverAct <- encodeM resolver-  resolver' <- liftIO $ resolverAct (getCleanups compileLayer)+addModule :: CompileLayer l => l -> FFI.ModuleKey -> Module -> IO ()+addModule compileLayer k mod = flip runAnyContT return $ do   mod' <- liftIO $ readModule mod   liftIO $ deleteModule mod   errMsg <- alloca@@ -78,12 +76,12 @@     FFI.addModule       (getCompileLayer compileLayer)       (getDataLayout compileLayer)+      k       mod'-      resolver'       errMsg  -- | Remove a previously added module.-removeModule :: CompileLayer l => l -> FFI.ModuleHandle -> IO ()+removeModule :: CompileLayer l => l -> FFI.ModuleKey -> IO () removeModule compileLayer handle =   FFI.removeModule (getCompileLayer compileLayer) handle @@ -91,11 +89,11 @@ -- -- /Note:/ This function consumes the module passed to it and it must -- not be used after calling this method.-withModule :: CompileLayer l => l -> Module -> SymbolResolver -> (FFI.ModuleHandle -> IO a) -> IO a-withModule compileLayer mod resolver =-  bracket-    (addModule compileLayer mod resolver)-    (removeModule compileLayer)+withModule :: CompileLayer l => l -> FFI.ModuleKey -> Module -> IO a -> IO a+withModule compileLayer k mod =+  bracket_+    (addModule compileLayer k mod)+    (removeModule compileLayer k)  -- | Dispose of a 'CompileLayer'. This should called when the -- 'CompileLayer' is not needed anymore.
src/LLVM/Internal/OrcJIT/CompileOnDemandLayer.hs view
@@ -101,13 +101,14 @@ -- When the callback manager is no longer needed, it should be freed -- using 'disposeJITCompileCallbackManager'. newJITCompileCallbackManager ::+  ExecutionSession ->   ShortByteString {- ^ target triple -} ->   Maybe (IO ()) {- ^ called on compilation errors -} ->   IO JITCompileCallbackManager-newJITCompileCallbackManager triple errorHandler = flip runAnyContT return $ do+newJITCompileCallbackManager (ExecutionSession es) triple errorHandler = flip runAnyContT return $ do   triple' <- encodeM triple   (errorHandler', cleanup) <- encodeM errorHandler-  callbackMgr <- liftIO (FFI.createLocalCompileCallbackManager triple' errorHandler')+  callbackMgr <- liftIO (FFI.createLocalCompileCallbackManager es triple' errorHandler')   return (CallbackMgr callbackMgr cleanup)  -- | Dispose of a 'JITCompileCallbackManager'.@@ -117,13 +118,14 @@  -- | Execute a computation using a new 'JITCompileCallbackManager'. withJITCompileCallbackManager ::+  ExecutionSession ->   ShortByteString {- ^ target triple -} ->   Maybe (IO ()) {- ^ called on compilation errors -} ->   (JITCompileCallbackManager -> IO a) ->   IO a-withJITCompileCallbackManager triple errorHandler =+withJITCompileCallbackManager es triple errorHandler =   bracket-    (newJITCompileCallbackManager triple errorHandler)+    (newJITCompileCallbackManager es triple errorHandler)     disposeJITCompileCallbackManager  -- | Create a new 'CompileOnDemandLayer'. The partitioning function@@ -132,24 +134,32 @@ -- -- When the layer is no longer needed, it should be disposed using 'disposeCompileLayer'. newCompileOnDemandLayer :: CompileLayer l =>+  ExecutionSession ->   l ->   TargetMachine ->+  (ModuleKey -> IO (Ptr FFI.SymbolResolver)) ->+  (ModuleKey -> Ptr FFI.SymbolResolver -> IO ()) ->   (Ptr FFI.Function -> IO [Ptr FFI.Function]) {- ^ partitioning function -} ->   JITCompileCallbackManager ->   IndirectStubsManagerBuilder ->   Bool {- ^ clone stubs into partitions -} ->   IO (CompileOnDemandLayer l)-newCompileOnDemandLayer baseLayer tm partition (CallbackMgr callbackMgr _) (StubsMgr stubsMgr) cloneStubs =+newCompileOnDemandLayer (ExecutionSession es) baseLayer tm getSymbolResolver setSymbolResolver partition (CallbackMgr callbackMgr _) (StubsMgr stubsMgr) cloneStubs =   flip runAnyContT return $ do     cleanups <- liftIO (newIORef [])     dl <- createRegisteredDataLayout tm cleanups+    getSymbolResolver' <- liftIO (allocFunPtr cleanups (FFI.wrapGetSymbolResolver getSymbolResolver))+    setSymbolResolver' <- liftIO (allocFunPtr cleanups (FFI.wrapSetSymbolResolver setSymbolResolver))     partitionAct <- encodeM partition     partition' <- liftIO $ partitionAct cleanups     cloneStubs' <- encodeM cloneStubs     cl <-       liftIO         (FFI.createCompileOnDemandLayer+           es            (getCompileLayer baseLayer)+           getSymbolResolver'+           setSymbolResolver'            partition'            callbackMgr            stubsMgr@@ -159,15 +169,18 @@ -- | 'bracket'-style wrapper around 'newCompileOnDemandLayer' and 'disposeCompileLayer'. withCompileOnDemandLayer ::   CompileLayer l =>+  ExecutionSession ->   l ->   TargetMachine ->+  (ModuleKey -> IO (Ptr FFI.SymbolResolver)) ->+  (ModuleKey -> Ptr FFI.SymbolResolver -> IO ()) ->   (Ptr FFI.Function -> IO [Ptr FFI.Function]) {- ^ partitioning function -} ->   JITCompileCallbackManager ->   IndirectStubsManagerBuilder ->   Bool {- ^ clone stubs into partitions -} ->   (CompileOnDemandLayer l -> IO a) ->   IO a-withCompileOnDemandLayer l tm partition callbackMgr stubsMgr cloneStubs =+withCompileOnDemandLayer es l tm getSymbolResolver setSymbolResolver partition callbackMgr stubsMgr cloneStubs =   bracket-    (newCompileOnDemandLayer l tm partition callbackMgr stubsMgr cloneStubs)+    (newCompileOnDemandLayer es l tm getSymbolResolver setSymbolResolver partition callbackMgr stubsMgr cloneStubs)     disposeCompileLayer
src/LLVM/Internal/OrcJIT/LinkingLayer.hs view
@@ -28,19 +28,15 @@   FFI.disposeLinkingLayer (getLinkingLayer l)   sequence_ =<< readIORef (getCleanups l) --- | Add an object file to the 'LinkingLayer'. The 'SymbolResolver' is used--- to resolve external symbols in the module.-addObjectFile :: LinkingLayer l => l -> ObjectFile -> SymbolResolver-              -> IO FFI.ObjectHandle-addObjectFile linkingLayer (ObjectFile obj) resolver = flip runAnyContT return $ do-  resolverAct <- encodeM resolver-  resolver'   <- liftIO $ resolverAct (getCleanups linkingLayer)+-- | Add an object file to the 'LinkingLayer'.+addObjectFile :: LinkingLayer l => l -> FFI.ModuleKey -> ObjectFile -> IO ()+addObjectFile linkingLayer k (ObjectFile obj) = flip runAnyContT return $ do   errMsg <- alloca   liftIO $     FFI.addObjectFile       (getLinkingLayer linkingLayer)+      k       obj-      resolver'       errMsg  -- | Bare bones implementation of a 'LinkingLayer'.@@ -55,15 +51,16 @@  -- | Create a new 'ObjectLinkingLayer'. This should be disposed using -- 'disposeLinkingLayer' when it is no longer needed.-newObjectLinkingLayer :: IO ObjectLinkingLayer-newObjectLinkingLayer = do-  linkingLayer <- FFI.createObjectLinkingLayer+newObjectLinkingLayer :: ExecutionSession -> (FFI.ModuleKey -> IO (Ptr FFI.SymbolResolver)) -> IO ObjectLinkingLayer+newObjectLinkingLayer (ExecutionSession es) getResolver = do   cleanups <- liftIO (newIORef [])+  getResolver' <- allocFunPtr cleanups (FFI.wrapGetSymbolResolver getResolver)+  linkingLayer <- FFI.createObjectLinkingLayer es getResolver'   return $ ObjectLinkingLayer linkingLayer cleanups  -- | 'bracket'-style wrapper around 'newObjectLinkingLayer' and 'disposeLinkingLayer'.-withObjectLinkingLayer :: (ObjectLinkingLayer -> IO a) -> IO a-withObjectLinkingLayer = bracket newObjectLinkingLayer disposeLinkingLayer+withObjectLinkingLayer :: ExecutionSession -> (FFI.ModuleKey -> IO (Ptr FFI.SymbolResolver)) -> (ObjectLinkingLayer -> IO a) -> IO a+withObjectLinkingLayer es resolver = bracket (newObjectLinkingLayer es resolver) disposeLinkingLayer  -- | @'findSymbol' layer symbol exportedSymbolsOnly@ searches for -- @symbol@ in all modules added to @layer@. If @exportedSymbolsOnly@@@ -80,7 +77,7 @@ -- | @'findSymbolIn' layer handle symbol exportedSymbolsOnly@ searches for -- @symbol@ in the context of the module represented by @handle@. If -- @exportedSymbolsOnly@ is 'True' only exported symbols are searched.-findSymbolIn :: LinkingLayer l => l -> FFI.ObjectHandle -> ShortByteString -> Bool -> IO (Either JITSymbolError JITSymbol)+findSymbolIn :: LinkingLayer l => l -> FFI.ModuleKey -> ShortByteString -> Bool -> IO (Either JITSymbolError JITSymbol) findSymbolIn linkingLayer handle symbol exportedSymbolsOnly =   SBS.useAsCString symbol $ \symbol' ->     flip runAnyContT return $ do
src/LLVM/OrcJIT.hs view
@@ -2,7 +2,7 @@     -- * CompileLayer     CompileLayer,     -- ** Add/remove modules-    ModuleHandle,+    ModuleKey,     addModule,     removeModule,     withModule,@@ -12,9 +12,18 @@     JITSymbolFlags(..),     defaultJITSymbolFlags,     SymbolResolver(..),+    withSymbolResolver,     -- ** Symbol mangling     MangledSymbol,     mangleSymbol,+    -- ** ExecutionSession+    ExecutionSession,+    createExecutionSession,+    disposeExecutionSession,+    withExecutionSession,+    allocateModuleKey,+    releaseModuleKey,+    withModuleKey,     -- ** IRCompileLayer     IRCompileLayer,     newIRCompileLayer,
test/LLVM/Test/Constants.hs view
@@ -80,8 +80,8 @@     ), (       "x86_fp80",       x86_fp80,-      C.Float (F.X86_FP80 0x0004 0x0003000200010000),-      "global x86_fp80 0xK00040003000200010000"+      C.Float (F.X86_FP80 0x0004 0x8003000200010000),+      "global x86_fp80 0xK00048003000200010000" {- don't know how to test this - LLVM's handling of this weird type is even weirder     ), (       "ppc_fp128",
test/LLVM/Test/Metadata.hs view
@@ -84,8 +84,12 @@       , UnsignedCharEncoding       ] -instance Arbitrary ChecksumKind where-  arbitrary = QC.elements [None, MD5, SHA1]+instance Arbitrary ChecksumInfo where+  arbitrary =+    oneof+      [ ChecksumInfo MD5 . BSS.pack <$> QC.vector 32+      , ChecksumInfo SHA1 . BSS.pack <$> QC.vector 40+      ]  instance Arbitrary BasicTypeTag where   arbitrary = QC.elements [BaseType, UnspecifiedType]@@ -244,13 +248,17 @@  instance Arbitrary DIFile where   arbitrary =-    O.File <$> arbitrarySbs <*> arbitrarySbs <*> arbitrarySbs <*> arbitrary+    O.File <$> arbitrarySbs <*> arbitrarySbs <*> arbitrary  instance Arbitrary DISubrange where   arbitrary = Subrange <$> arbitrary <*> arbitrary +instance Arbitrary DICount where+  -- TODO Include DICountVariable+  arbitrary = DICountConstant <$> arbitrary+ instance Arbitrary DIEnumerator where-  arbitrary = Enumerator <$> arbitrary <*> arbitrarySbs+  arbitrary = Enumerator <$> arbitrary <*> arbitrary <*> arbitrarySbs  instance Arbitrary DINode where   arbitrary =@@ -856,7 +864,7 @@                       , unit = Just (MDRef (MetadataNodeID 2))                       , O.templateParams = []                       , declaration = Nothing-                      , variables = []+                      , retainedNodes = []                       , thrownTypes = []                       }                   , MetadataNodeDefinition (MetadataNodeID 1)@@ -887,7 +895,7 @@                       }                   , MetadataNodeDefinition (MetadataNodeID 3) $                     DINode . DIScope . DIFile $-                    O.File "main.c" "/" "" None+                    O.File "main.c" "/" Nothing                   ]           s =             "; ModuleID = '<string>'\n\@@ -963,7 +971,7 @@                   , MetadataNodeDefinition (MetadataNodeID 4) (DIExpression (Expression []))                   , MetadataNodeDefinition (MetadataNodeID 5) $                     DINode . DIScope . DIFile $-                    O.File "main.c" "/" "" None+                    O.File "main.c" "/" Nothing                   , MetadataNodeDefinition (MetadataNodeID 6) $                     DINode . DIScope . DIType . DIBasicType $                     BasicType "" 0 0 Nothing BaseType
test/LLVM/Test/OrcJIT.hs view
@@ -6,6 +6,7 @@  import LLVM.Test.Support +import qualified Data.Map.Strict as Map import Control.Applicative import Data.ByteString (ByteString) import Data.Foldable@@ -50,17 +51,18 @@ foreign import ccall "dynamic"   mkMain :: FunPtr (IO Word32) -> IO Word32 -nullResolver :: MangledSymbol -> IO (Either JITSymbolError JITSymbol)-nullResolver s = putStrLn "nullresolver" >> return (Left (JITSymbolError "unknown symbol"))- resolver :: CompileLayer l => MangledSymbol -> l -> MangledSymbol -> IO (Either JITSymbolError JITSymbol)-resolver testFunc compileLayer symbol-  | symbol == testFunc = do+resolver testFunc compileLayer symbol = do+  if symbol /= testFunc+    then CL.findSymbol compileLayer symbol True+    else do       funPtr <- wrapTestFunc myTestFuncImpl       let addr = ptrToWordPtr (castFunPtrToPtr funPtr)       return (Right (JITSymbol addr defaultJITSymbolFlags))-  | otherwise = CL.findSymbol compileLayer symbol True +nullResolver :: MangledSymbol -> IO (Either JITSymbolError JITSymbol)+nullResolver s = putStrLn "nullresolver" >> return (Left (JITSymbolError "unknown symbol"))+ moduleTransform :: IORef Bool -> Ptr FFI.Module -> IO (Ptr FFI.Module) moduleTransform passmanagerSuccessful modulePtr = do   withPassManager defaultCuratedPassSetSpec { optLevel = Just 2 } $ \(PassManager pm) -> do@@ -72,80 +74,87 @@ tests =   testGroup "OrcJit" [     testCase "eager compilation" $ do+      resolvers <- newIORef Map.empty       withTestModule $ \mod ->         withHostTargetMachine $ \tm ->-          withObjectLinkingLayer $ \linkingLayer ->-            withIRCompileLayer linkingLayer tm $ \compileLayer -> do-              testFunc <- mangleSymbol compileLayer "testFunc"-              withModule-                compileLayer-                mod-                (SymbolResolver (resolver testFunc compileLayer) nullResolver) $-                \moduleHandle -> do-                  mainSymbol <- mangleSymbol compileLayer "main"-                  Right (JITSymbol mainFn _) <- CL.findSymbol compileLayer mainSymbol True-                  result <- mkMain (castPtrToFunPtr (wordPtrToPtr mainFn))-                  result @?= 42-                  Right (JITSymbol mainFn _) <- CL.findSymbolIn compileLayer moduleHandle mainSymbol True-                  result <- mkMain (castPtrToFunPtr (wordPtrToPtr mainFn))-                  result @?= 42-                  unknownSymbol <- mangleSymbol compileLayer "unknownSymbol"-                  unknownSymbolRes <- CL.findSymbol compileLayer unknownSymbol True-                  unknownSymbolRes @?= Left (JITSymbolError mempty),+        withExecutionSession $ \es ->+        withObjectLinkingLayer es (\k -> fmap (\rs -> rs Map.! k) (readIORef resolvers)) $ \linkingLayer ->+        withIRCompileLayer linkingLayer tm $ \compileLayer -> do+          testFunc <- mangleSymbol compileLayer "testFunc"+          withModuleKey es $ \k ->+            withSymbolResolver es (SymbolResolver (resolver testFunc compileLayer)) $ \resolver -> do+              modifyIORef' resolvers (Map.insert k resolver)+              withModule compileLayer k mod $ do+                mainSymbol <- mangleSymbol compileLayer "main"+                Right (JITSymbol mainFn _) <- CL.findSymbol compileLayer mainSymbol True+                result <- mkMain (castPtrToFunPtr (wordPtrToPtr mainFn))+                result @?= 42+                Right (JITSymbol mainFn _) <- CL.findSymbolIn compileLayer k mainSymbol True+                result <- mkMain (castPtrToFunPtr (wordPtrToPtr mainFn))+                result @?= 42+                unknownSymbol <- mangleSymbol compileLayer "unknownSymbol"+                unknownSymbolRes <- CL.findSymbol compileLayer unknownSymbol True+                unknownSymbolRes @?= Left (JITSymbolError mempty),      testCase "IRTransformLayer" $ do       passmanagerSuccessful <- newIORef False+      resolvers <- newIORef Map.empty       withTestModule $ \mod ->         withHostTargetMachine $ \tm ->-          withObjectLinkingLayer $ \linkingLayer ->-            withIRCompileLayer linkingLayer tm $ \compileLayer -> do-              withIRTransformLayer compileLayer tm (moduleTransform passmanagerSuccessful) $ \compileLayer -> do-                testFunc <- mangleSymbol compileLayer "testFunc"-                withModule-                  compileLayer-                  mod-                  (SymbolResolver (resolver testFunc compileLayer) nullResolver) $-                  \moduleHandle -> do-                    mainSymbol <- mangleSymbol compileLayer "main"-                    Right (JITSymbol mainFn _) <- CL.findSymbol compileLayer mainSymbol True-                    result <- mkMain (castPtrToFunPtr (wordPtrToPtr mainFn))-                    result @?= 42-                    readIORef passmanagerSuccessful @? "passmanager failed",+        withExecutionSession $ \es ->+        withObjectLinkingLayer es (\k -> fmap (\rs -> rs Map.! k) (readIORef resolvers)) $ \linkingLayer ->+        withIRCompileLayer linkingLayer tm $ \compileLayer ->+        withIRTransformLayer compileLayer tm (moduleTransform passmanagerSuccessful) $ \compileLayer ->+        withModuleKey es $ \k -> do+          testFunc <- mangleSymbol compileLayer "testFunc"+          withSymbolResolver es (SymbolResolver (resolver testFunc compileLayer)) $ \resolver -> do+            modifyIORef' resolvers (Map.insert k resolver)+            withModule compileLayer k mod $ do+              mainSymbol <- mangleSymbol compileLayer "main"+              Right (JITSymbol mainFn _) <- CL.findSymbol compileLayer mainSymbol True+              result <- mkMain (castPtrToFunPtr (wordPtrToPtr mainFn))+              result @?= 42+              readIORef passmanagerSuccessful @? "passmanager failed",      testCase "lazy compilation" $ do+      resolvers <- newIORef Map.empty+      let getResolver k = fmap (Map.! k) (readIORef resolvers)+          setResolver k r = modifyIORef' resolvers (Map.insert k r)       withTestModule $ \mod ->         withHostTargetMachine $ \tm -> do           triple <- getTargetMachineTriple tm-          withObjectLinkingLayer $ \linkingLayer ->+          withExecutionSession $ \es ->+            withObjectLinkingLayer es getResolver $ \linkingLayer ->             withIRCompileLayer linkingLayer tm $ \baseLayer ->-              withIndirectStubsManagerBuilder triple $ \stubsMgr ->-                withJITCompileCallbackManager triple Nothing $ \callbackMgr ->-                  withCompileOnDemandLayer baseLayer tm (\x -> return [x]) callbackMgr stubsMgr False $ \compileLayer -> do-                    testFunc <- mangleSymbol compileLayer "testFunc"-                    withModule-                      compileLayer-                      mod-                      (SymbolResolver (resolver testFunc compileLayer) nullResolver) $-                      \moduleHandle -> do-                        mainSymbol <- mangleSymbol compileLayer "main"-                        Right (JITSymbol mainFn _) <- CL.findSymbol compileLayer mainSymbol True-                        result <- mkMain (castPtrToFunPtr (wordPtrToPtr mainFn))-                        result @?= 42,+            withIndirectStubsManagerBuilder triple $ \stubsMgr ->+            withJITCompileCallbackManager es triple Nothing $ \callbackMgr ->+            withCompileOnDemandLayer es baseLayer tm getResolver setResolver (\x -> return [x]) callbackMgr stubsMgr False $ \compileLayer -> do+              testFunc <- mangleSymbol compileLayer "testFunc"+              withModuleKey es $ \k ->+                withSymbolResolver es (SymbolResolver (resolver testFunc baseLayer)) $ \resolver -> do+                  setResolver k resolver+                  withModule compileLayer k mod $ do+                    mainSymbol <- mangleSymbol compileLayer "main"+                    Right (JITSymbol mainFn _) <- CL.findSymbol compileLayer mainSymbol True+                    result <- mkMain (castPtrToFunPtr (wordPtrToPtr mainFn))+                    result @?= 42, -    testCase "finding symbols in linking layer" $ do-      withObjectLinkingLayer $ \linkingLayer -> do+    testCase "finding symbols in linking layer" $+      withExecutionSession $ \es ->+      withModuleKey es $ \k ->+      withSymbolResolver es (SymbolResolver nullResolver) $ \resolver ->+      withObjectLinkingLayer es (\_ -> pure resolver) $ \linkingLayer -> do         let inputPath = "./test/main_return_38.c"         withSystemTempFile "main.o" $ \outputPath _ -> do           callProcess "gcc" ["-c", inputPath, "-o", outputPath]           withObjectFile outputPath $ \objFile -> do-            let resl = SymbolResolver nullResolver nullResolver-            objectHandle <- addObjectFile linkingLayer objFile resl+            addObjectFile linkingLayer k objFile             -- Find main symbol by looking into global linking context             Right (JITSymbol mainFn _) <- LL.findSymbol linkingLayer "main" True             result <- mkMain (castPtrToFunPtr (wordPtrToPtr mainFn))             result @?= 38             -- Find main symbol by specificly using object handle for given object file-            Right (JITSymbol mainFn _) <- LL.findSymbolIn linkingLayer objectHandle "main" True+            Right (JITSymbol mainFn _) <- LL.findSymbolIn linkingLayer k "main" True             result <- mkMain (castPtrToFunPtr (wordPtrToPtr mainFn))             result @?= 38     ]
test/LLVM/Test/Regression.hs view
@@ -100,6 +100,82 @@       ]   } +duplicateDefinitions :: AST.Module+duplicateDefinitions =+  defaultModule+    { moduleName = "clashingModule"+    , moduleDefinitions =+        [ GlobalDefinition+            functionDefaults+              { name = "clashy"+              , returnType = i64+              , basicBlocks =+                  [ BasicBlock+                      "entry"+                      [ mkName "c" :=+                        Add+                          False+                          False+                          (ConstantOperand (C.Int 64 1))+                          (ConstantOperand (C.Int 64 2))+                          []+                      ]+                      (Do (Br "next" []))+                  , BasicBlock+                      "next"+                      [ mkName "c" :=+                        Phi i64 [(LocalReference i64 "c", "entry")] []+                      ]+                      (Do (Ret (Just (LocalReference i64 "c")) []))+                  ]+              }+        ]+    }++reuseAcrossFunctions :: AST.Module+reuseAcrossFunctions =+  defaultModule+    { moduleName = "<string>"+    , moduleDefinitions =+        [ GlobalDefinition+            functionDefaults+              { name = "f"+              , returnType = i64+              , basicBlocks =+                  [ BasicBlock+                      "entry"+                      [ "c" :=+                        Add+                          False+                          False+                          (ConstantOperand (C.Int 64 1))+                          (ConstantOperand (C.Int 64 2))+                          []+                      ]+                      (Do (Ret (Just (LocalReference i64 "c")) []))+                  ]+              }+        , GlobalDefinition+            functionDefaults+              { name = "g"+              , returnType = i64+              , basicBlocks =+                  [ BasicBlock+                      "entry"+                      [ "c" :=+                        Add+                          False+                          False+                          (ConstantOperand (C.Int 64 1))+                          (ConstantOperand (C.Int 64 2))+                          []+                      ]+                      (Do (Ret (Just (LocalReference i64 "c")) []))+                  ]+              }+        ]+    }+ shouldThrowEncodeException :: AST.Module -> String -> IO () shouldThrowEncodeException ast errMsg = do   result <- try $ withContext $ \context -> do@@ -108,6 +184,11 @@     Left (EncodeException actualErrMsg) -> actualErrMsg @?= errMsg     Right _ -> assertFailure ("Expected serialization to fail with: \"" ++ errMsg ++ "\"") +shouldNotThrow :: AST.Module -> IO ()+shouldNotThrow ast = do+  withContext $ \context -> do+    withModuleFromAST context ast (\_ -> return ())+ tests :: TestTree tests =   testGroup@@ -124,4 +205,11 @@         "null constants must have pointer type"         (example3 `shouldThrowEncodeException`           "Null pointer constant must have pointer type but has type IntegerType {typeBits = 32}.")+    , testCase+        "Duplicate definitions are not allowed"+        (duplicateDefinitions `shouldThrowEncodeException`+          "Duplicate definition of local variable: Name \"c\".")+    , testCase+        "Reusing variable names across functions is allowed"+        (shouldNotThrow reuseAcrossFunctions)     ]
test/debug_metadata_2.ll view
@@ -31,7 +31,7 @@ !6 = !{i32 7, !"PIC Level", i32 2} !7 = !{i32 7, !"PIE Level", i32 2} !8 = !{!"clang version 5.0.1 (tags/RELEASE_501/final)"}-!9 = distinct !DISubprogram(name: "f", scope: !1, file: !1, line: 1, type: !10, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: false, unit: !0, variables: !2)+!9 = distinct !DISubprogram(name: "f", scope: !1, file: !1, line: 1, type: !10, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: false, unit: !0, retainedNodes: !2) !10 = !DISubroutineType(types: !11) !11 = !{!12, !12} !12 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)