HscTypes.lhs 75.7 KB
Newer Older
1 2
%
% (c) The University of Glasgow, 2006
3 4 5 6
%
\section[HscTypes]{Types for the per-module compiler}

\begin{code}
7
-- | Types for the per-module compiler
8
module HscTypes ( 
9 10 11 12 13 14 15 16 17 18
        -- * 'Ghc' monad stuff
        Ghc(..), GhcT(..), liftGhcT,
        GhcMonad(..), WarnLogMonad(..),
        liftIO,
        ioMsgMaybe, ioMsg,
        logWarnings, clearWarnings, hasWarnings,
        SourceError, GhcApiError, mkSrcErr, srcErrorMessages, mkApiErr,
        handleSourceError,
        reflectGhc, reifyGhc,

19
	-- * Sessions and compilation state
20
	Session(..), withSession, modifySession,
21
        HscEnv(..), hscEPS,
Simon Marlow's avatar
Simon Marlow committed
22
	FinderCache, FindResult(..), ModLocationCache,
23 24
	Target(..), TargetId(..), pprTarget, pprTargetId,
	ModuleGraph, emptyMG,
25

26
        -- * Information about modules
27
	ModDetails(..),	emptyModDetails,
28
	ModGuts(..), CoreModule(..), CgGuts(..), ForeignStubs(..),
Simon Marlow's avatar
Simon Marlow committed
29
        ImportedMods,
30

31
	ModSummary(..), ms_mod_name, showModMsg, isBootSummary,
32
	msHsFilePath, msHiFilePath, msObjFilePath,
33

34
        -- * Information about the module being compiled
35 36
	HscSource(..), isHsBoot, hscSourceString,	-- Re-exported from DriverPhases
	
37
	-- * State relating to modules in this package
38
	HomePackageTable, HomeModInfo(..), emptyHomePackageTable,
chak@cse.unsw.edu.au.'s avatar
chak@cse.unsw.edu.au. committed
39
	hptInstances, hptRules, hptVectInfo,
40 41
	
	-- * State relating to known packages
42
	ExternalPackageState(..), EpsStats(..), addEpsInStats,
43
	PackageTypeEnv, PackageIfaceTable, emptyPackageIfaceTable,
Simon Marlow's avatar
Simon Marlow committed
44
	lookupIfaceByModule, emptyModIface,
45 46
	
	PackageInstEnv, PackageRuleBase,
47

48
        -- * Interactive context
49
	InteractiveContext(..), emptyInteractiveContext, 
50
	icPrintUnqual, mkPrintUnqualified, extendInteractiveContext,
mnislaih's avatar
mnislaih committed
51
        substInteractiveContext,
52

53
	-- * Interfaces
Ian Lynagh's avatar
Ian Lynagh committed
54 55
	ModIface(..), mkIfaceWarnCache, mkIfaceHashCache, mkIfaceFixCache,
	emptyIfaceWarnCache,
56

57
        -- * Fixity
58
	FixityEnv, FixItem(..), lookupFixity, emptyFixityEnv,
59

60 61 62
        -- * TyThings and type environments
	TyThing(..),
	tyThingClass, tyThingTyCon, tyThingDataCon, tyThingId,
63
	implicitTyThings, isImplicitTyThing,
64 65
	
	TypeEnv, lookupType, lookupTypeHscEnv, mkTypeEnv, emptyTypeEnv,
66
	extendTypeEnv, extendTypeEnvList, extendTypeEnvWithIds, lookupTypeEnv,
67
	typeEnvElts, typeEnvClasses, typeEnvTyCons, typeEnvIds,
68
	typeEnvDataCons,
69

70 71 72 73
        -- * MonadThings
        MonadThings(..),

        -- * Information on imports and exports
74
	WhetherHasOrphans, IsBootInterface, Usage(..), 
75
	Dependencies(..), noDependencies,
76
	NameCache(..), OrigNameCache, OrigIParamCache,
77
	Avails, availsToNameSet, availsToNameEnv, availName, availNames,
78
	GenAvailInfo(..), AvailInfo, RdrAvailInfo, 
79
	IfaceExport,
80

81
	-- * Warnings
Ian Lynagh's avatar
Ian Lynagh committed
82
	Warnings(..), WarningTxt(..), plusWarns,
83

84
	-- * Linker stuff
85 86
	Linkable(..), isObjectLinkable,
	Unlinked(..), CompiledByteCode,
andy@galois.com's avatar
andy@galois.com committed
87
	isObject, nameOfObject, isInterpretable, byteCodeOfObject,
88 89
        
        -- * Program coverage
90
        HpcInfo(..), emptyHpcInfo, isHpcUsed, AnyHpcUsage,
91

92
        -- * Breakpoints
93 94
        ModBreaks (..), BreakIndex, emptyModBreaks,

95
        -- * Vectorisation information
96 97
        VectInfo(..), IfaceVectInfo(..), noVectInfo, plusVectInfo, 
        noIfaceVectInfo
98
    ) where
99 100 101

#include "HsVersions.h"

102 103
#ifdef GHCI
import ByteCodeAsm	( CompiledByteCode )
104
import {-# SOURCE #-}  InteractiveEval ( Resume )
105 106
#endif

107
import RdrName
108
import Name
109
import NameEnv
110
import NameSet	
111
import OccName		( OccName, OccEnv, lookupOccEnv, mkOccEnv, emptyOccEnv, 
112
			  extendOccEnv )
113
import Module
114
import InstEnv		( InstEnv, Instance )
115
import FamInstEnv	( FamInstEnv, FamInst )
116
import Rules		( RuleBase )
117
import CoreSyn		( CoreBind )
chak@cse.unsw.edu.au.'s avatar
chak@cse.unsw.edu.au. committed
118
import VarEnv
119
import VarSet
120
import Var
121
import Id
mnislaih's avatar
mnislaih committed
122
import Type		
123

124
import Class		( Class, classSelIds, classATs, classTyCon )
125
import TyCon
126
import DataCon		( DataCon, dataConImplicitIds, dataConWrapId )
127
import PrelNames	( gHC_PRIM )
128
import Packages hiding ( Version(..) )
simonpj@microsoft.com's avatar
simonpj@microsoft.com committed
129
import DynFlags		( DynFlags(..), isOneShot, HscTarget (..) )
130
import DriverPhases	( HscSource(..), isHsBoot, hscSourceString, Phase )
Ian Lynagh's avatar
Ian Lynagh committed
131
import BasicTypes	( IPName, Fixity, defaultFixity, WarningTxt(..) )
dias@eecs.harvard.edu's avatar
dias@eecs.harvard.edu committed
132
import OptimizationFuel	( OptFuelState )
133
import IfaceSyn
134
import FiniteMap	( FiniteMap )
135
import CoreSyn		( CoreRule )
136
import Maybes		( orElse, expectJust, catMaybes )
137
import Outputable
138
import BreakArray
139
import SrcLoc		( SrcSpan, Located )
140
import LazyUniqFM		( lookupUFM, eltsUFM, emptyUFM )
141
import UniqSupply	( UniqSupply )
142
import FastString
143
import StringBuffer	( StringBuffer )
144
import Fingerprint
145 146 147 148 149 150
import MonadUtils
import Bag              ( emptyBag, unionBags, isEmptyBag )
import Data.Dynamic     ( Typeable )
import qualified Data.Dynamic as Dyn
import Bag              ( bagToList )
import ErrUtils         ( ErrorMessages, WarningMessages, Messages )
Simon Marlow's avatar
Simon Marlow committed
151

152
import System.FilePath
Simon Marlow's avatar
Simon Marlow committed
153
import System.Time	( ClockTime )
154
import Data.IORef
155
import Data.Array       ( Array, array )
mnislaih's avatar
mnislaih committed
156
import Data.List
157
import Control.Monad    ( mplus, guard, liftM )
158
import Exception
159 160
\end{code}

161

162 163
%************************************************************************
%*									*
164
\subsection{Compilation environment}
165 166 167
%*									*
%************************************************************************

168 169 170 171 172 173

\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.
174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 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 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319
data Session = Session !(IORef HscEnv) !(IORef WarningMessages)

mkSrcErr :: ErrorMessages -> SourceError
srcErrorMessages :: SourceError -> ErrorMessages
mkApiErr :: SDoc -> GhcApiError

-- | 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

-- | 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
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
320

321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 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 393 394 395
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

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
    Nothing -> throw (mkSrcErr errs)
    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
396

397 398 399
-- > Dual to 'reflectGhc'.  See its documentation.
reifyGhc :: (Session -> IO a) -> Ghc a
reifyGhc act = Ghc $ act
400 401
\end{code}

402
\begin{code}
403 404 405 406 407 408 409 410 411 412
-- | HscEnv is like 'Session', except that some of the fields are immutable.
-- 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.
413
data HscEnv 
414 415
  = HscEnv { 
	hsc_dflags :: DynFlags,
416
		-- ^ The dynamic flag settings
417 418

	hsc_targets :: [Target],
419
		-- ^ The targets (or roots) of the current session
420

421
	hsc_mod_graph :: ModuleGraph,
422
		-- ^ The module graph of the current session
423 424

	hsc_IC :: InteractiveContext,
425
		-- ^ The context for evaluating interactive statements
426 427

	hsc_HPT    :: HomePackageTable,
428 429
		-- ^ The home package table describes already-compiled
		-- home-package modules, /excluding/ the module we 
430 431 432
		-- are compiling right now.
		-- (In one-shot mode the current module is the only
		--  home-package module, so hsc_HPT is empty.  All other
433
		--  modules count as \"external-package\" modules.
434
		--  However, even in GHCi mode, hi-boot interfaces are
435
		--  demand-loaded into the external-package table.)
436
		--
437
		-- 'hsc_HPT' is not mutable because we only demand-load 
438
		-- external packages; the home package is eagerly 
439
		-- loaded, module by module, by the compilation manager.
440
		--	
441
		-- The HPT may contain modules compiled earlier by @--make@
442
		-- but not actually below the current module in the dependency
443 444 445
		-- graph.

		-- (This changes a previous invariant: changed Jan 05.)
446
	
447
	hsc_EPS	:: {-# UNPACK #-} !(IORef ExternalPackageState),
448 449 450 451
	        -- ^ Information about the currently loaded external packages.
	        -- This is mutable because packages will be demand-loaded during
	        -- a compilation run as required.
	
452
	hsc_NC	:: {-# UNPACK #-} !(IORef NameCache),
453 454
		-- ^ As with 'hsc_EPS', this is side-effected by compiling to
		-- reflect sucking in interface files.  They cache the state of
455 456
		-- external interface files, in effect.

Simon Marlow's avatar
Simon Marlow committed
457
	hsc_FC   :: {-# UNPACK #-} !(IORef FinderCache),
458
	        -- ^ The cached result of performing finding in the file system
Simon Marlow's avatar
Simon Marlow committed
459
	hsc_MLC  :: {-# UNPACK #-} !(IORef ModLocationCache),
460 461
		-- ^ This caches the location of modules, so we don't have to 
		-- search the filesystem multiple times. See also 'hsc_FC'.
Simon Marlow's avatar
Simon Marlow committed
462

dias@eecs.harvard.edu's avatar
dias@eecs.harvard.edu committed
463
        hsc_OptFuel :: OptFuelState,
464
                -- ^ Settings to control the use of \"optimization fuel\":
dias@eecs.harvard.edu's avatar
dias@eecs.harvard.edu committed
465 466 467
                -- by limiting the number of transformations,
                -- we can use binary search to help find compiler bugs.

468
        hsc_type_env_var :: Maybe (Module, IORef TypeEnv),
469 470 471
                -- ^ Used for one-shot compilation only, to initialise
                -- the 'IfGblEnv'. See 'TcRnTypes.tcg_type_env_var' for 
                -- 'TcRunTypes.TcGblEnv'
472

473
        hsc_global_rdr_env :: GlobalRdrEnv,
474 475 476 477 478
                -- ^ 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!
        
479
        hsc_global_type_env :: TypeEnv
480 481 482
                -- ^ Typing information about all those things in global scope.
                -- Not necessarily just the things directly imported by the module 
                -- being compiled!
483
 }
484 485 486

hscEPS :: HscEnv -> IO ExternalPackageState
hscEPS hsc_env = readIORef (hsc_EPS hsc_env)
487

488 489 490 491 492 493
-- | 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's avatar
Simon Marlow committed
494 495 496 497
data Target = Target
      TargetId                          -- module or filename
      Bool                              -- object code allowed?
      (Maybe (StringBuffer,ClockTime))  -- in-memory text buffer?
498 499

data TargetId
Simon Marlow's avatar
Simon Marlow committed
500
  = TargetModule ModuleName
501 502 503 504 505 506
	-- ^ 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.
507
  deriving Eq
508 509

pprTarget :: Target -> SDoc
Simon Marlow's avatar
Simon Marlow committed
510 511
pprTarget (Target id obj _) = 
   (if obj then char '*' else empty) <> pprTargetId id
512

Ian Lynagh's avatar
Ian Lynagh committed
513 514 515
instance Outputable Target where
    ppr = pprTarget

Simon Marlow's avatar
Simon Marlow committed
516
pprTargetId :: TargetId -> SDoc
517
pprTargetId (TargetModule m) = ppr m
518
pprTargetId (TargetFile f _) = text f
519

Ian Lynagh's avatar
Ian Lynagh committed
520 521 522
instance Outputable TargetId where
    ppr = pprTargetId

523
-- | Helps us find information about modules in the home package
Simon Marlow's avatar
Simon Marlow committed
524
type HomePackageTable  = ModuleNameEnv HomeModInfo
525
	-- Domain = modules in the home package that have been fully compiled
Simon Marlow's avatar
Simon Marlow committed
526
	-- "home" package name cached here for convenience
527 528

-- | Helps us find information about modules in the imported packages
529 530
type PackageIfaceTable = ModuleEnv ModIface
	-- Domain = modules in the imported packages
531

Simon Marlow's avatar
Simon Marlow committed
532
emptyHomePackageTable :: HomePackageTable
Simon Marlow's avatar
Simon Marlow committed
533
emptyHomePackageTable  = emptyUFM
Simon Marlow's avatar
Simon Marlow committed
534 535

emptyPackageIfaceTable :: PackageIfaceTable
536 537
emptyPackageIfaceTable = emptyModuleEnv

538
-- | Information about modules in the package being compiled
539
data HomeModInfo 
540 541 542 543 544 545 546 547 548 549 550 551 552 553 554
  = 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
555
		--      the old linkable because it was out of date.
556
		--
557 558 559 560 561 562 563
		-- 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).
        }
564

565 566
-- | Find the 'ModIface' for a 'Module', searching in both the loaded home
-- and external package module information
Simon Marlow's avatar
Simon Marlow committed
567 568 569 570 571 572 573
lookupIfaceByModule
	:: DynFlags
	-> HomePackageTable
	-> PackageIfaceTable
	-> Module
	-> Maybe ModIface
lookupIfaceByModule dflags hpt pit mod
574 575 576 577 578
  | 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)) 
579
    `mplus` lookupModuleEnv pit mod
580 581 582 583 584 585 586

  | 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.
587
-- We could eliminate (b) if we wanted, by making GHC.Prim belong to a package
588
-- of its own, but it doesn't seem worth the bother.
589
\end{code}
590

591 592

\begin{code}
593
hptInstances :: HscEnv -> (ModuleName -> Bool) -> ([Instance], [FamInst])
594
-- ^ Find all the instance declarations (of classes and families) that are in
595
-- modules imported by this one, directly or indirectly, and are in the Home
596
-- Package Table.  This ensures that we don't see instances from modules @--make@
597
-- compiled before this one, but which are not below this one.
598
hptInstances hsc_env want_this_module
599 600 601 602 603 604 605 606 607 608 609 610
  = 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)
611

Simon Marlow's avatar
Simon Marlow committed
612
hptRules :: HscEnv -> [(ModuleName, IsBootInterface)] -> [CoreRule]
613 614 615 616 617 618 619 620
-- ^ Get rules from modules \"below\" this one (in the dependency sense)
hptRules = hptSomeThingsBelowUs (md_rules . hm_details) False

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)
621
-- C.f Inst.hptInstances
622 623
hptSomeThingsBelowUs extract include_hi_boot hsc_env deps
 | isOneShot (ghcMode (hsc_dflags hsc_env)) = []
624 625 626 627
  | otherwise
  = let 
	hpt = hsc_HPT hsc_env
    in
628
    [ thing
629
    |	-- Find each non-hi-boot module below me
630 631
      (mod, is_boot_mod) <- deps
    , include_hi_boot || not is_boot_mod
632

633
	-- unsavoury: when compiling the base package with --make, we
634
	-- sometimes try to look up RULES etc for GHC.Prim.  GHC.Prim won't
635 636 637
	-- 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's avatar
Simon Marlow committed
638
    , mod /= moduleName gHC_PRIM
639

640
	-- Look it up in the HPT
641 642 643
    , let things = case lookupUFM hpt mod of
		    Just info -> extract info
		    Nothing -> pprTrace "WARNING in hptSomeThingsBelowUs" msg [] 
Ian Lynagh's avatar
Ian Lynagh committed
644 645
	  msg = vcat [ptext (sLit "missing module") <+> ppr mod,
		      ptext (sLit "Probable cause: out-of-date interface files")]
646
			-- This really shouldn't happen, but see Trac #962
647 648

	-- And get its dfuns
649
    , thing <- things ]
chak@cse.unsw.edu.au.'s avatar
chak@cse.unsw.edu.au. committed
650

651 652
\end{code}

Simon Marlow's avatar
Simon Marlow committed
653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672
%************************************************************************
%*									*
\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
673
	-- ^ The module was found
Simon Marlow's avatar
Simon Marlow committed
674
  | NoPackage PackageId
675
	-- ^ The requested package was not found
Simon Marlow's avatar
Simon Marlow committed
676
  | FoundMultiple [PackageId]
677
	-- ^ _Error_: both in multiple packages
Simon Marlow's avatar
Simon Marlow committed
678
  | PackageHidden PackageId
679
	-- ^ For an explicit source import, the package containing the module is
Simon Marlow's avatar
Simon Marlow committed
680 681
	-- not exposed.
  | ModuleHidden  PackageId
682
	-- ^ For an explicit source import, the package containing the module is
Simon Marlow's avatar
Simon Marlow committed
683
	-- exposed, but the module itself is hidden.
684
  | NotFound [FilePath] (Maybe PackageId)
685
	-- ^ The module was not found, the specified places were searched
Simon Marlow's avatar
Simon Marlow committed
686
  | NotFoundInPackage PackageId
687
	-- ^ The module was not found in this package
Simon Marlow's avatar
Simon Marlow committed
688 689 690 691 692 693

-- | 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}
694

695 696
%************************************************************************
%*									*
697
\subsection{Symbol tables and Module details}
698 699 700 701
%*									*
%************************************************************************

\begin{code}
702 703 704 705 706 707 708 709 710
-- | 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'.
711 712
data ModIface 
   = ModIface {
713 714 715
        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
716

717 718 719
        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?
720

721
	mi_deps	    :: Dependencies,
722 723 724
	        -- ^ The dependencies of the module, consulted for directly
	        -- imported modules only
	
725 726
		-- This is consulted for directly-imported modules,
		-- but not for anything else (hence lazy)
727 728
        mi_usages   :: [Usage],
                -- ^ Usages; kept sorted so that it's easy to decide
729
		-- whether to write a new iface file (changing usages
730
		-- doesn't affect the hash of this module)
731
        
732
		-- NOT STRICT!  we read this field lazily from the interface file
733
		-- It is *only* consulted by the recompilation checker
734

735 736 737
		-- Exports
		-- Kept sorted by (mod,occ), to make version comparisons easier
        mi_exports  :: ![IfaceExport],
738 739 740 741
                -- ^ 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
742

743
        mi_fixities :: [(OccName,Fixity)],
744 745
                -- ^ Fixities
        
746
		-- NOT STRICT!  we read this field lazily from the interface file
747

Ian Lynagh's avatar
Ian Lynagh committed
748
	mi_warns  :: Warnings,
749 750
		-- ^ Warnings
		
751
		-- NOT STRICT!  we read this field lazily from the interface file
752

753
		-- Type, class and variable declarations
754
		-- The hash of an Id changes if its fixity or deprecations change
755 756
		--	(as well as its type of course)
		-- Ditto data constructors, class operations, except that 
757
		-- the hash of the parent class/tycon changes
758
	mi_decls :: [(Fingerprint,IfaceDecl)],	-- ^ Sorted type, variable, class etc. declarations
759

760
        mi_globals  :: !(Maybe GlobalRdrEnv),
761 762
		-- ^ Binds all the things defined at the top level in
		-- the /original source/ code for this module. which
763 764 765 766 767 768 769
		-- 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
770
		-- from source then this field contains @Nothing@).
771 772
		--
		-- Strictly speaking this field should live in the
773
		-- 'HomeModInfo', but that leads to more plumbing.
774

775
		-- Instance declarations and rules
776 777 778 779 780
	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
781
					-- combined
782

783
        mi_vect_info :: !IfaceVectInfo, -- ^ Vectorisation information
784

785 786 787
		-- Cached environments for easy lookup
		-- These are computed (lazily) from other fields
		-- and are not put into the interface file
788 789
	mi_warn_fn  :: Name -> Maybe WarningTxt,        -- ^ Cached lookup for 'mi_warns'
	mi_fix_fn  :: OccName -> Fixity,	        -- ^ Cached lookup for 'mi_fixities'
790
	mi_hash_fn :: OccName -> Maybe (OccName, Fingerprint),
791 792
                        -- ^ Cached lookup for 'mi_decls'.
			-- The @Nothing@ in 'mi_hash_fn' means that the thing
793
			-- isn't in decls. It's useful to know that when
794
			-- seeing if we are up to date wrt. the old interface.
795
                        -- The 'OccName' is the parent of the name, if it has one.
796
	mi_hpc    :: !AnyHpcUsage
797
	        -- ^ True if this program uses Hpc at any point in the program.
798
     }
799

800 801 802
-- | 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'.
803 804
data ModDetails
   = ModDetails {
805 806
	-- The next two fields are created by the typechecker
	md_exports   :: [AvailInfo],
807 808
        md_types     :: !TypeEnv,       -- ^ Local type environment for this particular module
        md_insts     :: ![Instance],    -- ^ 'DFunId's for the instances in this module
809
        md_fam_insts :: ![FamInst],
810 811
        md_rules     :: ![CoreRule],    -- ^ Domain may include 'Id's from other modules
        md_vect_info :: !VectInfo       -- ^ Module vectorisation information
812
     }
813

Simon Marlow's avatar
Simon Marlow committed
814
emptyModDetails :: ModDetails
815
emptyModDetails = ModDetails { md_types = emptyTypeEnv,
816
			       md_exports = [],
817 818
			       md_insts     = [],
			       md_rules     = [],
mnislaih's avatar
mnislaih committed
819
			       md_fam_insts = [],
chak@cse.unsw.edu.au.'s avatar
chak@cse.unsw.edu.au. committed
820 821
                               md_vect_info = noVectInfo
                             } 
822

823
-- | Records the modules directly imported by a module for extracting e.g. usage information
824
type ImportedMods = ModuleEnv [(ModuleName, Bool, SrcSpan)]
825 826
-- TODO: we are not actually using the codomain of this type at all, so it can be
-- replaced with ModuleEnv ()
Simon Marlow's avatar
Simon Marlow committed
827

828 829 830 831
-- | 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.
832 833
data ModGuts
  = ModGuts {
834 835 836 837 838 839 840 841
        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')
842

843
        mg_rdr_env   :: !GlobalRdrEnv,	 -- ^ Top-level lexical environment
844

845
	-- These fields all describe the things **declared in this module**
846 847 848 849 850 851 852 853 854 855 856 857 858 859 860
	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
	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
861 862 863 864 865 866

	-- 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's avatar
Thomas Schilling committed
867
	mg_inst_env     :: InstEnv,
868 869
        -- ^ Class instance environment from /home-package/ modules (including
	-- this one); c.f. 'tcg_inst_env'
Thomas Schilling's avatar
Thomas Schilling committed
870 871
	mg_fam_inst_env :: FamInstEnv
        -- ^ Type-family instance enviroment for /home-package/ modules
872
	-- (including this one); c.f. 'tcg_fam_inst_env'
873 874
    }

875 876 877 878 879 880 881 882
-- 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.
883 884
data CoreModule
  = CoreModule {
885
      -- | Module name
886
      cm_module   :: !Module,
887
      -- | Type environment for types declared in this module
888
      cm_types    :: !TypeEnv,
889
      -- | Declarations
890
      cm_binds    :: [CoreBind],
891
      -- | Imports
892
      cm_imports  :: ![Module]
893 894 895 896 897 898
    }

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)

899
-- The ModGuts takes on several slightly different forms:
900
--
901 902 903 904 905
-- After simplification, the following fields change slightly:
--	mg_rules	Orphan rules only (local ones now attached to binds)
--	mg_binds	With rules attached


906 907 908 909 910
---------------------------------------------------------
-- The Tidy pass forks the information about this module: 
--	* one lot goes to interface file generation (ModIface)
--	  and later compilations (ModDetails)
--	* the other lot goes to code generation (CgGuts)
911 912

-- | A restricted form of 'ModGuts' for code generation purposes
913 914
data CgGuts 
  = CgGuts {
915
	cg_module   :: !Module, -- ^ Module being compiled
916

917
	cg_tycons   :: [TyCon],
918
		-- ^ Algebraic data types (including ones that started
919
		-- life as classes); generate constructors and info
920
		-- tables. Includes newtypes, just for the benefit of
921
		-- External Core
922

923
	cg_binds    :: [CoreBind],
924
		-- ^ The tidied main bindings, including
925 926 927 928
		-- previously-implicit bindings for record and class
		-- selectors, and data construtor wrappers.  But *not*
		-- data constructor workers; reason: we we regard them
		-- as part of the code-gen of tycons
929

930
	cg_dir_imps :: ![Module],
931
		-- ^ Directly-imported modules; used to generate
932
		-- initialisation code
933

934 935 936 937 938
	cg_foreign  :: !ForeignStubs,	-- ^ Foreign export stubs
	cg_dep_pkgs :: ![PackageId],	-- ^ Dependent packages, used to 
	                                -- generate #includes for C code gen
        cg_hpc_info :: !HpcInfo,        -- ^ Program coverage tick box information
        cg_modBreaks :: !ModBreaks      -- ^ Module breakpoints
939
    }
940

941
-----------------------------------
942 943
-- | Foreign export stubs
data ForeignStubs = NoStubs             -- ^ We don't have any stubs
944
		  | ForeignStubs
945 946 947 948 949 950 951 952 953
			SDoc 		
			SDoc 		
		   -- ^ There are some stubs. Parameters:
		   --
		   --  1) Header file prototypes for
                   --     "foreign exported" functions
                   --
                   --  2) C stubs to use when calling
                   --     "foreign exported" functions
954 955 956
\end{code}

\begin{code}
Simon Marlow's avatar
Simon Marlow committed
957 958 959
emptyModIface :: Module -> ModIface
emptyModIface mod
  = ModIface { mi_module   = mod,
960 961
	       mi_iface_hash = fingerprint0,
	       mi_mod_hash = fingerprint0,
962
	       mi_orphan   = False,
963
	       mi_finsts   = False,
964
	       mi_boot	   = False,
965 966
	       mi_deps     = noDependencies,
	       mi_usages   = [],
967
	       mi_exports  = [],
968
	       mi_exp_hash = fingerprint0,
969
	       mi_fixities = [],
Ian Lynagh's avatar
Ian Lynagh committed
970
	       mi_warns    = NoWarnings,
971 972 973 974 975
	       mi_insts     = [],
	       mi_fam_insts = [],
	       mi_rules     = [],
	       mi_decls     = [],
	       mi_globals   = Nothing,
976
	       mi_orphan_hash = fingerprint0,
977
               mi_vect_info = noIfaceVectInfo,
Ian Lynagh's avatar
Ian Lynagh committed
978
	       mi_warn_fn    = emptyIfaceWarnCache,
979 980 981
	       mi_fix_fn    = emptyIfaceFixCache,
	       mi_hash_fn   = emptyIfaceHashCache,
	       mi_hpc       = False
982
    }		
983 984
\end{code}

985

986 987 988 989 990 991