[project @ 1997-05-19 00:12:10 by sof]
[ghc-hetmet.git] / ghc / compiler / main / Main.lhs
index 54a6783..b81182c 100644 (file)
@@ -12,14 +12,22 @@ IMP_Ubiq(){-uitous-}
 IMPORT_1_3(IO(hGetContents,stdin,stderr,hPutStr,hClose,openFile,IOMode(..)))
 
 import HsSyn
+import RdrHsSyn                ( RdrName )
 
 import ReadPrefix      ( rdModule )
 import Rename          ( renameModule )
+import RnMonad         ( ExportEnv )
+
 import MkIface         -- several functions
 import TcModule                ( typecheckModule )
-import Desugar         ( deSugar, DsMatchContext, pprDsWarnings )
+import Desugar         ( deSugar, pprDsWarnings
+#if __GLASGOW_HASKELL__ <= 200
+                         , DsMatchContext, DsWarnFlavour 
+#endif
+                       )
 import SimplCore       ( core2core )
 import CoreToStg       ( topCoreBindsToStg )
+import StgSyn          ( collectFinalStgBinders )
 import SimplStg                ( stg2stg )
 import CodeGen         ( codeGen )
 #if ! OMIT_NATIVE_CODEGEN
@@ -28,11 +36,11 @@ import AsmCodeGen   ( dumpRealAsm, writeRealAsm )
 
 import AbsCSyn         ( absCNop, AbstractC )
 import AbsCUtils       ( flattenAbsC )
+import CoreUnfold      ( Unfolding )
 import Bag             ( emptyBag, isEmptyBag )
 import CmdLineOpts
 import ErrUtils                ( pprBagOfErrors, ghcExit )
 import Maybes          ( maybeToBool, MaybeErr(..) )
-import RdrHsSyn                ( getRawExportees )
 import Specialise      ( SpecialiseData(..) )
 import StgSyn          ( pprPlainStgBinding, GenStgBinding )
 import TcInstUtil      ( InstInfo )
@@ -45,27 +53,30 @@ import PprStyle             ( PprStyle(..) )
 import Pretty
 
 import Id              ( GenId )               -- instances
-import Name            ( Name, RdrName )       -- instances
+import Name            ( Name )                -- instances
 import PprType         ( GenType, GenTyVar )   -- instances
-import RnHsSyn         ( RnName )              -- instances
 import TyVar           ( GenTyVar )            -- instances
 import Unique          ( Unique )              -- instances
+#if __GLASGOW_HASKELL__ >= 202
+import Outputable       ( Outputable(..) )
+#endif
 \end{code}
 
 \begin{code}
-main
-  = hGetContents stdin >>= \ input_pgm ->
-    let
-       cmd_line_info = classifyOpts
-    in
-    doIt cmd_line_info input_pgm
+main =
+ _scc_ "main" 
+ hGetContents stdin    >>= \ input_pgm ->
+ let
+    cmd_line_info = classifyOpts
+ in
+ doIt cmd_line_info input_pgm
 \end{code}
 
 \begin{code}
 doIt :: ([CoreToDo], [StgToDo]) -> String -> IO ()
 
 doIt (core_cmds, stg_cmds) input_pgm
-  = doDump opt_Verbose "Glasgow Haskell Compiler, version 2.01, for Haskell 1.3" "" >>
+  = doDump opt_Verbose "Glasgow Haskell Compiler, version 2.03, for Haskell 1.4" "" >>
 
     -- ******* READER
     show_pass "Reader" >>
@@ -79,13 +90,21 @@ doIt (core_cmds, stg_cmds) input_pgm
        (pp_show (ppSourceStats rdr_module))    >>
 
     -- UniqueSupplies for later use (these are the only lower case uniques)
+    _scc_     "spl-rn"
     mkSplitUniqSupply 'r'      >>= \ rn_uniqs  -> -- renamer
+    _scc_     "spl-tc"
     mkSplitUniqSupply 'a'      >>= \ tc_uniqs  -> -- typechecker
+    _scc_     "spl-ds"
     mkSplitUniqSupply 'd'      >>= \ ds_uniqs  -> -- desugarer
+    _scc_     "spl-sm"
     mkSplitUniqSupply 's'      >>= \ sm_uniqs  -> -- core-to-core simplifier
+    _scc_     "spl-c2s"
     mkSplitUniqSupply 'c'      >>= \ c2s_uniqs -> -- core-to-stg
+    _scc_     "spl-st"
     mkSplitUniqSupply 'g'      >>= \ st_uniqs  -> -- stg-to-stg passes
+    _scc_     "spl-absc"
     mkSplitUniqSupply 'f'      >>= \ fl_uniqs  -> -- absC flattener
+    _scc_     "spl-ncg"
     mkSplitUniqSupply 'n'      >>= \ ncg_uniqs -> -- native-code generator
 
     -- ******* RENAMER
@@ -93,25 +112,19 @@ doIt (core_cmds, stg_cmds) input_pgm
     _scc_     "Renamer"
 
     renameModule rn_uniqs rdr_module >>=
-       \ (rn_mod, rn_env, import_names,
-          export_stuff, usage_stuff,
-          rn_errs_bag, rn_warns_bag) ->
+       \ (maybe_rn_stuff, rn_errs_bag, rn_warns_bag) ->
 
-    if (not (isEmptyBag rn_errs_bag)) then
-       hPutStr stderr (ppShow pprCols (pprBagOfErrors pprErrorsStyle rn_errs_bag))
-       >> hPutStr stderr "\n" >>
-       hPutStr stderr (ppShow pprCols (pprBagOfErrors pprErrorsStyle rn_warns_bag))
-       >> hPutStr stderr "\n" >>
-       ghcExit 1
+    checkErrors rn_errs_bag rn_warns_bag       >>
+    case maybe_rn_stuff of {
+       Nothing ->      -- Hurrah!  Renamer reckons that there's no need to
+                       -- go any further
+                       hPutStr stderr "No recompilation required!\n"   >>
+                       ghcExit 0 ;
+
+               -- Oh well, we've got to recompile for real
+       Just (rn_mod, iface_file_stuff, rn_name_supply, imported_modules) ->
 
-    else -- No renaming errors ...
 
-    (if (isEmptyBag rn_warns_bag) then
-       return ()
-     else
-       hPutStr stderr (ppShow pprCols (pprBagOfErrors pprErrorsStyle rn_warns_bag))
-       >> hPutStr stderr "\n"
-    )                                          >>
 
     doDump opt_D_dump_rn "Renamer:"
        (pp_show (ppr pprStyle rn_mod))         >>
@@ -120,20 +133,14 @@ doIt (core_cmds, stg_cmds) input_pgm
     -- (the iface file is produced incrementally, as we have
     -- the information that we need...; we use "iface<blah>")
     -- "endIface" finishes the job.
-    let
-       (usages_map, version_info, instance_modules) = usage_stuff
-    in
-    startIface mod_name                                    >>= \ if_handle ->
-    ifaceUsages                 if_handle usages_map       >>
-    ifaceVersions       if_handle version_info     >>
-    ifaceExportList     if_handle export_stuff rn_env >>
-    ifaceFixities       if_handle rn_mod           >>
-    ifaceInstanceModules if_handle instance_modules >>
+    startIface mod_name                                        >>= \ if_handle ->
+    ifaceMain if_handle iface_file_stuff               >>
+
 
     -- ******* TYPECHECKER
     show_pass "TypeCheck"                      >>
     _scc_     "TypeCheck"
-    case (case (typecheckModule tc_uniqs {-idinfo_fm-} rn_env rn_mod) of
+    case (case (typecheckModule tc_uniqs {-idinfo_fm-} rn_name_supply rn_mod) of
            Succeeded (stuff, warns)
                -> (emptyBag, warns, stuff)
            Failed (errs, warns)
@@ -141,44 +148,26 @@ doIt (core_cmds, stg_cmds) input_pgm
 
     of { (tc_errs_bag, tc_warns_bag, tc_results) ->
 
-    if (not (isEmptyBag tc_errs_bag)) then
-       hPutStr stderr (ppShow pprCols (pprBagOfErrors pprErrorsStyle tc_errs_bag))
-       >> hPutStr stderr "\n" >>
-       hPutStr stderr (ppShow pprCols (pprBagOfErrors pprErrorsStyle tc_warns_bag))
-       >> hPutStr stderr "\n" >>
-       ghcExit 1
-
-    else ( -- No typechecking errors ...
-
-    (if (isEmptyBag tc_warns_bag) then
-       return ()
-     else
-       hPutStr stderr (ppShow pprCols (pprBagOfErrors pprErrorsStyle tc_warns_bag))
-       >> hPutStr stderr "\n"
-    )                                          >>
+    checkErrors tc_errs_bag tc_warns_bag       >>
 
     case tc_results
     of {  (typechecked_quint@(recsel_binds, class_binds, inst_binds, val_binds, const_binds),
-          interface_stuff@(_,local_tycons,_,_),
-          pragma_tycon_specs, ddump_deriv) ->
+          local_tycons, local_classes, inst_info, pragma_tycon_specs,
+          ddump_deriv) ->
 
     doDump opt_D_dump_tc "Typechecked:"
-       (pp_show (ppAboves [
+       (pp_show (vcat [
            ppr pprStyle recsel_binds,
            ppr pprStyle class_binds,
            ppr pprStyle inst_binds,
-           ppAboves (map (\ (i,e) -> ppr pprStyle (VarMonoBind i e)) const_binds),
+           ppr pprStyle const_binds,
            ppr pprStyle val_binds]))           >>
 
     doDump opt_D_dump_deriv "Derived instances:"
        (pp_show (ddump_deriv pprStyle))        >>
 
-    -- OK, now do the interface stuff that relies on typechecker output:
-    ifaceDecls     if_handle interface_stuff   >>
-    ifaceInstances if_handle interface_stuff   >>
-
     -- ******* DESUGARER
-    show_pass "DeSugar"                        >>
+    show_pass "DeSugar "                       >>
     _scc_     "DeSugar"
     let
        (desugared,ds_warnings)
@@ -187,11 +176,11 @@ doIt (core_cmds, stg_cmds) input_pgm
     (if isEmptyBag ds_warnings then
        return ()
      else
-       hPutStr stderr (ppShow pprCols (pprDsWarnings pprErrorsStyle ds_warnings))
+       hPutStr stderr (pp_show (pprDsWarnings pprErrorsStyle ds_warnings))
        >> hPutStr stderr "\n"
     )                                          >>
 
-    doDump opt_D_dump_ds "Desugared:" (pp_show (ppAboves
+    doDump opt_D_dump_ds "Desugared:" (pp_show (vcat
        (map (pprCoreBinding pprStyle) desugared)))
                                                >>
 
@@ -205,10 +194,10 @@ doIt (core_cmds, stg_cmds) input_pgm
              sm_uniqs local_data_tycons pragma_tycon_specs desugared
                                                >>=
 
-        \ (simplified, inlinings_env,
+        \ (simplified,
            SpecData _ _ _ gen_tycons all_tycon_specs _ _ _) ->
 
-    doDump opt_D_dump_simpl "Simplified:" (pp_show (ppAboves
+    doDump opt_D_dump_simpl "Simplified:" (pp_show (vcat
        (map (pprCoreBinding pprStyle) simplified)))
                                                >>
 
@@ -227,22 +216,29 @@ doIt (core_cmds, stg_cmds) input_pgm
        \ (stg_binds2, cost_centre_info) ->
 
     doDump opt_D_dump_stg "STG syntax:"
-       (pp_show (ppAboves (map (pprPlainStgBinding pprStyle) stg_binds2)))
+       (pp_show (vcat (map (pprPlainStgBinding pprStyle) stg_binds2)))
                                                >>
 
+       -- Dump instance decls and type signatures into the interface file
+    let
+       final_ids = collectFinalStgBinders stg_binds2
+    in
+    _scc_     "Interface"
+    ifaceDecls if_handle local_tycons local_classes inst_info final_ids simplified     >>
+    endIface if_handle                                         >>
     -- We are definitely done w/ interface-file stuff at this point:
     -- (See comments near call to "startIface".)
-    endIface if_handle                         >>
+    
 
     -- ******* "ABSTRACT", THEN "FLAT", THEN *REAL* C!
     show_pass "CodeGen"                        >>
     _scc_     "CodeGen"
     let
-       abstractC      = codeGen mod_name     -- module name for CC labelling
+       abstractC      = codeGen mod_name               -- module name for CC labelling
                                 cost_centre_info
-                                import_names -- import names for CC registering
-                                gen_tycons      -- type constructors generated locally
-                                all_tycon_specs -- tycon specialisations
+                                imported_modules       -- import names for CC registering
+                                gen_tycons             -- type constructors generated locally
+                                all_tycon_specs        -- tycon specialisations
                                 stg_binds2
 
        flat_abstractC = flattenAbsC fl_uniqs abstractC
@@ -253,6 +249,7 @@ doIt (core_cmds, stg_cmds) input_pgm
     doDump opt_D_dump_flatC "Flat Abstract C:"
        (dumpRealC flat_abstractC)              >>
 
+    _scc_     "CodeOutput"
     -- You can have C (c_output) or assembly-language (ncg_output),
     -- but not both.  [Allowing for both gives a space leak on
     -- flat_abstractC.  WDP 94/10]
@@ -284,24 +281,11 @@ doIt (core_cmds, stg_cmds) input_pgm
     doOutput opt_ProduceC c_output_w           >>
 
     ghcExit 0
-    } ) }
+    } } }
   where
     -------------------------------------------------------------
     -- ****** printing styles and column width:
 
-    pprCols = (80 :: Int) -- could make configurable
-
-    (pprStyle, pprErrorsStyle)
-      = if      opt_PprStyle_All   then
-               (PprShowAll, PprShowAll)
-       else if opt_PprStyle_Debug then
-               (PprDebug, PprDebug)
-       else if opt_PprStyle_User  then
-               (PprForUser, PprForUser)
-       else -- defaults...
-               (PprDebug, PprForUser)
-
-    pp_show p = ppShow {-WAS:pprCols-}10000{-random-} p
 
     -------------------------------------------------------------
     -- ****** help functions:
@@ -321,16 +305,40 @@ doIt (core_cmds, stg_cmds) input_pgm
 
     doDump switch hdr string
       = if switch
-       then hPutStr stderr hdr             >>
+       then hPutStr stderr ("\n\n" ++ (take 80 $ repeat '=')) >>
+            hPutStr stderr ('\n': hdr)     >>
             hPutStr stderr ('\n': string)  >>
             hPutStr stderr "\n"
        else return ()
 
 
-ppSourceStats (HsModule name version exports imports fixities typedecls typesigs
-                     classdecls instdecls instsigs defdecls binds
-                     [{-no sigs-}] src_loc)
- = ppAboves (map pp_val
+pprCols = (80 :: Int) -- could make configurable
+
+(pprStyle, pprErrorsStyle)
+  | opt_PprStyle_All   = (PprShowAll, PprShowAll)
+  | opt_PprStyle_Debug = (PprDebug,   PprDebug)
+  | opt_PprStyle_User  = (PprQuote,   PprQuote)
+  | otherwise         = (PprDebug,   PprQuote)
+
+pp_show p = show p     -- ToDo: use pprCols
+
+checkErrors errs_bag warns_bag
+  | not (isEmptyBag errs_bag)
+  =    hPutStr stderr (pp_show (pprBagOfErrors pprErrorsStyle errs_bag))
+       >> hPutStr stderr "\n" >>
+       hPutStr stderr (pp_show (pprBagOfErrors pprErrorsStyle warns_bag))
+       >> hPutStr stderr "\n" >>
+       ghcExit 1
+
+  | not (isEmptyBag warns_bag)
+  = hPutStr stderr (pp_show (pprBagOfErrors pprErrorsStyle warns_bag)) >> 
+    hPutStr stderr "\n"
+  | otherwise = return ()
+
+
+ppSourceStats (HsModule name version exports imports fixities decls src_loc)
+ = vcat (map pp_val
               [("ExportAll        ", export_all), -- 1 if no export list
                ("ExportDecls      ", export_ds),
                ("ExportModules    ", export_ms),
@@ -341,7 +349,7 @@ ppSourceStats (HsModule name version exports imports fixities typedecls typesigs
                ("  ImpPartial     ", import_partial),
                ("  ImpHiding      ", import_hiding),
                ("FixityDecls      ", fixity_ds),
-               ("DefaultDecls     ", defalut_ds),
+               ("DefaultDecls     ", default_ds),
                ("TypeDecls        ", type_ds),
                ("DataDecls        ", data_ds),
                ("NewTypeDecls     ", newt_ds),
@@ -357,57 +365,52 @@ ppSourceStats (HsModule name version exports imports fixities typedecls typesigs
                ("FunBinds         ", fn_bind_ds),
                ("InlineMeths      ", method_inlines),
                ("InlineBinds      ", bind_inlines),
-               ("SpecialisedData  ", data_specs),
-               ("SpecialisedInsts ", inst_specs),
+--             ("SpecialisedData  ", data_specs),
+--             ("SpecialisedInsts ", inst_specs),
                ("SpecialisedMeths ", method_specs),
                ("SpecialisedBinds ", bind_specs)
               ])
   where
-    pp_val (str, 0) = ppNil
-    pp_val (str, n) = ppBesides [ppStr str, ppInt n]
-
-    (export_decls, export_mods) = getRawExportees exports
-    type_decls = filter is_type_decl typedecls
-    data_decls = filter is_data_decl typedecls
-    newt_decls = filter is_newt_decl typedecls
-
-    export_ds  = length export_decls
-    export_ms  = length export_mods
-    export_all = if export_ds == 0 && export_ms == 0 then 1 else 0
-
-    fixity_ds  = length fixities
-    defalut_ds = length defdecls
-    type_ds    = length type_decls
-    data_ds    = length data_decls
-    newt_ds    = length newt_decls
-    class_ds   = length classdecls
-    inst_ds    = length instdecls
+    pp_val (str, 0) = empty
+    pp_val (str, n) = hcat [text str, int n]
+
+    fixity_ds   = length fixities
+    type_decls         = [d | TyD d@(TySynonym _ _ _ _)    <- decls]
+    data_decls         = [d | TyD d@(TyData DataType _ _ _ _ _ _ _) <- decls]
+    newt_decls         = [d | TyD d@(TyData NewType  _ _ _ _ _ _ _) <- decls]
+    type_ds    = length type_decls
+    data_ds    = length data_decls
+    newt_ds    = length newt_decls
+    class_decls = [d | ClD d <- decls]
+    class_ds    = length class_decls
+    inst_decls  = [d | InstD d <- decls]
+    inst_ds     = length inst_decls
+    default_ds  = length [() | DefD _ <- decls]
+    val_decls   = [d | ValD d <- decls]
+
+    real_exports = case exports of { Nothing -> []; Just es -> es }
+    n_exports           = length real_exports
+    export_ms           = length [() | IEModuleContents _ <- real_exports]
+    export_ds           = n_exports - export_ms
+    export_all          = case exports of { Nothing -> 1; other -> 0 }
 
     (val_bind_ds, fn_bind_ds, bind_tys, bind_specs, bind_inlines)
-       = count_binds binds
+       = count_binds (foldr ThenBinds EmptyBinds val_decls)
 
     (import_no, import_qual, import_as, import_all, import_partial, import_hiding)
        = foldr add6 (0,0,0,0,0,0) (map import_info imports)
     (data_constrs, data_derivs)
        = foldr add2 (0,0) (map data_info (newt_decls ++ data_decls))
     (class_method_ds, default_method_ds)
-       = foldr add2 (0,0) (map class_info classdecls)
+       = foldr add2 (0,0) (map class_info class_decls)
     (inst_method_ds, method_specs, method_inlines)
-       = foldr add3 (0,0,0) (map inst_info instdecls)
+       = foldr add3 (0,0,0) (map inst_info inst_decls)
 
-    data_specs  = length typesigs
-    inst_specs  = length instsigs
 
     count_binds EmptyBinds        = (0,0,0,0,0)
     count_binds (ThenBinds b1 b2) = count_binds b1 `add5` count_binds b2
-    count_binds (SingleBind b)    = case count_bind b of
-                                     (vs,fs) -> (vs,fs,0,0,0)
-    count_binds (BindWith b sigs) = case (count_bind b, count_sigs sigs) of
-                                     ((vs,fs),(ts,_,ss,is)) -> (vs,fs,ts,ss,is)
-
-    count_bind EmptyBind      = (0,0)
-    count_bind (NonRecBind b) = count_monobinds b
-    count_bind (RecBind b)    = count_monobinds b
+    count_binds (MonoBind b sigs _) = case (count_monobinds b, count_sigs sigs) of
+                                       ((vs,fs),(ts,_,ss,is)) -> (vs,fs,ts,ss,is)
 
     count_monobinds EmptyMonoBinds       = (0,0)
     count_monobinds (AndMonoBinds b1 b2)  = count_monobinds b1 `add2` count_monobinds b2
@@ -417,7 +420,7 @@ ppSourceStats (HsModule name version exports imports fixities typedecls typesigs
 
     count_sigs sigs = foldr add4 (0,0,0,0) (map sig_info sigs)
 
-    sig_info (Sig _ _ _ _)        = (1,0,0,0)
+    sig_info (Sig _ _ _)          = (1,0,0,0)
     sig_info (ClassOpSig _ _ _ _) = (0,1,0,0)
     sig_info (SpecSig _ _ _ _)    = (0,0,1,0)
     sig_info (InlineSig _ _)      = (0,0,0,1)
@@ -433,28 +436,19 @@ ppSourceStats (HsModule name version exports imports fixities typedecls typesigs
     spec_info (Just (False, _)) = (0,0,0,0,1,0)
     spec_info (Just (True, _))  = (0,0,0,0,0,1)
 
-    data_info (TyData _ _ _ constrs derivs _ _)
+    data_info (TyData _ _ _ _ constrs derivs _ _)
        = (length constrs, case derivs of {Nothing -> 0; Just ds -> length ds})
-    data_info (TyNew _ _ _ constr derivs _ _)
-       = (length constr, case derivs of {Nothing -> 0; Just ds -> length ds})
 
     class_info (ClassDecl _ _ _ meth_sigs def_meths _ _)
        = case count_sigs meth_sigs of
            (_,classops,_,_) ->
               (classops, addpr (count_monobinds def_meths))
 
-    inst_info (InstDecl _ _ inst_meths _ _ inst_sigs _ _)
+    inst_info (InstDecl _ inst_meths inst_sigs _ _)
        = case count_sigs inst_sigs of
            (_,_,ss,is) ->
               (addpr (count_monobinds inst_meths), ss, is)
 
-    is_type_decl (TySynonym _ _ _ _)     = True
-    is_type_decl _                      = False
-    is_data_decl (TyData _ _ _ _ _ _ _)  = True
-    is_data_decl _                      = False
-    is_newt_decl (TyNew  _ _ _ _ _ _ _)  = True
-    is_newt_decl _                      = False
-
     addpr (x,y) = x+y
     add1 x1 y1  = x1+y1
     add2 (x1,x2) (y1,y2) = (x1+y1,x2+y2)