Fix #481: use a safe recompilation check when Template Haskell is
[ghc.git] / compiler / main / HscMain.lhs
1 %
2 % (c) The GRASP/AQUA Project, Glasgow University, 1993-2000
3 %
4 \begin{code}
5 -- | Main API for compiling plain Haskell source code.
6 --
7 -- This module implements compilation of a Haskell source.  It is
8 -- /not/ concerned with preprocessing of source files; this is handled
9 -- in "DriverPipeline".
10 --
11 -- There are various entry points depending on what mode we're in:
12 -- "batch" mode (@--make@), "one-shot" mode (@-c@, @-S@ etc.), and
13 -- "interactive" mode (GHCi).  There are also entry points for
14 -- individual passes: parsing, typechecking/renaming, desugaring, and
15 -- simplification.
16 --
17 -- All the functions here take an 'HscEnv' as a parameter, but none of
18 -- them return a new one: 'HscEnv' is treated as an immutable value
19 -- from here on in (although it has mutable components, for the
20 -- caches).
21 --
22 -- Warning messages are dealt with consistently throughout this API:
23 -- during compilation warnings are collected, and before any function
24 -- in @HscMain@ returns, the warnings are either printed, or turned
25 -- into a real compialtion error if the @-Werror@ flag is enabled.
26 --
27 module HscMain
28     ( 
29     -- * Making an HscEnv
30       newHscEnv
31
32     -- * Compiling complete source files
33     , Compiler
34     , HscStatus' (..)
35     , InteractiveStatus, HscStatus
36     , hscCompileOneShot
37     , hscCompileBatch
38     , hscCompileNothing
39     , hscCompileInteractive
40     , hscCompileCmmFile
41     , hscCompileCore
42
43     -- * Running passes separately
44     , hscParse
45     , hscTypecheckRename
46     , hscDesugar
47     , makeSimpleIface
48     , makeSimpleDetails
49     , hscSimplify -- ToDo, shouldn't really export this
50
51     -- ** Backends
52     , hscOneShotBackendOnly
53     , hscBatchBackendOnly
54     , hscNothingBackendOnly
55     , hscInteractiveBackendOnly
56
57     -- * Support for interactive evaluation
58     , hscParseIdentifier
59     , hscTcRcLookupName
60     , hscTcRnGetInfo
61 #ifdef GHCI
62     , hscRnImportDecls
63     , hscGetModuleExports
64     , hscTcRnLookupRdrName
65     , hscStmt, hscStmtWithLocation
66     , hscTcExpr, hscImport, hscKcType
67     , hscCompileCoreExpr
68 #endif
69
70     ) where
71
72 #ifdef GHCI
73 import ByteCodeGen      ( byteCodeGen, coreExprToBCOs )
74 import Linker           ( HValue, linkExpr )
75 import CoreTidy         ( tidyExpr )
76 import Type             ( Type )
77 import TcType           ( tyVarsOfTypes )
78 import PrelNames        ( iNTERACTIVE )
79 import {- Kind parts of -} Type         ( Kind )
80 import Id               ( idType )
81 import CoreLint         ( lintUnfolding )
82 import DsMeta           ( templateHaskellNames )
83 import VarSet
84 import VarEnv           ( emptyTidyEnv )
85 import Panic
86 #endif
87
88 import Id               ( Id )
89 import Module
90 import Packages
91 import RdrName
92 import HsSyn
93 import CoreSyn
94 import StringBuffer
95 import Parser
96 import Lexer hiding (getDynFlags)
97 import SrcLoc
98 import TcRnDriver
99 import TcIface          ( typecheckIface )
100 import TcRnMonad
101 import IfaceEnv         ( initNameCache )
102 import LoadIface        ( ifaceStats, initExternalPackageState )
103 import PrelInfo         ( wiredInThings, basicKnownKeyNames )
104 import MkIface
105 import Desugar
106 import SimplCore
107 import TidyPgm
108 import CorePrep
109 import CoreToStg        ( coreToStg )
110 import qualified StgCmm ( codeGen )
111 import StgSyn
112 import CostCentre
113 import ProfInit
114 import TyCon            ( TyCon, isDataTyCon )
115 import Name             ( Name, NamedThing(..) )
116 import SimplStg         ( stg2stg )
117 import CodeGen          ( codeGen )
118 import OldCmm           ( Cmm )
119 import PprCmm           ( pprCmms )
120 import CmmParse         ( parseCmmFile )
121 import CmmBuildInfoTables
122 import CmmPipeline
123 import CmmInfo
124 import OptimizationFuel ( initOptFuelState )
125 import CmmCvt
126 import CmmContFlowOpt   ( runCmmContFlowOpts )
127 import CodeOutput
128 import NameEnv          ( emptyNameEnv )
129 import NameSet          ( emptyNameSet )
130 import InstEnv
131 import FamInstEnv       ( emptyFamInstEnv )
132 import Fingerprint      ( Fingerprint )
133
134 import DynFlags
135 import ErrUtils
136 import UniqSupply       ( mkSplitUniqSupply )
137
138 import Outputable
139 import HscStats         ( ppSourceStats )
140 import HscTypes
141 import MkExternalCore   ( emitExternalCore )
142 import FastString
143 import UniqFM           ( emptyUFM )
144 import UniqSupply       ( initUs_ )
145 import Bag
146 import Exception
147
148 import Control.Monad
149 import Data.Maybe       ( catMaybes )
150 import Data.IORef
151 \end{code}
152 #include "HsVersions.h"
153
154
155 %************************************************************************
156 %*                                                                      *
157                 Initialisation
158 %*                                                                      *
159 %************************************************************************
160
161 \begin{code}
162 newHscEnv :: DynFlags -> IO HscEnv
163 newHscEnv dflags
164   = do  { eps_var <- newIORef initExternalPackageState
165         ; us      <- mkSplitUniqSupply 'r'
166         ; nc_var  <- newIORef (initNameCache us knownKeyNames)
167         ; fc_var  <- newIORef emptyUFM
168         ; mlc_var <- newIORef emptyModuleEnv
169         ; optFuel <- initOptFuelState
170         ; return (HscEnv { hsc_dflags = dflags,
171                            hsc_targets = [],
172                            hsc_mod_graph = [],
173                            hsc_IC      = emptyInteractiveContext,
174                            hsc_HPT     = emptyHomePackageTable,
175                            hsc_EPS     = eps_var,
176                            hsc_NC      = nc_var,
177                            hsc_FC      = fc_var,
178                            hsc_MLC     = mlc_var,
179                            hsc_OptFuel = optFuel,
180                            hsc_type_env_var = Nothing } ) }
181
182
183 knownKeyNames :: [Name]      -- Put here to avoid loops involving DsMeta,
184                              -- where templateHaskellNames are defined
185 knownKeyNames
186   = map getName wiredInThings 
187     ++ basicKnownKeyNames
188 #ifdef GHCI
189     ++ templateHaskellNames
190 #endif
191
192 -- -----------------------------------------------------------------------------
193 -- The Hsc monad: collecting warnings
194
195 newtype Hsc a = Hsc (HscEnv -> WarningMessages -> IO (a, WarningMessages))
196
197 instance Monad Hsc where
198   return a = Hsc $ \_ w -> return (a, w)
199   Hsc m >>= k = Hsc $ \e w -> do (a, w1) <- m e w
200                                  case k a of
201                                     Hsc k' -> k' e w1
202
203 instance MonadIO Hsc where
204   liftIO io = Hsc $ \_ w -> do a <- io; return (a, w)
205
206 runHsc :: HscEnv -> Hsc a -> IO a
207 runHsc hsc_env (Hsc hsc) = do
208   (a, w) <- hsc hsc_env emptyBag
209   printOrThrowWarnings (hsc_dflags hsc_env) w
210   return a
211
212 getWarnings :: Hsc WarningMessages
213 getWarnings = Hsc $ \_ w -> return (w, w)
214
215 clearWarnings :: Hsc ()
216 clearWarnings = Hsc $ \_ _w -> return ((), emptyBag)
217
218 logWarnings :: WarningMessages -> Hsc ()
219 logWarnings w = Hsc $ \_ w0 -> return ((), w0 `unionBags` w)
220
221 getHscEnv :: Hsc HscEnv
222 getHscEnv = Hsc $ \e w -> return (e, w)
223
224 getDynFlags :: Hsc DynFlags
225 getDynFlags = Hsc $ \e w -> return (hsc_dflags e, w)
226
227 handleWarnings :: Hsc ()
228 handleWarnings = do
229   dflags <- getDynFlags
230   w <- getWarnings
231   liftIO $ printOrThrowWarnings dflags w
232   clearWarnings
233
234 -- | log warning in the monad, and if there are errors then
235 -- throw a SourceError exception.
236 logWarningsReportErrors :: Messages -> Hsc ()
237 logWarningsReportErrors (warns,errs) = do
238   logWarnings warns
239   when (not (isEmptyBag errs)) $ do
240     liftIO $ throwIO $ mkSrcErr errs
241
242 -- | Deal with errors and warnings returned by a compilation step
243 --
244 -- In order to reduce dependencies to other parts of the compiler, functions
245 -- outside the "main" parts of GHC return warnings and errors as a parameter
246 -- and signal success via by wrapping the result in a 'Maybe' type.  This
247 -- function logs the returned warnings and propagates errors as exceptions
248 -- (of type 'SourceError').
249 --
250 -- This function assumes the following invariants:
251 --
252 --  1. If the second result indicates success (is of the form 'Just x'),
253 --     there must be no error messages in the first result.
254 --
255 --  2. If there are no error messages, but the second result indicates failure
256 --     there should be warnings in the first result.  That is, if the action
257 --     failed, it must have been due to the warnings (i.e., @-Werror@).
258 ioMsgMaybe :: IO (Messages, Maybe a) -> Hsc a
259 ioMsgMaybe ioA = do
260   ((warns,errs), mb_r) <- liftIO $ ioA
261   logWarnings warns
262   case mb_r of
263     Nothing -> liftIO $ throwIO (mkSrcErr errs)
264     Just r  -> ASSERT( isEmptyBag errs ) return r
265
266 -- | like ioMsgMaybe, except that we ignore error messages and return
267 -- 'Nothing' instead.
268 ioMsgMaybe' :: IO (Messages, Maybe a) -> Hsc (Maybe a)
269 ioMsgMaybe' ioA = do
270   ((warns,_errs), mb_r) <- liftIO $ ioA
271   logWarnings warns
272   return mb_r
273
274 -- -----------------------------------------------------------------------------
275 -- | Lookup things in the compiler's environment
276
277 #ifdef GHCI
278 hscTcRnLookupRdrName :: HscEnv -> RdrName -> IO [Name]
279 hscTcRnLookupRdrName hsc_env rdr_name = 
280   runHsc hsc_env $ ioMsgMaybe $ tcRnLookupRdrName hsc_env rdr_name
281 #endif
282
283 hscTcRcLookupName :: HscEnv -> Name -> IO (Maybe TyThing)
284 hscTcRcLookupName hsc_env name = 
285   runHsc hsc_env $ ioMsgMaybe' $ tcRnLookupName hsc_env name
286     -- ignore errors: the only error we're likely to get is
287     -- "name not found", and the Maybe in the return type
288     -- is used to indicate that.
289
290 hscTcRnGetInfo :: HscEnv -> Name -> IO (Maybe (TyThing, Fixity, [Instance]))
291 hscTcRnGetInfo hsc_env name =
292   runHsc hsc_env $ ioMsgMaybe' $ tcRnGetInfo hsc_env name
293
294 #ifdef GHCI
295 hscGetModuleExports :: HscEnv -> Module -> IO (Maybe [AvailInfo])
296 hscGetModuleExports hsc_env mdl =
297   runHsc hsc_env $ ioMsgMaybe' $ getModuleExports hsc_env mdl
298
299 -- -----------------------------------------------------------------------------
300 -- | Rename some import declarations
301
302 hscRnImportDecls
303         :: HscEnv
304         -> Module
305         -> [LImportDecl RdrName]
306         -> IO GlobalRdrEnv
307
308 -- It is important that we use tcRnImports instead of calling rnImports directly
309 -- because tcRnImports will force-load any orphan modules necessary, making extra
310 -- instances/family instances visible (GHC #4832)
311 hscRnImportDecls hsc_env this_mod import_decls
312   = runHsc hsc_env $ ioMsgMaybe $ initTc hsc_env HsSrcFile False this_mod $
313           fmap tcg_rdr_env $ tcRnImports hsc_env this_mod import_decls
314
315 #endif
316
317 -- -----------------------------------------------------------------------------
318 -- | parse a file, returning the abstract syntax
319
320 hscParse :: HscEnv -> ModSummary -> IO (Located (HsModule RdrName))
321 hscParse hsc_env mod_summary = runHsc hsc_env $ hscParse' mod_summary
322
323 -- internal version, that doesn't fail due to -Werror
324 hscParse' :: ModSummary -> Hsc (Located (HsModule RdrName))
325 hscParse' mod_summary
326  = do
327    dflags <- getDynFlags
328    let 
329        src_filename  = ms_hspp_file mod_summary
330        maybe_src_buf = ms_hspp_buf  mod_summary
331
332    --------------------------  Parser  ----------------
333    liftIO $ showPass dflags "Parser"
334    {-# SCC "Parser" #-} do
335
336         -- sometimes we already have the buffer in memory, perhaps
337         -- because we needed to parse the imports out of it, or get the
338         -- module name.
339    buf <- case maybe_src_buf of
340             Just b  -> return b
341             Nothing -> liftIO $ hGetStringBuffer src_filename
342
343    let loc  = mkRealSrcLoc (mkFastString src_filename) 1 1
344
345    case unP parseModule (mkPState dflags buf loc) of
346      PFailed span err ->
347          liftIO $ throwOneError (mkPlainErrMsg span err)
348
349      POk pst rdr_module -> do
350          logWarningsReportErrors (getMessages pst)
351          liftIO $ dumpIfSet_dyn dflags Opt_D_dump_parsed "Parser" $
352                                 ppr rdr_module
353          liftIO $ dumpIfSet_dyn dflags Opt_D_source_stats "Source Statistics" $
354                                 ppSourceStats False rdr_module
355          return rdr_module
356           -- ToDo: free the string buffer later.
357
358 -- XXX: should this really be a Maybe X?  Check under which circumstances this
359 -- can become a Nothing and decide whether this should instead throw an
360 -- exception/signal an error.
361 type RenamedStuff = 
362         (Maybe (HsGroup Name, [LImportDecl Name], Maybe [LIE Name],
363                 Maybe LHsDocString))
364
365 -- | Rename and typecheck a module, additionally returning the renamed syntax
366 hscTypecheckRename :: HscEnv -> ModSummary -> Located (HsModule RdrName)
367                    -> IO (TcGblEnv, RenamedStuff)
368 hscTypecheckRename hsc_env mod_summary rdr_module
369   = runHsc hsc_env $ do
370       tc_result
371           <- {-# SCC "Typecheck-Rename" #-}
372               ioMsgMaybe $ 
373                   tcRnModule hsc_env (ms_hsc_src mod_summary) True rdr_module
374
375       let -- This 'do' is in the Maybe monad!
376           rn_info = do decl <- tcg_rn_decls tc_result
377                        let imports = tcg_rn_imports tc_result
378                            exports = tcg_rn_exports tc_result
379                            doc_hdr  = tcg_doc_hdr tc_result
380                        return (decl,imports,exports,doc_hdr)
381
382       return (tc_result, rn_info)
383
384 -- | Convert a typechecked module to Core
385 hscDesugar :: HscEnv -> ModSummary -> TcGblEnv -> IO ModGuts
386 hscDesugar hsc_env mod_summary tc_result
387   = runHsc hsc_env $ hscDesugar' mod_summary tc_result
388
389 hscDesugar' :: ModSummary -> TcGblEnv -> Hsc ModGuts
390 hscDesugar' mod_summary tc_result
391  = do
392       hsc_env <- getHscEnv
393       r <- ioMsgMaybe $ 
394              deSugar hsc_env (ms_location mod_summary) tc_result
395
396       handleWarnings
397                 -- always check -Werror after desugaring, this is 
398                 -- the last opportunity for warnings to arise before
399                 -- the backend.
400       return r
401
402 -- | Make a 'ModIface' from the results of typechecking.  Used when
403 -- not optimising, and the interface doesn't need to contain any
404 -- unfoldings or other cross-module optimisation info.
405 -- ToDo: the old interface is only needed to get the version numbers,
406 -- we should use fingerprint versions instead.
407 makeSimpleIface :: HscEnv -> 
408                    Maybe ModIface -> TcGblEnv -> ModDetails
409                 -> IO (ModIface,Bool)
410 makeSimpleIface hsc_env maybe_old_iface tc_result details
411   = runHsc hsc_env $
412      ioMsgMaybe $ 
413        mkIfaceTc hsc_env (fmap mi_iface_hash maybe_old_iface) details tc_result
414
415 -- | Make a 'ModDetails' from the results of typechecking.  Used when
416 -- typechecking only, as opposed to full compilation.
417 makeSimpleDetails :: HscEnv -> TcGblEnv -> IO ModDetails
418 makeSimpleDetails hsc_env tc_result = mkBootModDetailsTc hsc_env tc_result
419 \end{code}
420
421 %************************************************************************
422 %*                                                                      *
423                 The main compiler pipeline
424 %*                                                                      *
425 %************************************************************************
426
427                    --------------------------------
428                         The compilation proper
429                    --------------------------------
430
431
432 It's the task of the compilation proper to compile Haskell, hs-boot and
433 core files to either byte-code, hard-code (C, asm, LLVM, ect) or to
434 nothing at all (the module is still parsed and type-checked. This
435 feature is mostly used by IDE's and the likes).
436 Compilation can happen in either 'one-shot', 'batch', 'nothing',
437 or 'interactive' mode. 'One-shot' mode targets hard-code, 'batch' mode
438 targets hard-code, 'nothing' mode targets nothing and 'interactive' mode
439 targets byte-code.
440 The modes are kept separate because of their different types and meanings.
441 In 'one-shot' mode, we're only compiling a single file and can therefore
442 discard the new ModIface and ModDetails. This is also the reason it only
443 targets hard-code; compiling to byte-code or nothing doesn't make sense
444 when we discard the result.
445 'Batch' mode is like 'one-shot' except that we keep the resulting ModIface
446 and ModDetails. 'Batch' mode doesn't target byte-code since that require
447 us to return the newly compiled byte-code.
448 'Nothing' mode has exactly the same type as 'batch' mode but they're still
449 kept separate. This is because compiling to nothing is fairly special: We
450 don't output any interface files, we don't run the simplifier and we don't
451 generate any code.
452 'Interactive' mode is similar to 'batch' mode except that we return the
453 compiled byte-code together with the ModIface and ModDetails.
454
455 Trying to compile a hs-boot file to byte-code will result in a run-time
456 error. This is the only thing that isn't caught by the type-system.
457
458 \begin{code}
459
460 -- Status of a compilation to hard-code or nothing.
461 data HscStatus' a
462     = HscNoRecomp
463     | HscRecomp
464        (Maybe FilePath)
465             -- Has stub files.  This is a hack. We can't compile C files here
466             -- since it's done in DriverPipeline. For now we just return True
467             -- if we want the caller to compile them for us.
468        a
469
470 -- This is a bit ugly.  Since we use a typeclass below and would like to avoid
471 -- functional dependencies, we have to parameterise the typeclass over the
472 -- result type.  Therefore we need to artificially distinguish some types.  We
473 -- do this by adding type tags which will simply be ignored by the caller.
474 type HscStatus         = HscStatus' ()
475 type InteractiveStatus = HscStatus' (Maybe (CompiledByteCode, ModBreaks))
476     -- INVARIANT: result is @Nothing@ <=> input was a boot file
477
478 type OneShotResult     = HscStatus
479 type BatchResult       = (HscStatus, ModIface, ModDetails)
480 type NothingResult     = (HscStatus, ModIface, ModDetails)
481 type InteractiveResult = (InteractiveStatus, ModIface, ModDetails)
482
483 -- FIXME: The old interface and module index are only using in 'batch' and
484 --        'interactive' mode. They should be removed from 'oneshot' mode.
485 type Compiler result =  HscEnv
486                      -> ModSummary
487                      -> SourceModified
488                      -> Maybe ModIface      -- Old interface, if available
489                      -> Maybe (Int,Int)     -- Just (i,n) <=> module i of n (for msgs)
490                      -> IO result
491
492 data HsCompiler a
493   = HsCompiler {
494     -- | Called when no recompilation is necessary.
495     hscNoRecomp :: ModIface
496                 -> Hsc a,
497
498     -- | Called to recompile the module.
499     hscRecompile :: ModSummary -> Maybe Fingerprint
500                  -> Hsc a,
501
502     hscBackend :: TcGblEnv -> ModSummary -> Maybe Fingerprint
503                -> Hsc a,
504
505     -- | Code generation for Boot modules.
506     hscGenBootOutput :: TcGblEnv -> ModSummary -> Maybe Fingerprint
507                      -> Hsc a,
508
509     -- | Code generation for normal modules.
510     hscGenOutput :: ModGuts  -> ModSummary -> Maybe Fingerprint
511                  -> Hsc a
512   }
513
514 genericHscCompile :: HsCompiler a
515                   -> (HscEnv -> Maybe (Int,Int) -> RecompReason -> ModSummary -> IO ())
516                   -> HscEnv -> ModSummary -> SourceModified
517                   -> Maybe ModIface -> Maybe (Int, Int)
518                   -> IO a
519 genericHscCompile compiler hscMessage hsc_env
520                   mod_summary source_modified
521                   mb_old_iface0 mb_mod_index
522  = do
523      (recomp_reqd, mb_checked_iface)
524          <- {-# SCC "checkOldIface" #-}
525             checkOldIface hsc_env mod_summary 
526                           source_modified mb_old_iface0
527      -- save the interface that comes back from checkOldIface.
528      -- In one-shot mode we don't have the old iface until this
529      -- point, when checkOldIface reads it from the disk.
530      let mb_old_hash = fmap mi_iface_hash mb_checked_iface
531
532      let
533        skip iface = do
534          hscMessage hsc_env mb_mod_index RecompNotRequired mod_summary
535          runHsc hsc_env $ hscNoRecomp compiler iface
536
537        compile reason = do
538          hscMessage hsc_env mb_mod_index reason mod_summary
539          runHsc hsc_env $ hscRecompile compiler mod_summary mb_old_hash
540
541        stable = case source_modified of
542                   SourceUnmodifiedAndStable -> True
543                   _ -> False
544
545         -- If the module used TH splices when it was last compiled,
546         -- then the recompilation check is not accurate enough (#481)
547         -- and we must ignore it.  However, if the module is stable
548         -- (none of the modules it depends on, directly or indirectly,
549         -- changed), then we *can* skip recompilation.  This is why
550         -- the SourceModified type contains SourceUnmodifiedAndStable,
551         -- and it's pretty important: otherwise ghc --make would
552         -- always recompile TH modules, even if nothing at all has
553         -- changed.  Stability is just the same check that make is
554         -- doing for us in one-shot mode.
555
556      case mb_checked_iface of
557        Just iface | not recomp_reqd ->
558            if mi_used_th iface && not stable
559                then compile RecompForcedByTH
560                else skip iface
561        _otherwise ->
562            compile RecompRequired
563
564
565 hscCheckRecompBackend :: HsCompiler a -> TcGblEnv -> Compiler a
566 hscCheckRecompBackend compiler tc_result 
567                    hsc_env mod_summary source_modified mb_old_iface _m_of_n
568   = do
569      (recomp_reqd, mb_checked_iface)
570          <- {-# SCC "checkOldIface" #-}
571             checkOldIface hsc_env mod_summary
572                           source_modified mb_old_iface
573
574      let mb_old_hash = fmap mi_iface_hash mb_checked_iface
575      case mb_checked_iface of
576        Just iface | not recomp_reqd
577            -> runHsc hsc_env $ 
578                  hscNoRecomp compiler
579                              iface{ mi_globals = Just (tcg_rdr_env tc_result) }
580        _otherwise
581            -> runHsc hsc_env $
582                  hscBackend compiler tc_result mod_summary mb_old_hash
583
584 genericHscRecompile :: HsCompiler a
585                     -> ModSummary -> Maybe Fingerprint
586                     -> Hsc a
587 genericHscRecompile compiler mod_summary mb_old_hash
588   | ExtCoreFile <- ms_hsc_src mod_summary =
589       panic "GHC does not currently support reading External Core files"
590   | otherwise = do
591       tc_result <- hscFileFrontEnd mod_summary
592       hscBackend compiler tc_result mod_summary mb_old_hash
593
594 genericHscBackend :: HsCompiler a
595                   -> TcGblEnv -> ModSummary -> Maybe Fingerprint
596                   -> Hsc a
597 genericHscBackend compiler tc_result mod_summary mb_old_hash
598   | HsBootFile <- ms_hsc_src mod_summary =
599       hscGenBootOutput compiler tc_result mod_summary mb_old_hash
600   | otherwise = do
601       guts <- hscDesugar' mod_summary tc_result
602       hscGenOutput compiler guts mod_summary mb_old_hash
603
604 compilerBackend :: HsCompiler a -> TcGblEnv -> Compiler a
605 compilerBackend comp tcg hsc_env ms' _ _mb_old_iface _ =
606   runHsc hsc_env $
607     hscBackend comp tcg ms' Nothing
608
609 --------------------------------------------------------------
610 -- Compilers
611 --------------------------------------------------------------
612
613 hscOneShotCompiler :: HsCompiler OneShotResult
614 hscOneShotCompiler =
615   HsCompiler {
616
617     hscNoRecomp = \_old_iface -> do
618       hsc_env <- getHscEnv
619       liftIO $ dumpIfaceStats hsc_env
620       return HscNoRecomp
621
622   , hscRecompile = genericHscRecompile hscOneShotCompiler
623
624   , hscBackend = \ tc_result mod_summary mb_old_hash -> do
625        dflags <- getDynFlags
626        case hscTarget dflags of
627          HscNothing -> return (HscRecomp Nothing ())
628          _otherw    -> genericHscBackend hscOneShotCompiler
629                                          tc_result mod_summary mb_old_hash
630
631   , hscGenBootOutput = \tc_result mod_summary mb_old_iface -> do
632        (iface, changed, _) <- hscSimpleIface tc_result mb_old_iface
633        hscWriteIface iface changed mod_summary
634        return (HscRecomp Nothing ())
635
636   , hscGenOutput = \guts0 mod_summary mb_old_iface -> do
637        guts <- hscSimplify' guts0
638        (iface, changed, _details, cgguts) <- hscNormalIface guts mb_old_iface
639        hscWriteIface iface changed mod_summary
640        hasStub <- hscGenHardCode cgguts mod_summary
641        return (HscRecomp hasStub ())
642   }
643
644 -- Compile Haskell, boot and extCore in OneShot mode.
645 hscCompileOneShot :: Compiler OneShotResult
646 hscCompileOneShot hsc_env mod_summary src_changed mb_old_iface mb_i_of_n
647   = do
648        -- One-shot mode needs a knot-tying mutable variable for interface
649        -- files.  See TcRnTypes.TcGblEnv.tcg_type_env_var.
650       type_env_var <- newIORef emptyNameEnv
651       let
652          mod = ms_mod mod_summary
653          hsc_env' = hsc_env{ hsc_type_env_var = Just (mod, type_env_var) }
654       ---
655       genericHscCompile hscOneShotCompiler
656                         oneShotMsg hsc_env' mod_summary src_changed
657                         mb_old_iface mb_i_of_n
658
659
660 hscOneShotBackendOnly :: TcGblEnv -> Compiler OneShotResult
661 hscOneShotBackendOnly = compilerBackend hscOneShotCompiler
662
663 --------------------------------------------------------------
664
665 hscBatchCompiler :: HsCompiler BatchResult
666 hscBatchCompiler =
667   HsCompiler {
668
669     hscNoRecomp = \iface -> do
670        details <- genModDetails iface
671        return (HscNoRecomp, iface, details)
672
673   , hscRecompile = genericHscRecompile hscBatchCompiler
674
675   , hscBackend = genericHscBackend hscBatchCompiler
676
677   , hscGenBootOutput = \tc_result mod_summary mb_old_iface -> do
678        (iface, changed, details) <- hscSimpleIface tc_result mb_old_iface
679        hscWriteIface iface changed mod_summary
680        return (HscRecomp Nothing (), iface, details)
681
682   , hscGenOutput = \guts0 mod_summary mb_old_iface -> do
683        guts <- hscSimplify' guts0
684        (iface, changed, details, cgguts) <- hscNormalIface guts mb_old_iface
685        hscWriteIface iface changed mod_summary
686        hasStub <- hscGenHardCode cgguts mod_summary
687        return (HscRecomp hasStub (), iface, details)
688   }
689
690 -- Compile Haskell, boot and extCore in batch mode.
691 hscCompileBatch :: Compiler (HscStatus, ModIface, ModDetails)
692 hscCompileBatch = genericHscCompile hscBatchCompiler batchMsg
693
694 hscBatchBackendOnly :: TcGblEnv -> Compiler BatchResult
695 hscBatchBackendOnly = hscCheckRecompBackend hscBatchCompiler
696
697 --------------------------------------------------------------
698
699 hscInteractiveCompiler :: HsCompiler InteractiveResult
700 hscInteractiveCompiler =
701   HsCompiler {
702     hscNoRecomp = \iface -> do
703        details <- genModDetails iface
704        return (HscNoRecomp, iface, details)
705
706   , hscRecompile = genericHscRecompile hscInteractiveCompiler
707
708   , hscBackend = genericHscBackend hscInteractiveCompiler
709
710   , hscGenBootOutput = \tc_result _mod_summary mb_old_iface -> do
711        (iface, _changed, details) <- hscSimpleIface tc_result mb_old_iface
712        return (HscRecomp Nothing Nothing, iface, details)
713
714   , hscGenOutput = \guts0 mod_summary mb_old_iface -> do
715        guts <- hscSimplify' guts0
716        (iface, _changed, details, cgguts) <- hscNormalIface guts mb_old_iface
717        hscInteractive (iface, details, cgguts) mod_summary
718   }
719
720 -- Compile Haskell, extCore to bytecode.
721 hscCompileInteractive :: Compiler (InteractiveStatus, ModIface, ModDetails)
722 hscCompileInteractive = genericHscCompile hscInteractiveCompiler batchMsg
723
724 hscInteractiveBackendOnly :: TcGblEnv -> Compiler InteractiveResult
725 hscInteractiveBackendOnly = compilerBackend hscInteractiveCompiler
726
727 --------------------------------------------------------------
728
729 hscNothingCompiler :: HsCompiler NothingResult
730 hscNothingCompiler =
731   HsCompiler {
732     hscNoRecomp = \iface -> do
733        details <- genModDetails iface
734        return (HscNoRecomp, iface, details)
735
736   , hscRecompile = genericHscRecompile hscNothingCompiler
737
738   , hscBackend = \tc_result _mod_summary mb_old_iface -> do
739        handleWarnings
740        (iface, _changed, details) <- hscSimpleIface tc_result mb_old_iface
741        return (HscRecomp Nothing (), iface, details)
742
743   , hscGenBootOutput = \_ _ _ ->
744         panic "hscCompileNothing: hscGenBootOutput should not be called"
745
746   , hscGenOutput = \_ _ _ ->
747         panic "hscCompileNothing: hscGenOutput should not be called"
748   }
749
750 -- Type-check Haskell and .hs-boot only (no external core)
751 hscCompileNothing :: Compiler (HscStatus, ModIface, ModDetails)
752 hscCompileNothing = genericHscCompile hscNothingCompiler batchMsg
753
754 hscNothingBackendOnly :: TcGblEnv -> Compiler NothingResult
755 hscNothingBackendOnly = compilerBackend hscNothingCompiler
756
757 --------------------------------------------------------------
758 -- NoRecomp handlers
759 --------------------------------------------------------------
760
761 genModDetails :: ModIface -> Hsc ModDetails
762 genModDetails old_iface
763   = do
764       hsc_env <- getHscEnv
765       new_details <- {-# SCC "tcRnIface" #-}
766                      liftIO $ initIfaceCheck hsc_env $
767                               typecheckIface old_iface
768       liftIO $ dumpIfaceStats hsc_env
769       return new_details
770
771 --------------------------------------------------------------
772 -- Progress displayers.
773 --------------------------------------------------------------
774
775 data RecompReason = RecompNotRequired | RecompRequired | RecompForcedByTH
776   deriving Eq
777
778 oneShotMsg :: HscEnv -> Maybe (Int,Int) -> RecompReason -> ModSummary -> IO ()
779 oneShotMsg hsc_env _mb_mod_index recomp _mod_summary =
780   case recomp of
781     RecompNotRequired ->
782             compilationProgressMsg (hsc_dflags hsc_env) $
783                    "compilation IS NOT required"
784     _other ->
785             return ()
786
787 batchMsg :: HscEnv -> Maybe (Int,Int) -> RecompReason -> ModSummary -> IO ()
788 batchMsg hsc_env mb_mod_index recomp mod_summary
789  = case recomp of
790      RecompRequired -> showMsg "Compiling "
791      RecompNotRequired
792        | verbosity (hsc_dflags hsc_env) >= 2 -> showMsg "Skipping  "
793        | otherwise -> return ()
794      RecompForcedByTH -> showMsg "Compiling [TH] "
795    where
796      showMsg msg =
797         compilationProgressMsg (hsc_dflags hsc_env) $
798          (showModuleIndex mb_mod_index ++
799          msg ++ showModMsg (hscTarget (hsc_dflags hsc_env)) (recomp == RecompRequired) mod_summary)
800
801 --------------------------------------------------------------
802 -- FrontEnds
803 --------------------------------------------------------------
804
805 hscFileFrontEnd :: ModSummary -> Hsc TcGblEnv
806 hscFileFrontEnd mod_summary = do
807     rdr_module <- hscParse' mod_summary
808     hsc_env <- getHscEnv
809     tcg_env <-
810         {-# SCC "Typecheck-Rename" #-}
811         ioMsgMaybe $
812             tcRnModule hsc_env (ms_hsc_src mod_summary) False rdr_module
813     dflags <- getDynFlags
814     -- XXX: See Note [Safe Haskell API]
815     if safeHaskellOn dflags
816         then do
817             tcg_env1 <- checkSafeImports dflags hsc_env tcg_env
818             if safeLanguageOn dflags
819                 then do
820                     -- we also nuke user written RULES.
821                     logWarnings $ warns (tcg_rules tcg_env1)
822                     return tcg_env1 { tcg_rules = [] }
823                 else do
824                     -- Wipe out trust required packages if the module isn't
825                     -- trusted. Not doing this doesn't cause any problems
826                     -- but means the hi file will say some pkgs should be
827                     -- trusted when they don't need to be (since its an
828                     -- untrusted module) and we don't force them to be.
829                     let imps  = tcg_imports tcg_env1
830                         imps' = imps { imp_trust_pkgs = [] }
831                     return tcg_env1 { tcg_imports = imps' }
832
833         else
834             return tcg_env
835
836     where
837         warns rules = listToBag $ map warnRules rules
838         warnRules (L loc (HsRule n _ _ _ _ _ _)) =
839             mkPlainWarnMsg loc $
840                 text "Rule \"" <> ftext n <> text "\" ignored" $+$
841                 text "User defined rules are disabled under Safe Haskell"
842
843 --------------------------------------------------------------
844 -- Safe Haskell
845 --------------------------------------------------------------
846
847 -- Note [Safe Haskell API]
848 -- ~~~~~~~~~~~~~~~~~~~~~~
849 -- XXX: We only call this in hscFileFrontend and don't expose
850 -- it to the GHC API. External users of GHC can't properly use
851 -- the GHC API and Safe Haskell.
852
853
854 -- Note [Safe Haskell Trust Check]
855 -- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
856 -- Safe Haskell checks that an import is trusted according to the following
857 -- rules for an import of module M that resides in Package P:
858 --
859 --   * If M is recorded as Safe and all its trust dependencies are OK
860 --     then M is considered safe.
861 --   * If M is recorded as Trustworthy and P is considered trusted and
862 --     all M's trust dependencies are OK then M is considered safe.
863 --
864 -- By trust dependencies we mean that the check is transitive. So if
865 -- a module M that is Safe relies on a module N that is trustworthy,
866 -- importing module M will first check (according to the second case)
867 -- that N is trusted before checking M is trusted.
868 --
869 -- This is a minimal description, so please refer to the user guide
870 -- for more details. The user guide is also considered the authoritative
871 -- source in this matter, not the comments or code.
872
873
874 -- | Validate that safe imported modules are actually safe.
875 -- For modules in the HomePackage (the package the module we
876 -- are compiling in resides) this just involves checking its
877 -- trust type is 'Safe' or 'Trustworthy'. For modules that
878 -- reside in another package we also must check that the
879 -- external pacakge is trusted. See the Note [Safe Haskell
880 -- Trust Check] above for more information.
881 --
882 -- The code for this is quite tricky as the whole algorithm
883 -- is done in a few distinct phases in different parts of the
884 -- code base. See RnNames.rnImportDecl for where package trust
885 -- dependencies for a module are collected and unioned.
886 -- Specifically see the Note [RnNames . Tracking Trust Transitively]
887 -- and the Note [RnNames . Trust Own Package].
888 checkSafeImports :: DynFlags -> HscEnv -> TcGblEnv -> Hsc TcGblEnv
889 checkSafeImports dflags hsc_env tcg_env
890     = do
891         imps <- mapM condense imports'
892         pkgs <- mapM checkSafe imps
893         checkPkgTrust pkg_reqs
894
895         -- add in trusted package requirements for this module
896         let new_trust = emptyImportAvails { imp_trust_pkgs = catMaybes pkgs }
897         return tcg_env { tcg_imports = imp_info `plusImportAvails` new_trust }
898
899     where
900         imp_info = tcg_imports tcg_env     -- ImportAvails
901         imports  = imp_mods imp_info       -- ImportedMods
902         imports' = moduleEnvToList imports -- (Module, [ImportedModsVal])
903         pkg_reqs = imp_trust_pkgs imp_info -- [PackageId]
904
905         condense :: (Module, [ImportedModsVal]) -> Hsc (Module, SrcSpan, IsSafeImport)
906         condense (_, [])   = panic "HscMain.condense: Pattern match failure!"
907         condense (m, x:xs) = do (_,_,l,s) <- foldlM cond' x xs
908                                 return (m, l, s)
909         
910         -- ImportedModsVal = (ModuleName, Bool, SrcSpan, IsSafeImport)
911         cond' :: ImportedModsVal -> ImportedModsVal -> Hsc ImportedModsVal
912         cond' v1@(m1,_,l1,s1) (_,_,_,s2)
913             | s1 /= s2
914             = liftIO $ throwIO $ mkSrcErr $ unitBag $ mkPlainErrMsg l1
915                     (text "Module" <+> ppr m1 <+> (text $ "is imported"
916                         ++ " both as a safe and unsafe import!"))
917             | otherwise
918             = return v1
919
920         lookup' :: Module -> Hsc (Maybe ModIface)
921         lookup' m = do
922             hsc_eps <- liftIO $ hscEPS hsc_env
923             let pkgIfaceT = eps_PIT hsc_eps
924                 homePkgT = hsc_HPT hsc_env
925                 iface = lookupIfaceByModule dflags homePkgT pkgIfaceT m
926             return iface
927
928         isHomePkg :: Module -> Bool
929         isHomePkg m
930             | thisPackage dflags == modulePackageId m = True
931             | otherwise                               = False
932
933         -- | Check the package a module resides in is trusted.
934         -- Safe compiled modules are trusted without requiring
935         -- that their package is trusted. For trustworthy modules,
936         -- modules in the home package are trusted but otherwise
937         -- we check the package trust flag.
938         packageTrusted :: SafeHaskellMode -> Bool -> Module -> Bool
939         packageTrusted Sf_Safe False _ = True
940         packageTrusted _ _ m
941             | isHomePkg m = True
942             | otherwise   = trusted $ getPackageDetails (pkgState dflags)
943                                                         (modulePackageId m)
944
945         -- Is a module trusted? Return Nothing if True, or a String
946         -- if it isn't, containing the reason it isn't
947         isModSafe :: Module -> SrcSpan -> Hsc (Maybe SDoc)
948         isModSafe m l = do
949             iface <- lookup' m
950             case iface of
951                 -- can't load iface to check trust!
952                 Nothing -> liftIO $ throwIO $ mkSrcErr $ unitBag $ mkPlainErrMsg l
953                             $ text "Can't load the interface file for" <+> ppr m <>
954                               text ", to check that it can be safely imported"
955
956                 -- got iface, check trust
957                 Just iface' -> do
958                     let trust = getSafeMode $ mi_trust iface'
959                         trust_own_pkg = mi_trust_pkg iface'
960                         -- check module is trusted
961                         safeM = trust `elem` [Sf_Safe, Sf_Trustworthy]
962                         -- check package is trusted
963                         safeP = packageTrusted trust trust_own_pkg m
964                     if safeM && safeP
965                         then return Nothing
966                         else return $ Just $ if safeM
967                             then text "The package (" <> ppr (modulePackageId m) <>
968                                  text ") the module resides in isn't trusted."
969                             else text "The module itself isn't safe."
970
971         -- Here we check the transitive package trust requirements are OK still.
972         checkPkgTrust :: [PackageId] -> Hsc ()
973         checkPkgTrust pkgs = do
974             case errors of
975                 [] -> return ()
976                 _  -> (liftIO . throwIO . mkSrcErr . listToBag) errors
977             where
978                 errors = catMaybes $ map go pkgs
979                 go pkg
980                     | trusted $ getPackageDetails (pkgState dflags) pkg
981                     = Nothing
982                     | otherwise
983                     = Just $ mkPlainErrMsg noSrcSpan
984                            $ text "The package (" <> ppr pkg <> text ") is required"
985                           <> text " to be trusted but it isn't!"
986
987         checkSafe :: (Module, SrcSpan, IsSafeImport) -> Hsc (Maybe PackageId)
988         checkSafe (_, _, False) = return Nothing
989         checkSafe (m, l, True ) = do
990             module_safe <- isModSafe m l
991             case module_safe of
992                 Nothing -> return pkg
993                 Just s  -> liftIO $ throwIO $ mkSrcErr $ unitBag $ mkPlainErrMsg l
994                             $ ppr m <+> text "can't be safely imported!"
995                                 <+> s
996             where pkg | isHomePkg m = Nothing
997                       | otherwise   = Just (modulePackageId m)
998                             
999 --------------------------------------------------------------
1000 -- Simplifiers
1001 --------------------------------------------------------------
1002
1003 hscSimplify :: HscEnv -> ModGuts -> IO ModGuts
1004 hscSimplify hsc_env modguts = runHsc hsc_env $ hscSimplify' modguts
1005
1006 hscSimplify' :: ModGuts -> Hsc ModGuts
1007 hscSimplify' ds_result
1008   = do hsc_env <- getHscEnv
1009        {-# SCC "Core2Core" #-}
1010          liftIO $ core2core hsc_env ds_result
1011
1012 --------------------------------------------------------------
1013 -- Interface generators
1014 --------------------------------------------------------------
1015
1016 hscSimpleIface :: TcGblEnv
1017                -> Maybe Fingerprint
1018                -> Hsc (ModIface, Bool, ModDetails)
1019 hscSimpleIface tc_result mb_old_iface
1020   = do 
1021        hsc_env <- getHscEnv
1022        details <- liftIO $ mkBootModDetailsTc hsc_env tc_result
1023        (new_iface, no_change)
1024            <- {-# SCC "MkFinalIface" #-}
1025               ioMsgMaybe $ 
1026                 mkIfaceTc hsc_env mb_old_iface details tc_result
1027        -- And the answer is ...
1028        liftIO $ dumpIfaceStats hsc_env
1029        return (new_iface, no_change, details)
1030
1031 hscNormalIface :: ModGuts
1032                -> Maybe Fingerprint
1033                -> Hsc (ModIface, Bool, ModDetails, CgGuts)
1034 hscNormalIface simpl_result mb_old_iface
1035   = do 
1036        hsc_env <- getHscEnv
1037        (cg_guts, details) <- {-# SCC "CoreTidy" #-}
1038                              liftIO $ tidyProgram hsc_env simpl_result
1039
1040             -- BUILD THE NEW ModIface and ModDetails
1041             --  and emit external core if necessary
1042             -- This has to happen *after* code gen so that the back-end
1043             -- info has been set.  Not yet clear if it matters waiting
1044             -- until after code output
1045        (new_iface, no_change)
1046            <- {-# SCC "MkFinalIface" #-}
1047               ioMsgMaybe $ 
1048                    mkIface hsc_env mb_old_iface details simpl_result
1049
1050        -- Emit external core
1051        -- This should definitely be here and not after CorePrep,
1052        -- because CorePrep produces unqualified constructor wrapper declarations,
1053        -- so its output isn't valid External Core (without some preprocessing).
1054        liftIO $ emitExternalCore (hsc_dflags hsc_env) cg_guts
1055        liftIO $ dumpIfaceStats hsc_env
1056
1057             -- Return the prepared code.
1058        return (new_iface, no_change, details, cg_guts)
1059
1060 --------------------------------------------------------------
1061 -- BackEnd combinators
1062 --------------------------------------------------------------
1063
1064 hscWriteIface :: ModIface
1065               -> Bool
1066               -> ModSummary
1067               -> Hsc ()
1068
1069 hscWriteIface iface no_change mod_summary
1070     = do dflags <- getDynFlags
1071          unless no_change
1072            $ liftIO $ writeIfaceFile dflags (ms_location mod_summary) iface
1073
1074 -- | Compile to hard-code.
1075 hscGenHardCode :: CgGuts -> ModSummary
1076                -> Hsc (Maybe FilePath) -- ^ @Just f@ <=> _stub.c is f
1077 hscGenHardCode cgguts mod_summary
1078   = do
1079     hsc_env <- getHscEnv
1080     liftIO $ do
1081          let CgGuts{ -- This is the last use of the ModGuts in a compilation.
1082                      -- From now on, we just use the bits we need.
1083                      cg_module   = this_mod,
1084                      cg_binds    = core_binds,
1085                      cg_tycons   = tycons,
1086                      cg_foreign  = foreign_stubs0,
1087                      cg_dep_pkgs = dependencies,
1088                      cg_hpc_info = hpc_info } = cgguts
1089              dflags = hsc_dflags hsc_env
1090              platform = targetPlatform dflags
1091              location = ms_location mod_summary
1092              data_tycons = filter isDataTyCon tycons
1093              -- cg_tycons includes newtypes, for the benefit of External Core,
1094              -- but we don't generate any code for newtypes
1095
1096          -------------------
1097          -- PREPARE FOR CODE GENERATION
1098          -- Do saturation and convert to A-normal form
1099          prepd_binds <- {-# SCC "CorePrep" #-}
1100                         corePrepPgm dflags core_binds data_tycons ;
1101          -----------------  Convert to STG ------------------
1102          (stg_binds, cost_centre_info)
1103              <- {-# SCC "CoreToStg" #-}
1104                 myCoreToStg dflags this_mod prepd_binds 
1105
1106          let prof_init = profilingInitCode this_mod cost_centre_info
1107              foreign_stubs = foreign_stubs0 `appendStubC` prof_init
1108
1109          ------------------  Code generation ------------------
1110          
1111          cmms <- if dopt Opt_TryNewCodeGen dflags
1112                  then do cmms <- tryNewCodeGen hsc_env this_mod data_tycons
1113                                  cost_centre_info
1114                                  stg_binds hpc_info
1115                          return cmms
1116                  else {-# SCC "CodeGen" #-}
1117                        codeGen dflags this_mod data_tycons
1118                                cost_centre_info
1119                                stg_binds hpc_info
1120
1121          --- Optionally run experimental Cmm transformations ---
1122          cmms <- optionallyConvertAndOrCPS hsc_env cmms
1123                  -- unless certain dflags are on, the identity function
1124          ------------------  Code output -----------------------
1125          rawcmms <- cmmToRawCmm cmms
1126          dumpIfSet_dyn dflags Opt_D_dump_raw_cmm "Raw Cmm" (pprPlatform platform rawcmms)
1127          (_stub_h_exists, stub_c_exists)
1128              <- codeOutput dflags this_mod location foreign_stubs 
1129                 dependencies rawcmms
1130          return stub_c_exists
1131
1132 hscInteractive :: (ModIface, ModDetails, CgGuts)
1133                -> ModSummary
1134                -> Hsc (InteractiveStatus, ModIface, ModDetails)
1135 #ifdef GHCI
1136 hscInteractive (iface, details, cgguts) mod_summary
1137     = do
1138          dflags <- getDynFlags
1139          let CgGuts{ -- This is the last use of the ModGuts in a compilation.
1140                      -- From now on, we just use the bits we need.
1141                      cg_module   = this_mod,
1142                      cg_binds    = core_binds,
1143                      cg_tycons   = tycons,
1144                      cg_foreign  = foreign_stubs,
1145                      cg_modBreaks = mod_breaks } = cgguts
1146
1147              location = ms_location mod_summary
1148              data_tycons = filter isDataTyCon tycons
1149              -- cg_tycons includes newtypes, for the benefit of External Core,
1150              -- but we don't generate any code for newtypes
1151
1152          -------------------
1153          -- PREPARE FOR CODE GENERATION
1154          -- Do saturation and convert to A-normal form
1155          prepd_binds <- {-# SCC "CorePrep" #-}
1156                         liftIO $ corePrepPgm dflags core_binds data_tycons ;
1157          -----------------  Generate byte code ------------------
1158          comp_bc <- liftIO $ byteCodeGen dflags prepd_binds data_tycons mod_breaks
1159          ------------------ Create f-x-dynamic C-side stuff ---
1160          (_istub_h_exists, istub_c_exists) 
1161              <- liftIO $ outputForeignStubs dflags this_mod
1162                                             location foreign_stubs
1163          return (HscRecomp istub_c_exists (Just (comp_bc, mod_breaks))
1164                 , iface, details)
1165 #else
1166 hscInteractive _ _ = panic "GHC not compiled with interpreter"
1167 #endif
1168
1169 ------------------------------
1170
1171 hscCompileCmmFile :: HscEnv -> FilePath -> IO ()
1172 hscCompileCmmFile hsc_env filename
1173   = runHsc hsc_env $ do
1174       let dflags = hsc_dflags hsc_env
1175       cmm <- ioMsgMaybe $ parseCmmFile dflags filename
1176       liftIO $ do
1177         cmms <- optionallyConvertAndOrCPS hsc_env [cmm]
1178         rawCmms <- cmmToRawCmm cmms
1179         _ <- codeOutput dflags no_mod no_loc NoStubs [] rawCmms
1180         return ()
1181   where
1182         no_mod = panic "hscCmmFile: no_mod"
1183         no_loc = ModLocation{ ml_hs_file  = Just filename,
1184                               ml_hi_file  = panic "hscCmmFile: no hi file",
1185                               ml_obj_file = panic "hscCmmFile: no obj file" }
1186
1187 -------------------- Stuff for new code gen ---------------------
1188
1189 tryNewCodeGen   :: HscEnv -> Module -> [TyCon]
1190                 -> CollectedCCs
1191                 -> [(StgBinding,[(Id,[Id])])]
1192                 -> HpcInfo
1193                 -> IO [Cmm]
1194 tryNewCodeGen hsc_env this_mod data_tycons
1195               cost_centre_info stg_binds hpc_info =
1196   do    { let dflags = hsc_dflags hsc_env
1197               platform = targetPlatform dflags
1198         ; prog <- StgCmm.codeGen dflags this_mod data_tycons
1199                          cost_centre_info stg_binds hpc_info
1200         ; dumpIfSet_dyn dflags Opt_D_dump_cmmz "Cmm produced by new codegen" 
1201                 (pprCmms platform prog)
1202
1203         -- We are building a single SRT for the entire module, so
1204         -- we must thread it through all the procedures as we cps-convert them.
1205         ; us <- mkSplitUniqSupply 'S'
1206         ; let initTopSRT = initUs_ us emptySRT
1207         ; (topSRT, prog) <- foldM (cmmPipeline hsc_env) (initTopSRT, []) prog
1208
1209         ; let prog' = map cmmOfZgraph (srtToData topSRT : prog)
1210         ; dumpIfSet_dyn dflags Opt_D_dump_cmmz "Output Cmm" (pprPlatform platform prog')
1211         ; return prog' }
1212
1213
1214 optionallyConvertAndOrCPS :: HscEnv -> [Cmm] -> IO [Cmm]
1215 optionallyConvertAndOrCPS hsc_env cmms =
1216     do let dflags = hsc_dflags hsc_env
1217         --------  Optionally convert to and from zipper ------
1218        cmms <- if dopt Opt_ConvertToZipCfgAndBack dflags
1219                then mapM (testCmmConversion hsc_env) cmms
1220                else return cmms
1221        return cmms
1222
1223
1224 testCmmConversion :: HscEnv -> Cmm -> IO Cmm
1225 testCmmConversion hsc_env cmm =
1226     do let dflags = hsc_dflags hsc_env
1227            platform = targetPlatform dflags
1228        showPass dflags "CmmToCmm"
1229        dumpIfSet_dyn dflags Opt_D_dump_cvt_cmm "C-- pre-conversion" (pprPlatform platform cmm)
1230        --continuationC <- cmmCPS dflags abstractC >>= cmmToRawCmm
1231        us <- mkSplitUniqSupply 'C'
1232        let zgraph = initUs_ us (cmmToZgraph platform cmm)
1233        chosen_graph <-
1234         if dopt Opt_RunCPSZ dflags
1235             then do us <- mkSplitUniqSupply 'S'
1236                     let topSRT = initUs_ us emptySRT
1237                     (_, [zgraph]) <- cmmPipeline hsc_env (topSRT, []) zgraph
1238                     return zgraph
1239             else return (runCmmContFlowOpts zgraph)
1240        dumpIfSet_dyn dflags Opt_D_dump_cmmz "C-- Zipper Graph" (pprPlatform platform chosen_graph)
1241        showPass dflags "Convert from Z back to Cmm"
1242        let cvt = cmmOfZgraph chosen_graph
1243        dumpIfSet_dyn dflags Opt_D_dump_cvt_cmm "C-- post-conversion" (pprPlatform platform cvt)
1244        return cvt
1245
1246 myCoreToStg :: DynFlags -> Module -> [CoreBind]
1247             -> IO ( [(StgBinding,[(Id,[Id])])]  -- output program
1248                   , CollectedCCs) -- cost centre info (declared and used)
1249
1250 myCoreToStg dflags this_mod prepd_binds
1251  = do 
1252       stg_binds <- {-# SCC "Core2Stg" #-}
1253              coreToStg (thisPackage dflags) prepd_binds
1254
1255       (stg_binds2, cost_centre_info) <- {-# SCC "Stg2Stg" #-}
1256              stg2stg dflags this_mod stg_binds
1257
1258       return (stg_binds2, cost_centre_info)
1259 \end{code}
1260
1261
1262 %************************************************************************
1263 %*                                                                      *
1264 \subsection{Compiling a do-statement}
1265 %*                                                                      *
1266 %************************************************************************
1267
1268 When the UnlinkedBCOExpr is linked you get an HValue of type
1269         IO [HValue]
1270 When you run it you get a list of HValues that should be 
1271 the same length as the list of names; add them to the ClosureEnv.
1272
1273 A naked expression returns a singleton Name [it].
1274
1275         What you type                   The IO [HValue] that hscStmt returns
1276         -------------                   ------------------------------------
1277         let pat = expr          ==>     let pat = expr in return [coerce HVal x, coerce HVal y, ...]
1278                                         bindings: [x,y,...]
1279
1280         pat <- expr             ==>     expr >>= \ pat -> return [coerce HVal x, coerce HVal y, ...]
1281                                         bindings: [x,y,...]
1282
1283         expr (of IO type)       ==>     expr >>= \ v -> return [v]
1284           [NB: result not printed]      bindings: [it]
1285           
1286
1287         expr (of non-IO type, 
1288           result showable)      ==>     let v = expr in print v >> return [v]
1289                                         bindings: [it]
1290
1291         expr (of non-IO type, 
1292           result not showable)  ==>     error
1293
1294 \begin{code}
1295 #ifdef GHCI
1296 hscStmt         -- Compile a stmt all the way to an HValue, but don't run it
1297   :: HscEnv
1298   -> String                     -- The statement
1299   -> IO (Maybe ([Id], HValue))
1300      -- ^ 'Nothing' <==> empty statement (or comment only), but no parse error
1301 hscStmt hsc_env stmt = hscStmtWithLocation hsc_env stmt "<interactive>" 1
1302
1303 hscStmtWithLocation     -- Compile a stmt all the way to an HValue, but don't run it
1304   :: HscEnv
1305   -> String                     -- The statement
1306   -> String                     -- the source
1307   -> Int                        -- ^ starting line
1308   -> IO (Maybe ([Id], HValue))
1309      -- ^ 'Nothing' <==> empty statement (or comment only), but no parse error
1310 hscStmtWithLocation hsc_env stmt source linenumber = runHsc hsc_env $ do
1311     maybe_stmt <- hscParseStmtWithLocation source linenumber stmt
1312     case maybe_stmt of
1313       Nothing -> return Nothing
1314       Just parsed_stmt -> do  -- The real stuff
1315
1316              -- Rename and typecheck it
1317         let icontext = hsc_IC hsc_env
1318         (ids, tc_expr) <- ioMsgMaybe $ 
1319                             tcRnStmt hsc_env icontext parsed_stmt
1320             -- Desugar it
1321         let rdr_env  = ic_rn_gbl_env icontext
1322             type_env = mkTypeEnv (map AnId (ic_tmp_ids icontext))
1323         ds_expr <- ioMsgMaybe $
1324                      deSugarExpr hsc_env iNTERACTIVE rdr_env type_env tc_expr
1325         handleWarnings
1326
1327         -- Then desugar, code gen, and link it
1328         let src_span = srcLocSpan interactiveSrcLoc
1329         hsc_env <- getHscEnv
1330         hval <- liftIO $ hscCompileCoreExpr hsc_env src_span ds_expr
1331
1332         return $ Just (ids, hval)
1333
1334 hscImport :: HscEnv -> String -> IO (ImportDecl RdrName)
1335 hscImport hsc_env str = runHsc hsc_env $ do
1336     (L _ (HsModule{hsmodImports=is})) <- 
1337        hscParseThing parseModule str
1338     case is of
1339         [i] -> return (unLoc i)
1340         _ -> liftIO $ throwOneError $
1341                 mkPlainErrMsg noSrcSpan $
1342                     ptext (sLit "parse error in import declaration")
1343
1344 hscTcExpr       -- Typecheck an expression (but don't run it)
1345   :: HscEnv
1346   -> String                     -- The expression
1347   -> IO Type
1348
1349 hscTcExpr hsc_env expr = runHsc hsc_env $ do
1350     maybe_stmt <- hscParseStmt expr
1351     case maybe_stmt of
1352         Just (L _ (ExprStmt expr _ _ _)) ->
1353             ioMsgMaybe $ tcRnExpr hsc_env (hsc_IC hsc_env) expr
1354         _ ->
1355             liftIO $ throwIO $ mkSrcErr $ unitBag $ mkPlainErrMsg noSrcSpan
1356                 (text "not an expression:" <+> quotes (text expr))
1357
1358 -- | Find the kind of a type
1359 hscKcType
1360   :: HscEnv
1361   -> String                     -- ^ The type
1362   -> IO Kind
1363
1364 hscKcType hsc_env str = runHsc hsc_env $ do
1365     ty <- hscParseType str
1366     ioMsgMaybe $ tcRnType hsc_env (hsc_IC hsc_env) ty
1367
1368 #endif
1369 \end{code}
1370
1371 \begin{code}
1372 #ifdef GHCI
1373 hscParseStmt :: String -> Hsc (Maybe (LStmt RdrName))
1374 hscParseStmt = hscParseThing parseStmt
1375
1376 hscParseStmtWithLocation :: String -> Int 
1377                          -> String -> Hsc (Maybe (LStmt RdrName))
1378 hscParseStmtWithLocation source linenumber stmt = 
1379   hscParseThingWithLocation source linenumber parseStmt stmt
1380
1381 hscParseType :: String -> Hsc (LHsType RdrName)
1382 hscParseType = hscParseThing parseType
1383 #endif
1384
1385 hscParseIdentifier :: HscEnv -> String -> IO (Located RdrName)
1386 hscParseIdentifier hsc_env str = runHsc hsc_env $ 
1387                                    hscParseThing parseIdentifier str
1388
1389 hscParseThing :: (Outputable thing)
1390               => Lexer.P thing
1391               -> String
1392               -> Hsc thing
1393 hscParseThing = hscParseThingWithLocation "<interactive>" 1
1394
1395 hscParseThingWithLocation :: (Outputable thing)
1396               => String -> Int 
1397               -> Lexer.P thing
1398               -> String
1399               -> Hsc thing
1400 hscParseThingWithLocation source linenumber parser str
1401  = {-# SCC "Parser" #-} do
1402       dflags <- getDynFlags
1403       liftIO $ showPass dflags "Parser"
1404
1405       let buf = stringToStringBuffer str
1406           loc  = mkRealSrcLoc (fsLit source) linenumber 1
1407
1408       case unP parser (mkPState dflags buf loc) of
1409
1410         PFailed span err -> do
1411           let msg = mkPlainErrMsg span err
1412           liftIO $ throwIO (mkSrcErr (unitBag msg))
1413
1414         POk pst thing -> do
1415           logWarningsReportErrors (getMessages pst)
1416           liftIO $ dumpIfSet_dyn dflags Opt_D_dump_parsed "Parser" (ppr thing)
1417           return thing
1418 \end{code}
1419
1420 \begin{code}
1421 hscCompileCore :: HscEnv
1422                -> Bool
1423                -> ModSummary
1424                -> [CoreBind]
1425                -> IO ()
1426
1427 hscCompileCore hsc_env simplify mod_summary binds
1428   = runHsc hsc_env $ do
1429       let maybe_simplify mod_guts | simplify = hscSimplify' mod_guts
1430                                   | otherwise = return mod_guts
1431       guts <- maybe_simplify (mkModGuts (ms_mod mod_summary) binds)
1432       (iface, changed, _details, cgguts) <- hscNormalIface guts Nothing
1433       hscWriteIface iface changed mod_summary
1434       _ <- hscGenHardCode cgguts mod_summary
1435       return ()
1436
1437 -- Makes a "vanilla" ModGuts.
1438 mkModGuts :: Module -> [CoreBind] -> ModGuts
1439 mkModGuts mod binds = ModGuts {
1440   mg_module = mod,
1441   mg_boot = False,
1442   mg_exports = [],
1443   mg_deps = noDependencies,
1444   mg_dir_imps = emptyModuleEnv,
1445   mg_used_names = emptyNameSet,
1446   mg_used_th = False,
1447   mg_rdr_env = emptyGlobalRdrEnv,
1448   mg_fix_env = emptyFixityEnv,
1449   mg_types = emptyTypeEnv,
1450   mg_insts = [],
1451   mg_fam_insts = [],
1452   mg_rules = [],
1453   mg_vect_decls = [],
1454   mg_binds = binds,
1455   mg_foreign = NoStubs,
1456   mg_warns = NoWarnings,
1457   mg_anns = [],
1458   mg_hpc_info = emptyHpcInfo False,
1459   mg_modBreaks = emptyModBreaks,
1460   mg_vect_info = noVectInfo,
1461   mg_inst_env = emptyInstEnv,
1462   mg_fam_inst_env = emptyFamInstEnv,
1463   mg_trust_pkg = False
1464 }
1465 \end{code}
1466
1467 %************************************************************************
1468 %*                                                                      *
1469         Desugar, simplify, convert to bytecode, and link an expression
1470 %*                                                                      *
1471 %************************************************************************
1472
1473 \begin{code}
1474 #ifdef GHCI
1475 hscCompileCoreExpr :: HscEnv -> SrcSpan -> CoreExpr -> IO HValue
1476 hscCompileCoreExpr hsc_env srcspan ds_expr
1477   | rtsIsProfiled
1478   = throwIO (InstallationError "You can't call hscCompileCoreExpr in a profiled compiler")
1479           -- Otherwise you get a seg-fault when you run it
1480
1481   | otherwise = do
1482     let dflags = hsc_dflags hsc_env
1483     let lint_on = dopt Opt_DoCoreLinting dflags
1484
1485         -- Simplify it
1486     simpl_expr <- simplifyExpr dflags ds_expr
1487
1488         -- Tidy it (temporary, until coreSat does cloning)
1489     let tidy_expr = tidyExpr emptyTidyEnv simpl_expr
1490
1491         -- Prepare for codegen
1492     prepd_expr <- corePrepExpr dflags tidy_expr
1493
1494         -- Lint if necessary
1495         -- ToDo: improve SrcLoc
1496     when lint_on $
1497        let ictxt = hsc_IC hsc_env
1498            tyvars = varSetElems (tyVarsOfTypes (map idType (ic_tmp_ids ictxt)))
1499        in
1500            case lintUnfolding noSrcLoc tyvars prepd_expr of
1501               Just err -> pprPanic "hscCompileCoreExpr" err
1502               Nothing  -> return ()
1503
1504           -- Convert to BCOs
1505     bcos <- coreExprToBCOs dflags prepd_expr
1506
1507         -- link it
1508     hval <- linkExpr hsc_env srcspan bcos
1509
1510     return hval
1511 #endif
1512 \end{code}
1513
1514
1515 %************************************************************************
1516 %*                                                                      *
1517         Statistics on reading interfaces
1518 %*                                                                      *
1519 %************************************************************************
1520
1521 \begin{code}
1522 dumpIfaceStats :: HscEnv -> IO ()
1523 dumpIfaceStats hsc_env
1524   = do  { eps <- readIORef (hsc_EPS hsc_env)
1525         ; dumpIfSet (dump_if_trace || dump_rn_stats)
1526                     "Interface statistics"
1527                     (ifaceStats eps) }
1528   where
1529     dflags = hsc_dflags hsc_env
1530     dump_rn_stats = dopt Opt_D_dump_rn_stats dflags
1531     dump_if_trace = dopt Opt_D_dump_if_trace dflags
1532 \end{code}
1533
1534 %************************************************************************
1535 %*                                                                      *
1536         Progress Messages: Module i of n
1537 %*                                                                      *
1538 %************************************************************************
1539
1540 \begin{code}
1541 showModuleIndex :: Maybe (Int, Int) -> String
1542 showModuleIndex Nothing = ""
1543 showModuleIndex (Just (i,n)) = "[" ++ padded ++ " of " ++ n_str ++ "] "
1544     where
1545         n_str = show n
1546         i_str = show i
1547         padded = replicate (length n_str - length i_str) ' ' ++ i_str
1548 \end{code}