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