module GHC.Unit.Home.ModInfo
(
HomeModInfo (..)
, HomeModLinkable(..)
, homeModInfoObject
, homeModInfoByteCode
, emptyHomeModInfoLinkable
, justBytecode
, justObjects
, bytecodeAndObjects
)
where
import GHC.Prelude
import GHC.Unit.Module.ModIface
import GHC.Unit.Module.ModDetails
import GHC.Linker.Types ( Linkable(..), linkableIsNativeCodeOnly )
import GHC.Utils.Outputable
import GHC.Utils.Panic
data HomeModInfo = HomeModInfo
{ HomeModInfo -> ModIface
hm_iface :: !ModIface
, HomeModInfo -> ModDetails
hm_details :: ModDetails
, HomeModInfo -> HomeModLinkable
hm_linkable :: !HomeModLinkable
}
homeModInfoByteCode :: HomeModInfo -> Maybe Linkable
homeModInfoByteCode :: HomeModInfo -> Maybe Linkable
homeModInfoByteCode = HomeModLinkable -> Maybe Linkable
homeMod_bytecode (HomeModLinkable -> Maybe Linkable)
-> (HomeModInfo -> HomeModLinkable)
-> HomeModInfo
-> Maybe Linkable
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HomeModInfo -> HomeModLinkable
hm_linkable
homeModInfoObject :: HomeModInfo -> Maybe Linkable
homeModInfoObject :: HomeModInfo -> Maybe Linkable
homeModInfoObject = HomeModLinkable -> Maybe Linkable
homeMod_object (HomeModLinkable -> Maybe Linkable)
-> (HomeModInfo -> HomeModLinkable)
-> HomeModInfo
-> Maybe Linkable
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HomeModInfo -> HomeModLinkable
hm_linkable
emptyHomeModInfoLinkable :: HomeModLinkable
emptyHomeModInfoLinkable :: HomeModLinkable
emptyHomeModInfoLinkable = Maybe Linkable -> Maybe Linkable -> HomeModLinkable
HomeModLinkable Maybe Linkable
forall a. Maybe a
Nothing Maybe Linkable
forall a. Maybe a
Nothing
data HomeModLinkable = HomeModLinkable { HomeModLinkable -> Maybe Linkable
homeMod_bytecode :: !(Maybe Linkable)
, HomeModLinkable -> Maybe Linkable
homeMod_object :: !(Maybe Linkable) }
instance Outputable HomeModLinkable where
ppr :: HomeModLinkable -> SDoc
ppr (HomeModLinkable Maybe Linkable
l1 Maybe Linkable
l2) = Maybe Linkable -> SDoc
forall a. Outputable a => a -> SDoc
ppr Maybe Linkable
l1 SDoc -> SDoc -> SDoc
forall doc. IsDoc doc => doc -> doc -> doc
$$ Maybe Linkable -> SDoc
forall a. Outputable a => a -> SDoc
ppr Maybe Linkable
l2
justBytecode :: Linkable -> HomeModLinkable
justBytecode :: Linkable -> HomeModLinkable
justBytecode Linkable
lm =
Bool -> SDoc -> HomeModLinkable -> HomeModLinkable
forall a. HasCallStack => Bool -> SDoc -> a -> a
assertPpr (Bool -> Bool
not (Linkable -> Bool
linkableIsNativeCodeOnly Linkable
lm)) (Linkable -> SDoc
forall a. Outputable a => a -> SDoc
ppr Linkable
lm)
(HomeModLinkable -> HomeModLinkable)
-> HomeModLinkable -> HomeModLinkable
forall a b. (a -> b) -> a -> b
$ HomeModLinkable
emptyHomeModInfoLinkable { homeMod_bytecode = Just lm }
justObjects :: Linkable -> HomeModLinkable
justObjects :: Linkable -> HomeModLinkable
justObjects Linkable
lm =
Bool -> SDoc -> HomeModLinkable -> HomeModLinkable
forall a. HasCallStack => Bool -> SDoc -> a -> a
assertPpr (Linkable -> Bool
linkableIsNativeCodeOnly Linkable
lm) (Linkable -> SDoc
forall a. Outputable a => a -> SDoc
ppr Linkable
lm)
(HomeModLinkable -> HomeModLinkable)
-> HomeModLinkable -> HomeModLinkable
forall a b. (a -> b) -> a -> b
$ HomeModLinkable
emptyHomeModInfoLinkable { homeMod_object = Just lm }
bytecodeAndObjects :: Linkable -> Linkable -> HomeModLinkable
bytecodeAndObjects :: Linkable -> Linkable -> HomeModLinkable
bytecodeAndObjects Linkable
bc Linkable
o =
Bool -> SDoc -> HomeModLinkable -> HomeModLinkable
forall a. HasCallStack => Bool -> SDoc -> a -> a
assertPpr (Bool -> Bool
not (Linkable -> Bool
linkableIsNativeCodeOnly Linkable
bc) Bool -> Bool -> Bool
&& Linkable -> Bool
linkableIsNativeCodeOnly Linkable
o) (Linkable -> SDoc
forall a. Outputable a => a -> SDoc
ppr Linkable
bc SDoc -> SDoc -> SDoc
forall doc. IsDoc doc => doc -> doc -> doc
$$ Linkable -> SDoc
forall a. Outputable a => a -> SDoc
ppr Linkable
o)
(Maybe Linkable -> Maybe Linkable -> HomeModLinkable
HomeModLinkable (Linkable -> Maybe Linkable
forall a. a -> Maybe a
Just Linkable
bc) (Linkable -> Maybe Linkable
forall a. a -> Maybe a
Just Linkable
o))