[project @ 1997-05-19 00:12:10 by sof]
[ghc-hetmet.git] / ghc / compiler / main / Main.lhs
index d10aae9..b81182c 100644 (file)
 %
-% (c) The GRASP/AQUA Project, Glasgow University, 1993-1995
+% (c) The GRASP/AQUA Project, Glasgow University, 1993-1996
 %
 \section[GHC_Main]{Main driver for Glasgow Haskell compiler}
 
 \begin{code}
 #include "HsVersions.h"
 
-module Main (
-#ifdef __GLASGOW_HASKELL__
-       mainPrimIO
-#else
-       main
-#endif
-    ) where
+module Main ( main ) where
 
-import MainMonad
-import CmdLineOpts
+IMP_Ubiq(){-uitous-}
+IMPORT_1_3(IO(hGetContents,stdin,stderr,hPutStr,hClose,openFile,IOMode(..)))
 
-import AbsCSyn
-import AbsPrel         ( builtinNameInfo )
-import AbsSyn
-import AbsUniType      ( isDataTyCon, TauType(..), UniType, TyVar, TyCon, Class )
-import Bag             ( emptyBag, isEmptyBag, Bag )
-import CE              ( CE(..), UniqFM )
-import CodeGen         ( codeGen )
-import CoreToStg       ( topCoreBindsToStg )
-import Desugar         ( deSugar )
-import DsMonad         ( DsMatchContext, DsMatchKind, pprDsWarnings )
-import E               ( getE_TCE, E, GVE(..) )
-                               -- most of above needed by mkInterface
-#ifndef DPH
-import Errors          ( pprBagOfErrors, Error(..) )
-#else
-import Errors          ( pprBagOfErrors, pprPodizedWarning, Error(..) )
-#endif {- Data Parallel Haskell -}
-import Id              ( mkInstId, Id, Inst )
-import Maybes          ( maybeToBool, Maybe(..), MaybeErr(..) )
-import MkIface         ( mkInterface )
-import Outputable
-import PlainCore       ( CoreExpr, CoreBinding, pprPlainCoreBinding,
-                         PlainCoreProgram(..), PlainCoreBinding(..)
-                       )
-import Pretty
+import HsSyn
+import RdrHsSyn                ( RdrName )
 
-#ifdef USE_NEW_READER
-import ReadPrefix2     ( rdModule )
-#else
-import {-hide from mkdependHS-}
-       ReadPrefix      ( rdModule )
+import ReadPrefix      ( rdModule )
+import Rename          ( renameModule )
+import RnMonad         ( ExportEnv )
+
+import MkIface         -- several functions
+import TcModule                ( typecheckModule )
+import Desugar         ( deSugar, pprDsWarnings
+#if __GLASGOW_HASKELL__ <= 200
+                         , DsMatchContext, DsWarnFlavour 
 #endif
-import Rename          -- renameModule ...
-import SimplCore       -- core2core
-import SimplStg                ( stg2stg )
---ANDY: import SimplHaskell
-import StgSyn          ( pprPlainStgBinding, StgBinding, StgRhs, CostCentre,
-                         StgBinderInfo, PlainStgProgram(..), PlainStgBinding(..)
-                       )
-import TCE             ( rngTCE, {- UNUSED: printTypeInfoForPop,-} TCE(..)
-                         IF_ATTACK_PRAGMAS(COMMA eltsUFM)
                        )
-import Typecheck       -- typecheckModule ...
-import SplitUniq
-import Unique          -- lots of UniqueSupplies, etc.
-import Util
-
+import SimplCore       ( core2core )
+import CoreToStg       ( topCoreBindsToStg )
+import StgSyn          ( collectFinalStgBinders )
+import SimplStg                ( stg2stg )
+import CodeGen         ( codeGen )
 #if ! OMIT_NATIVE_CODEGEN
-import AsmCodeGen      ( dumpRealAsm
-# if __GLASGOW_HASKELL__
-                         , writeRealAsm
-# endif
-                       )
+import AsmCodeGen      ( dumpRealAsm, writeRealAsm )
 #endif
 
-#ifdef USE_SEMANTIQUE_STRANAL
-import ProgEnv         ( ProgEnv(..), TreeProgEnv(..), createProgEnv )
-import StrAnal         ( ppShowStrAnal, OAT )
-#endif
-#ifdef DPH
-import PodizeCore      ( podizeCore , PodWarning)
-import AbsCTopApal      ( nuAbsCToApal )
-import NextUsed         ( pprTopNextUsedC, getTopLevelNexts, AbsCNextUsed,
-                          TopAbsCNextUsed(..) , MagicId)
+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 Specialise      ( SpecialiseData(..) )
+import StgSyn          ( pprPlainStgBinding, GenStgBinding )
+import TcInstUtil      ( InstInfo )
+import TyCon           ( isDataTyCon )
+import UniqSupply      ( mkSplitUniqSupply )
+
+import PprAbsC         ( dumpRealC, writeRealC )
+import PprCore         ( pprCoreBinding )
+import PprStyle                ( PprStyle(..) )
+import Pretty
 
-#endif {- Data Parallel Haskell -}
+import Id              ( GenId )               -- instances
+import Name            ( Name )                -- instances
+import PprType         ( GenType, GenTyVar )   -- instances
+import TyVar           ( GenTyVar )            -- instances
+import Unique          ( Unique )              -- instances
+#if __GLASGOW_HASKELL__ >= 202
+import Outputable       ( Outputable(..) )
+#endif
 \end{code}
 
 \begin{code}
-#ifndef __GLASGOW_HASKELL__
-main :: Dialogue
-
-main = mainIOtoDialogue main_io
-
-main_io :: MainIO ()
-main_io
-#else
-mainPrimIO
-#endif
-  = BSCC("mainIO")
-    BSCC("rdInput") readMn stdin ESCC  `thenMn` \ input_pgm ->
-    getArgsMn                          `thenMn` \ raw_cmd_line ->
-    classifyOpts raw_cmd_line          `thenMn` \ cmd_line_info ->
-    BSCC("doPasses")
-    doIt cmd_line_info input_pgm
-    ESCC ESCC
+main =
+ _scc_ "main" 
+ hGetContents stdin    >>= \ input_pgm ->
+ let
+    cmd_line_info = classifyOpts
+ in
+ doIt cmd_line_info input_pgm
 \end{code}
 
 \begin{code}
-doIt :: CmdLineInfo -> String -> MainIO ()
-#ifndef DPH
-doIt (switch_lookup_fn, core_cmds, stg_cmds) input_pgm
-#else
-doIt (switch_lookup_fn, core_cmds, podize_cmds, pcore_cmds, stg_cmds) input_pgm
-#endif {- Data Parallel Haskell -}
-  --
-  -- Help functions and boring global variables (e.g., printing style)
-  -- are figured out first; the "business end" follows, in the
-  -- body of the let.
-  --
-  = let 
-       -- ****** help functions:
-
-       switch_is_on switch = switchIsOn switch_lookup_fn switch
-
-       string_switch_is_on switch
-         = maybeToBool (stringSwitchSet switch_lookup_fn switch)
-
-        show_pass
-          = if switch_is_on D_show_passes
-           then \ what -> writeMn stderr ("*** "++what++":\n")
-           else \ what -> returnMn ()
-
-       doOutput switch io_action
-         = BSCC("doOutput")
-           case (stringSwitchSet switch_lookup_fn switch) of
-             Nothing    -> returnMn ()
-             Just fname -> 
-               fopen fname "a+"        `thenMn` \ file ->
-               if (file == ``NULL'') then
-                   error ("doOutput: failed to open:"++fname)
-               else
-                   io_action file              `thenMn` \ () ->
-                   fclose file                 `thenMn` \ status ->
-                   if status == 0
-                   then returnMn ()
-                   else error ("doOutput: closed failed: "{-++show status++" "-}++fname)
-           ESCC
-
-       doDump switch hdr string
-         = BSCC("doDump")
-           if (switch_is_on switch)
-           then writeMn stderr hdr             `thenMn_`
-                writeMn stderr ('\n': string)  `thenMn_`
-                writeMn stderr "\n"
-           else returnMn ()
-           ESCC
-
-       -- ****** printing styles and column width:
-
-       pprCols = (80 :: Int) -- could make configurable
-
-       (pprStyle, pprErrorsStyle)
-         = if      switch_is_on PprStyle_All   then
-                   (PprShowAll, PprShowAll)
-           else if switch_is_on PprStyle_Debug then
-                   (PprDebug, PprDebug)
-           else if switch_is_on PprStyle_User  then
-                   (PprForUser, PprForUser)
-           else -- defaults...
-                   (PprDebug, PprForUser)
-
-       pp_show p = ppShow {-WAS:pprCols-}10000{-random-} p
-    in
-    -- non-tuple-ish bindings...
-       -- ****** possibly fiddle builtin namespaces:
-
-    BIND (BSCC("builtinEnv") 
-         builtinNameInfo switch_is_on {-switch looker-upper-}
-         ESCC
-        )
-      _TO_ (init_val_lookup_fn, init_tc_lookup_fn) ->
-
-    -- **********************************************
-    -- Welcome to the business end of the main module
-    -- of the Glorious Glasgow Haskell compiler!
-    -- **********************************************
-#ifndef DPH
-    doDump Verbose "Glasgow Haskell Compiler, version 0.27" "" `thenMn_`
-#else
-    doDump Verbose "Data Parallel Haskell Compiler, version 0.06 (Glasgow 0.27)" ""
-       `thenMn_`
-#endif {- Data Parallel Haskell -}
+doIt :: ([CoreToDo], [StgToDo]) -> String -> IO ()
+
+doIt (core_cmds, stg_cmds) input_pgm
+  = doDump opt_Verbose "Glasgow Haskell Compiler, version 2.03, for Haskell 1.4" "" >>
 
     -- ******* READER
-    show_pass "Read" `thenMn_`
-#ifdef USE_NEW_READER
-    BSCC("rdModule") 
-    rdModule
-    ESCC
-       `thenMn` \ (mod_name, export_list_fns, absyn_tree) ->
-
-    BIND (\x -> x) _TO_ bar_foo ->
-    -- so BINDs and BENDs add up...
-#else
-    BIND BSCC("rdModule") 
-        rdModule input_pgm
-        ESCC
-    _TO_ (mod_name, export_list_fns, absyn_tree) ->
-#endif
-    let
-       -- reader things used (much?) later
-       ds_mod_name = mod_name
-       if_mod_name = mod_name
-       co_mod_name = mod_name
-       st_mod_name = mod_name
-       cc_mod_name = mod_name
-       -- also: export_list_fns
-    in
-    doDump D_source_stats "\nSource Statistics:"
-                        (pp_show (ppSourceStats absyn_tree)) `thenMn_`
-
-    doDump D_dump_rif2hs "Parsed, Haskellised:" 
-                        (pp_show (ppr pprStyle absyn_tree))  `thenMn_`
-
-    -- UniqueSupplies for later use
-    getSplitUniqSupplyMn 'r'   `thenMn` \ rn_uniqs ->  -- renamer
-    getSplitUniqSupplyMn 't'   `thenMn` \ tc_uniqs ->  -- typechecker
-    getSplitUniqSupplyMn 'd'   `thenMn` \ ds_uniqs ->  -- desugarer
-    getSplitUniqSupplyMn 's'   `thenMn` \ sm_uniqs ->  -- core-to-core simplifier
-    getSplitUniqSupplyMn 'C'   `thenMn` \ c2s_uniqs -> -- core-to-stg
-    getSplitUniqSupplyMn 'T'   `thenMn` \ st_uniqs ->  -- stg-to-stg passes
-    getSplitUniqSupplyMn 'F'   `thenMn` \ fl_uniqs ->  -- absC flattener
-    getSplitUniqSupplyMn 'P'   `thenMn` \ prof_uniqs -> -- profiling tidy-upper
-    getSplitUniqSupplyMn 'L'   `thenMn` \ pre_ncg_uniqs -> -- native-code generator
-    let
-       ncg_uniqs = {-mkUniqueSupplyGrimily-} pre_ncg_uniqs
-    in
+    show_pass "Reader" >>
+    _scc_     "Reader"
+    rdModule           >>= \ (mod_name, rdr_module) ->
+
+    doDump opt_D_dump_rdr "Reader:"
+       (pp_show (ppr pprStyle rdr_module))     >>
+
+    doDump opt_D_source_stats "\nSource Statistics:"
+       (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
-    show_pass "Rename" `thenMn_`
-    BIND BSCC("Renamer")
-        renameModule switch_is_on
-                     (init_val_lookup_fn, init_tc_lookup_fn)
-                     absyn_tree
-                     rn_uniqs
-        ESCC
-    _TO_ (mod4, import_names, final_name_funs, rn_errs_bag) ->
-    let
-       -- renamer things used (much?) later
-       cc_import_names = import_names
-    in
+    show_pass "Renamer"                        >>
+    _scc_     "Renamer"
 
-    doDump D_dump_rn4 "Renamer-pass4:"
-                       (pp_show (ppr pprStyle mod4))   `thenMn_`
+    renameModule rn_uniqs rdr_module >>=
+       \ (maybe_rn_stuff, rn_errs_bag, rn_warns_bag) ->
 
-    if (not (isEmptyBag rn_errs_bag)) then
-       -- Stop right here
-       writeMn stderr (ppShow pprCols (pprBagOfErrors pprErrorsStyle rn_errs_bag))
-       `thenMn_` writeMn stderr "\n"
-       `thenMn_` exitMn 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) ->
+
+
+
+    doDump opt_D_dump_rn "Renamer:"
+       (pp_show (ppr pprStyle rn_mod))         >>
+
+    -- Safely past renaming: we can start the interface file:
+    -- (the iface file is produced incrementally, as we have
+    -- the information that we need...; we use "iface<blah>")
+    -- "endIface" finishes the job.
+    startIface mod_name                                        >>= \ if_handle ->
+    ifaceMain if_handle iface_file_stuff               >>
 
-    else -- No renaming errors, carry on with...
 
     -- ******* TYPECHECKER
-    show_pass "TypeCheck" `thenMn_`
-    BIND (case BSCC("TypeChecker")
-              typecheckModule switch_is_on tc_uniqs final_name_funs mod4
-              ESCC
-         of
-           Succeeded stuff
-               -> (emptyBag, stuff)
-           Failed tc_errs_bag
-               -> (tc_errs_bag,
-                   panic "main: tickled tc_results even though there were errors"))
-
-    _TO_ (tc_errs_bag, tc_results) ->
+    show_pass "TypeCheck"                      >>
+    _scc_     "TypeCheck"
+    case (case (typecheckModule tc_uniqs {-idinfo_fm-} rn_name_supply rn_mod) of
+           Succeeded (stuff, warns)
+               -> (emptyBag, warns, stuff)
+           Failed (errs, warns)
+               -> (errs, warns, error "tc_results"))
+
+    of { (tc_errs_bag, tc_warns_bag, tc_results) ->
+
+    checkErrors tc_errs_bag tc_warns_bag       >>
+
+    case tc_results
+    of {  (typechecked_quint@(recsel_binds, class_binds, inst_binds, val_binds, const_binds),
+          local_tycons, local_classes, inst_info, pragma_tycon_specs,
+          ddump_deriv) ->
+
+    doDump opt_D_dump_tc "Typechecked:"
+       (pp_show (vcat [
+           ppr pprStyle recsel_binds,
+           ppr pprStyle class_binds,
+           ppr pprStyle inst_binds,
+           ppr pprStyle const_binds,
+           ppr pprStyle val_binds]))           >>
+
+    doDump opt_D_dump_deriv "Derived instances:"
+       (pp_show (ddump_deriv pprStyle))        >>
 
-    let
-       ppr_b :: (Inst, TypecheckedExpr) -> Pretty
-       ppr_b (i,e) = ppr pprStyle (VarMonoBind (mkInstId i) e)
-    in
-    if (not (isEmptyBag tc_errs_bag)) then
-       -- Must stop *before* trying to dump tc output, because
-       -- if it fails it does not give you any useful stuff back!
-       writeMn stderr (ppShow pprCols (pprBagOfErrors pprErrorsStyle tc_errs_bag))
-       `thenMn_` writeMn stderr "\n"
-       `thenMn_` exitMn 1
-
-    else ( -- No typechecking errors either -- so, go for broke!
-
-    BIND tc_results
-    _TO_  (typechecked_quad@(class_binds, inst_binds, val_binds, const_binds),
-          interface_stuff@(_,_,_,_,_),  -- @-pat just for strictness...
-          pragma_tycon_specs, {-UNUSED:big_env,-} this_mod_env, ddump_deriv) ->
-    let
---     big_tce  = getE_TCE big_env
---     big_elts = rngTCE big_tce
-
-       this_mod_tce  = getE_TCE this_mod_env
-       this_mod_elts = rngTCE this_mod_tce
-       
-       local_tycons = [tc | tc <- this_mod_elts,
-                                  isLocallyDefined tc, -- from this module only
-                                  isDataTyCon tc ]     -- algebraic types only
-    in
---    pprTrace "Envs:" (ppAboves [
---     ppr pprStyle if_global_ids,
---     ppr pprStyle if_tce,
---     ppr pprStyle if_ce,
---     ppr pprStyle this_mod_env,
---     ppr pprStyle big_env
---     ]) (
-
-    doDump D_dump_tc "Typechecked:"
-                     (pp_show
-                       (ppAboves [ppr pprStyle class_binds,
-                                  ppr pprStyle inst_binds,
-                                  ppAboves (map ppr_b const_binds),
-                                  ppr pprStyle val_binds]))    `thenMn_`
-
-    doDump D_dump_deriv   "Derived instances:"
-                         (pp_show (ddump_deriv pprStyle))      `thenMn_`
-
---NOT REALLY USED:
---  doDump D_dump_type_info "" (pp_show (printTypeInfoForPop big_tce)) `thenMn_`
     -- ******* DESUGARER
-    show_pass "DeSugar" `thenMn_`
+    show_pass "DeSugar "                       >>
+    _scc_     "DeSugar"
     let
        (desugared,ds_warnings)
-         = BSCC("DeSugarer")
-           deSugar ds_uniqs switch_lookup_fn ds_mod_name typechecked_quad
-           ESCC
+         = deSugar ds_uniqs mod_name typechecked_quint
     in
     (if isEmptyBag ds_warnings then
-       returnMn ()
+       return ()
      else
-       writeMn stderr (ppShow pprCols (pprDsWarnings pprErrorsStyle ds_warnings))
-       `thenMn_` writeMn stderr "\n"
-    ) `thenMn_`
+       hPutStr stderr (pp_show (pprDsWarnings pprErrorsStyle ds_warnings))
+       >> hPutStr stderr "\n"
+    )                                          >>
 
-    doDump D_dump_ds "Desugared:" (pp_show (ppAboves
-                       (map (pprPlainCoreBinding pprStyle) desugared)))   `thenMn_`
+    doDump opt_D_dump_ds "Desugared:" (pp_show (vcat
+       (map (pprCoreBinding pprStyle) desugared)))
+                                               >>
 
     -- ******* CORE-TO-CORE SIMPLIFICATION (NB: I/O op)
-    core2core core_cmds switch_lookup_fn co_mod_name pprStyle
-             sm_uniqs local_tycons pragma_tycon_specs desugared
-               `thenMn` \ (simplified, inlinings_env,
-                           SpecData _ _ _ gen_tycons all_tycon_specs _ _ _) ->
-
-    doDump D_dump_simpl "Simplified:" (pp_show (ppAboves
-                       (map (pprPlainCoreBinding pprStyle) simplified)))   `thenMn_`
-
--- ANDY:
---  doDump D_dump_core_passes_info "(Haskell) Simplified:" 
---                     (coreToHaskell simplified)                          `thenMn_`
-
-#ifdef DPH
-    -- ******* PODIZE (VECTORIZE) THE CORE PROGRAM     
+    show_pass "Core2Core"                      >>
+    _scc_     "Core2Core"
     let
-        (warn,podized) = BSCC("PodizeCore")
-                        podizeCore podize_cmds switch_is_on
-                                   uniqSupply_p simplified
-                        ESCC
-    in
-    (if (not (null warn))
-     then writeMn stderr "\n"                                              `thenMn_`
-         writeMn stderr (ppShow pprCols (ppAboves
-                    (map (\w -> pprPodizedWarning w pprErrorsStyle) warn))) `thenMn_`
-         writeMn stderr "\n"
-     else returnMn ())                                                     `thenMn_`
-           
-    doDump D_dump_pod   "Podization:" (pp_show (ppAboves
-                    (map (pprPlainCoreBinding pprStyle) podized)))         `thenMn_`
-
-    -- ******** CORE-TO-CORE SIMPLIFICATION OF PODIZED PROGRAM
-    let 
-       psimplified = BSCC("PodizeCore2Core")
-                     core2core pcore_cmds switch_is_on pprStyle
-                               uniqSupply_S podized
-                     ESCC
+       local_data_tycons = filter isDataTyCon local_tycons
     in
-    doDump D_dump_psimpl "Par Simplified:" (pp_show (ppAboves
-                       (map (pprPlainCoreBinding pprStyle) psimplified)))  `thenMn_`
+    core2core core_cmds mod_name pprStyle
+             sm_uniqs local_data_tycons pragma_tycon_specs desugared
+                                               >>=
 
-#endif {- Data Parallel Haskell -}
+        \ (simplified,
+           SpecData _ _ _ gen_tycons all_tycon_specs _ _ _) ->
 
-#ifdef USE_SEMANTIQUE_STRANAL
-    -- ******* SEMANTIQUE STRICTNESS ANALYSER
-    doDump D_dump_stranal_sem "Strictness:" (ppShowStrAnal simplified big_env) `thenMn_`
-#endif
+    doDump opt_D_dump_simpl "Simplified:" (pp_show (vcat
+       (map (pprCoreBinding pprStyle) simplified)))
+                                               >>
 
     -- ******* STG-TO-STG SIMPLIFICATION
-    show_pass "Core2Stg" `thenMn_`
+    show_pass "Core2Stg"                       >>
+    _scc_     "Core2Stg"
     let
-#ifndef DPH
-       stg_binds   = BSCC("Core2Stg")
-                     topCoreBindsToStg c2s_uniqs simplified
-                     ESCC
-#else
-       stg_binds   = BSCC("Core2Stg")
-                     topCoreBindsToStg c2s_uniqs psimplified
-                     ESCC
-#endif {- Data Parallel Haskell -}
+       stg_binds   = topCoreBindsToStg c2s_uniqs simplified
     in
-    show_pass "Stg2Stg" `thenMn_`
-    stg2stg stg_cmds switch_lookup_fn st_mod_name pprStyle st_uniqs stg_binds
-                       `thenMn` \ (stg_binds2, cost_centre_info) ->
-
-    doDump D_dump_stg "STG syntax:" (pp_show (ppAboves
-                     (map (pprPlainStgBinding pprStyle) stg_binds2)))  `thenMn_`
-
-    -- ******* INTERFACE GENERATION (needs STG output)
-{-  let
-       mod_name = "_TestName_"
-       export_list_fns = (\ x -> False, \ x -> False)
-       inlinings_env = nullIdEnv
-       fixities = []
-       if_global_ids = []
-       if_ce = nullCE
-       if_tce = nullTCE
-       if_inst_info = emptyBag
-    in
--}
-    show_pass "Interface" `thenMn_`
+
+    show_pass "Stg2Stg"                        >>
+    _scc_     "Stg2Stg"
+    stg2stg stg_cmds mod_name pprStyle st_uniqs stg_binds
+                                               >>=
+
+       \ (stg_binds2, cost_centre_info) ->
+
+    doDump opt_D_dump_stg "STG syntax:"
+       (pp_show (vcat (map (pprPlainStgBinding pprStyle) stg_binds2)))
+                                               >>
+
+       -- Dump instance decls and type signatures into the interface file
     let
-       mod_interface
-         = BSCC("MkInterface")
-           mkInterface switch_is_on if_mod_name export_list_fns
-                       inlinings_env all_tycon_specs
-                       interface_stuff
-                       stg_binds2
-           ESCC
+       final_ids = collectFinalStgBinders stg_binds2
     in
-    doOutput ProduceHi BSCC("PrintInterface")
-                      ( \ file ->
-                        ppAppendFile file 1000{-pprCols-} mod_interface )
-                      ESCC                                             `thenMn_`
+    _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".)
+    
 
     -- ******* "ABSTRACT", THEN "FLAT", THEN *REAL* C!
-    show_pass "CodeGen" `thenMn_`
+    show_pass "CodeGen"                        >>
+    _scc_     "CodeGen"
     let
-       abstractC      = BSCC("CodeGen")
-                        codeGen cc_mod_name     -- module name for CC labelling
+       abstractC      = codeGen mod_name               -- module name for CC labelling
                                 cost_centre_info
-                                cc_import_names -- import names for CC registering
-                                switch_lookup_fn
-                                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
-                        ESCC
 
-       flat_abstractC = BSCC("FlattenAbsC")
-                        flattenAbsC fl_uniqs abstractC
-                        ESCC
+       flat_abstractC = flattenAbsC fl_uniqs abstractC
     in
-    doDump D_dump_absC  "Abstract C:" (dumpRealC switch_is_on abstractC)   `thenMn_`
+    doDump opt_D_dump_absC  "Abstract C:"
+       (dumpRealC abstractC)                   >>
 
-    doDump D_dump_flatC "Flat Abstract C:" (dumpRealC switch_is_on flat_abstractC) `thenMn_`
+    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]
     let
        (flat_absC_c, flat_absC_ncg) =
-          case (string_switch_is_on ProduceC || switch_is_on D_dump_realC,
-                string_switch_is_on ProduceS || switch_is_on D_dump_asm) of
-            (True,  False) -> (flat_abstractC, AbsCNop)
-            (False, True)  -> (AbsCNop, flat_abstractC)
-            (False, False) -> (AbsCNop, AbsCNop)
+          case (maybeToBool opt_ProduceC || opt_D_dump_realC,
+                maybeToBool opt_ProduceS || opt_D_dump_asm) of
+            (True,  False) -> (flat_abstractC, absCNop)
+            (False, True)  -> (absCNop, flat_abstractC)
+            (False, False) -> (absCNop, absCNop)
             (True,  True)  -> error "ERROR: Can't do both .hc and .s at the same time"
 
-       c_output_d = BSCC("PrintRealC")
-                    dumpRealC switch_is_on flat_absC_c
-                    ESCC
-
-#ifdef __GLASGOW_HASKELL__
-       c_output_w = BSCC("PrintRealC")
-                    (\ f -> writeRealC switch_is_on f flat_absC_c)
-                    ESCC
-#else
-       c_output_w = c_output_d
-#endif
+       c_output_d = dumpRealC flat_absC_c
+       c_output_w = (\ f -> writeRealC f flat_absC_c)
 
 #if OMIT_NATIVE_CODEGEN
-       ncg_output_d
-         = error "*** GHC not built with a native-code generator ***"
+       ncg_output_d = error "*** GHC not built with a native-code generator ***"
        ncg_output_w = ncg_output_d
 #else
-       ncg_output_d = BSCC("nativeCode")
-                    dumpRealAsm switch_lookup_fn flat_absC_ncg ncg_uniqs
-                    ESCC
-
-#ifdef __GLASGOW_HASKELL__
-       ncg_output_w = BSCC("nativeCode")
-                    (\ f -> writeRealAsm switch_lookup_fn f flat_absC_ncg ncg_uniqs)
-                    ESCC
-#else
-       ncg_output_w = ncg_output_d
-#endif
+       ncg_output_d = dumpRealAsm flat_absC_ncg ncg_uniqs
+       ncg_output_w = (\ f -> writeRealAsm f flat_absC_ncg ncg_uniqs)
 #endif
     in
-    doDump D_dump_asm "" ncg_output_d `thenMn_`
-    doOutput ProduceS    ncg_output_w `thenMn_`
 
-#ifndef DPH
-    -- ********* GHC Finished !!!!
-    doDump D_dump_realC "" c_output_d `thenMn_`
-    doOutput ProduceC     c_output_w `thenMn_`
+    doDump opt_D_dump_asm "" ncg_output_d      >>
+    doOutput opt_ProduceS ncg_output_w                 >>
 
-#else
-    -- ********* DPH needs native code generator, nearly finished.....
-    let 
-       next_used_flatC = getTopLevelNexts flat_abstractC []
-       apal_module     = nuAbsCToApal uniqSupply_L mod_name next_used_flatC
-    in
-    doDump D_dump_nextC "Next Used annotated C:" (ppShow pprCols 
-                               (pprTopNextUsedC next_used_flatC))          `thenMn_`
-    doOutput ProduceC  ("! /* DAP assembler (APAL): */\n"++apal_module)    `thenMn_`
+    doDump opt_D_dump_realC "" c_output_d      >>
+    doOutput opt_ProduceC c_output_w           >>
 
-#endif {- Data Parallel Haskell -}
-    exitMn 0
-    {-)-} BEND ) BEND BEND BEND BEND
+    ghcExit 0
+    } } }
+  where
+    -------------------------------------------------------------
+    -- ****** printing styles and column width:
+
+
+    -------------------------------------------------------------
+    -- ****** help functions:
+
+    show_pass
+      = if opt_D_show_passes
+       then \ what -> hPutStr stderr ("*** "++what++":\n")
+       else \ what -> return ()
+
+    doOutput switch io_action
+      = case switch of
+         Nothing -> return ()
+         Just fname ->
+           openFile fname WriteMode    >>= \ handle ->
+           io_action handle            >>
+           hClose handle
+
+    doDump switch hdr string
+      = if switch
+       then hPutStr stderr ("\n\n" ++ (take 80 $ repeat '=')) >>
+            hPutStr stderr ('\n': hdr)     >>
+            hPutStr stderr ('\n': string)  >>
+            hPutStr stderr "\n"
+       else return ()
+
+
+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 (Module name exports imports fixities typedecls typesigs
-                     classdecls instdecls instsigs defdecls binds
-                     [{-no sigs-}] src_loc)
- = ppAboves (map pp_val
+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),
-               ("ImportAll        ", import_all),
-               ("ImportPartial    ", import_partial),
-               ("  PartialDecls   ", partial_decls),
-               ("ImportHiding     ", import_hiding),
-               ("  HidingDecls    ", hiding_decls),
+               ("Imports          ", import_no),
+               ("  ImpQual        ", import_qual),
+               ("  ImpAs          ", import_as),
+               ("  ImpAll         ", import_all),
+               ("  ImpPartial     ", import_partial),
+               ("  ImpHiding      ", import_hiding),
                ("FixityDecls      ", fixity_ds),
-               ("DefaultDecls     ", defalut_ds),
+               ("DefaultDecls     ", default_ds),
                ("TypeDecls        ", type_ds),
                ("DataDecls        ", data_ds),
+               ("NewTypeDecls     ", newt_ds),
                ("DataConstrs      ", data_constrs),
                ("DataDerivings    ", data_derivs),
                ("ClassDecls       ", class_ds),
@@ -550,102 +365,95 @@ ppSourceStats (Module name 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) = getRawIEStrings exports
-    type_decls = filter is_type_decl typedecls
-    data_decls = filter is_data_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
-    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_all, import_partial, partial_decls, import_hiding, hiding_decls)
-        = foldr add5 (0,0,0,0,0) (map import_info imports)
+    (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 data_decls)
+       = 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)
-
-    data_specs  = length (filter is_data_spec_sig typesigs)
-    inst_specs  = length (filter is_inst_spec_sig instsigs)
+       = foldr add3 (0,0,0) (map inst_info inst_decls)
 
 
     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_binds (MonoBind b sigs _) = case (count_monobinds 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_monobinds EmptyMonoBinds      = (0,0)
-    count_monobinds (AndMonoBinds b1 b2) = count_monobinds b1 `add2` count_monobinds b2
+    count_monobinds EmptyMonoBinds       = (0,0)
+    count_monobinds (AndMonoBinds b1 b2)  = count_monobinds b1 `add2` count_monobinds b2
     count_monobinds (PatMonoBind (VarPatIn n) r _) = (1,0)
-    count_monobinds (PatMonoBind p r _)  = (0,1)
-    count_monobinds (FunMonoBind f m _)  = (0,1)
+    count_monobinds (PatMonoBind p r _)   = (0,1)
+    count_monobinds (FunMonoBind f _ m _) = (0,1)
 
     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)
+    sig_info (InlineSig _ _)      = (0,0,0,1)
     sig_info _                    = (0,0,0,0)
 
-    import_info (ImportAll _ _)        = (1,0,0,0,0)
-    import_info (ImportSome _ ds _)    = (0,1,length ds,0,0)
-    import_info (ImportButHide _ ds _) = (0,0,0,1,length ds)
+    import_info (ImportDecl _ qual as spec _)
+       = add6 (1, qual_info qual, as_info as, 0,0,0) (spec_info spec)
+    qual_info False  = 0
+    qual_info True   = 1
+    as_info Nothing  = 0
+    as_info (Just _) = 1
+    spec_info Nothing          = (0,0,0,1,0,0)
+    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 _ _)
-       = (length constrs, length derivs)
+    data_info (TyData _ _ _ _ constrs derivs _ _)
+       = (length constrs, 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 _ _)
-        = case count_sigs inst_sigs of
+    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_data_spec_sig (SpecDataSig _ _ _) = True
-    is_data_spec_sig _                  = False
-    is_inst_spec_sig (InstSpecSig _ _ _) = True
-
     addpr (x,y) = x+y
     add1 x1 y1  = x1+y1
     add2 (x1,x2) (y1,y2) = (x1+y1,x2+y2)
     add3 (x1,x2,x3) (y1,y2,y3) = (x1+y1,x2+y2,x3+y3)
     add4 (x1,x2,x3,x4) (y1,y2,y3,y4) = (x1+y1,x2+y2,x3+y3,x4+y4)
     add5 (x1,x2,x3,x4,x5) (y1,y2,y3,y4,y5) = (x1+y1,x2+y2,x3+y3,x4+y4,x5+y5)
+    add6 (x1,x2,x3,x4,x5,x6) (y1,y2,y3,y4,y5,y6) = (x1+y1,x2+y2,x3+y3,x4+y4,x5+y5,x6+y6)
 \end{code}
-
-