HscTypes.lhs 81.1 KB
 Simon Marlow committed Oct 11, 2006 1 2 % % (c) The University of Glasgow, 2006  sewardj committed Oct 11, 2000 3 4 5 6 % \section[HscTypes]{Types for the per-module compiler} \begin{code}  7 -- | Types for the per-module compiler  simonpj committed Oct 16, 2000 8 module HscTypes (  Thomas Schilling committed Sep 14, 2008 9 10 11 12 13 14 15  -- * 'Ghc' monad stuff Ghc(..), GhcT(..), liftGhcT, GhcMonad(..), WarnLogMonad(..), liftIO, ioMsgMaybe, ioMsg, logWarnings, clearWarnings, hasWarnings, SourceError, GhcApiError, mkSrcErr, srcErrorMessages, mkApiErr,  Simon Marlow committed Oct 10, 2008 16  throwOneError, handleSourceError,  Thomas Schilling committed Sep 14, 2008 17  reflectGhc, reifyGhc,  Thomas Schilling committed Nov 22, 2008 18  handleFlagWarnings,  Thomas Schilling committed Sep 14, 2008 19   simonmar committed Mar 22, 2005 20  -- * Sessions and compilation state  Thomas Schilling committed Nov 25, 2008 21  Session(..), withSession, modifySession, withTempSession,  Simon Marlow committed May 02, 2007 22  HscEnv(..), hscEPS,  Simon Marlow committed Jul 25, 2006 23  FinderCache, FindResult(..), ModLocationCache,  simonmar committed Mar 22, 2005 24 25  Target(..), TargetId(..), pprTarget, pprTargetId, ModuleGraph, emptyMG,  Thomas Schilling committed Nov 28, 2008 26 27  -- ** Callbacks GhcApiCallbacks(..), withLocalCallbacks,  simonpj committed Jun 15, 2001 28   29  -- * Information about modules  simonmar committed Mar 24, 2005 30  ModDetails(..), emptyModDetails,  31  ModGuts(..), CoreModule(..), CgGuts(..), ForeignStubs(..),  Simon Marlow committed Nov 06, 2007 32  ImportedMods,  simonpj committed Sep 13, 2002 33   Simon Marlow committed May 02, 2007 34  ModSummary(..), ms_mod_name, showModMsg, isBootSummary,  35  msHsFilePath, msHiFilePath, msObjFilePath,  simonpj committed Jan 27, 2005 36   37  -- * Information about the module being compiled  simonpj committed Jan 27, 2005 38 39  HscSource(..), isHsBoot, hscSourceString, -- Re-exported from DriverPhases  40  -- * State relating to modules in this package  simonpj committed Sep 13, 2002 41  HomePackageTable, HomeModInfo(..), emptyHomePackageTable,  chak@cse.unsw.edu.au. committed May 07, 2007 42  hptInstances, hptRules, hptVectInfo,  43 44  -- * State relating to known packages  simonpj committed Aug 16, 2004 45  ExternalPackageState(..), EpsStats(..), addEpsInStats,  simonpj committed Sep 13, 2002 46  PackageTypeEnv, PackageIfaceTable, emptyPackageIfaceTable,  Simon Marlow committed Jul 25, 2006 47  lookupIfaceByModule, emptyModIface,  48 49  PackageInstEnv, PackageRuleBase,  simonpj committed Oct 16, 2000 50   simonpj@microsoft.com committed Oct 30, 2008 51 52 53 54  -- * Annotations prepareAnnotations,  55  -- * Interactive context  simonpj committed Oct 09, 2003 56  InteractiveContext(..), emptyInteractiveContext,  Simon Marlow committed Apr 25, 2007 57  icPrintUnqual, mkPrintUnqualified, extendInteractiveContext,  mnislaih committed Jul 14, 2007 58  substInteractiveContext,  simonpj committed Oct 09, 2003 59   60  -- * Interfaces  Ian Lynagh committed Jul 20, 2008 61 62  ModIface(..), mkIfaceWarnCache, mkIfaceHashCache, mkIfaceFixCache, emptyIfaceWarnCache,  simonmar committed Feb 26, 2001 63   64  -- * Fixity  simonpj committed Oct 09, 2003 65  FixityEnv, FixItem(..), lookupFixity, emptyFixityEnv,  simonpj committed Oct 23, 2000 66   67 68 69  -- * TyThings and type environments TyThing(..), tyThingClass, tyThingTyCon, tyThingDataCon, tyThingId,  Simon Marlow committed Oct 11, 2006 70  implicitTyThings, isImplicitTyThing,  71 72  TypeEnv, lookupType, lookupTypeHscEnv, mkTypeEnv, emptyTypeEnv,  simonpj committed Aug 16, 2004 73  extendTypeEnv, extendTypeEnvList, extendTypeEnvWithIds, lookupTypeEnv,  simonpj committed Oct 18, 2001 74  typeEnvElts, typeEnvClasses, typeEnvTyCons, typeEnvIds,  chak@cse.unsw.edu.au. committed Sep 20, 2006 75  typeEnvDataCons,  sewardj committed Oct 18, 2000 76   77 78 79 80  -- * MonadThings MonadThings(..), -- * Information on imports and exports  simonpj committed Oct 09, 2003 81  WhetherHasOrphans, IsBootInterface, Usage(..),  simonpj committed Oct 25, 2002 82  Dependencies(..), noDependencies,  simonpj committed Sep 13, 2002 83  NameCache(..), OrigNameCache, OrigIParamCache,  Simon Marlow committed Oct 11, 2006 84  Avails, availsToNameSet, availsToNameEnv, availName, availNames,  simonpj committed Dec 06, 2001 85  GenAvailInfo(..), AvailInfo, RdrAvailInfo,  simonpj committed Oct 09, 2003 86  IfaceExport,  simonpj committed Sep 13, 2002 87   88  -- * Warnings  Ian Lynagh committed Jul 20, 2008 89  Warnings(..), WarningTxt(..), plusWarns,  simonpj committed Oct 16, 2000 90   91  -- * Linker stuff  simonpj committed Sep 13, 2002 92 93  Linkable(..), isObjectLinkable, Unlinked(..), CompiledByteCode,  andy@galois.com committed Oct 24, 2006 94  isObject, nameOfObject, isInterpretable, byteCodeOfObject,  95 96  -- * Program coverage  andy@galois.com committed Jul 17, 2007 97  HpcInfo(..), emptyHpcInfo, isHpcUsed, AnyHpcUsage,  Simon Marlow committed Apr 17, 2007 98   99  -- * Breakpoints  chak@cse.unsw.edu.au. committed May 04, 2007 100 101  ModBreaks (..), BreakIndex, emptyModBreaks,  102  -- * Vectorisation information  chak@cse.unsw.edu.au. committed May 04, 2007 103 104  VectInfo(..), IfaceVectInfo(..), noVectInfo, plusVectInfo, noIfaceVectInfo  simonpj committed Oct 16, 2000 105  ) where  sewardj committed Oct 11, 2000 106 107 108  #include "HsVersions.h"  simonpj committed Sep 13, 2002 109 110 #ifdef GHCI import ByteCodeAsm ( CompiledByteCode )  Simon Marlow committed May 02, 2007 111 import {-# SOURCE #-} InteractiveEval ( Resume )  simonpj committed Sep 13, 2002 112 113 #endif  Simon Marlow committed Dec 02, 2008 114 import HsSyn  115 import RdrName  simonpj@microsoft.com committed Oct 03, 2008 116 import Name  simonpj committed Mar 08, 2001 117 import NameEnv  simonpj committed Sep 13, 2002 118 import NameSet  simonpj committed Oct 09, 2003 119 import OccName ( OccName, OccEnv, lookupOccEnv, mkOccEnv, emptyOccEnv,  simonpj committed Sep 30, 2004 120  extendOccEnv )  simonmar committed Jan 30, 2002 121 import Module  simonpj committed Apr 28, 2005 122 import InstEnv ( InstEnv, Instance )  chak@cse.unsw.edu.au. committed Oct 10, 2006 123 import FamInstEnv ( FamInstEnv, FamInst )  simonpj committed Oct 25, 2000 124 import Rules ( RuleBase )  simonmar committed Mar 13, 2001 125 import CoreSyn ( CoreBind )  chak@cse.unsw.edu.au. committed May 08, 2007 126 import VarEnv  Simon Marlow committed Apr 25, 2007 127 import VarSet  128 import Var  Simon Marlow committed Apr 25, 2007 129 import Id  mnislaih committed Jul 14, 2007 130 import Type  simonpj committed Oct 09, 2003 131   simonpj@microsoft.com committed Oct 30, 2008 132 import Annotations  chak@cse.unsw.edu.au. committed Sep 20, 2006 133 import Class ( Class, classSelIds, classATs, classTyCon )  Simon Marlow committed Oct 11, 2006 134 import TyCon  simonpj@microsoft.com committed Dec 04, 2007 135 import DataCon ( DataCon, dataConImplicitIds, dataConWrapId )  Simon Marlow committed Mar 02, 2006 136 import PrelNames ( gHC_PRIM )  137 import Packages hiding ( Version(..) )  Thomas Schilling committed Nov 22, 2008 138 139 import DynFlags ( DynFlags(..), isOneShot, HscTarget (..), dopt, DynFlag(..) )  simonmar committed May 16, 2005 140 import DriverPhases ( HscSource(..), isHsBoot, hscSourceString, Phase )  Ian Lynagh committed Jul 20, 2008 141 import BasicTypes ( IPName, Fixity, defaultFixity, WarningTxt(..) )  dias@eecs.harvard.edu committed May 29, 2008 142 import OptimizationFuel ( OptFuelState )  Simon Marlow committed Oct 11, 2006 143 import IfaceSyn  simonpj committed Oct 09, 2003 144 import FiniteMap ( FiniteMap )  simonpj committed Apr 28, 2005 145 import CoreSyn ( CoreRule )  twanvl committed Jan 17, 2008 146 import Maybes ( orElse, expectJust, catMaybes )  sewardj committed Oct 16, 2000 147 import Outputable  Simon Marlow committed Apr 17, 2007 148 import BreakArray  Thomas Schilling committed Nov 22, 2008 149 import SrcLoc ( SrcSpan, Located(..) )  Ian Lynagh committed Feb 07, 2008 150 import LazyUniqFM ( lookupUFM, eltsUFM, emptyUFM )  sewardj committed Oct 24, 2000 151 import UniqSupply ( UniqSupply )  Ian Lynagh committed Mar 29, 2008 152 import FastString  simonpj committed Jan 27, 2005 153 import StringBuffer ( StringBuffer )  Simon Marlow committed May 28, 2008 154 import Fingerprint  Thomas Schilling committed Sep 14, 2008 155 156 157 import MonadUtils import Data.Dynamic ( Typeable ) import qualified Data.Dynamic as Dyn  Simon Marlow committed Oct 10, 2008 158 159 import Bag import ErrUtils  Simon Marlow committed Oct 11, 2006 160   Ian Lynagh committed Jan 20, 2008 161 import System.FilePath  Simon Marlow committed Oct 11, 2006 162 import System.Time ( ClockTime )  Simon Marlow committed May 02, 2007 163 import Data.IORef  Simon Marlow committed Apr 17, 2007 164 import Data.Array ( Array, array )  mnislaih committed Jul 14, 2007 165 import Data.List  Thomas Schilling committed Nov 22, 2008 166 import Control.Monad ( mplus, guard, liftM, when )  Thomas Schilling committed Sep 14, 2008 167 import Exception  sewardj committed Oct 11, 2000 168 169 \end{code}  simonpj committed Sep 13, 2002 170   simonpj committed Jun 15, 2001 171 172 %************************************************************************ %* *  simonpj committed Sep 13, 2002 173 \subsection{Compilation environment}  simonpj committed Jun 15, 2001 174 175 176 %* * %************************************************************************  simonmar committed Mar 22, 2005 177 178 179 180 181 182  \begin{code} -- | The Session is a handle to the complete state of a compilation -- session. A compilation session consists of a set of modules -- constituting the current program or library, the context for -- interactive evaluation, and various caches.  Thomas Schilling committed Sep 14, 2008 183 184 185 186 187 188 data Session = Session !(IORef HscEnv) !(IORef WarningMessages) mkSrcErr :: ErrorMessages -> SourceError srcErrorMessages :: SourceError -> ErrorMessages mkApiErr :: SDoc -> GhcApiError  Simon Marlow committed Oct 10, 2008 189 190 191 throwOneError :: MonadIO m => ErrMsg -> m ab throwOneError err = liftIO $throwIO$ mkSrcErr $unitBag err  Thomas Schilling committed Sep 14, 2008 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 -- | A source error is an error that is caused by one or more errors in the -- source code. A 'SourceError' is thrown by many functions in the -- compilation pipeline. Inside GHC these errors are merely printed via -- 'log_action', but API clients may treat them differently, for example, -- insert them into a list box. If you want the default behaviour, use the -- idiom: -- -- > handleSourceError printExceptionAndWarnings$ do -- > ... api calls that may fail ... -- -- The 'SourceError's error messages can be accessed via 'srcErrorMessages'. -- This list may be empty if the compiler failed due to @-Werror@ -- ('Opt_WarnIsError'). -- -- See 'printExceptionAndWarnings' for more information on what to take care -- of when writing a custom error handler. data SourceError = SourceError ErrorMessages instance Show SourceError where show (SourceError msgs) = unlines . map show . bagToList $msgs -- ToDo: is there some nicer way to print this? sourceErrorTc :: Dyn.TyCon sourceErrorTc = Dyn.mkTyCon "SourceError" {-# NOINLINE sourceErrorTc #-} instance Typeable SourceError where typeOf _ = Dyn.mkTyConApp sourceErrorTc [] instance Exception SourceError mkSrcErr = SourceError -- | Perform the given action and call the exception handler if the action -- throws a 'SourceError'. See 'SourceError' for more information. handleSourceError :: (ExceptionMonad m) => (SourceError -> m a) -- ^ exception handler -> m a -- ^ action to perform -> m a handleSourceError handler act = gcatch act (\(e :: SourceError) -> handler e) srcErrorMessages (SourceError msgs) = msgs -- | XXX: what exactly is an API error? data GhcApiError = GhcApiError SDoc instance Show GhcApiError where show (GhcApiError msg) = showSDoc msg ghcApiErrorTc :: Dyn.TyCon ghcApiErrorTc = Dyn.mkTyCon "GhcApiError" {-# NOINLINE ghcApiErrorTc #-} instance Typeable GhcApiError where typeOf _ = Dyn.mkTyConApp ghcApiErrorTc [] instance Exception GhcApiError mkApiErr = GhcApiError -- | A monad that allows logging of warnings. class Monad m => WarnLogMonad m where setWarnings :: WarningMessages -> m () getWarnings :: m WarningMessages logWarnings :: WarnLogMonad m => WarningMessages -> m () logWarnings warns = do warns0 <- getWarnings setWarnings (unionBags warns warns0) -- | Clear the log of 'Warnings'. clearWarnings :: WarnLogMonad m => m () clearWarnings = setWarnings emptyBag -- | Returns true if there were any warnings. hasWarnings :: WarnLogMonad m => m Bool hasWarnings = getWarnings >>= return . not . isEmptyBag -- | A monad that has all the features needed by GHC API calls. -- -- In short, a GHC monad -- -- - allows embedding of IO actions, -- -- - can log warnings, -- -- - allows handling of (extensible) exceptions, and -- -- - maintains a current session. -- -- If you do not use 'Ghc' or 'GhcT', make sure to call 'GHC.initGhcMonad' -- before any call to the GHC API functions can occur. -- class (Functor m, MonadIO m, WarnLogMonad m, ExceptionMonad m) => GhcMonad m where getSession :: m HscEnv setSession :: HscEnv -> m () -- | Call the argument with the current session. withSession :: GhcMonad m => (HscEnv -> m a) -> m a withSession f = getSession >>= f -- | Set the current session to the result of applying the current session to -- the argument. modifySession :: GhcMonad m => (HscEnv -> HscEnv) -> m () modifySession f = do h <- getSession setSession$! f h  Thomas Schilling committed Nov 25, 2008 299 300 301 302 303 304 305 306 307 308 withSavedSession :: GhcMonad m => m a -> m a withSavedSession m = do saved_session <- getSession m gfinally setSession saved_session -- | Call an action with a temporarily modified Session. withTempSession :: GhcMonad m => (HscEnv -> HscEnv) -> m a -> m a withTempSession f m = withSavedSession $modifySession f >> m  Thomas Schilling committed Sep 14, 2008 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 -- | A minimal implementation of a 'GhcMonad'. If you need a custom monad, -- e.g., to maintain additional state consider wrapping this monad or using -- 'GhcT'. newtype Ghc a = Ghc { unGhc :: Session -> IO a } instance Functor Ghc where fmap f m = Ghc$ \s -> f fmap unGhc m s instance Monad Ghc where return a = Ghc $\_ -> return a m >>= g = Ghc$ \s -> do a <- unGhc m s; unGhc (g a) s instance MonadIO Ghc where liftIO ioA = Ghc $\_ -> ioA instance ExceptionMonad Ghc where gcatch act handle = Ghc$ \s -> unGhc act s gcatch \e -> unGhc (handle e) s  Thomas Schilling committed Oct 06, 2008 327 328 329  gblock (Ghc m) = Ghc $\s -> gblock (m s) gunblock (Ghc m) = Ghc$ \s -> gunblock (m s)  Thomas Schilling committed Sep 14, 2008 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 instance WarnLogMonad Ghc where setWarnings warns = Ghc $\(Session _ wref) -> writeIORef wref warns -- | Return 'Warnings' accumulated so far. getWarnings = Ghc$ \(Session _ wref) -> readIORef wref instance GhcMonad Ghc where getSession = Ghc $\(Session r _) -> readIORef r setSession s' = Ghc$ \(Session r _) -> writeIORef r s' -- | A monad transformer to add GHC specific features to another monad. -- -- Note that the wrapped monad must support IO and handling of exceptions. newtype GhcT m a = GhcT { unGhcT :: Session -> m a } liftGhcT :: Monad m => m a -> GhcT m a liftGhcT m = GhcT $\_ -> m  Simon Marlow committed May 02, 2007 345   Thomas Schilling committed Sep 14, 2008 346 347 348 349 350 351 352 353 354 355 356 357 358 instance Functor m => Functor (GhcT m) where fmap f m = GhcT$ \s -> f fmap unGhcT m s instance Monad m => Monad (GhcT m) where return x = GhcT $\_ -> return x m >>= k = GhcT$ \s -> do a <- unGhcT m s; unGhcT (k a) s instance MonadIO m => MonadIO (GhcT m) where liftIO ioA = GhcT $\_ -> liftIO ioA instance ExceptionMonad m => ExceptionMonad (GhcT m) where gcatch act handle = GhcT$ \s -> unGhcT act s gcatch \e -> unGhcT (handle e) s  Thomas Schilling committed Oct 06, 2008 359 360  gblock (GhcT m) = GhcT $\s -> gblock (m s) gunblock (GhcT m) = GhcT$ \s -> gunblock (m s)  Thomas Schilling committed Sep 14, 2008 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392  instance MonadIO m => WarnLogMonad (GhcT m) where setWarnings warns = GhcT $\(Session _ wref) -> liftIO$ writeIORef wref warns -- | Return 'Warnings' accumulated so far. getWarnings = GhcT $\(Session _ wref) -> liftIO$ readIORef wref instance (Functor m, ExceptionMonad m, MonadIO m) => GhcMonad (GhcT m) where getSession = GhcT $\(Session r _) -> liftIO$ readIORef r setSession s' = GhcT $\(Session r _) -> liftIO$ writeIORef r s' -- | Lift an IO action returning errors messages into a 'GhcMonad'. -- -- In order to reduce dependencies to other parts of the compiler, functions -- outside the "main" parts of GHC return warnings and errors as a parameter -- and signal success via by wrapping the result in a 'Maybe' type. This -- function logs the returned warnings and propagates errors as exceptions -- (of type 'SourceError'). -- -- This function assumes the following invariants: -- -- 1. If the second result indicates success (is of the form 'Just x'), -- there must be no error messages in the first result. -- -- 2. If there are no error messages, but the second result indicates failure -- there should be warnings in the first result. That is, if the action -- failed, it must have been due to the warnings (i.e., @-Werror@). ioMsgMaybe :: GhcMonad m => IO (Messages, Maybe a) -> m a ioMsgMaybe ioA = do ((warns,errs), mb_r) <- liftIO ioA logWarnings warns case mb_r of  Simon Marlow committed Oct 10, 2008 393  Nothing -> liftIO $throwIO (mkSrcErr errs)  Thomas Schilling committed Sep 14, 2008 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422  Just r -> ASSERT( isEmptyBag errs ) return r -- | Lift a non-failing IO action into a 'GhcMonad'. -- -- Like 'ioMsgMaybe', but assumes that the action will never return any error -- messages. ioMsg :: GhcMonad m => IO (Messages, a) -> m a ioMsg ioA = do ((warns,errs), r) <- liftIO ioA logWarnings warns ASSERT( isEmptyBag errs ) return r -- | Reflect a computation in the 'Ghc' monad into the 'IO' monad. -- -- You can use this to call functions returning an action in the 'Ghc' monad -- inside an 'IO' action. This is needed for some (too restrictive) callback -- arguments of some library functions: -- -- > libFunc :: String -> (Int -> IO a) -> IO a -- > ghcFunc :: Int -> Ghc a -- > -- > ghcFuncUsingLibFunc :: String -> Ghc a -> Ghc a -- > ghcFuncUsingLibFunc str = -- > reifyGhc$ \s -> -- > libFunc $\i -> do -- > reflectGhc (ghcFunc i) s -- reflectGhc :: Ghc a -> Session -> IO a reflectGhc m = unGhc m  Simon Marlow committed May 02, 2007 423   Thomas Schilling committed Sep 14, 2008 424 425 426 -- > Dual to 'reflectGhc'. See its documentation. reifyGhc :: (Session -> IO a) -> Ghc a reifyGhc act = Ghc$ act  Thomas Schilling committed Nov 22, 2008 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444  handleFlagWarnings :: GhcMonad m => DynFlags -> [Located String] -> m () handleFlagWarnings dflags warns = when (dopt Opt_WarnDeprecatedFlags dflags) (handleFlagWarnings' dflags warns) handleFlagWarnings' :: GhcMonad m => DynFlags -> [Located String] -> m () handleFlagWarnings' _ [] = return () handleFlagWarnings' dflags warns = do -- It would be nicer if warns :: [Located Message], but that has circular -- import problems. logWarnings $listToBag (map mkFlagWarning warns) when (dopt Opt_WarnIsError dflags)$ liftIO $throwIO$ mkSrcErr emptyBag mkFlagWarning :: Located String -> WarnMsg mkFlagWarning (L loc warn) = mkPlainWarnMsg loc (text warn)  simonmar committed Mar 22, 2005 445 446 \end{code}  simonpj committed Jun 15, 2001 447 \begin{code}  Thomas Schilling committed Nov 28, 2008 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 -- | These functions are called in various places of the GHC API. -- -- API clients can override any of these callbacks to change GHC's default -- behaviour. data GhcApiCallbacks = GhcApiCallbacks { -- | Called by 'load' after the compilating of each module. -- -- The default implementation simply prints all warnings and errors to -- @stderr@. Don't forget to call 'clearWarnings' when implementing your -- own call. -- -- The first argument is the module that was compiled. -- -- The second argument is @Nothing@ if no errors occured, but there may -- have been warnings. If it is @Just err@ at least one error has -- occured. If 'srcErrorMessages' is empty, compilation failed due to -- @-Werror@. reportModuleCompilationResult :: GhcMonad m => ModSummary -> Maybe SourceError -> m () } -- | Temporarily modify the callbacks. After the action is executed all -- callbacks are reset (not, however, any other modifications to the session -- state.) withLocalCallbacks :: GhcMonad m => (GhcApiCallbacks -> GhcApiCallbacks) -> m a -> m a withLocalCallbacks f m = do hsc_env <- getSession let cb0 = hsc_callbacks hsc_env let cb' = f cb0 setSession (hsc_env { hsc_callbacks = cb' seq cb' }) r <- m  Thomas Schilling committed Nov 28, 2008 484 485  hsc_env' <- getSession setSession (hsc_env' { hsc_callbacks = cb0 })  Thomas Schilling committed Nov 28, 2008 486 487 488 489 490 491  return r \end{code} \begin{code} -- | Hscenv is like 'Session', except that some of the fields are immutable.  492 493 494 495 496 497 498 499 500 -- An HscEnv is used to compile a single module from plain Haskell source -- code (after preprocessing) to either C, assembly or C--. Things like -- the module graph don't change during a single compilation. -- -- Historical note: \"hsc\" used to be the name of the compiler binary, -- when there was a separate driver and compiler. To compile a single -- module, the driver would invoke hsc on the source code... so nowadays -- we think of hsc as the layer of the compiler that deals with compiling -- a single module.  simonpj committed Oct 09, 2003 501 data HscEnv  simonmar committed Mar 22, 2005 502 503  = HscEnv { hsc_dflags :: DynFlags,  504  -- ^ The dynamic flag settings  simonmar committed Mar 22, 2005 505   Thomas Schilling committed Nov 28, 2008 506 507 508  hsc_callbacks :: GhcApiCallbacks, -- ^ Callbacks for the GHC API.  simonmar committed Mar 22, 2005 509  hsc_targets :: [Target],  510  -- ^ The targets (or roots) of the current session  simonpj committed Oct 09, 2003 511   simonmar committed Mar 22, 2005 512  hsc_mod_graph :: ModuleGraph,  513  -- ^ The module graph of the current session  simonmar committed Mar 22, 2005 514 515  hsc_IC :: InteractiveContext,  516  -- ^ The context for evaluating interactive statements  simonmar committed Mar 22, 2005 517 518  hsc_HPT :: HomePackageTable,  519 520  -- ^ The home package table describes already-compiled -- home-package modules, /excluding/ the module we  simonpj committed Oct 09, 2003 521 522 523  -- are compiling right now. -- (In one-shot mode the current module is the only -- home-package module, so hsc_HPT is empty. All other  524  -- modules count as \"external-package\" modules.  simonpj committed Oct 01, 2004 525  -- However, even in GHCi mode, hi-boot interfaces are  526  -- demand-loaded into the external-package table.)  simonpj committed Oct 01, 2004 527  --  528  -- 'hsc_HPT' is not mutable because we only demand-load  simonpj committed Oct 09, 2003 529  -- external packages; the home package is eagerly  simonpj committed Oct 01, 2004 530  -- loaded, module by module, by the compilation manager.  simonpj committed Jan 18, 2005 531  --  532  -- The HPT may contain modules compiled earlier by @--make@  simonpj committed Jan 18, 2005 533  -- but not actually below the current module in the dependency  534 535 536  -- graph. -- (This changes a previous invariant: changed Jan 05.)  simonpj committed Oct 09, 2003 537   simonmar committed Mar 22, 2005 538  hsc_EPS :: {-# UNPACK #-} !(IORef ExternalPackageState),  539 540 541 542  -- ^ Information about the currently loaded external packages. -- This is mutable because packages will be demand-loaded during -- a compilation run as required.  simonmar committed Mar 22, 2005 543  hsc_NC :: {-# UNPACK #-} !(IORef NameCache),  544 545  -- ^ As with 'hsc_EPS', this is side-effected by compiling to -- reflect sucking in interface files. They cache the state of  simonmar committed Mar 22, 2005 546 547  -- external interface files, in effect.  Simon Marlow committed Jul 25, 2006 548  hsc_FC :: {-# UNPACK #-} !(IORef FinderCache),  549  -- ^ The cached result of performing finding in the file system  Simon Marlow committed Jul 25, 2006 550  hsc_MLC :: {-# UNPACK #-} !(IORef ModLocationCache),  551 552  -- ^ This caches the location of modules, so we don't have to -- search the filesystem multiple times. See also 'hsc_FC'.  Simon Marlow committed Jul 25, 2006 553   dias@eecs.harvard.edu committed May 29, 2008 554  hsc_OptFuel :: OptFuelState,  555  -- ^ Settings to control the use of \"optimization fuel\":  dias@eecs.harvard.edu committed May 29, 2008 556 557 558  -- by limiting the number of transformations, -- we can use binary search to help find compiler bugs.  Simon Marlow committed May 30, 2008 559  hsc_type_env_var :: Maybe (Module, IORef TypeEnv),  560 561 562  -- ^ Used for one-shot compilation only, to initialise -- the 'IfGblEnv'. See 'TcRnTypes.tcg_type_env_var' for -- 'TcRunTypes.TcGblEnv'  Simon Marlow committed May 30, 2008 563   David Himmelstrup committed Apr 18, 2006 564  hsc_global_rdr_env :: GlobalRdrEnv,  565 566 567 568 569  -- ^ A mapping from 'RdrName's that are in global scope during -- the compilation of the current file to more detailed -- information about those names. Not necessarily just the -- names directly imported by the module being compiled!  David Himmelstrup committed Apr 18, 2006 570  hsc_global_type_env :: TypeEnv  571 572 573  -- ^ Typing information about all those things in global scope. -- Not necessarily just the things directly imported by the module -- being compiled!  simonmar committed Mar 22, 2005 574  }  simonpj committed Oct 09, 2003 575 576 577  hscEPS :: HscEnv -> IO ExternalPackageState hscEPS hsc_env = readIORef (hsc_EPS hsc_env)  simonpj committed Jun 15, 2001 578   simonmar committed Mar 22, 2005 579 580 581 582 583 584 -- | A compilation target. -- -- A target may be supplied with the actual text of the -- module. If so, use this instead of the file contents (this -- is for use in an IDE where the file hasn't been saved by -- the user yet).  Simon Marlow committed Aug 27, 2008 585 data Target = Target  Thomas Schilling committed Oct 06, 2008 586 587 588 589 590  { targetId :: TargetId -- ^ module or filename , targetAllowObjCode :: Bool -- ^ object code allowed? , targetContents :: Maybe (StringBuffer,ClockTime) -- ^ in-memory text buffer? }  simonmar committed Mar 22, 2005 591 592  data TargetId  Simon Marlow committed Jul 25, 2006 593  = TargetModule ModuleName  simonmar committed May 16, 2005 594 595 596 597 598 599  -- ^ A module name: search for the file | TargetFile FilePath (Maybe Phase) -- ^ A filename: preprocess & parse it to find the module name. -- If specified, the Phase indicates how to compile this file -- (which phase to start from). Nothing indicates the starting phase -- should be determined from the suffix of the filename.  simonmar committed Mar 31, 2005 600  deriving Eq  simonmar committed Mar 22, 2005 601 602  pprTarget :: Target -> SDoc  Simon Marlow committed Aug 27, 2008 603 604 pprTarget (Target id obj _) = (if obj then char '*' else empty) <> pprTargetId id  simonmar committed Mar 22, 2005 605   Ian Lynagh committed Nov 25, 2006 606 607 608 instance Outputable Target where ppr = pprTarget  Simon Marlow committed Oct 09, 2007 609 pprTargetId :: TargetId -> SDoc  simonmar committed Mar 22, 2005 610 pprTargetId (TargetModule m) = ppr m  simonmar committed May 16, 2005 611 pprTargetId (TargetFile f _) = text f  simonmar committed Mar 22, 2005 612   Ian Lynagh committed Nov 25, 2006 613 614 615 instance Outputable TargetId where ppr = pprTargetId  616 -- | Helps us find information about modules in the home package  Simon Marlow committed Jul 25, 2006 617 type HomePackageTable = ModuleNameEnv HomeModInfo  618  -- Domain = modules in the home package that have been fully compiled  Simon Marlow committed Jul 25, 2006 619  -- "home" package name cached here for convenience  620 621  -- | Helps us find information about modules in the imported packages  simonmar committed Mar 22, 2005 622 623 type PackageIfaceTable = ModuleEnv ModIface -- Domain = modules in the imported packages  simonpj committed Sep 13, 2002 624   Simon Marlow committed Oct 09, 2007 625 emptyHomePackageTable :: HomePackageTable  Simon Marlow committed Jul 25, 2006 626 emptyHomePackageTable = emptyUFM  Simon Marlow committed Oct 09, 2007 627 628  emptyPackageIfaceTable :: PackageIfaceTable  simonpj committed Sep 13, 2002 629 630 emptyPackageIfaceTable = emptyModuleEnv  631 -- | Information about modules in the package being compiled  simonpj committed Oct 09, 2003 632 data HomeModInfo  Thomas Schilling committed Oct 14, 2008 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657  = HomeModInfo { hm_iface :: !ModIface, -- ^ The basic loaded interface file: every loaded module has one of -- these, even if it is imported from another package hm_details :: !ModDetails, -- ^ Extra information that has been created from the 'ModIface' for -- the module, typically during typechecking hm_linkable :: !(Maybe Linkable) -- ^ The actual artifact we would like to link to access things in -- this module. -- -- 'hm_linkable' might be Nothing: -- -- 1. If this is an .hs-boot module -- -- 2. Temporarily during compilation if we pruned away -- the old linkable because it was out of date. -- -- After a complete compilation ('GHC.load'), all 'hm_linkable' fields -- in the 'HomePackageTable' will be @Just@. -- -- When re-linking a module ('HscMain.HscNoRecomp'), we construct the -- 'HomeModInfo' by building a new 'ModDetails' from the old -- 'ModIface' (only). }  simonpj committed Oct 23, 2000 658   659 660 -- | Find the 'ModIface' for a 'Module', searching in both the loaded home -- and external package module information  Simon Marlow committed Jul 25, 2006 661 662 663 664 665 666 667 lookupIfaceByModule :: DynFlags -> HomePackageTable -> PackageIfaceTable -> Module -> Maybe ModIface lookupIfaceByModule dflags hpt pit mod  simonpj@microsoft.com committed Oct 06, 2006 668 669 670 671 672  | modulePackageId mod == thisPackage dflags = -- The module comes from the home package, so look first -- in the HPT. If it's not from the home package it's wrong to look -- in the HPT, because the HPT is indexed by *ModuleName* not Module fmap hm_iface (lookupUFM hpt (moduleName mod))  twanvl committed Jan 17, 2008 673  mplus lookupModuleEnv pit mod  simonpj@microsoft.com committed Oct 06, 2006 674 675 676 677 678 679 680  | otherwise = lookupModuleEnv pit mod -- Look in PIT only -- If the module does come from the home package, why do we look in the PIT as well? -- (a) In OneShot mode, even home-package modules accumulate in the PIT -- (b) Even in Batch (--make) mode, there is *one* case where a home-package -- module is in the PIT, namely GHC.Prim when compiling the base package.  chevalier@alum.wellesley.edu committed Dec 25, 2007 681 -- We could eliminate (b) if we wanted, by making GHC.Prim belong to a package  simonpj@microsoft.com committed Oct 06, 2006 682 -- of its own, but it doesn't seem worth the bother.  simonpj committed Sep 13, 2002 683 \end{code}  simonpj committed Oct 23, 2000 684   simonpj committed Jan 18, 2005 685 686  \begin{code}  chak@cse.unsw.edu.au. committed May 06, 2007 687 hptInstances :: HscEnv -> (ModuleName -> Bool) -> ([Instance], [FamInst])  688 -- ^ Find all the instance declarations (of classes and families) that are in  chak@cse.unsw.edu.au. committed May 06, 2007 689 -- modules imported by this one, directly or indirectly, and are in the Home  690 -- Package Table. This ensures that we don't see instances from modules @--make@  chak@cse.unsw.edu.au. committed May 06, 2007 691 -- compiled before this one, but which are not below this one.  simonpj committed Jan 27, 2005 692 hptInstances hsc_env want_this_module  693 694 695 696 697 698 699 700 701 702 703 704  = let (insts, famInsts) = unzip $flip hptAllThings hsc_env$ \mod_info -> do guard (want_this_module (moduleName (mi_module (hm_iface mod_info)))) let details = hm_details mod_info return (md_insts details, md_fam_insts details) in (concat insts, concat famInsts) hptVectInfo :: HscEnv -> VectInfo -- ^ Get the combined VectInfo of all modules in the home package table. In -- contrast to instances and rules, we don't care whether the modules are -- \"below\" us in the dependency sense. The VectInfo of those modules not \"below\" -- us does not affect the compilation of the current module. hptVectInfo = concatVectInfo . hptAllThings ((: []) . md_vect_info . hm_details)  simonpj committed Jan 18, 2005 705   Simon Marlow committed Jul 25, 2006 706 hptRules :: HscEnv -> [(ModuleName, IsBootInterface)] -> [CoreRule]  707 708 709 -- ^ Get rules from modules \"below\" this one (in the dependency sense) hptRules = hptSomeThingsBelowUs (md_rules . hm_details) False  simonpj@microsoft.com committed Oct 30, 2008 710 711 712 713 714 715  hptAnns :: HscEnv -> Maybe [(ModuleName, IsBootInterface)] -> [Annotation] -- ^ Get annotations from modules \"below\" this one (in the dependency sense) hptAnns hsc_env (Just deps) = hptSomeThingsBelowUs (md_anns . hm_details) False hsc_env deps hptAnns hsc_env Nothing = hptAllThings (md_anns . hm_details) hsc_env  716 717 718 719 720 hptAllThings :: (HomeModInfo -> [a]) -> HscEnv -> [a] hptAllThings extract hsc_env = concatMap extract (eltsUFM (hsc_HPT hsc_env)) hptSomeThingsBelowUs :: (HomeModInfo -> [a]) -> Bool -> HscEnv -> [(ModuleName, IsBootInterface)] -> [a] -- Get things from modules \"below\" this one (in the dependency sense)  simonpj committed Jan 18, 2005 721 -- C.f Inst.hptInstances  722 723 hptSomeThingsBelowUs extract include_hi_boot hsc_env deps | isOneShot (ghcMode (hsc_dflags hsc_env)) = []  simonpj committed Jan 18, 2005 724 725 726 727  | otherwise = let hpt = hsc_HPT hsc_env in  728  [ thing  simonpj committed Jan 18, 2005 729  | -- Find each non-hi-boot module below me  730 731  (mod, is_boot_mod) <- deps , include_hi_boot || not is_boot_mod  simonpj committed Jan 18, 2005 732   Simon Marlow committed Mar 02, 2006 733  -- unsavoury: when compiling the base package with --make, we  734  -- sometimes try to look up RULES etc for GHC.Prim. GHC.Prim won't  Simon Marlow committed Mar 02, 2006 735 736 737  -- be in the HPT, because we never compile it; it's in the EPT -- instead. ToDo: clean up, and remove this slightly bogus -- filter:  Simon Marlow committed Jul 25, 2006 738  , mod /= moduleName gHC_PRIM  Simon Marlow committed Mar 02, 2006 739   simonpj committed Jan 18, 2005 740  -- Look it up in the HPT  741 742 743  , let things = case lookupUFM hpt mod of Just info -> extract info Nothing -> pprTrace "WARNING in hptSomeThingsBelowUs" msg []  Ian Lynagh committed Apr 12, 2008 744 745  msg = vcat [ptext (sLit "missing module") <+> ppr mod, ptext (sLit "Probable cause: out-of-date interface files")]  simonpj@microsoft.com committed Nov 22, 2006 746  -- This really shouldn't happen, but see Trac #962  simonpj committed Jan 18, 2005 747 748  -- And get its dfuns  749  , thing <- things ]  simonpj@microsoft.com committed Oct 30, 2008 750 \end{code}  chak@cse.unsw.edu.au. committed May 07, 2007 751   simonpj@microsoft.com committed Oct 30, 2008 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 %************************************************************************ %* * \subsection{Dealing with Annotations} %* * %************************************************************************ \begin{code} prepareAnnotations :: HscEnv -> Maybe ModGuts -> IO AnnEnv -- ^ Deal with gathering annotations in from all possible places -- and combining them into a single 'AnnEnv' prepareAnnotations hsc_env mb_guts = do { eps <- hscEPS hsc_env ; let -- Extract annotations from the module being compiled if supplied one mb_this_module_anns = fmap (mkAnnEnv . mg_anns) mb_guts -- Extract dependencies of the module if we are supplied one, -- otherwise load annotations from all home package table -- entries regardless of dependency ordering. home_pkg_anns = (mkAnnEnv . hptAnns hsc_env) $fmap (dep_mods . mg_deps) mb_guts other_pkg_anns = eps_ann_env eps ann_env = foldl1' plusAnnEnv$ catMaybes [mb_this_module_anns, Just home_pkg_anns, Just other_pkg_anns] ; return ann_env }  simonpj committed Jan 18, 2005 776 777 \end{code}  Simon Marlow committed Jul 25, 2006 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 %************************************************************************ %* * \subsection{The Finder cache} %* * %************************************************************************ \begin{code} -- | The 'FinderCache' maps home module names to the result of -- searching for that module. It records the results of searching for -- modules along the search path. On @:load@, we flush the entire -- contents of this cache. -- -- Although the @FinderCache@ range is 'FindResult' for convenience , -- in fact it will only ever contain 'Found' or 'NotFound' entries. -- type FinderCache = ModuleNameEnv FindResult -- | The result of searching for an imported module. data FindResult = Found ModLocation Module  798  -- ^ The module was found  Simon Marlow committed Jul 25, 2006 799  | NoPackage PackageId  800  -- ^ The requested package was not found  Simon Marlow committed Jul 25, 2006 801  | FoundMultiple [PackageId]  802  -- ^ _Error_: both in multiple packages  Simon Marlow committed Jul 25, 2006 803  | PackageHidden PackageId  804  -- ^ For an explicit source import, the package containing the module is  Simon Marlow committed Jul 25, 2006 805 806  -- not exposed. | ModuleHidden PackageId  807  -- ^ For an explicit source import, the package containing the module is  Simon Marlow committed Jul 25, 2006 808  -- exposed, but the module itself is hidden.  Simon Marlow committed Aug 11, 2006 809  | NotFound [FilePath] (Maybe PackageId)  810  -- ^ The module was not found, the specified places were searched  Simon Marlow committed Jul 25, 2006 811  | NotFoundInPackage PackageId  812  -- ^ The module was not found in this package  Simon Marlow committed Jul 25, 2006 813 814 815 816 817 818  -- | Cache that remembers where we found a particular module. Contains both -- home modules and package modules. On @:load@, only home modules are -- purged from this cache. type ModLocationCache = ModuleEnv ModLocation \end{code}  simonpj committed Jan 18, 2005 819   sewardj committed Oct 11, 2000 820 821 %************************************************************************ %* *  simonpj committed Oct 11, 2000 822 \subsection{Symbol tables and Module details}  sewardj committed Oct 11, 2000 823 824 825 826 %* * %************************************************************************ \begin{code}  827 828 829 830 831 832 833 834 835 -- | A 'ModIface' plus a 'ModDetails' summarises everything we know -- about a compiled module. The 'ModIface' is the stuff *before* linking, -- and can be written out to an interface file. The 'ModDetails is after -- linking and can be completely recovered from just the 'ModIface'. -- -- When we read an interface file, we also construct a 'ModIface' from it, -- except that we explicitly make the 'mi_decls' and a few other fields empty; -- as when reading we consolidate the declarations etc. into a number of indexed -- maps and environments in the 'ExternalPackageState'.  sewardj committed Oct 20, 2000 836 837 data ModIface = ModIface {  838 839 840  mi_module :: !Module, -- ^ Name of the module we are for mi_iface_hash :: !Fingerprint, -- ^ Hash of the whole interface mi_mod_hash :: !Fingerprint, -- ^ Hash of the ABI only  simonpj committed Oct 09, 2003 841   842 843 844  mi_orphan :: !WhetherHasOrphans, -- ^ Whether this module has orphans mi_finsts :: !WhetherHasFamInst, -- ^ Whether this module has family instances mi_boot :: !IsBootInterface, -- ^ Read from an hi-boot file?  simonmar committed Jan 03, 2002 845   simonpj committed Oct 24, 2002 846  mi_deps :: Dependencies,  847 848 849  -- ^ The dependencies of the module, consulted for directly -- imported modules only  simonpj committed Oct 09, 2003 850 851  -- This is consulted for directly-imported modules, -- but not for anything else (hence lazy)  852 853  mi_usages :: [Usage], -- ^ Usages; kept sorted so that it's easy to decide  simonmar committed Nov 23, 2001 854  -- whether to write a new iface file (changing usages  Simon Marlow committed May 28, 2008 855  -- doesn't affect the hash of this module)  856   simonpj committed Sep 13, 2002 857  -- NOT STRICT! we read this field lazily from the interface file  simonpj committed Oct 24, 2002 858  -- It is *only* consulted by the recompilation checker  sewardj committed Oct 11, 2000 859   simonpj committed Oct 09, 2003 860 861 862  -- Exports -- Kept sorted by (mod,occ), to make version comparisons easier mi_exports :: ![IfaceExport],  863 864 865 866  -- ^ Records the modules that are the declaration points for things -- exported by this module, and the 'OccName's of those things mi_exp_hash :: !Fingerprint, -- ^ Hash of export list  simonpj committed Oct 23, 2000 867   simonpj committed Oct 09, 2003 868  mi_fixities :: [(OccName,Fixity)],  869 870  -- ^ Fixities  simonpj committed Oct 09, 2003 871  -- NOT STRICT! we read this field lazily from the interface file  simonpj committed Oct 17, 2000 872   Ian Lynagh committed Jul 20, 2008 873  mi_warns :: Warnings,  874 875  -- ^ Warnings  simonpj committed Oct 09, 2003 876  -- NOT STRICT! we read this field lazily from the interface file  sewardj committed Oct 20, 2000 877   simonpj@microsoft.com committed Oct 30, 2008 878 879 880 881 882  mi_anns :: [IfaceAnnotation], -- ^ Annotations -- NOT STRICT! we read this field lazily from the interface file  simonpj committed Oct 09, 2003 883  -- Type, class and variable declarations  Simon Marlow committed May 28, 2008 884  -- The hash of an Id changes if its fixity or deprecations change  simonpj committed Oct 09, 2003 885 886  -- (as well as its type of course) -- Ditto data constructors, class operations, except that  Simon Marlow committed May 28, 2008 887  -- the hash of the parent class/tycon changes  888  mi_decls :: [(Fingerprint,IfaceDecl)], -- ^ Sorted type, variable, class etc. declarations  simonpj committed Oct 09, 2003 889   simonmar committed Feb 14, 2005 890  mi_globals :: !(Maybe GlobalRdrEnv),  891 892  -- ^ Binds all the things defined at the top level in -- the /original source/ code for this module. which  simonmar committed May 17, 2005 893 894 895 896 897 898 899  -- is NOT the same as mi_exports, nor mi_decls (which -- may contains declarations for things not actually -- defined by the user). Used for GHCi and for inspecting -- the contents of modules via the GHC API only. -- -- (We need the source file to figure out the -- top-level environment, if we didn't compile this module  900  -- from source then this field contains @Nothing@).  simonmar committed May 17, 2005 901 902  -- -- Strictly speaking this field should live in the  903  -- 'HomeModInfo', but that leads to more plumbing.  simonmar committed Feb 14, 2005 904   simonpj committed Oct 09, 2003 905  -- Instance declarations and rules  906 907 908 909 910  mi_insts :: [IfaceInst], -- ^ Sorted class instance mi_fam_insts :: [IfaceFamInst], -- ^ Sorted family instances mi_rules :: [IfaceRule], -- ^ Sorted rules mi_orphan_hash :: !Fingerprint, -- ^ Hash for orphan rules and -- class and family instances  chak@cse.unsw.edu.au. committed Oct 13, 2006 911  -- combined  simonpj committed Oct 09, 2003 912   913  mi_vect_info :: !IfaceVectInfo, -- ^ Vectorisation information  chak@cse.unsw.edu.au. committed May 04, 2007 914   simonpj committed Oct 09, 2003 915 916 917  -- Cached environments for easy lookup -- These are computed (lazily) from other fields -- and are not put into the interface file  918 919  mi_warn_fn :: Name -> Maybe WarningTxt, -- ^ Cached lookup for 'mi_warns' mi_fix_fn :: OccName -> Fixity, -- ^ Cached lookup for 'mi_fixities'  Simon Marlow committed May 28, 2008 920  mi_hash_fn :: OccName -> Maybe (OccName, Fingerprint),  921 922  -- ^ Cached lookup for 'mi_decls'. -- The @Nothing@ in 'mi_hash_fn' means that the thing  simonpj committed Oct 09, 2003 923  -- isn't in decls. It's useful to know that when  924  -- seeing if we are up to date wrt. the old interface.  Simon Marlow committed Oct 11, 2006 925  -- The 'OccName' is the parent of the name, if it has one.  andy@galois.com committed Jul 17, 2007 926  mi_hpc :: !AnyHpcUsage  927  -- ^ True if this program uses Hpc at any point in the program.  sewardj committed Oct 20, 2000 928  }  sewardj committed Oct 11, 2000 929   930 931 932 -- | The 'ModDetails' is essentially a cache for information in the 'ModIface' -- for home modules only. Information relating to packages will be loaded into -- global environments in 'ExternalPackageState'.  sewardj committed Oct 20, 2000 933 934 data ModDetails = ModDetails {  chak@cse.unsw.edu.au. committed Oct 18, 2006 935 936  -- The next two fields are created by the typechecker md_exports :: [AvailInfo],  937 938  md_types :: !TypeEnv, -- ^ Local type environment for this particular module md_insts :: ![Instance], -- ^ 'DFunId's for the instances in this module  chak@cse.unsw.edu.au. committed Oct 18, 2006 939  md_fam_insts :: ![FamInst],  940  md_rules :: ![CoreRule], -- ^ Domain may include 'Id's from other modules  simonpj@microsoft.com committed Oct 30, 2008 941 942  md_anns :: ![Annotation], -- ^ Annotations present in this module: currently -- they only annotate things also declared in this module  943  md_vect_info :: !VectInfo -- ^ Module vectorisation information  sewardj committed Oct 11, 2000 944  }  simonpj committed Mar 08, 2001 945   Simon Marlow committed Oct 09, 2007 946 emptyModDetails :: ModDetails  simonmar committed Mar 24, 2005 947 emptyModDetails = ModDetails { md_types = emptyTypeEnv,  Simon Marlow committed Oct 11, 2006 948  md_exports = [],  chak@cse.unsw.edu.au. committed Sep 20, 2006 949 950  md_insts = [], md_rules = [],  mnislaih committed Dec 10, 2006 951  md_fam_insts = [],  simonpj@microsoft.com committed Oct 30, 2008 952  md_anns = [],  chak@cse.unsw.edu.au. committed May 07, 2007 953 954  md_vect_info = noVectInfo }  chak@cse.unsw.edu.au. committed Sep 20, 2006 955   956 -- | Records the modules directly imported by a module for extracting e.g. usage information  Simon Marlow committed May 28, 2008 957 type ImportedMods = ModuleEnv [(ModuleName, Bool, SrcSpan)]  958 959 -- TODO: we are not actually using the codomain of this type at all, so it can be -- replaced with ModuleEnv ()  Simon Marlow committed Nov 06, 2007 960   961 962 963 964 -- | A ModGuts is carried through the compiler, accumulating stuff as it goes -- There is only one ModGuts at any time, the one for the module -- being compiled right now. Once it is compiled, a 'ModIface' and -- 'ModDetails' are extracted and the ModGuts is dicarded.  simonpj committed Sep 13, 2002 965 966 data ModGuts = ModGuts {  967 968 969 970 971 972 973 974  mg_module :: !Module, -- ^ Module being compiled mg_boot :: IsBootInterface, -- ^ Whether it's an hs-boot module mg_exports :: ![AvailInfo], -- ^ What it exports mg_deps :: !Dependencies, -- ^ What it depends on, directly or -- otherwise mg_dir_imps :: !ImportedMods, -- ^ Directly-imported modules; used to -- generate initialisation code mg_used_names:: !NameSet, -- ^ What the module needed (used in 'MkIface.mkIface')  chak@cse.unsw.edu.au. committed Oct 10, 2006 975   976  mg_rdr_env :: !GlobalRdrEnv, -- ^ Top-level lexical environment  chak@cse.unsw.edu.au. committed Oct 10, 2006 977   simonpj@microsoft.com committed Aug 22, 2007 978  -- These fields all describe the things **declared in this module**  979 980 981 982 983 984 985 986 987 988 989 990  mg_fix_env :: !FixityEnv, -- ^ Fixities declared in this module -- TODO: I'm unconvinced this is actually used anywhere mg_types :: !TypeEnv, -- ^ Types declared in this module mg_insts :: ![Instance], -- ^ Class instances declared in this module mg_fam_insts :: ![FamInst], -- ^ Family instances declared in this module mg_rules :: ![CoreRule], -- ^ Before the core pipeline starts, contains -- rules declared in this module. After the core -- pipeline starts, it is changed to contain all -- known rules for those things imported mg_binds :: ![CoreBind], -- ^ Bindings for this module mg_foreign :: !ForeignStubs, -- ^ Foreign exports declared in this module mg_warns :: !Warnings, -- ^ Warnings declared in the module  simonpj@microsoft.com committed Oct 30, 2008 991  mg_anns :: [Annotation], -- ^ Annotations declared in this module  992 993 994  mg_hpc_info :: !HpcInfo, -- ^ Coverage tick boxes in the module mg_modBreaks :: !ModBreaks, -- ^ Breakpoints for the module mg_vect_info :: !VectInfo, -- ^ Pool of vectorised declarations in the module  simonpj@microsoft.com committed Aug 22, 2007 995 996 997 998 999 1000  -- The next two fields are unusual, because they give instance -- environments for *all* modules in the home package, including -- this module, rather than for *just* this module. -- Reason: when looking up an instance we don't want to have to -- look at each module in the home package in turn  Thomas Schilling committed Jul 20, 2008 1001  mg_inst_env :: InstEnv,  1002 1003  -- ^ Class instance environment from /home-package/ modules (including -- this one); c.f. 'tcg_inst_env'  Thomas Schilling committed Jul 20, 2008 1004 1005  mg_fam_inst_env :: FamInstEnv -- ^ Type-family instance enviroment for /home-package/ modules  1006  -- (including this one); c.f. 'tcg_fam_inst_env'  simonpj committed Sep 13, 2002 1007 1008  }  1009 1010 1011 1012 1013 1014 1015 1016 -- The ModGuts takes on several slightly different forms: -- -- After simplification, the following fields change slightly: -- mg_rules Orphan rules only (local ones now attached to binds) -- mg_binds With rules attached -- | A CoreModule consists of just the fields of a 'ModGuts' that are needed for -- the 'GHC.compileToCoreModule' interface.  1017 1018 data CoreModule = CoreModule {  1019  -- | Module name  1020  cm_module :: !Module,  1021  -- | Type environment for types declared in this module  1022  cm_types :: !TypeEnv,  1023  -- | Declarations  chevalier@alum.wellesley.edu committed Dec 25, 2007 1024  cm_binds :: [CoreBind],  1025  -- | Imports  chevalier@alum.wellesley.edu committed Dec 25, 2007 1026  cm_imports :: ![Module]  1027 1028 1029 1030 1031 1032  } instance Outputable CoreModule where ppr (CoreModule {cm_module = mn, cm_types = te, cm_binds = cb}) = text "%module" <+> ppr mn <+> ppr te  vcat (map ppr cb)  simonpj committed Sep 13, 2002 1033 -- The ModGuts takes on several slightly different forms:  simonpj committed Mar 08, 2001 1034 --  simonpj committed Sep 13, 2002 1035 1036 1037 1038