\section[GHC_Main]{Main driver for Glasgow Haskell compiler}
\begin{code}
-module HscMain ( HscResult(..), hscMain,
+module HscMain ( HscResult(..), hscMain,
#ifdef GHCI
hscStmt, hscThing, hscModuleContents,
#endif
#ifdef GHCI
import Interpreter
import ByteCodeGen ( byteCodeGen )
-import CoreTidy ( tidyCoreExpr )
+import TidyPgm ( tidyCoreExpr )
import CorePrep ( corePrepExpr )
import Rename ( renameStmt, renameRdrName, slurpIface )
import RdrName ( rdrNameOcc, setRdrNameOcc )
import Type ( Type )
import Id ( Id, idName, setGlobalIdDetails )
import IdInfo ( GlobalIdDetails(VanillaGlobal) )
-import Name ( isLocalName )
+import Name ( isInternalName )
import NameEnv ( lookupNameEnv )
+import Module ( lookupModuleEnv )
import RdrName ( rdrEnvElts )
import PrelNames ( iNTERACTIVE )
import StringBuffer ( stringToStringBuffer )
-import FastString ( mkFastString )
import Maybes ( catMaybes )
import List ( nub )
import IdInfo ( CafInfo(..), CgInfoEnv, CgInfo(..) )
import StringBuffer ( hGetStringBuffer, freeStringBuffer )
import Parser
-import Lex ( PState(..), ParseResult(..) )
+import Lex ( ParseResult(..), ExtFlags(..), mkPState )
import SrcLoc ( mkSrcLoc )
import Finder ( findModule )
import Rename ( checkOldIface, renameModule, closeIfaceDecls )
import Rules ( emptyRuleBase )
import PrelInfo ( wiredInThingEnv, wiredInThings )
import PrelRules ( builtinRules )
-import PrelNames ( knownKeyNames )
+import PrelNames ( knownKeyNames, gHC_PRIM_Name )
import MkIface ( mkFinalIface )
import TcModule
import InstEnv ( emptyInstEnv )
import Desugar
+import Flattening ( flatten, flattenExpr )
import SimplCore
import CoreUtils ( coreBindsSize )
-import CoreTidy ( tidyCorePgm )
+import TidyPgm ( tidyCorePgm )
import CorePrep ( corePrepPgm )
import StgSyn
import CoreToStg ( coreToStg )
import SimplStg ( stg2stg )
import CodeGen ( codeGen )
-import CodeOutput ( codeOutput )
+import CodeOutput ( codeOutput, outputForeignStubs )
import Module ( ModuleName, moduleName, mkHomeModule )
import CmdLineOpts
import HscTypes
import FiniteMap ( FiniteMap, plusFM, emptyFM, addToFM )
import OccName ( OccName )
-import Name ( Name, nameModule, nameOccName, getName, isGlobalName )
+import Name ( Name, nameModule, nameOccName, getName )
import NameEnv ( emptyNameEnv, mkNameEnv )
import Module ( Module )
<- _scc_ "DeSugar"
deSugar dflags pcs_tc hst this_mod print_unqual tc_result
+ -------------------
+ -- FLATTENING
+ -------------------
+ ; flat_details
+ <- _scc_ "Flattening"
+ flatten dflags pcs_tc hst ds_details
+
; pcs_middle
<- _scc_ "pcs_middle"
if ghci_mode == OneShot
-------------------
; simpl_details
<- _scc_ "Core2Core"
- core2core dflags pcs_middle hst dont_discard ds_details
+ core2core dflags pcs_middle hst dont_discard flat_details
-------------------
-- TIDY
local_tycons = typeEnvTyCons env_tc
local_classes = typeEnvClasses env_tc
- imported_module_names = map ideclName (hsModuleImports rdr_module)
+ imported_module_names =
+ filter (/= gHC_PRIM_Name) $
+ map ideclName (hsModuleImports rdr_module)
+ -- eek! doesn't this keep rdr_module live until code generation?
+ -- SDM 3/2002
mod_name_to_Module nm
= do m <- findModule nm ; return (fst (fromJust m))
mkFinalIface ghci_mode dflags location
maybe_checked_iface new_iface tidy_details
- return ( False, False, Just (bcos,itbl_env), final_iface )
+ ------------------ Create f-x-dynamic C-side stuff ---
+ (istub_h_exists, istub_c_exists)
+ <- outputForeignStubs dflags c_code h_code
+
+ return ( istub_h_exists, istub_c_exists,
+ Just (bcos,itbl_env), final_iface )
#else
then error "GHC not compiled with interpreter"
#endif
showPass dflags "Parser"
_scc_ "Parser" do
- buf <- hGetStringBuffer True{-expand tabs-} src_filename
+ buf <- hGetStringBuffer src_filename
- let glaexts | dopt Opt_GlasgowExts dflags = 1#
- | otherwise = 0#
+ let exts = ExtFlags {glasgowExtsEF = dopt Opt_GlasgowExts dflags,
+ parrEF = dopt Opt_PArr dflags}
+ loc = mkSrcLoc (_PK_ src_filename) 1
- case parseModule buf PState{ bol = 0#, atbol = 1#,
- context = [], glasgow_exts = glaexts,
- loc = mkSrcLoc (_PK_ src_filename) 1 } of {
+ case parseModule buf (mkPState loc exts) of {
PFailed err -> do { hPutStrLn stderr (showSDoc err);
freeStringBuffer buf;
-- Desugar it
ds_expr <- deSugarExpr dflags pcs2 hst iNTERACTIVE print_unqual tc_expr
+ -- Flatten it
+ ; flat_expr <- flattenExpr dflags pcs2 hst ds_expr
+
-- Simplify it
- ; simpl_expr <- simplifyExpr dflags pcs2 hst ds_expr
+ ; simpl_expr <- simplifyExpr dflags pcs2 hst flat_expr
-- Tidy it (temporary, until coreSat does cloning)
; tidy_expr <- tidyCoreExpr simpl_expr
buf <- stringToStringBuffer str
- let glaexts | dopt Opt_GlasgowExts dflags = 1#
- | otherwise = 0#
+ let exts = ExtFlags {glasgowExtsEF = dopt Opt_GlasgowExts dflags,
+ parrEF = dopt Opt_PArr dflags}
+ loc = mkSrcLoc SLIT("<interactive>") 1
- case parseStmt buf PState{ bol = 0#, atbol = 1#,
- context = [], glasgow_exts = glaexts,
- loc = mkSrcLoc SLIT("<interactive>") 1 } of {
+ case parseStmt buf (mkPState loc exts) of {
PFailed err -> do { hPutStrLn stderr (showSDoc err);
-- Not yet implemented in <4.11 freeStringBuffer buf;
Nothing -> return (pcs, []);
Just pcs ->
let do_lookup n
- | isLocalName n = lookupNameEnv (ic_type_env ic) n
+ | isInternalName n = lookupNameEnv (ic_type_env ic) n
| otherwise = lookupType hst (pcs_PTE pcs) n
maybe_ty_things = map do_lookup names
myParseIdentifier dflags str
= do buf <- stringToStringBuffer str
- let glaexts | dopt Opt_GlasgowExts dflags = 1#
- | otherwise = 0#
+ let exts = ExtFlags {glasgowExtsEF = dopt Opt_GlasgowExts dflags,
+ parrEF = dopt Opt_PArr dflags}
+ loc = mkSrcLoc SLIT("<interactive>") 1
- case parseIdentifier buf
- PState{ bol = 0#, atbol = 1#,
- context = [], glasgow_exts = glaexts,
- loc = mkSrcLoc SLIT("<interactive>") 1 } of
+ case parseIdentifier buf (mkPState loc exts) of
PFailed err -> do { hPutStrLn stderr (showSDoc err);
freeStringBuffer buf;