Remove LazyUniqFM; fixes trac #3880
[ghc-hetmet.git] / compiler / main / HscMain.lhs
1 %
2 % (c) The GRASP/AQUA Project, Glasgow University, 1993-2000
3 %
4 \begin{code}
5 -- | Main driver for the compiling plain Haskell source code.
6 --
7 -- This module implements compilation of a Haskell-only source file.  It is
8 -- /not/ concerned with preprocessing of source files; this is handled in
9 -- "DriverPipeline".
10 --
11 module HscMain
12     ( newHscEnv, hscCmmFile
13     , hscParseIdentifier
14     , hscSimplify
15     , hscNormalIface, hscWriteIface, hscGenHardCode
16 #ifdef GHCI
17     , hscStmt, hscTcExpr, hscKcType
18     , compileExpr
19 #endif
20     , HsCompiler(..)
21     , hscOneShotCompiler, hscNothingCompiler
22     , hscInteractiveCompiler, hscBatchCompiler
23     , hscCompileOneShot     -- :: Compiler HscStatus
24     , hscCompileBatch       -- :: Compiler (HscStatus, ModIface, ModDetails)
25     , hscCompileNothing     -- :: Compiler (HscStatus, ModIface, ModDetails)
26     , hscCompileInteractive -- :: Compiler (InteractiveStatus, ModIface, ModDetails)
27     , hscCheckRecompBackend
28     , HscStatus' (..)
29     , InteractiveStatus, HscStatus
30
31     -- The new interface
32     , hscParse
33     , hscTypecheck
34     , hscTypecheckRename
35     , hscDesugar
36     , makeSimpleIface
37     , makeSimpleDetails
38     ) where
39
40 #ifdef GHCI
41 import CodeOutput       ( outputForeignStubs )
42 import ByteCodeGen      ( byteCodeGen, coreExprToBCOs )
43 import Linker           ( HValue, linkExpr )
44 import CoreTidy         ( tidyExpr )
45 import CorePrep         ( corePrepExpr )
46 import Desugar          ( deSugarExpr )
47 import SimplCore        ( simplifyExpr )
48 import TcRnDriver       ( tcRnStmt, tcRnExpr, tcRnType ) 
49 import Type             ( Type )
50 import PrelNames        ( iNTERACTIVE )
51 import {- Kind parts of -} Type         ( Kind )
52 import CoreLint         ( lintUnfolding )
53 import DsMeta           ( templateHaskellNames )
54 import SrcLoc           ( SrcSpan, noSrcLoc, interactiveSrcLoc, srcLocSpan, noSrcSpan )
55 import VarSet
56 import VarEnv           ( emptyTidyEnv )
57 #endif
58
59 import Id               ( Id )
60 import Module           ( emptyModuleEnv, ModLocation(..), Module )
61 import RdrName
62 import HsSyn
63 import CoreSyn
64 import SrcLoc           ( Located(..) )
65 import StringBuffer
66 import Parser
67 import Lexer
68 import SrcLoc           ( mkSrcLoc )
69 import TcRnDriver       ( tcRnModule )
70 import TcIface          ( typecheckIface )
71 import TcRnMonad        ( initIfaceCheck, TcGblEnv(..) )
72 import IfaceEnv         ( initNameCache )
73 import LoadIface        ( ifaceStats, initExternalPackageState )
74 import PrelInfo         ( wiredInThings, basicKnownKeyNames )
75 import MkIface
76 import Desugar          ( deSugar )
77 import SimplCore        ( core2core )
78 import TidyPgm
79 import CorePrep         ( corePrepPgm )
80 import CoreToStg        ( coreToStg )
81 import qualified StgCmm ( codeGen )
82 import StgSyn
83 import CostCentre
84 import TyCon            ( TyCon, isDataTyCon )
85 import Name             ( Name, NamedThing(..) )
86 import SimplStg         ( stg2stg )
87 import CodeGen          ( codeGen )
88 import Cmm              ( Cmm )
89 import PprCmm           ( pprCmms )
90 import CmmParse         ( parseCmmFile )
91 import CmmBuildInfoTables
92 import CmmCPS
93 import CmmCPSZ
94 import CmmInfo
95 import OptimizationFuel ( initOptFuelState )
96 import CmmCvt
97 import CmmTx
98 import CmmContFlowOpt
99 import CodeOutput       ( codeOutput )
100 import NameEnv          ( emptyNameEnv )
101 import Fingerprint      ( Fingerprint )
102
103 import DynFlags
104 import ErrUtils
105 import UniqSupply       ( mkSplitUniqSupply )
106
107 import Outputable
108 import HscStats         ( ppSourceStats )
109 import HscTypes
110 import MkExternalCore   ( emitExternalCore )
111 import FastString
112 import UniqFM           ( emptyUFM )
113 import UniqSupply       ( initUs_ )
114 import Bag              ( unitBag )
115 import Exception
116 -- import MonadUtils
117
118 import Control.Monad
119 -- import System.IO
120 import Data.IORef
121 \end{code}
122 #include "HsVersions.h"
123
124
125 %************************************************************************
126 %*                                                                      *
127                 Initialisation
128 %*                                                                      *
129 %************************************************************************
130
131 \begin{code}
132 newHscEnv :: GhcApiCallbacks -> DynFlags -> IO HscEnv
133 newHscEnv callbacks dflags
134   = do  { eps_var <- newIORef initExternalPackageState
135         ; us      <- mkSplitUniqSupply 'r'
136         ; nc_var  <- newIORef (initNameCache us knownKeyNames)
137         ; fc_var  <- newIORef emptyUFM
138         ; mlc_var <- newIORef emptyModuleEnv
139         ; optFuel <- initOptFuelState
140         ; return (HscEnv { hsc_dflags = dflags,
141                            hsc_callbacks = callbacks,
142                            hsc_targets = [],
143                            hsc_mod_graph = [],
144                            hsc_IC      = emptyInteractiveContext,
145                            hsc_HPT     = emptyHomePackageTable,
146                            hsc_EPS     = eps_var,
147                            hsc_NC      = nc_var,
148                            hsc_FC      = fc_var,
149                            hsc_MLC     = mlc_var,
150                            hsc_OptFuel = optFuel,
151                            hsc_type_env_var = Nothing,
152                            hsc_global_rdr_env = emptyGlobalRdrEnv,
153                            hsc_global_type_env = emptyNameEnv } ) }
154
155
156 knownKeyNames :: [Name] -- Put here to avoid loops involving DsMeta,
157                         -- where templateHaskellNames are defined
158 knownKeyNames = map getName wiredInThings 
159               ++ basicKnownKeyNames
160 #ifdef GHCI
161               ++ templateHaskellNames
162 #endif
163 \end{code}
164
165
166 \begin{code}
167 -- | parse a file, returning the abstract syntax
168 hscParse :: GhcMonad m =>
169             ModSummary
170          -> m (Located (HsModule RdrName))
171 hscParse mod_summary = do
172    hsc_env <- getSession
173    let dflags        = hsc_dflags hsc_env
174        src_filename  = ms_hspp_file mod_summary
175        maybe_src_buf = ms_hspp_buf  mod_summary
176    --------------------------  Parser  ----------------
177    liftIO $ showPass dflags "Parser"
178    {-# SCC "Parser" #-} do
179
180         -- sometimes we already have the buffer in memory, perhaps
181         -- because we needed to parse the imports out of it, or get the
182         -- module name.
183    buf <- case maybe_src_buf of
184             Just b  -> return b
185             Nothing -> liftIO $ hGetStringBuffer src_filename
186
187    let loc  = mkSrcLoc (mkFastString src_filename) 1 1
188
189    case unP parseModule (mkPState buf loc dflags) of
190      PFailed span err ->
191          throwOneError (mkPlainErrMsg span err)
192
193      POk pst rdr_module -> do
194          let ms@(warns,errs) = getMessages pst
195          logWarnings warns
196          if errorsFound dflags ms then
197            liftIO $ throwIO $ mkSrcErr errs
198           else liftIO $ do
199            dumpIfSet_dyn dflags Opt_D_dump_parsed "Parser" (ppr rdr_module) ;
200            dumpIfSet_dyn dflags Opt_D_source_stats "Source Statistics"
201                                (ppSourceStats False rdr_module) ;
202            return rdr_module
203           -- ToDo: free the string buffer later.
204
205 -- | Rename and typecheck a module
206 hscTypecheck :: GhcMonad m =>
207                 ModSummary -> Located (HsModule RdrName)
208              -> m TcGblEnv
209 hscTypecheck mod_summary rdr_module = do
210       hsc_env <- getSession
211       r <- {-# SCC "Typecheck-Rename" #-}
212            ioMsgMaybe $ tcRnModule hsc_env (ms_hsc_src mod_summary) False rdr_module
213       return r
214
215 -- XXX: should this really be a Maybe X?  Check under which circumstances this
216 -- can become a Nothing and decide whether this should instead throw an
217 -- exception/signal an error.
218 type RenamedStuff = 
219         (Maybe (HsGroup Name, [LImportDecl Name], Maybe [LIE Name],
220                 Maybe LHsDocString))
221
222 -- | Rename and typecheck a module, additionally returning the renamed syntax
223 hscTypecheckRename ::
224        GhcMonad m =>
225        ModSummary -> Located (HsModule RdrName)
226     -> m (TcGblEnv, RenamedStuff)
227 hscTypecheckRename mod_summary rdr_module = do
228     hsc_env <- getSession
229     tc_result
230           <- {-# SCC "Typecheck-Rename" #-}
231              ioMsgMaybe $ tcRnModule hsc_env (ms_hsc_src mod_summary) True rdr_module
232
233     let -- This 'do' is in the Maybe monad!
234         rn_info = do { decl <- tcg_rn_decls tc_result
235                      ; let imports = tcg_rn_imports tc_result
236                            exports = tcg_rn_exports tc_result
237                            doc_hdr  = tcg_doc_hdr tc_result
238                      ; return (decl,imports,exports,doc_hdr) }
239
240     return (tc_result, rn_info)
241
242 -- | Convert a typechecked module to Core
243 hscDesugar :: GhcMonad m => ModSummary -> TcGblEnv -> m ModGuts
244 hscDesugar mod_summary tc_result =
245   withSession $ \hsc_env ->
246     ioMsgMaybe $ deSugar hsc_env (ms_location mod_summary) tc_result
247
248 -- | Make a 'ModIface' from the results of typechecking.  Used when
249 -- not optimising, and the interface doesn't need to contain any
250 -- unfoldings or other cross-module optimisation info.
251 -- ToDo: the old interface is only needed to get the version numbers,
252 -- we should use fingerprint versions instead.
253 makeSimpleIface :: GhcMonad m =>
254                    Maybe ModIface -> TcGblEnv -> ModDetails
255                 -> m (ModIface,Bool)
256 makeSimpleIface maybe_old_iface tc_result details =
257   withSession $ \hsc_env ->
258   ioMsgMaybe $ mkIfaceTc hsc_env (fmap mi_iface_hash maybe_old_iface) details tc_result
259
260 -- | Make a 'ModDetails' from the results of typechecking.  Used when
261 -- typechecking only, as opposed to full compilation.
262 makeSimpleDetails :: GhcMonad m => TcGblEnv -> m ModDetails
263 makeSimpleDetails tc_result =
264     withSession $ \hsc_env -> liftIO $ mkBootModDetailsTc hsc_env tc_result
265 \end{code}
266
267 %************************************************************************
268 %*                                                                      *
269                 The main compiler pipeline
270 %*                                                                      *
271 %************************************************************************
272
273                    --------------------------------
274                         The compilation proper
275                    --------------------------------
276
277
278 It's the task of the compilation proper to compile Haskell, hs-boot and
279 core files to either byte-code, hard-code (C, asm, Java, ect) or to
280 nothing at all (the module is still parsed and type-checked. This
281 feature is mostly used by IDE's and the likes).
282 Compilation can happen in either 'one-shot', 'batch', 'nothing',
283 or 'interactive' mode. 'One-shot' mode targets hard-code, 'batch' mode
284 targets hard-code, 'nothing' mode targets nothing and 'interactive' mode
285 targets byte-code.
286 The modes are kept separate because of their different types and meanings.
287 In 'one-shot' mode, we're only compiling a single file and can therefore
288 discard the new ModIface and ModDetails. This is also the reason it only
289 targets hard-code; compiling to byte-code or nothing doesn't make sense
290 when we discard the result.
291 'Batch' mode is like 'one-shot' except that we keep the resulting ModIface
292 and ModDetails. 'Batch' mode doesn't target byte-code since that require
293 us to return the newly compiled byte-code.
294 'Nothing' mode has exactly the same type as 'batch' mode but they're still
295 kept separate. This is because compiling to nothing is fairly special: We
296 don't output any interface files, we don't run the simplifier and we don't
297 generate any code.
298 'Interactive' mode is similar to 'batch' mode except that we return the
299 compiled byte-code together with the ModIface and ModDetails.
300
301 Trying to compile a hs-boot file to byte-code will result in a run-time
302 error. This is the only thing that isn't caught by the type-system.
303
304 \begin{code}
305
306 -- Status of a compilation to hard-code or nothing.
307 data HscStatus' a
308     = HscNoRecomp
309     | HscRecomp
310        Bool -- Has stub files.  This is a hack. We can't compile C files here
311             -- since it's done in DriverPipeline. For now we just return True
312             -- if we want the caller to compile them for us.
313        a
314
315 -- This is a bit ugly.  Since we use a typeclass below and would like to avoid
316 -- functional dependencies, we have to parameterise the typeclass over the
317 -- result type.  Therefore we need to artificially distinguish some types.  We
318 -- do this by adding type tags which will simply be ignored by the caller.
319 type HscStatus         = HscStatus' ()
320 type InteractiveStatus = HscStatus' (Maybe (CompiledByteCode, ModBreaks))
321     -- INVARIANT: result is @Nothing@ <=> input was a boot file
322
323 type OneShotResult     = HscStatus
324 type BatchResult       = (HscStatus, ModIface, ModDetails)
325 type NothingResult     = (HscStatus, ModIface, ModDetails)
326 type InteractiveResult = (InteractiveStatus, ModIface, ModDetails)
327
328 -- FIXME: The old interface and module index are only using in 'batch' and
329 --        'interactive' mode. They should be removed from 'oneshot' mode.
330 type Compiler result =  GhcMonad m =>
331                         HscEnv
332                      -> ModSummary
333                      -> Bool                -- True <=> source unchanged
334                      -> Maybe ModIface      -- Old interface, if available
335                      -> Maybe (Int,Int)     -- Just (i,n) <=> module i of n (for msgs)
336                      -> m result
337
338 data HsCompiler a
339   = HsCompiler {
340     -- | Called when no recompilation is necessary.
341     hscNoRecomp :: GhcMonad m =>
342                    ModIface -> m a,
343
344     -- | Called to recompile the module.
345     hscRecompile :: GhcMonad m =>
346                     ModSummary -> Maybe Fingerprint -> m a,
347
348     hscBackend :: GhcMonad m =>
349                   TcGblEnv -> ModSummary -> Maybe Fingerprint -> m a,
350
351     -- | Code generation for Boot modules.
352     hscGenBootOutput :: GhcMonad m =>
353                         TcGblEnv -> ModSummary -> Maybe Fingerprint -> m a,
354
355     -- | Code generation for normal modules.
356     hscGenOutput :: GhcMonad m =>
357                     ModGuts  -> ModSummary -> Maybe Fingerprint -> m a
358   }
359
360 genericHscCompile :: GhcMonad m =>
361                      HsCompiler a
362                   -> (Maybe (Int,Int) -> Bool -> ModSummary -> m ())
363                   -> HscEnv -> ModSummary -> Bool
364                   -> Maybe ModIface -> Maybe (Int, Int)
365                   -> m a
366 genericHscCompile compiler hscMessage
367                   hsc_env mod_summary source_unchanged
368                   mb_old_iface0 mb_mod_index =
369    withTempSession (\_ -> hsc_env) $ do
370      (recomp_reqd, mb_checked_iface)
371          <- {-# SCC "checkOldIface" #-}
372             liftIO $ checkOldIface hsc_env mod_summary
373                                    source_unchanged mb_old_iface0
374      -- save the interface that comes back from checkOldIface.
375      -- In one-shot mode we don't have the old iface until this
376      -- point, when checkOldIface reads it from the disk.
377      let mb_old_hash = fmap mi_iface_hash mb_checked_iface
378      case mb_checked_iface of
379        Just iface | not recomp_reqd
380            -> do hscMessage mb_mod_index False mod_summary
381                  hscNoRecomp compiler iface
382        _otherwise
383            -> do hscMessage mb_mod_index True mod_summary
384                  hscRecompile compiler mod_summary mb_old_hash
385
386 hscCheckRecompBackend :: HsCompiler a -> TcGblEnv -> Compiler a
387 hscCheckRecompBackend compiler tc_result 
388                    hsc_env mod_summary source_unchanged mb_old_iface _m_of_n =
389    withTempSession (\_ -> hsc_env) $ do
390      (recomp_reqd, mb_checked_iface)
391          <- {-# SCC "checkOldIface" #-}
392             liftIO $ checkOldIface hsc_env mod_summary
393                                    source_unchanged mb_old_iface
394
395      let mb_old_hash = fmap mi_iface_hash mb_checked_iface
396      case mb_checked_iface of
397        Just iface | not recomp_reqd
398            -> hscNoRecomp compiler iface{ mi_globals = Just (tcg_rdr_env tc_result) }
399        _otherwise
400            -> hscBackend compiler tc_result mod_summary mb_old_hash
401
402 genericHscRecompile :: GhcMonad m =>
403                        HsCompiler a
404                     -> ModSummary -> Maybe Fingerprint
405                     -> m a
406 genericHscRecompile compiler mod_summary mb_old_hash
407   | ExtCoreFile <- ms_hsc_src mod_summary =
408       panic "GHC does not currently support reading External Core files"
409   | otherwise = do
410       tc_result <- hscFileFrontEnd mod_summary
411       hscBackend compiler tc_result mod_summary mb_old_hash
412
413 genericHscBackend :: GhcMonad m =>
414                      HsCompiler a
415                   -> TcGblEnv -> ModSummary -> Maybe Fingerprint
416                   -> m a
417 genericHscBackend compiler tc_result mod_summary mb_old_hash
418   | HsBootFile <- ms_hsc_src mod_summary =
419       hscGenBootOutput compiler tc_result mod_summary mb_old_hash
420   | otherwise = do
421       guts <- hscDesugar mod_summary tc_result
422       hscGenOutput compiler guts mod_summary mb_old_hash
423
424 --------------------------------------------------------------
425 -- Compilers
426 --------------------------------------------------------------
427
428 hscOneShotCompiler :: HsCompiler OneShotResult
429 hscOneShotCompiler =
430   HsCompiler {
431
432     hscNoRecomp = \_old_iface -> do
433       withSession (liftIO . dumpIfaceStats)
434       return HscNoRecomp
435
436   , hscRecompile = genericHscRecompile hscOneShotCompiler
437
438   , hscBackend = genericHscBackend hscOneShotCompiler
439
440   , hscGenBootOutput = \tc_result mod_summary mb_old_iface -> do
441        (iface, changed, _) <- hscSimpleIface tc_result mb_old_iface
442        hscWriteIface iface changed mod_summary
443        return (HscRecomp False ())
444
445   , hscGenOutput = \guts0 mod_summary mb_old_iface -> do
446        guts <- hscSimplify guts0
447        (iface, changed, _details, cgguts)
448            <- hscNormalIface guts mb_old_iface
449        hscWriteIface iface changed mod_summary
450        hasStub <- hscGenHardCode cgguts mod_summary
451        return (HscRecomp hasStub ())
452   }
453
454 -- Compile Haskell, boot and extCore in OneShot mode.
455 hscCompileOneShot :: Compiler OneShotResult
456 hscCompileOneShot hsc_env mod_summary src_changed mb_old_iface mb_i_of_n = do
457        -- One-shot mode needs a knot-tying mutable variable for interface
458        -- files.  See TcRnTypes.TcGblEnv.tcg_type_env_var.
459       type_env_var <- liftIO $ newIORef emptyNameEnv
460       let
461          mod = ms_mod mod_summary
462          hsc_env' = hsc_env{ hsc_type_env_var = Just (mod, type_env_var) }
463       ---
464       genericHscCompile hscOneShotCompiler
465                         oneShotMsg hsc_env' mod_summary src_changed
466                         mb_old_iface mb_i_of_n
467
468
469 --------------------------------------------------------------
470
471 hscBatchCompiler :: HsCompiler BatchResult
472 hscBatchCompiler =
473   HsCompiler {
474
475     hscNoRecomp = \iface -> do
476        details <- genModDetails iface
477        return (HscNoRecomp, iface, details)
478
479   , hscRecompile = genericHscRecompile hscBatchCompiler
480
481   , hscBackend = genericHscBackend hscBatchCompiler
482
483   , hscGenBootOutput = \tc_result mod_summary mb_old_iface -> do
484        (iface, changed, details)
485            <- hscSimpleIface tc_result mb_old_iface
486        hscWriteIface iface changed mod_summary
487        return (HscRecomp False (), iface, details)
488
489   , hscGenOutput = \guts0 mod_summary mb_old_iface -> do
490        guts <- hscSimplify guts0
491        (iface, changed, details, cgguts)
492            <- hscNormalIface guts mb_old_iface
493        hscWriteIface iface changed mod_summary
494        hasStub <- hscGenHardCode cgguts mod_summary
495        return (HscRecomp hasStub (), iface, details)
496   }
497
498 -- Compile Haskell, boot and extCore in batch mode.
499 hscCompileBatch :: Compiler (HscStatus, ModIface, ModDetails)
500 hscCompileBatch = genericHscCompile hscBatchCompiler batchMsg
501
502 --------------------------------------------------------------
503
504 hscInteractiveCompiler :: HsCompiler InteractiveResult
505 hscInteractiveCompiler =
506   HsCompiler {
507     hscNoRecomp = \iface -> do
508        details <- genModDetails iface
509        return (HscNoRecomp, iface, details)
510
511   , hscRecompile = genericHscRecompile hscInteractiveCompiler
512
513   , hscBackend = genericHscBackend hscInteractiveCompiler
514
515   , hscGenBootOutput = \tc_result _mod_summary mb_old_iface -> do
516        (iface, _changed, details) <- hscSimpleIface tc_result mb_old_iface
517        return (HscRecomp False Nothing, iface, details)
518
519   , hscGenOutput = \guts0 mod_summary mb_old_iface -> do
520        guts <- hscSimplify guts0
521        (iface, _changed, details, cgguts)
522            <- hscNormalIface guts mb_old_iface
523        hscInteractive (iface, details, cgguts) mod_summary
524   }
525
526 -- Compile Haskell, extCore to bytecode.
527 hscCompileInteractive :: Compiler (InteractiveStatus, ModIface, ModDetails)
528 hscCompileInteractive = genericHscCompile hscInteractiveCompiler batchMsg
529
530 --------------------------------------------------------------
531
532 hscNothingCompiler :: HsCompiler NothingResult
533 hscNothingCompiler =
534   HsCompiler {
535     hscNoRecomp = \iface -> do
536        details <- genModDetails iface
537        return (HscNoRecomp, iface, details)
538
539   , hscRecompile = \mod_summary mb_old_hash ->
540       case ms_hsc_src mod_summary of
541         ExtCoreFile ->
542           panic "hscCompileNothing: cannot do external core"
543         _otherwise -> do
544           tc_result <- hscFileFrontEnd mod_summary
545           hscBackend hscNothingCompiler tc_result mod_summary mb_old_hash
546
547   , hscBackend = \tc_result _mod_summary mb_old_iface -> do
548        (iface, _changed, details) <- hscSimpleIface tc_result mb_old_iface
549        return (HscRecomp False (), iface, details)
550
551   , hscGenBootOutput = \_ _ _ ->
552         panic "hscCompileNothing: hscGenBootOutput should not be called"
553
554   , hscGenOutput = \_ _ _ ->
555         panic "hscCompileNothing: hscGenOutput should not be called"
556   }
557
558 -- Type-check Haskell and .hs-boot only (no external core)
559 hscCompileNothing :: Compiler (HscStatus, ModIface, ModDetails)
560 hscCompileNothing = genericHscCompile hscNothingCompiler batchMsg
561
562 --------------------------------------------------------------
563 -- NoRecomp handlers
564 --------------------------------------------------------------
565
566 genModDetails :: GhcMonad m => ModIface -> m ModDetails
567 genModDetails old_iface =
568     withSession $ \hsc_env -> liftIO $ do
569       new_details <- {-# SCC "tcRnIface" #-}
570                      initIfaceCheck hsc_env $
571                      typecheckIface old_iface
572       dumpIfaceStats hsc_env
573       return new_details
574
575 --------------------------------------------------------------
576 -- Progress displayers.
577 --------------------------------------------------------------
578
579 oneShotMsg :: GhcMonad m => Maybe (Int,Int) -> Bool -> ModSummary -> m ()
580 oneShotMsg _mb_mod_index recomp _mod_summary
581     = do hsc_env <- getSession
582          liftIO $ do
583          if recomp
584             then return ()
585             else compilationProgressMsg (hsc_dflags hsc_env) $
586                      "compilation IS NOT required"
587
588 batchMsg :: GhcMonad m => Maybe (Int,Int) -> Bool -> ModSummary -> m ()
589 batchMsg mb_mod_index recomp mod_summary
590     = do hsc_env <- getSession
591          let showMsg msg = compilationProgressMsg (hsc_dflags hsc_env) $
592                            (showModuleIndex mb_mod_index ++
593                             msg ++ showModMsg (hscTarget (hsc_dflags hsc_env)) recomp mod_summary)
594          liftIO $ do
595          if recomp
596             then showMsg "Compiling "
597             else if verbosity (hsc_dflags hsc_env) >= 2
598                     then showMsg "Skipping  "
599                     else return ()
600
601 --------------------------------------------------------------
602 -- FrontEnds
603 --------------------------------------------------------------
604 hscFileFrontEnd :: GhcMonad m => ModSummary -> m TcGblEnv
605 hscFileFrontEnd mod_summary =
606     do rdr_module <- hscParse mod_summary
607        hscTypecheck mod_summary rdr_module
608
609 --------------------------------------------------------------
610 -- Simplifiers
611 --------------------------------------------------------------
612
613 hscSimplify :: GhcMonad m => ModGuts -> m ModGuts
614 hscSimplify ds_result
615   = do hsc_env <- getSession
616        simpl_result <- {-# SCC "Core2Core" #-}
617                        liftIO $ core2core hsc_env ds_result
618        return simpl_result
619
620 --------------------------------------------------------------
621 -- Interface generators
622 --------------------------------------------------------------
623
624 hscSimpleIface :: GhcMonad m =>
625                   TcGblEnv
626                -> Maybe Fingerprint
627                -> m (ModIface, Bool, ModDetails)
628 hscSimpleIface tc_result mb_old_iface
629   = do hsc_env <- getSession
630        details <- liftIO $ mkBootModDetailsTc hsc_env tc_result
631        (new_iface, no_change)
632            <- {-# SCC "MkFinalIface" #-}
633               ioMsgMaybe $ mkIfaceTc hsc_env mb_old_iface details tc_result
634        -- And the answer is ...
635        liftIO $ dumpIfaceStats hsc_env
636        return (new_iface, no_change, details)
637
638 hscNormalIface :: GhcMonad m =>
639                   ModGuts
640                -> Maybe Fingerprint
641                -> m (ModIface, Bool, ModDetails, CgGuts)
642 hscNormalIface simpl_result mb_old_iface
643   = do hsc_env <- getSession
644
645        (cg_guts, details) <- {-# SCC "CoreTidy" #-}
646                              liftIO $ tidyProgram hsc_env simpl_result
647
648             -- BUILD THE NEW ModIface and ModDetails
649             --  and emit external core if necessary
650             -- This has to happen *after* code gen so that the back-end
651             -- info has been set.  Not yet clear if it matters waiting
652             -- until after code output
653        (new_iface, no_change)
654            <- {-# SCC "MkFinalIface" #-}
655               ioMsgMaybe $ mkIface hsc_env mb_old_iface
656                                    details simpl_result
657         -- Emit external core
658        -- This should definitely be here and not after CorePrep,
659        -- because CorePrep produces unqualified constructor wrapper declarations,
660        -- so its output isn't valid External Core (without some preprocessing).
661        liftIO $ emitExternalCore (hsc_dflags hsc_env) cg_guts
662        liftIO $ dumpIfaceStats hsc_env
663
664             -- Return the prepared code.
665        return (new_iface, no_change, details, cg_guts)
666
667 --------------------------------------------------------------
668 -- BackEnd combinators
669 --------------------------------------------------------------
670
671 hscWriteIface :: GhcMonad m =>
672                  ModIface -> Bool
673               -> ModSummary
674               -> m ()
675 hscWriteIface iface no_change mod_summary
676     = do hsc_env <- getSession
677          let dflags = hsc_dflags hsc_env
678          liftIO $ do
679          unless no_change
680            $ writeIfaceFile dflags (ms_location mod_summary) iface
681
682 -- | Compile to hard-code.
683 hscGenHardCode :: GhcMonad m =>
684                   CgGuts -> ModSummary
685                -> m Bool -- ^ @True@ <=> stub.c exists
686 hscGenHardCode cgguts mod_summary
687     = withSession $ \hsc_env -> liftIO $ do
688          let CgGuts{ -- This is the last use of the ModGuts in a compilation.
689                      -- From now on, we just use the bits we need.
690                      cg_module   = this_mod,
691                      cg_binds    = core_binds,
692                      cg_tycons   = tycons,
693                      cg_dir_imps = dir_imps,
694                      cg_foreign  = foreign_stubs,
695                      cg_dep_pkgs = dependencies,
696                      cg_hpc_info = hpc_info } = cgguts
697              dflags = hsc_dflags hsc_env
698              location = ms_location mod_summary
699              data_tycons = filter isDataTyCon tycons
700              -- cg_tycons includes newtypes, for the benefit of External Core,
701              -- but we don't generate any code for newtypes
702
703          -------------------
704          -- PREPARE FOR CODE GENERATION
705          -- Do saturation and convert to A-normal form
706          prepd_binds <- {-# SCC "CorePrep" #-}
707                         corePrepPgm dflags core_binds data_tycons ;
708          -----------------  Convert to STG ------------------
709          (stg_binds, cost_centre_info)
710              <- {-# SCC "CoreToStg" #-}
711                 myCoreToStg dflags this_mod prepd_binds 
712
713          ------------------  Code generation ------------------
714          cmms <- if dopt Opt_TryNewCodeGen (hsc_dflags hsc_env)
715                  then do cmms <- tryNewCodeGen hsc_env this_mod data_tycons
716                                  dir_imps cost_centre_info
717                                  stg_binds hpc_info
718                          return cmms
719                  else {-# SCC "CodeGen" #-}
720                        codeGen dflags this_mod data_tycons
721                                dir_imps cost_centre_info
722                                stg_binds hpc_info
723
724          --- Optionally run experimental Cmm transformations ---
725          -- cmms <- optionallyConvertAndOrCPS hsc_env cmms
726                  -- unless certain dflags are on, the identity function
727          ------------------  Code output -----------------------
728          rawcmms <- cmmToRawCmm cmms
729          dumpIfSet_dyn dflags Opt_D_dump_cmmz "Raw Cmm" (ppr rawcmms)
730          (_stub_h_exists, stub_c_exists)
731              <- codeOutput dflags this_mod location foreign_stubs 
732                 dependencies rawcmms
733          return stub_c_exists
734
735 hscInteractive :: GhcMonad m =>
736                   (ModIface, ModDetails, CgGuts)
737                -> ModSummary
738                -> m (InteractiveStatus, ModIface, ModDetails)
739 #ifdef GHCI
740 hscInteractive (iface, details, cgguts) mod_summary
741     = do hsc_env <- getSession
742          liftIO $ do
743          let CgGuts{ -- This is the last use of the ModGuts in a compilation.
744                      -- From now on, we just use the bits we need.
745                      cg_module   = this_mod,
746                      cg_binds    = core_binds,
747                      cg_tycons   = tycons,
748                      cg_foreign  = foreign_stubs,
749                      cg_modBreaks = mod_breaks } = cgguts
750              dflags = hsc_dflags hsc_env
751              location = ms_location mod_summary
752              data_tycons = filter isDataTyCon tycons
753              -- cg_tycons includes newtypes, for the benefit of External Core,
754              -- but we don't generate any code for newtypes
755
756          -------------------
757          -- PREPARE FOR CODE GENERATION
758          -- Do saturation and convert to A-normal form
759          prepd_binds <- {-# SCC "CorePrep" #-}
760                         corePrepPgm dflags core_binds data_tycons ;
761          -----------------  Generate byte code ------------------
762          comp_bc <- byteCodeGen dflags prepd_binds data_tycons mod_breaks
763          ------------------ Create f-x-dynamic C-side stuff ---
764          (_istub_h_exists, istub_c_exists) 
765              <- outputForeignStubs dflags this_mod location foreign_stubs
766          return (HscRecomp istub_c_exists (Just (comp_bc, mod_breaks))
767                 , iface, details)
768 #else
769 hscInteractive _ _ = panic "GHC not compiled with interpreter"
770 #endif
771
772 ------------------------------
773
774 hscCmmFile :: GhcMonad m => HscEnv -> FilePath -> m ()
775 hscCmmFile hsc_env filename = do
776     dflags <- return $ hsc_dflags hsc_env
777     cmm <- ioMsgMaybe $
778              parseCmmFile dflags filename
779     cmms <- liftIO $ optionallyConvertAndOrCPS hsc_env [cmm]
780     rawCmms <- liftIO $ cmmToRawCmm cmms
781     _ <- liftIO $ codeOutput dflags no_mod no_loc NoStubs [] rawCmms
782     return ()
783   where
784         no_mod = panic "hscCmmFile: no_mod"
785         no_loc = ModLocation{ ml_hs_file  = Just filename,
786                               ml_hi_file  = panic "hscCmmFile: no hi file",
787                               ml_obj_file = panic "hscCmmFile: no obj file" }
788
789 -------------------- Stuff for new code gen ---------------------
790
791 tryNewCodeGen   :: HscEnv -> Module -> [TyCon] -> [Module]
792                 -> CollectedCCs
793                 -> [(StgBinding,[(Id,[Id])])]
794                 -> HpcInfo
795                 -> IO [Cmm]
796 tryNewCodeGen hsc_env this_mod data_tycons imported_mods 
797               cost_centre_info stg_binds hpc_info =
798   do    { let dflags = hsc_dflags hsc_env
799         ; prog <- StgCmm.codeGen dflags this_mod data_tycons imported_mods 
800                          cost_centre_info stg_binds hpc_info
801         ; dumpIfSet_dyn dflags Opt_D_dump_cmmz "Cmm produced by new codegen" 
802                 (pprCmms prog)
803
804         ; prog <- return $ map (runTx $ runCmmOpts cmmCfgOptsZ) prog
805                 -- Control flow optimisation
806
807         -- We are building a single SRT for the entire module, so
808         -- we must thread it through all the procedures as we cps-convert them.
809         ; us <- mkSplitUniqSupply 'S'
810         ; let topSRT = initUs_ us emptySRT
811         ; (topSRT, prog) <- foldM (protoCmmCPSZ hsc_env) (topSRT, []) prog
812                 -- The main CPS conversion
813
814         ; prog <- return $ map (runTx $ runCmmOpts cmmCfgOptsZ) (srtToData topSRT : prog)
815                 -- Control flow optimisation, again
816
817         ; let prog' = map cmmOfZgraph prog
818         ; dumpIfSet_dyn dflags Opt_D_dump_cmmz "Output Cmm" (ppr prog')
819         ; return prog' }
820
821
822 optionallyConvertAndOrCPS :: HscEnv -> [Cmm] -> IO [Cmm]
823 optionallyConvertAndOrCPS hsc_env cmms =
824     do let dflags = hsc_dflags hsc_env
825         --------  Optionally convert to and from zipper ------
826        cmms <- if dopt Opt_ConvertToZipCfgAndBack dflags
827                then mapM (testCmmConversion hsc_env) cmms
828                else return cmms
829          ---------  Optionally convert to CPS (MDA) -----------
830        cmms <- if not (dopt Opt_ConvertToZipCfgAndBack dflags) &&
831                   dopt Opt_RunCPS dflags
832                then cmmCPS dflags cmms
833                else return cmms
834        return cmms
835
836
837 testCmmConversion :: HscEnv -> Cmm -> IO Cmm
838 testCmmConversion hsc_env cmm =
839     do let dflags = hsc_dflags hsc_env
840        showPass dflags "CmmToCmm"
841        dumpIfSet_dyn dflags Opt_D_dump_cvt_cmm "C-- pre-conversion" (ppr cmm)
842        --continuationC <- cmmCPS dflags abstractC >>= cmmToRawCmm
843        us <- mkSplitUniqSupply 'C'
844        let cfopts = runTx $ runCmmOpts cmmCfgOptsZ
845        let cvtm = do g <- cmmToZgraph cmm
846                      return $ cfopts g
847        let zgraph = initUs_ us cvtm
848        us <- mkSplitUniqSupply 'S'
849        let topSRT = initUs_ us emptySRT
850        (_, [cps_zgraph]) <- protoCmmCPSZ hsc_env (topSRT, []) zgraph
851        let chosen_graph = if dopt Opt_RunCPSZ dflags then cps_zgraph else zgraph
852        dumpIfSet_dyn dflags Opt_D_dump_cmmz "C-- Zipper Graph" (ppr chosen_graph)
853        showPass dflags "Convert from Z back to Cmm"
854        let cvt = cmmOfZgraph $ cfopts $ chosen_graph
855        dumpIfSet_dyn dflags Opt_D_dump_cvt_cmm "C-- post-conversion" (ppr cvt)
856        return cvt
857
858 myCoreToStg :: DynFlags -> Module -> [CoreBind]
859             -> IO ( [(StgBinding,[(Id,[Id])])]  -- output program
860                   , CollectedCCs) -- cost centre info (declared and used)
861
862 myCoreToStg dflags this_mod prepd_binds
863  = do 
864       stg_binds <- {-# SCC "Core2Stg" #-}
865              coreToStg (thisPackage dflags) prepd_binds
866
867       (stg_binds2, cost_centre_info) <- {-# SCC "Stg2Stg" #-}
868              stg2stg dflags this_mod stg_binds
869
870       return (stg_binds2, cost_centre_info)
871 \end{code}
872
873
874 %************************************************************************
875 %*                                                                      *
876 \subsection{Compiling a do-statement}
877 %*                                                                      *
878 %************************************************************************
879
880 When the UnlinkedBCOExpr is linked you get an HValue of type
881         IO [HValue]
882 When you run it you get a list of HValues that should be 
883 the same length as the list of names; add them to the ClosureEnv.
884
885 A naked expression returns a singleton Name [it].
886
887         What you type                   The IO [HValue] that hscStmt returns
888         -------------                   ------------------------------------
889         let pat = expr          ==>     let pat = expr in return [coerce HVal x, coerce HVal y, ...]
890                                         bindings: [x,y,...]
891
892         pat <- expr             ==>     expr >>= \ pat -> return [coerce HVal x, coerce HVal y, ...]
893                                         bindings: [x,y,...]
894
895         expr (of IO type)       ==>     expr >>= \ v -> return [v]
896           [NB: result not printed]      bindings: [it]
897           
898
899         expr (of non-IO type, 
900           result showable)      ==>     let v = expr in print v >> return [v]
901                                         bindings: [it]
902
903         expr (of non-IO type, 
904           result not showable)  ==>     error
905
906 \begin{code}
907 #ifdef GHCI
908 hscStmt         -- Compile a stmt all the way to an HValue, but don't run it
909   :: GhcMonad m =>
910      HscEnv
911   -> String                     -- The statement
912   -> m (Maybe ([Id], HValue))
913      -- ^ 'Nothing' <==> empty statement (or comment only), but no parse error
914 hscStmt hsc_env stmt = do
915     maybe_stmt <- hscParseStmt (hsc_dflags hsc_env) stmt
916     case maybe_stmt of
917       Nothing -> return Nothing
918       Just parsed_stmt -> do  -- The real stuff
919
920              -- Rename and typecheck it
921         let icontext = hsc_IC hsc_env
922         (ids, tc_expr) <- ioMsgMaybe $ tcRnStmt hsc_env icontext parsed_stmt
923             -- Desugar it
924         let rdr_env  = ic_rn_gbl_env icontext
925             type_env = mkTypeEnv (map AnId (ic_tmp_ids icontext))
926         ds_expr <- ioMsgMaybe $
927                      deSugarExpr hsc_env iNTERACTIVE rdr_env type_env tc_expr
928
929         -- Then desugar, code gen, and link it
930         let src_span = srcLocSpan interactiveSrcLoc
931         hval <- liftIO $ compileExpr hsc_env src_span ds_expr
932
933         return $ Just (ids, hval)
934
935
936 hscTcExpr       -- Typecheck an expression (but don't run it)
937   :: GhcMonad m =>
938      HscEnv
939   -> String                     -- The expression
940   -> m Type
941
942 hscTcExpr hsc_env expr = do
943     maybe_stmt <- hscParseStmt (hsc_dflags hsc_env) expr
944     let icontext = hsc_IC hsc_env
945     case maybe_stmt of
946       Just (L _ (ExprStmt expr _ _)) -> do
947           ty <- ioMsgMaybe $ tcRnExpr hsc_env icontext expr
948           return ty
949       _ -> do throw $ mkSrcErr $ unitBag $ mkPlainErrMsg
950                         noSrcSpan
951                         (text "not an expression:" <+> quotes (text expr))
952
953 -- | Find the kind of a type
954 hscKcType
955   :: GhcMonad m =>
956      HscEnv
957   -> String                     -- ^ The type
958   -> m Kind
959
960 hscKcType hsc_env str = do
961     ty <- hscParseType (hsc_dflags hsc_env) str
962     let icontext = hsc_IC hsc_env
963     ioMsgMaybe $ tcRnType hsc_env icontext ty
964
965 #endif
966 \end{code}
967
968 \begin{code}
969 #ifdef GHCI
970 hscParseStmt :: GhcMonad m => DynFlags -> String -> m (Maybe (LStmt RdrName))
971 hscParseStmt = hscParseThing parseStmt
972
973 hscParseType :: GhcMonad m => DynFlags -> String -> m (LHsType RdrName)
974 hscParseType = hscParseThing parseType
975 #endif
976
977 hscParseIdentifier :: GhcMonad m => DynFlags -> String -> m (Located RdrName)
978 hscParseIdentifier = hscParseThing parseIdentifier
979
980 hscParseThing :: (Outputable thing, GhcMonad m)
981               => Lexer.P thing
982               -> DynFlags -> String
983               -> m thing
984         -- Nothing => Parse error (message already printed)
985         -- Just x  => success
986 hscParseThing parser dflags str
987  = (liftIO $ showPass dflags "Parser") >>
988       {-# SCC "Parser" #-} do
989
990       buf <- liftIO $ stringToStringBuffer str
991
992       let loc  = mkSrcLoc (fsLit "<interactive>") 1 1
993
994       case unP parser (mkPState buf loc dflags) of
995
996         PFailed span err -> do
997           let msg = mkPlainErrMsg span err
998           throw (mkSrcErr (unitBag msg))
999
1000         POk pst thing -> do
1001
1002           let ms@(warns, errs) = getMessages pst
1003           logWarnings warns
1004           when (errorsFound dflags ms) $ -- handle -Werror
1005             throw (mkSrcErr errs)
1006
1007           --ToDo: can't free the string buffer until we've finished this
1008           -- compilation sweep and all the identifiers have gone away.
1009           liftIO $ dumpIfSet_dyn dflags Opt_D_dump_parsed "Parser" (ppr thing)
1010           return thing
1011 \end{code}
1012
1013 %************************************************************************
1014 %*                                                                      *
1015         Desugar, simplify, convert to bytecode, and link an expression
1016 %*                                                                      *
1017 %************************************************************************
1018
1019 \begin{code}
1020 #ifdef GHCI
1021 compileExpr :: HscEnv -> SrcSpan -> CoreExpr -> IO HValue
1022
1023 compileExpr hsc_env srcspan ds_expr
1024   = do  { let { dflags  = hsc_dflags hsc_env ;
1025                 lint_on = dopt Opt_DoCoreLinting dflags }
1026               
1027                 -- Simplify it
1028         ; simpl_expr <- simplifyExpr dflags ds_expr
1029
1030                 -- Tidy it (temporary, until coreSat does cloning)
1031         ; let tidy_expr = tidyExpr emptyTidyEnv simpl_expr
1032
1033                 -- Prepare for codegen
1034         ; prepd_expr <- corePrepExpr dflags tidy_expr
1035
1036                 -- Lint if necessary
1037                 -- ToDo: improve SrcLoc
1038         ; if lint_on then 
1039                 let ictxt = hsc_IC hsc_env
1040                     tyvars = varSetElems (ic_tyvars ictxt)
1041                 in
1042                 case lintUnfolding noSrcLoc tyvars prepd_expr of
1043                    Just err -> pprPanic "compileExpr" err
1044                    Nothing  -> return ()
1045           else
1046                 return ()
1047
1048                 -- Convert to BCOs
1049         ; bcos <- coreExprToBCOs dflags prepd_expr
1050
1051                 -- link it
1052         ; hval <- linkExpr hsc_env srcspan bcos
1053
1054         ; return hval
1055      }
1056 #endif
1057 \end{code}
1058
1059
1060 %************************************************************************
1061 %*                                                                      *
1062         Statistics on reading interfaces
1063 %*                                                                      *
1064 %************************************************************************
1065
1066 \begin{code}
1067 dumpIfaceStats :: HscEnv -> IO ()
1068 dumpIfaceStats hsc_env
1069   = do  { eps <- readIORef (hsc_EPS hsc_env)
1070         ; dumpIfSet (dump_if_trace || dump_rn_stats)
1071                     "Interface statistics"
1072                     (ifaceStats eps) }
1073   where
1074     dflags = hsc_dflags hsc_env
1075     dump_rn_stats = dopt Opt_D_dump_rn_stats dflags
1076     dump_if_trace = dopt Opt_D_dump_if_trace dflags
1077 \end{code}
1078
1079 %************************************************************************
1080 %*                                                                      *
1081         Progress Messages: Module i of n
1082 %*                                                                      *
1083 %************************************************************************
1084
1085 \begin{code}
1086 showModuleIndex :: Maybe (Int, Int) -> String
1087 showModuleIndex Nothing = ""
1088 showModuleIndex (Just (i,n)) = "[" ++ padded ++ " of " ++ n_str ++ "] "
1089     where
1090         n_str = show n
1091         i_str = show i
1092         padded = replicate (length n_str - length i_str) ' ' ++ i_str
1093 \end{code}