[project @ 2000-12-18 12:43:04 by sewardj]
authorsewardj <unknown>
Mon, 18 Dec 2000 12:43:04 +0000 (12:43 +0000)
committersewardj <unknown>
Mon, 18 Dec 2000 12:43:04 +0000 (12:43 +0000)
Wire in the bytecode interpreter and delete the old one.

ghc/compiler/Makefile
ghc/compiler/compMan/CmLink.lhs
ghc/compiler/compMan/CmTypes.lhs
ghc/compiler/compMan/CompManager.lhs
ghc/compiler/ghci/ByteCodeGen.lhs
ghc/compiler/ghci/InteractiveUI.hs
ghc/compiler/ghci/InterpSyn.lhs [deleted file]
ghc/compiler/ghci/StgInterp.lhs [deleted file]
ghc/compiler/main/DriverPipeline.hs
ghc/compiler/main/HscMain.lhs
ghc/compiler/main/Interpreter.hs

index d28fdea..5861468 100644 (file)
@@ -1,5 +1,5 @@
 # -----------------------------------------------------------------------------
-# $Id: Makefile,v 1.118 2000/12/11 16:42:26 sewardj Exp $
+# $Id: Makefile,v 1.119 2000/12/18 12:43:04 sewardj Exp $
 
 TOP = ..
 include $(TOP)/mk/boilerplate.mk
@@ -189,9 +189,7 @@ SRC_HC_OPTS += -recomp $(GhcHcOpts)
 # Was 6m with 2.10
 absCSyn/PprAbsC_HC_OPTS        = -H10m
 
-basicTypes/IdInfo_HC_OPTS      = -K2m
 codeGen/CgCase_HC_OPTS         = -fno-prune-tydecls
-hsSyn/HsExpr_HC_OPTS           = -K2m
 main/Main_HC_OPTS              = -fvia-C
 
 ifneq "$(GhcWithHscBuiltViaC)" "YES"
@@ -200,25 +198,19 @@ main/Main_HC_OPTS                 += -syslib misc -DREPORT_TO_MOTHERLODE
 endif
 endif
 
-main/CmdLineOpts_HC_OPTS       = -K6m
-nativeGen/PprMach_HC_OPTS      = -K2m
-nativeGen/MachMisc_HC_OPTS     = -K2m 
 nativeGen/MachCode_HC_OPTS     = -H10m
 
 # Avoids Bug in 3.02, it seems
 usageSP/UsageSPInf_HC_OPTS     = -Onot
 
-prelude/PrimOp_HC_OPTS                 = -H12m -K3m -no-recomp
+prelude/PrimOp_HC_OPTS                 = -H12m -no-recomp
 
 # because the NCG can't handle the 64-bit math in here
 prelude/PrelRules_HC_OPTS      = -fvia-C
 
-parser/Lex_HC_OPTS             = -K2m -H16m 
-parser/Ctype_HC_OPTS           = -K2m
+rename/ParseIface_HC_OPTS      += -Onot -H45m -fno-warn-incomplete-patterns
 
-rename/ParseIface_HC_OPTS      += -Onot -H45m -K2m -fno-warn-incomplete-patterns
-
-parser/Parser_HC_OPTS          += -Onot -H80m -optCrts-M80m -K2m -fno-warn-incomplete-patterns
+parser/Parser_HC_OPTS          += -Onot -H80m -fno-warn-incomplete-patterns
 
 ifeq "$(TARGETPLATFORM)" "hppa1.1-hp-hpux9"
 rename/RnMonad_HC_OPTS                 =  -O2 -O2-for-C
index 0932a02..8bce437 100644 (file)
@@ -24,9 +24,7 @@ import CmTypes
 import CmStaticInfo    ( GhciMode(..) )
 import Outputable      ( SDoc )
 import Digraph         ( SCC(..), flattenSCC )
-import DriverUtil
 import Module          ( ModuleName )
-import RdrName
 import FiniteMap
 import Outputable
 import ErrUtils                ( showPass )
@@ -203,11 +201,11 @@ invalidLinkable = throwDyn (OtherError "linkable doesn't contain entirely object
 
 -- link all the interpreted code in one go.  We first remove from the
 -- various environments any previous versions of these modules.
-linkFinish pls mods ul_trees = do
+linkFinish pls mods ul_bcos = do
    resolveObjs
    let itbl_env'    = filterNameMap mods (itbl_env pls)
        closure_env' = filterNameMap mods (closure_env pls)
-       stuff        = [ (trees,itbls) | Trees trees itbls <- ul_trees ]
+       stuff        = [ (bcos,itbls) | BCOs bcos itbls <- ul_bcos ]
 
    (ibinds, new_itbl_env, new_closure_env) <-
        linkIModules itbl_env' closure_env' stuff
@@ -222,8 +220,8 @@ linkFinish pls mods ul_trees = do
 unload :: PersistentLinkerState -> IO PersistentLinkerState
 unload pls = return pls{ closure_env = emptyFM, itbl_env = emptyFM }
 
-linkExpr :: PersistentLinkerState -> UnlinkedIExpr -> IO HValue
-linkExpr PersistentLinkerState{ itbl_env = ie, closure_env = ce } expr
-  = iExprToHValue ie ce expr
+linkExpr :: PersistentLinkerState -> UnlinkedBCOExpr -> IO HValue
+linkExpr PersistentLinkerState{ itbl_env = ie, closure_env = ce } bcos
+  = linkIExpr ie ce bcos
 #endif
 \end{code}
index 8bf11a9..f9e251b 100644 (file)
@@ -13,7 +13,7 @@ module CmTypes (
 import Interpreter
 import HscTypes
 import Module
-import CmStaticInfo
+--import CmStaticInfo
 import Outputable
 
 import Time            ( ClockTime )
@@ -23,14 +23,14 @@ data Unlinked
    = DotO FilePath
    | DotA FilePath
    | DotDLL FilePath
-   | Trees [UnlinkedIBind] ItblEnv  -- bunch of interpretable bindings, +
-                                   -- a mapping from DataCons to their itbls
+   | BCOs [UnlinkedBCO] ItblEnv  -- bunch of interpretable bindings, +
+                                -- a mapping from DataCons to their itbls
 
 instance Outputable Unlinked where
    ppr (DotO path)   = text "DotO" <+> text path
    ppr (DotA path)   = text "DotA" <+> text path
    ppr (DotDLL path) = text "DotDLL" <+> text path
-   ppr (Trees binds _) = text "Trees" <+> ppr binds
+   ppr (BCOs bcos _) = text "BCOs" <+> vcat (map ppr bcos)
 
 isObject (DotO _) = True
 isObject (DotA _) = True
@@ -41,8 +41,8 @@ nameOfObject (DotO fn)   = fn
 nameOfObject (DotA fn)   = fn
 nameOfObject (DotDLL fn) = fn
 
-isInterpretable (Trees _ _) = True
-isInterpretable _ = False
+isInterpretable (BCOs _ _) = True
+isInterpretable _          = False
 
 data Linkable
    = LM ClockTime ModuleName [Unlinked]
index dfd6e03..c930b58 100644 (file)
@@ -17,21 +17,17 @@ where
 import CmLink
 import CmTypes
 import HscTypes
-import Module          ( ModuleName, moduleName,
-                         isHomeModule, moduleEnvElts,
-                         moduleNameUserString )
+import Module          ( Module, ModuleName, moduleName, isHomeModule,
+                         mkHomeModule, mkModuleName, moduleNameUserString )
 import CmStaticInfo    ( GhciMode(..) )
 import DriverPipeline
 import GetImports
 import HscTypes                ( HomeSymbolTable, HomeIfaceTable, 
                          PersistentCompilerState, ModDetails(..) )
-import Name            ( lookupNameEnv )
-import Module
-import PrelNames       ( mainName )
 import HscMain         ( initPersistentCompilerState )
 import Finder
 import UniqFM          ( emptyUFM, lookupUFM, addToUFM, delListFromUFM,
-                         UniqFM, listToUFM, eltsUFM )
+                         UniqFM, listToUFM )
 import Unique          ( Uniquable )
 import Digraph         ( SCC(..), stronglyConnComp, flattenSCC )
 import DriverFlags     ( getDynFlags )
@@ -60,7 +56,7 @@ import Directory        ( getModificationTime, doesFileExist )
 import IO
 import Monad
 import List            ( nub )
-import Maybe           ( catMaybes, fromMaybe, isJust, maybeToList )
+import Maybe           ( catMaybes, fromMaybe, maybeToList )
 \end{code}
 
 
@@ -80,8 +76,8 @@ cmGetExpr cmstate dflags modname expr
           hscExpr dflags hst hit pcs (mkHomeModule modname) expr
         case maybe_stuff of
           Nothing     -> return (cmstate{ pcs=new_pcs }, Nothing)
-          Just (uiexpr, print_unqual, ty) -> do
-               hValue <- linkExpr pls uiexpr
+          Just (bcos, print_unqual, ty) -> do
+               hValue <- linkExpr pls bcos
                return (cmstate{ pcs=new_pcs }, 
                        Just (hValue, print_unqual, ty))
 
index 0a77cbf..32f83e9 100644 (file)
@@ -4,16 +4,20 @@
 \section[ByteCodeGen]{Generate bytecode from Core}
 
 \begin{code}
-module ByteCodeGen ( byteCodeGen, linkIModules ) where
+module ByteCodeGen ( UnlinkedBCO, UnlinkedBCOExpr, ItblEnv, ClosureEnv, HValue,
+                    filterNameMap,
+                     byteCodeGen, coreExprToBCOs, 
+                    linkIModules, linkIExpr
+                  ) where
 
 #include "HsVersions.h"
 
 import Outputable
-import Name            ( Name, getName )
+import Name            ( Name, getName, nameModule )
 import Id              ( Id, idType, isDataConId_maybe )
 import OrdList         ( OrdList, consOL, snocOL, appOL, unitOL, 
                          nilOL, toOL, concatOL, fromOL )
-import FiniteMap       ( FiniteMap, addListToFM, listToFM, 
+import FiniteMap       ( FiniteMap, addListToFM, listToFM, filterFM,
                          addToFM, lookupFM, fmToList, emptyFM, plusFM )
 import CoreSyn
 import PprCore         ( pprCoreExpr, pprCoreAlt )
@@ -33,6 +37,7 @@ import Constants      ( wORD_SIZE )
 import CmdLineOpts     ( DynFlags, DynFlag(..) )
 import ErrUtils                ( showPass, dumpIfSet_dyn )
 import ClosureInfo     ( mkVirtHeapOffsets )
+import Module          ( ModuleName, moduleName )
 
 import List            ( intersperse )
 import Monad           ( foldM )
@@ -54,12 +59,17 @@ import IOExts               ( IORef, readIORef, writeIORef, fixIO )
 import ArrayBase       
 import PrelArr         ( Array(..) )
 import PrelIOBase      ( IO(..) )
+
 \end{code}
 
-Entry point.
+%************************************************************************
+%*                                                                     *
+\subsection{Functions visible from outside this module.}
+%*                                                                     *
+%************************************************************************
 
 \begin{code}
--- visible from outside
+
 byteCodeGen :: DynFlags
             -> [CoreBind] 
             -> [TyCon] -> [Class]
@@ -84,6 +94,35 @@ byteCodeGen dflags binds local_tycons local_classes
         return (bcos, itblenv)
         
 
+-- Returns: (the root BCO for this expression, 
+--           a list of auxilary BCOs resulting from compiling closures)
+coreExprToBCOs :: DynFlags
+              -> CoreExpr
+               -> IO UnlinkedBCOExpr
+coreExprToBCOs dflags expr
+ = do showPass dflags "ByteCodeGen"
+      let invented_id = panic "invented_id" :: Id
+          (BcM_State all_proto_bcos final_ctr) 
+             = runBc (BcM_State [] 0) 
+                     (schemeR (invented_id, freeVars expr))
+      dumpIfSet_dyn dflags Opt_D_dump_InterpSyn
+         "Proto-bcos" (vcat (intersperse (char ' ') (map ppr all_proto_bcos)))
+
+      let invented_name = getName invented_id
+      let root_proto_bco 
+             = case filter ((== invented_name).nameOfProtoBCO) all_proto_bcos of
+                  [root_bco] -> root_bco
+          auxiliary_proto_bcos
+             = filter ((/= invented_name).nameOfProtoBCO) all_proto_bcos
+
+      auxiliary_bcos <- mapM assembleBCO auxiliary_proto_bcos
+      root_bco <- assembleBCO root_proto_bco
+
+      return (root_bco, auxiliary_bcos)
+
+
+
+
 data UnlinkedBCO
    = UnlinkedBCO Name
                  Int (IOUArray Int Word16)     -- insns
@@ -93,14 +132,30 @@ data UnlinkedBCO
 
 nameOfUnlinkedBCO (UnlinkedBCO nm _ _ _ _ _ _ _ _) = nm
 
--- needs a proper home
+-- When translating expressions, we need to distinguish the root
+-- BCO for the expression
+type UnlinkedBCOExpr = (UnlinkedBCO, [UnlinkedBCO])
+
+instance Outputable UnlinkedBCO where
+   ppr (UnlinkedBCO nm n_insns insns n_lits lits n_ptrs ptrs n_itbls itbls)
+      = sep [text "BCO", ppr nm, text "with", 
+             int n_insns, text "insns",
+             int n_lits, text "lits",
+             int n_ptrs, text "ptrs",
+             int n_itbls, text "itbls"]
+
+
+-- these need a proper home
 type ItblEnv    = FiniteMap Name (Ptr StgInfoTable)
 type ClosureEnv = FiniteMap Name HValue
-data HValue = HValue  -- dummy type, actually a pointer to some Real Code.
+data HValue     = HValue  -- dummy type, actually a pointer to some Real Code.
 
+-- remove all entries for a given set of modules from the environment
+filterNameMap :: [ModuleName] -> FiniteMap Name a -> FiniteMap Name a
+filterNameMap mods env 
+   = filterFM (\n _ -> moduleName (nameModule n) `notElem` mods) env
 \end{code}
 
-
 %************************************************************************
 %*                                                                     *
 \subsection{Bytecodes, and Outputery.}
@@ -214,6 +269,8 @@ data ProtoBCO a
               (Either [AnnAlt Id VarSet]
                       (AnnExpr Id VarSet))
 
+nameOfProtoBCO (ProtoBCO nm insns origin) = nm
+
 
 type Sequel = Int      -- back off to this depth before ENTER
 
@@ -1130,6 +1187,12 @@ GLOBAL_VAR(v_cafTable, [], [HValue])
 addCAF :: HValue -> IO ()
 addCAF x = do xs <- readIORef v_cafTable; writeIORef v_cafTable (x:xs)
 
+bcosToHValue :: ItblEnv -> ClosureEnv -> UnlinkedBCOExpr -> IO HValue
+bcosToHValue ie ce (root_bco, other_bcos)
+   = do linked_expr <- linkIExpr ie ce (root_bco, other_bcos)
+       return linked_expr
+
+
 linkIModules :: ItblEnv    -- incoming global itbl env; returned updated
             -> ClosureEnv -- incoming global closure env; returned updated
             -> [([UnlinkedBCO], ItblEnv)]
@@ -1142,16 +1205,28 @@ linkIModules gie gce mods = do
   
   (new_bcos, new_gce) <-
     fixIO (\ ~(new_bcos, new_gce) -> do
-
       new_bcos <- linkBCOs final_gie new_gce bcos
-
       let new_gce = addListToFM gce (zip top_level_binders new_bcos)
-
       return (new_bcos, new_gce))
 
   return (new_bcos, final_gie, new_gce)
 
 
+linkIExpr :: ItblEnv -> ClosureEnv -> UnlinkedBCOExpr
+          -> IO HValue           -- IO BCO# really
+linkIExpr ie ce (root_ul_bco, aux_ul_bcos)
+   = do let aux_ul_binders = map nameOfUnlinkedBCO aux_ul_bcos
+        (aux_bcos, aux_ce) 
+           <- fixIO 
+                (\ ~(aux_bcos, new_ce) 
+                 -> do new_bcos <- linkBCOs ie new_ce aux_ul_bcos
+                       let new_ce = addListToFM ce (zip aux_ul_binders new_bcos)
+                       return (new_bcos, new_ce)
+                )
+        [root_bco]
+           <- linkBCOs ie aux_ce [root_ul_bco]
+        return root_bco
+
 
 linkBCOs :: ItblEnv -> ClosureEnv -> [UnlinkedBCO] 
          -> IO [HValue]   -- IO [BCO#] really
index 45a3e18..499998d 100644 (file)
@@ -1,5 +1,5 @@
 -----------------------------------------------------------------------------
--- $Id: InteractiveUI.hs,v 1.23 2000/12/13 12:18:40 sewardj Exp $
+-- $Id: InteractiveUI.hs,v 1.24 2000/12/18 12:43:04 sewardj Exp $
 --
 -- GHC Interactive User Interface
 --
@@ -20,7 +20,7 @@ import Linker
 import Module
 import Outputable
 import Util
-import TypeRep {- instance Outputable Type; do not delete -}
+import PprType {- instance Outputable Type; do not delete -}
 import Panic   ( GhcException(..) )
 
 import Exception
diff --git a/ghc/compiler/ghci/InterpSyn.lhs b/ghc/compiler/ghci/InterpSyn.lhs
deleted file mode 100644 (file)
index ccb6963..0000000
+++ /dev/null
@@ -1,355 +0,0 @@
-%
-% (c) The University of Glasgow 2000
-%
-\section[InterpSyn]{Abstract syntax for interpretable trees}
-
-\begin{code}
-module InterpSyn {- Todo: ( ... ) -} where
-
-#include "HsVersions.h"
-
-import Id
-import Name
-import PrimOp
-import Outputable
-
-import PrelAddr -- tmp
-import PrelGHC  -- tmp
-import GlaExts ( Int(..) )
-
------------------------------------------------------------------------------
--- The interpretable expression type
-
-data HValue = HValue  -- dummy type, actually a pointer to some Real Code.
-
-data IBind con var = IBind Id (IExpr con var)
-
-binder (IBind v e) = v
-bindee (IBind v e) = e
-
-data AltAlg  con var = AltAlg  Int{-tagNo-} [(Id,Rep)] (IExpr con var)
-data AltPrim con var = AltPrim (Lit con var) (IExpr con var)
-
--- HACK ALERT!  A Lit may *only* be one of LitI, LitL, LitF, LitD
-type Lit con var = IExpr con var
-
-data Rep 
-  = RepI 
-  | RepP
-  | RepF
-  | RepD
-  -- we're assuming that Char# is sufficiently compatible with Int# that
-  -- we only need one rep for both.
-
-  {- Not yet:
-  | RepV       -- void rep
-  | RepI8
-  | RepI64
-  -}
-  deriving Eq
-
-
-
--- index???OffClosure needs to traverse indirection nodes.
-
--- You can always tell the representation of an IExpr by examining
--- its root node.
-data IExpr con var
-   = CaseAlgP  Id (IExpr con var) [AltAlg  con var] (Maybe (IExpr con var))
-   | CaseAlgI  Id (IExpr con var) [AltAlg  con var] (Maybe (IExpr con var))
-   | CaseAlgF  Id (IExpr con var) [AltAlg  con var] (Maybe (IExpr con var))
-   | CaseAlgD  Id (IExpr con var) [AltAlg  con var] (Maybe (IExpr con var))
-
-   | CasePrimP Id (IExpr con var) [AltPrim con var] (Maybe (IExpr con var))
-   | CasePrimI Id (IExpr con var) [AltPrim con var] (Maybe (IExpr con var))
-   | CasePrimF Id (IExpr con var) [AltPrim con var] (Maybe (IExpr con var))
-   | CasePrimD Id (IExpr con var) [AltPrim con var] (Maybe (IExpr con var))
-
-   -- saturated constructor apps; args are in heap order.
-   -- The Addrs are the info table pointers.  Descriptors refer to the
-   -- arg reps; all constructor applications return pointer rep.
-   | ConApp    con
-   | ConAppI   con (IExpr con var)
-   | ConAppP   con (IExpr con var)
-   | ConAppPP  con (IExpr con var) (IExpr con var)
-   | ConAppGen con [IExpr con var]
-
-   | PrimOpP PrimOp [(IExpr con var)]
-   | PrimOpI PrimOp [(IExpr con var)]
-   | PrimOpF PrimOp [(IExpr con var)]
-   | PrimOpD PrimOp [(IExpr con var)]
-
-   | NonRecP (IBind con var) (IExpr con var)
-   | NonRecI (IBind con var) (IExpr con var)
-   | NonRecF (IBind con var) (IExpr con var)
-   | NonRecD (IBind con var) (IExpr con var)
-
-   | RecP    [IBind con var] (IExpr con var)
-   | RecI    [IBind con var] (IExpr con var)
-   | RecF    [IBind con var] (IExpr con var)
-   | RecD    [IBind con var] (IExpr con var)
-
-   | LitI   Int#
-   | LitF   Float#
-   | LitD   Double#
-
-   {- not yet:
-   | LitB   Int8#
-   | LitL   Int64#
-   -}
-
-   | Native var          -- pointer to a Real Closure
-
-   | VarP   Id
-   | VarI   Id
-   | VarF   Id
-   | VarD   Id
-
-       -- LamXY indicates a function of reps X -> Y
-       -- ie var rep = X, result rep = Y
-       -- NOTE: repOf (LamXY _ _) = RepI regardless of X and Y
-       --
-   | LamPP  Id (IExpr con var)
-   | LamPI  Id (IExpr con var)
-   | LamPF  Id (IExpr con var)
-   | LamPD  Id (IExpr con var)
-   | LamIP  Id (IExpr con var)
-   | LamII  Id (IExpr con var)
-   | LamIF  Id (IExpr con var)
-   | LamID  Id (IExpr con var)
-   | LamFP  Id (IExpr con var)
-   | LamFI  Id (IExpr con var)
-   | LamFF  Id (IExpr con var)
-   | LamFD  Id (IExpr con var)
-   | LamDP  Id (IExpr con var)
-   | LamDI  Id (IExpr con var)
-   | LamDF  Id (IExpr con var)
-   | LamDD  Id (IExpr con var)
-
-       -- AppXY means apply a fn (always of Ptr rep) to 
-       -- an arg of rep X giving result of Rep Y
-       -- therefore: repOf (AppXY _ _) = RepY
-   | AppPP  (IExpr con var) (IExpr con var)
-   | AppPI  (IExpr con var) (IExpr con var)
-   | AppPF  (IExpr con var) (IExpr con var)
-   | AppPD  (IExpr con var) (IExpr con var)
-   | AppIP  (IExpr con var) (IExpr con var)
-   | AppII  (IExpr con var) (IExpr con var)
-   | AppIF  (IExpr con var) (IExpr con var)
-   | AppID  (IExpr con var) (IExpr con var)
-   | AppFP  (IExpr con var) (IExpr con var)
-   | AppFI  (IExpr con var) (IExpr con var)
-   | AppFF  (IExpr con var) (IExpr con var)
-   | AppFD  (IExpr con var) (IExpr con var)
-   | AppDP  (IExpr con var) (IExpr con var)
-   | AppDI  (IExpr con var) (IExpr con var)
-   | AppDF  (IExpr con var) (IExpr con var)
-   | AppDD  (IExpr con var) (IExpr con var)
-
-
-showExprTag :: IExpr c v -> String
-showExprTag expr
-   = case expr of
-
-        CaseAlgP  _ _ _ _ -> "CaseAlgP"
-        CaseAlgI  _ _ _ _ -> "CaseAlgI"
-        CaseAlgF  _ _ _ _ -> "CaseAlgF"
-        CaseAlgD  _ _ _ _ -> "CaseAlgD"
-
-        CasePrimP _ _ _ _ -> "CasePrimP"
-        CasePrimI _ _ _ _ -> "CasePrimI"
-        CasePrimF _ _ _ _ -> "CasePrimF"
-        CasePrimD _ _ _ _ -> "CasePrimD"
-
-        ConApp _          -> "ConApp"
-        ConAppI _ _       -> "ConAppI"
-        ConAppP _ _       -> "ConAppP"
-        ConAppPP _ _ _    -> "ConAppPP"
-        ConAppGen _ _     -> "ConAppGen"
-
-        PrimOpP _ _       -> "PrimOpP"
-        PrimOpI _ _       -> "PrimOpI"
-        PrimOpF _ _       -> "PrimOpF"
-        PrimOpD _ _       -> "PrimOpD"
-
-        NonRecP _ _       -> "NonRecP"
-        NonRecI _ _       -> "NonRecI"
-        NonRecF _ _       -> "NonRecF"
-        NonRecD _ _       -> "NonRecD"
-
-        RecP _ _          -> "RecP"
-        RecI _ _          -> "RecI"
-        RecF _ _          -> "RecF"
-        RecD _ _          -> "RecD"
-
-        LitI _            -> "LitI"
-        LitF _            -> "LitF"
-        LitD _            -> "LitD"
-
-        Native _          -> "Native"
-
-        VarP _            -> "VarP"
-        VarI _            -> "VarI"
-        VarF _            -> "VarF"
-        VarD _            -> "VarD"
-
-        LamPP _ _         -> "LamPP"
-        LamPI _ _         -> "LamPI"
-        LamPF _ _         -> "LamPF"
-        LamPD _ _         -> "LamPD"
-        LamIP _ _         -> "LamIP"
-        LamII _ _         -> "LamII"
-        LamIF _ _         -> "LamIF"
-        LamID _ _         -> "LamID"
-        LamFP _ _         -> "LamFP"
-        LamFI _ _         -> "LamFI"
-        LamFF _ _         -> "LamFF"
-        LamFD _ _         -> "LamFD"
-        LamDP _ _         -> "LamDP"
-        LamDI _ _         -> "LamDI"
-        LamDF _ _         -> "LamDF"
-        LamDD _ _         -> "LamDD"
-
-        AppPP _ _         -> "AppPP"
-        AppPI _ _         -> "AppPI"
-        AppPF _ _         -> "AppPF"
-        AppPD _ _         -> "AppPD"
-        AppIP _ _         -> "AppIP"
-        AppII _ _         -> "AppII"
-        AppIF _ _         -> "AppIF"
-        AppID _ _         -> "AppID"
-        AppFP _ _         -> "AppFP"
-        AppFI _ _         -> "AppFI"
-        AppFF _ _         -> "AppFF"
-        AppFD _ _         -> "AppFD"
-        AppDP _ _         -> "AppDP"
-        AppDI _ _         -> "AppDI"
-        AppDF _ _         -> "AppDF"
-        AppDD _ _         -> "AppDD"
-
-        other             -> "(showExprTag:unhandled case)"
-
------------------------------------------------------------------------------
--- Instantiations of the IExpr type
-
-type UnlinkedIExpr = IExpr Name Name
-type LinkedIExpr   = IExpr Addr    HValue
-
-type UnlinkedIBind = IBind Name Name
-type LinkedIBind   = IBind Addr    HValue
-
-type UnlinkedAltAlg  = AltAlg  Name Name
-type LinkedAltAlg    = AltAlg  Addr HValue
-
-type UnlinkedAltPrim = AltPrim Name Name
-type LinkedAltPrim = AltPrim Addr HValue
-
------------------------------------------------------------------------------
--- Pretty printing
-
-instance Outputable HValue where
-   ppr x = text (show (A# (unsafeCoerce# x :: Addr#)))
-        -- ptext SLIT("<O>")  -- unidentified lurking object
-
-instance (Outputable var, Outputable con) => Outputable (IBind con var) where
-  ppr ibind = pprIBind ibind
-
-pprIBind :: (Outputable var, Outputable con) => IBind con var -> SDoc
-pprIBind (IBind v e) = ppr v <+> char '=' <+> pprIExpr e
-
-pprAltAlg (AltAlg tag vars rhs)
-   = text "Tag_" <> int tag <+> hsep (map ppr vars)
-     <+> text "->" <+> pprIExpr rhs
-
-pprAltPrim (AltPrim tag rhs)
-   = pprIExpr tag <+> text "->" <+> pprIExpr rhs
-
-instance Outputable Rep where
-   ppr RepP = text "P"
-   ppr RepI = text "I"
-   ppr RepF = text "F"
-   ppr RepD = text "D"
-
-instance Outputable Addr where
-   ppr addr = text (show addr)
-
-pprDefault Nothing = text "NO_DEFAULT"
-pprDefault (Just e) = text "DEFAULT ->" $$ nest 2 (pprIExpr e)
-
-pprIExpr :: (Outputable var, Outputable con) => IExpr con var -> SDoc
-pprIExpr (expr:: IExpr con var)
-   = case expr of
-        PrimOpI op args -> doPrimOp 'I' op args
-        PrimOpP op args -> doPrimOp 'P' op args
-
-        VarI v    -> ppr v
-        VarP v    -> ppr v
-        LitI i#   -> int (I# i#) <> char '#'
-
-        LamPP v e -> doLam "PP" v e
-        LamPI v e -> doLam "PI" v e
-        LamIP v e -> doLam "IP" v e
-        LamII v e -> doLam "II" v e
-
-        AppPP f a -> doApp "PP" f a
-        AppPI f a -> doApp "PI" f a
-        AppIP f a -> doApp "IP" f a
-        AppII f a -> doApp "II" f a
-
-       Native v  -> ptext SLIT("Native") <+> ppr v
-
-        CasePrimI b sc alts def -> doCasePrim 'I' b sc alts def
-        CasePrimP b sc alts def -> doCasePrim 'P' b sc alts def
-
-        CaseAlgI b sc alts def -> doCaseAlg 'I' b sc alts def
-        CaseAlgP b sc alts def -> doCaseAlg 'P' b sc alts def
-
-        NonRecP bind body -> doNonRec 'P' bind body
-       NonRecI bind body -> doNonRec 'I' bind body
-
-       RecP binds body -> doRec 'P' binds body
-       RecI binds body -> doRec 'I' binds body
-
-        ConApp    i          -> doConApp "" i ([] :: [IExpr con var])
-        ConAppI   i a1       -> doConApp "" i [a1]
-        ConAppP   i a1       -> doConApp "" i [a1]
-        ConAppPP  i a1 a2    -> doConApp "" i [a1,a2]
-        ConAppGen i args     -> doConApp "" i args
-
-        other     -> text "pprIExpr: unimplemented tag:" 
-                     <+> text (showExprTag other)
-     where
-        doConApp repstr itbl args
-           = text "Con" <> text repstr
-             <+> char '[' <> hsep (map pprIExpr args) <> char ']'
-
-        doPrimOp repchar op args
-           = char repchar <> ppr op <+> char '[' <> hsep (map pprIExpr args) <> char ']'
-
-        doNonRec repchr bind body
-           = vcat [text "let" <> char repchr <+> pprIBind bind, text "in", pprIExpr body]
-
-       doRec repchr binds body
-          = vcat [text "letrec" <> char repchr <+> vcat (map pprIBind binds),
-               text "in", pprIExpr body]
-
-        doCasePrim repchr b sc alts def
-           = sep [text "CasePrim" <> char repchr 
-                     <+> pprIExpr sc <+> text "of" <+> ppr b <+> char '{',
-                  nest 2 (vcat (map pprAltPrim alts) $$ pprDefault def),
-                  char '}'
-                 ]
-
-        doCaseAlg repchr b sc alts def
-           = sep [text "CaseAlg" <> char repchr 
-                     <+> pprIExpr sc <+> text "of" <+> ppr b <+> char '{',
-                  nest 2 (vcat (map pprAltAlg alts) $$ pprDefault def),
-                  char '}'
-                 ]
-
-        doApp repstr f a
-           = text "(@" <> text repstr <+> pprIExpr f <+> pprIExpr a <> char ')'
-        doLam repstr v e 
-           = (char '\\' <> text repstr <+> ppr v <+> text "->") $$ pprIExpr e
-
-\end{code}
diff --git a/ghc/compiler/ghci/StgInterp.lhs b/ghc/compiler/ghci/StgInterp.lhs
deleted file mode 100644 (file)
index 8428814..0000000
+++ /dev/null
@@ -1,1425 +0,0 @@
-%
-% (c) The GRASP/AQUA Project, Glasgow University, 1992-2000
-%
-\section[StgInterp]{Translates STG syntax to interpretable form, and run it}
-
-\begin{code}
-
-module StgInterp ( 
-
-    ClosureEnv, ItblEnv, 
-    filterNameMap,      -- :: [ModuleName] -> FiniteMap Name a 
-                       -- -> FiniteMap Name a
-
-    linkIModules,      -- :: ItblEnv -> ClosureEnv
-                       -- -> [([UnlinkedIBind], ItblEnv)]
-                       -- -> IO ([LinkedIBind], ItblEnv, ClosureEnv)
-
-    iExprToHValue,     --  :: ItblEnv -> ClosureEnv 
-                       --  -> UnlinkedIExpr -> HValue
-
-    stgBindsToInterpSyn,-- :: [StgBinding] 
-                       -- -> [TyCon] -> [Class] 
-                       -- -> IO ([UnlinkedIBind], ItblEnv)
-
-    stgExprToInterpSyn, -- :: StgExpr
-                       -- -> IO UnlinkedIExpr
-
-    interp             -- :: LinkedIExpr -> HValue
- ) where
-
-{- -----------------------------------------------------------------------------
-
- ToDo:
-   - link should be in the IO monad, so it can modify the symtabs as it
-     goes along
-   - need a way to remove the bindings for a module from the symtabs. 
-     maybe the symtabs should be indexed by module first.
-
-   - change the representation to something less verbose (?).
-
-   - converting string literals to Addr# is horrible and introduces
-     a memory leak.  See if something can be done about this.
-
-   - lots of assumptions about word size vs. double size etc.
-
------------------------------------------------------------------------------ -}
-
-#include "HsVersions.h"
-
-
-
-import Linker
-import Id              ( Id, idPrimRep )
-import Outputable
-import Var
-import PrimOp          ( PrimOp(..) )
-import PrimRep         ( PrimRep(..) )
-import Literal         ( Literal(..) )
-import Type            ( Type, typePrimRep, deNoteType, repType, funResultTy )
-import DataCon         ( DataCon, dataConTag, dataConRepArgTys )
-import ClosureInfo     ( mkVirtHeapOffsets )
-import Module          ( ModuleName, moduleName )
-import RdrName
-import Name            hiding (filterNameEnv)
-import Util
-import UniqFM
-import UniqSet
-
---import {-# SOURCE #-} MCI_make_constr
-
-import FastString
-import GlaExts         ( Int(..) )
-import Module          ( moduleNameFS )
-
-import TyCon           ( TyCon, isDataTyCon, tyConDataCons, tyConFamilySize )
-import Class           ( Class, classTyCon )
-import InterpSyn
-import StgSyn
-import FiniteMap
-import OccName         ( occNameString )
-import ErrUtils                ( showPass, dumpIfSet_dyn )
-import CmdLineOpts     ( DynFlags, DynFlag(..) )
-import Panic           ( panic )
-
-import IOExts
-import Addr
-import Bits
-import Foreign
-import CTypes
-
-import IO
-
-import PrelGHC         --( unsafeCoerce#, dataToTag#,
-                       --  indexPtrOffClosure#, indexWordOffClosure# )
-import PrelAddr        ( Addr(..) )
-import PrelFloat       ( Float(..), Double(..) )
-
-
-#if 1
-interp = panic "interp"
-stgExprToInterpSyn = panic "stgExprToInterpSyn"
-stgBindsToInterpSyn = panic "stgBindsToInterpSyn"
-iExprToHValue = panic "iExprToHValue"
-linkIModules = panic "linkIModules"
-filterNameMap = panic "filterNameMap"
-type ItblEnv    = FiniteMap Name (Ptr StgInfoTable)
-type ClosureEnv = FiniteMap Name HValue
-data StgInfoTable = StgInfoTable {
-   ptrs :: Word16,
-   nptrs :: Word16,
-   srtlen :: Word16,
-   tipe :: Word16,
-   code0, code1, code2, code3, code4, code5, code6, code7 :: Word8
-}
-
-#else
-
--- ---------------------------------------------------------------------------
--- Environments needed by the linker
--- ---------------------------------------------------------------------------
-
-type ItblEnv    = FiniteMap Name (Ptr StgInfoTable)
-type ClosureEnv = FiniteMap Name HValue
-emptyClosureEnv = emptyFM
-
--- remove all entries for a given set of modules from the environment
-filterNameMap :: [ModuleName] -> FiniteMap Name a -> FiniteMap Name a
-filterNameMap mods env 
-   = filterFM (\n _ -> moduleName (nameModule n) `notElem` mods) env
-
--- ---------------------------------------------------------------------------
--- Turn an UnlinkedIExpr into a value we can run, for the interpreter
--- ---------------------------------------------------------------------------
-
-iExprToHValue :: ItblEnv -> ClosureEnv -> UnlinkedIExpr -> IO HValue
-iExprToHValue ie ce expr
-   = do linked_expr <- linkIExpr ie ce expr
-       return (interp linked_expr)
-
--- ---------------------------------------------------------------------------
--- Convert STG to an unlinked interpretable
--- ---------------------------------------------------------------------------
-
--- visible from outside
-stgBindsToInterpSyn :: DynFlags
-                   -> [StgBinding] 
-                   -> [TyCon] -> [Class] 
-                   -> IO ([UnlinkedIBind], ItblEnv)
-stgBindsToInterpSyn dflags binds local_tycons local_classes
- = do showPass dflags "StgToInterp"
-      let ibinds = concatMap (translateBind emptyUniqSet) binds
-      let tycs   = local_tycons ++ map classTyCon local_classes
-      dumpIfSet_dyn dflags Opt_D_dump_InterpSyn
-        "Convert To InterpSyn" (vcat (map pprIBind ibinds))
-      itblenv <- mkITbls tycs
-      return (ibinds, itblenv)
-
-stgExprToInterpSyn :: DynFlags
-                  -> StgExpr
-                  -> IO UnlinkedIExpr
-stgExprToInterpSyn dflags expr
- = do showPass dflags "StgToInterp"
-      let iexpr = stg2expr emptyUniqSet expr
-      dumpIfSet_dyn dflags Opt_D_dump_InterpSyn
-       "Convert To InterpSyn" (pprIExpr iexpr)
-      return iexpr
-
-translateBind :: UniqSet Id -> StgBinding -> [UnlinkedIBind]
-translateBind ie (StgNonRec v e)  = [IBind v (rhs2expr ie e)]
-translateBind ie (StgRec vs_n_es) = [IBind v (rhs2expr ie' e) | (v,e) <- vs_n_es]
-  where ie' = addListToUniqSet ie (map fst vs_n_es)
-
-isRec (StgNonRec _ _) = False
-isRec (StgRec _)      = True
-
-rhs2expr :: UniqSet Id -> StgRhs -> UnlinkedIExpr
-rhs2expr ie (StgRhsClosure ccs binfo srt fvs uflag args rhs)
-   = mkLambdas args
-     where
-        rhsExpr = stg2expr (addListToUniqSet ie args) rhs
-        rhsRep  = repOfStgExpr rhs
-        mkLambdas [] = rhsExpr
-       mkLambdas [v] = mkLam (repOfId v) rhsRep v rhsExpr
-        mkLambdas (v:vs) = mkLam (repOfId v) RepP v (mkLambdas vs)
-rhs2expr ie (StgRhsCon ccs dcon args)
-   = conapp2expr ie dcon args
-
-conapp2expr :: UniqSet Id -> DataCon -> [StgArg] -> UnlinkedIExpr
-conapp2expr ie dcon args
-   = mkConApp con_rdrname reps exprs
-     where
-       con_rdrname = getName dcon
-        exprs       = map (arg2expr ie) inHeapOrder
-        reps        = map repOfArg inHeapOrder
-        inHeapOrder = toHeapOrder args
-
-        toHeapOrder :: [StgArg] -> [StgArg]
-        toHeapOrder args
-           = let (_, _, rearranged_w_offsets) = mkVirtHeapOffsets getArgPrimRep args
-                 (rearranged, offsets) = unzip rearranged_w_offsets
-             in
-                 rearranged
-
--- Handle most common cases specially; do the rest with a generic
--- mechanism (deferred till later :)
-mkConApp :: Name -> [Rep] -> [UnlinkedIExpr] -> UnlinkedIExpr
-mkConApp nm []               []         = ConApp    nm
-mkConApp nm [RepI]           [a1]       = ConAppI   nm a1
-mkConApp nm [RepP]           [a1]       = ConAppP   nm a1
-mkConApp nm [RepP,RepP]      [a1,a2]    = ConAppPP  nm a1 a2
-mkConApp nm reps args  = ConAppGen nm args
-
-mkLam RepP RepP = LamPP
-mkLam RepI RepP = LamIP
-mkLam RepP RepI = LamPI
-mkLam RepI RepI = LamII
-mkLam repa repr = pprPanic "StgInterp.mkLam" (ppr repa <+> ppr repr)
-
-mkApp RepP RepP = AppPP
-mkApp RepI RepP = AppIP
-mkApp RepP RepI = AppPI
-mkApp RepI RepI = AppII
-mkApp repa repr = pprPanic "StgInterp.mkApp" (ppr repa <+> ppr repr)
-
-repOfId :: Id -> Rep
-repOfId = primRep2Rep . idPrimRep
-
-primRep2Rep primRep
-   = case primRep of
-
-       -- genuine lifted types
-        PtrRep        -> RepP
-
-       -- all these are unboxed, fit into a word, and we assume they
-       -- all have the same call/return convention.
-        IntRep        -> RepI
-       CharRep       -> RepI
-       WordRep       -> RepI
-       AddrRep       -> RepI
-       WeakPtrRep    -> RepI
-       StablePtrRep  -> RepI
-
-       -- these are pretty dodgy: really pointers, but
-       -- we can't let the compiler build thunks with these reps.
-       ForeignObjRep -> RepP
-       StableNameRep -> RepP
-       ThreadIdRep   -> RepP
-       ArrayRep      -> RepP
-       ByteArrayRep  -> RepP
-
-       FloatRep      -> RepF
-       DoubleRep     -> RepD
-
-        other -> pprPanic "primRep2Rep" (ppr other)
-
-repOfStgExpr :: StgExpr -> Rep
-repOfStgExpr stgexpr
-   = case stgexpr of
-        StgLit lit 
-           -> repOfLit lit
-        StgCase scrut live liveR bndr srt alts
-           -> case altRhss alts of
-                 (a:_) -> repOfStgExpr a
-                 []    -> panic "repOfStgExpr: no alts"
-        StgApp var []
-           -> repOfId var
-        StgApp var args
-           -> repOfApp ((deNoteType.repType.idType) var) (length args)
-
-        StgPrimApp op args res_ty
-           -> (primRep2Rep.typePrimRep) res_ty
-
-        StgLet binds body -> repOfStgExpr body
-        StgLetNoEscape live liveR binds body -> repOfStgExpr body
-
-        StgConApp con args -> RepP -- by definition
-
-        other 
-           -> pprPanic "repOfStgExpr" (ppr other)
-     where
-        altRhss (StgAlgAlts tycon alts def)
-           = [rhs | (dcon,bndrs,uses,rhs) <- alts] ++ defRhs def
-        altRhss (StgPrimAlts tycon alts def)
-           = [rhs | (lit,rhs) <- alts] ++ defRhs def
-        defRhs StgNoDefault 
-           = []
-        defRhs (StgBindDefault rhs)
-           = [rhs]
-
-        -- returns the Rep of the result of applying ty to n args.
-        repOfApp :: Type -> Int -> Rep
-        repOfApp ty 0 = (primRep2Rep.typePrimRep) ty
-        repOfApp ty n = repOfApp (funResultTy ty) (n-1)
-
-
-
-repOfLit lit
-   = case lit of
-        MachInt _    -> RepI
-        MachWord _   -> RepI
-        MachAddr _   -> RepI
-        MachChar _   -> RepI
-        MachFloat _  -> RepF
-        MachDouble _ -> RepD
-        MachStr _    -> RepI   -- because it's a ptr outside the heap
-        other -> pprPanic "repOfLit" (ppr lit)
-
-lit2expr :: Literal -> UnlinkedIExpr
-lit2expr lit
-   = case lit of
-        MachInt  i   -> case fromIntegral i of I# i -> LitI i
-        MachWord i   -> case fromIntegral i of I# i -> LitI i
-        MachAddr i   -> case fromIntegral i of I# i -> LitI i
-       MachChar i   -> case fromIntegral i of I# i -> LitI i
-       MachFloat f  -> case fromRational f of F# f -> LitF f
-       MachDouble f -> case fromRational f of D# f -> LitD f
-        MachStr s    -> 
-          case s of
-               CharStr s i -> LitI (addr2Int# s)
-
-               FastString _ l ba -> 
-               -- sigh, a string in the heap is no good to us.  We need a 
-               -- static C pointer, since the type of a string literal is 
-               -- Addr#.  So, copy the string into C land and introduce a 
-               -- memory leak at the same time.
-                 let n = I# l in
-                -- CAREFUL!  Chars are 32 bits in ghc 4.09+
-                 case unsafePerformIO (do a@(Ptr addr) <- mallocBytes (n+1)
-                                          strncpy a ba (fromIntegral n)
-                                          writeCharOffAddr addr n '\0'
-                                          return addr)
-                 of  A# a -> LitI (addr2Int# a)
-
-               _ -> error "StgInterp.lit2expr: unhandled string constant type"
-
-        other -> pprPanic "lit2expr" (ppr lit)
-
-stg2expr :: UniqSet Id -> StgExpr -> UnlinkedIExpr
-stg2expr ie stgexpr
-   = case stgexpr of
-        StgApp var []
-           -> mkVar ie (repOfId var) var
-
-        StgApp var args
-           -> mkAppChain ie (repOfStgExpr stgexpr) (mkVar ie (repOfId var) var) args
-        StgLit lit
-           -> lit2expr lit
-
-        StgCase scrut live liveR bndr srt (StgPrimAlts ty alts def)
-           |  repOfStgExpr scrut /= RepP
-           -> mkCasePrim (repOfStgExpr stgexpr) 
-                         bndr (stg2expr ie scrut) 
-                              (map (doPrimAlt ie') alts) 
-                              (def2expr ie' def)
-           | otherwise ->
-               pprPanic "stg2expr(StgCase,prim)" (ppr (repOfStgExpr scrut) $$ (case scrut of (StgApp v _) -> ppr v <+> ppr (idType v) <+> ppr (idPrimRep v)) $$ ppr stgexpr)
-          where ie' = addOneToUniqSet ie bndr
-
-        StgCase scrut live liveR bndr srt (StgAlgAlts tycon alts def)
-           |  repOfStgExpr scrut == RepP
-           -> mkCaseAlg (repOfStgExpr stgexpr) 
-                        bndr (stg2expr ie scrut) 
-                             (map (doAlgAlt ie') alts) 
-                             (def2expr ie' def)
-          where ie' = addOneToUniqSet ie bndr
-
-
-        StgPrimApp op args res_ty
-           -> mkPrimOp (repOfStgExpr stgexpr) op (map (arg2expr ie) args)
-
-        StgConApp dcon args
-           -> conapp2expr ie dcon args
-
-        StgLet binds@(StgNonRec v e) body
-          -> mkNonRec (repOfStgExpr stgexpr) 
-               (head (translateBind ie binds)) 
-               (stg2expr (addOneToUniqSet ie v) body)
-
-        StgLet binds@(StgRec bs) body
-           -> mkRec (repOfStgExpr stgexpr) 
-               (translateBind ie binds) 
-               (stg2expr (addListToUniqSet ie (map fst bs)) body)
-
-       -- treat let-no-escape just like let.
-       StgLetNoEscape _ _ binds body
-          -> stg2expr ie (StgLet binds body)
-
-        other
-           -> pprPanic "stg2expr" (ppr stgexpr)
-     where
-        doPrimAlt ie (lit,rhs) 
-           = AltPrim (lit2expr lit) (stg2expr ie rhs)
-        doAlgAlt ie (dcon,vars,uses,rhs) 
-           = AltAlg (dataConTag dcon - 1) 
-                    (map id2VaaRep (toHeapOrder vars)) 
-                       (stg2expr (addListToUniqSet ie vars) rhs)
-
-        toHeapOrder vars
-           = let (_,_,rearranged_w_offsets) = mkVirtHeapOffsets idPrimRep vars
-                 (rearranged,offsets)       = unzip rearranged_w_offsets
-             in
-                 rearranged
-
-        def2expr ie StgNoDefault         = Nothing
-        def2expr ie (StgBindDefault rhs) = Just (stg2expr ie rhs)
-
-        mkAppChain ie result_rep so_far []
-           = panic "mkAppChain"
-        mkAppChain ie result_rep so_far [a]
-           = mkApp (repOfArg a) result_rep so_far (arg2expr ie a)
-        mkAppChain ie result_rep so_far (a:as)
-           = mkAppChain ie result_rep (mkApp (repOfArg a) RepP so_far (arg2expr ie a)) as
-
-mkCasePrim RepI = CasePrimI
-mkCasePrim RepP = CasePrimP
-
-mkCaseAlg  RepI = CaseAlgI
-mkCaseAlg  RepP = CaseAlgP
-
--- any var that isn't in scope is turned into a Native
-mkVar ie rep var
-  | var `elementOfUniqSet` ie = 
-       (case rep of
-          RepI -> VarI
-          RepF -> VarF
-          RepD -> VarD
-          RepP -> VarP)  var
-  | otherwise = Native (getName var)
-
-mkRec RepI = RecI
-mkRec RepP = RecP
-mkNonRec RepI = NonRecI
-mkNonRec RepP = NonRecP
-
-mkPrimOp RepI = PrimOpI
-mkPrimOp RepP = PrimOpP        
-
-arg2expr :: UniqSet Id -> StgArg -> UnlinkedIExpr
-arg2expr ie (StgVarArg v)   = mkVar ie (repOfId v) v
-arg2expr ie (StgLitArg lit) = lit2expr lit
-arg2expr ie (StgTypeArg ty) = pprPanic "arg2expr" (ppr ty)
-
-repOfArg :: StgArg -> Rep
-repOfArg (StgVarArg v)   = repOfId v
-repOfArg (StgLitArg lit) = repOfLit lit
-repOfArg (StgTypeArg ty) = pprPanic "repOfArg" (ppr ty)
-
-id2VaaRep var = (var, repOfId var)
-
-
--- ---------------------------------------------------------------------------
--- Link interpretables into something we can run
--- ---------------------------------------------------------------------------
-
-GLOBAL_VAR(cafTable, [], [HValue])
-
-addCAF :: HValue -> IO ()
-addCAF x = do xs <- readIORef cafTable; writeIORef cafTable (x:xs)
-
-linkIModules :: ItblEnv    -- incoming global itbl env; returned updated
-            -> ClosureEnv -- incoming global closure env; returned updated
-            -> [([UnlinkedIBind], ItblEnv)]
-            -> IO ([LinkedIBind], ItblEnv, ClosureEnv)
-linkIModules gie gce mods = do
-  let (bindss, ies) = unzip mods
-      binds  = concat bindss
-      top_level_binders = map (getName.binder) binds
-      final_gie = foldr plusFM gie ies
-  
-  (new_binds, new_gce) <-
-    fixIO (\ ~(new_binds, new_gce) -> do
-
-      new_binds <- linkIBinds final_gie new_gce binds
-
-      let new_rhss = map (\b -> evalP (bindee b) emptyUFM) new_binds
-      let new_gce = addListToFM gce (zip top_level_binders new_rhss)
-
-      return (new_binds, new_gce))
-
-  return (new_binds, final_gie, new_gce)
-
-
--- We're supposed to augment the environments with the values of any
--- external functions/info tables we need as we go along, but that's a
--- lot of hassle so for now I'll look up external things as they crop
--- up and not cache them in the source symbol tables.  The interpreted
--- code will still be referenced in the source symbol tables.
-
-linkIBinds :: ItblEnv -> ClosureEnv -> [UnlinkedIBind] -> IO [LinkedIBind]
-linkIBinds ie ce binds = mapM (linkIBind ie ce) binds
-
-linkIBind ie ce (IBind bndr expr)
-   = do expr <- linkIExpr ie ce expr
-       return (IBind bndr expr)
-
-linkIExpr :: ItblEnv -> ClosureEnv -> UnlinkedIExpr -> IO LinkedIExpr
-linkIExpr ie ce expr = case expr of
-
-   CaseAlgP  bndr expr alts dflt -> linkAlgCase ie ce bndr expr alts dflt CaseAlgP
-   CaseAlgI  bndr expr alts dflt -> linkAlgCase ie ce bndr expr alts dflt CaseAlgI
-   CaseAlgF  bndr expr alts dflt -> linkAlgCase ie ce bndr expr alts dflt CaseAlgF
-   CaseAlgD  bndr expr alts dflt -> linkAlgCase ie ce bndr expr alts dflt CaseAlgD
-
-   CasePrimP  bndr expr alts dflt -> linkPrimCase ie ce bndr expr alts dflt CasePrimP
-   CasePrimI  bndr expr alts dflt -> linkPrimCase ie ce bndr expr alts dflt CasePrimI
-   CasePrimF  bndr expr alts dflt -> linkPrimCase ie ce bndr expr alts dflt CasePrimF
-   CasePrimD  bndr expr alts dflt -> linkPrimCase ie ce bndr expr alts dflt CasePrimD
-
-   ConApp con -> lookupNullaryCon ie con
-
-   ConAppI con arg0 -> do
-       con' <- lookupCon ie con
-       arg' <- linkIExpr ie ce arg0
-       return (ConAppI con' arg')
-
-   ConAppP con arg0 -> do
-       con' <- lookupCon ie con
-       arg' <- linkIExpr ie ce arg0
-       return (ConAppP con' arg')
-
-   ConAppPP con arg0 arg1 -> do
-       con' <- lookupCon ie con
-       arg0' <- linkIExpr ie ce arg0
-       arg1' <- linkIExpr ie ce arg1
-       return (ConAppPP con' arg0' arg1')
-
-   ConAppGen con args -> do
-       con <- lookupCon ie con
-       args <- mapM (linkIExpr ie ce) args
-       return (ConAppGen con args)
-   
-   PrimOpI op args -> linkPrimOp ie ce PrimOpI op args
-   PrimOpP op args -> linkPrimOp ie ce PrimOpP op args
-   
-   NonRecP bind expr  -> linkNonRec ie ce NonRecP bind expr
-   NonRecI bind expr  -> linkNonRec ie ce NonRecI bind expr
-   NonRecF bind expr  -> linkNonRec ie ce NonRecF bind expr
-   NonRecD bind expr  -> linkNonRec ie ce NonRecD bind expr
-
-   RecP binds expr  -> linkRec ie ce RecP binds expr
-   RecI binds expr  -> linkRec ie ce RecI binds expr
-   RecF binds expr  -> linkRec ie ce RecF binds expr
-   RecD binds expr  -> linkRec ie ce RecD binds expr
-
-   LitI i -> return (LitI i)
-   LitF i -> return (LitF i)
-   LitD i -> return (LitD i)
-
-   Native var -> lookupNative ce var
-   
-   VarP v -> lookupVar ce VarP v
-   VarI v -> lookupVar ce VarI v
-   VarF v -> lookupVar ce VarF v
-   VarD v -> lookupVar ce VarD v
-   
-   LamPP  bndr expr -> linkLam ie ce LamPP bndr expr
-   LamPI  bndr expr -> linkLam ie ce LamPI bndr expr
-   LamPF  bndr expr -> linkLam ie ce LamPF bndr expr
-   LamPD  bndr expr -> linkLam ie ce LamPD bndr expr
-   LamIP  bndr expr -> linkLam ie ce LamIP bndr expr
-   LamII  bndr expr -> linkLam ie ce LamII bndr expr
-   LamIF  bndr expr -> linkLam ie ce LamIF bndr expr
-   LamID  bndr expr -> linkLam ie ce LamID bndr expr
-   LamFP  bndr expr -> linkLam ie ce LamFP bndr expr
-   LamFI  bndr expr -> linkLam ie ce LamFI bndr expr
-   LamFF  bndr expr -> linkLam ie ce LamFF bndr expr
-   LamFD  bndr expr -> linkLam ie ce LamFD bndr expr
-   LamDP  bndr expr -> linkLam ie ce LamDP bndr expr
-   LamDI  bndr expr -> linkLam ie ce LamDI bndr expr
-   LamDF  bndr expr -> linkLam ie ce LamDF bndr expr
-   LamDD  bndr expr -> linkLam ie ce LamDD bndr expr
-   
-   AppPP  fun arg -> linkApp ie ce AppPP fun arg
-   AppPI  fun arg -> linkApp ie ce AppPI fun arg
-   AppPF  fun arg -> linkApp ie ce AppPF fun arg
-   AppPD  fun arg -> linkApp ie ce AppPD fun arg
-   AppIP  fun arg -> linkApp ie ce AppIP fun arg
-   AppII  fun arg -> linkApp ie ce AppII fun arg
-   AppIF  fun arg -> linkApp ie ce AppIF fun arg
-   AppID  fun arg -> linkApp ie ce AppID fun arg
-   AppFP  fun arg -> linkApp ie ce AppFP fun arg
-   AppFI  fun arg -> linkApp ie ce AppFI fun arg
-   AppFF  fun arg -> linkApp ie ce AppFF fun arg
-   AppFD  fun arg -> linkApp ie ce AppFD fun arg
-   AppDP  fun arg -> linkApp ie ce AppDP fun arg
-   AppDI  fun arg -> linkApp ie ce AppDI fun arg
-   AppDF  fun arg -> linkApp ie ce AppDF fun arg
-   AppDD  fun arg -> linkApp ie ce AppDD fun arg
-   
-linkAlgCase ie ce bndr expr alts dflt con
-   = do expr <- linkIExpr ie ce expr
-       alts <- mapM (linkAlgAlt ie ce) alts
-       dflt <- linkDefault ie ce dflt
-       return (con bndr expr alts dflt)
-
-linkPrimCase ie ce bndr expr alts dflt con
-   = do expr <- linkIExpr ie ce expr
-       alts <- mapM (linkPrimAlt ie ce) alts
-       dflt <- linkDefault ie ce dflt
-       return (con bndr expr alts dflt)
-
-linkAlgAlt ie ce (AltAlg tag args rhs) 
-  = do rhs <- linkIExpr ie ce rhs
-       return (AltAlg tag args rhs)
-
-linkPrimAlt ie ce (AltPrim lit rhs) 
-  = do rhs <- linkIExpr ie ce rhs
-       lit <- linkIExpr ie ce lit
-       return (AltPrim lit rhs)
-
-linkDefault ie ce Nothing = return Nothing
-linkDefault ie ce (Just expr) 
-   = do expr <- linkIExpr ie ce expr
-       return (Just expr)
-
-linkNonRec ie ce con bind expr 
-   = do expr <- linkIExpr ie ce expr
-       bind <- linkIBind ie ce bind
-        return (con bind expr)
-
-linkRec ie ce con binds expr 
-   = do expr <- linkIExpr ie ce expr
-       binds <- linkIBinds ie ce binds
-        return (con binds expr)
-
-linkLam ie ce con bndr expr
-   = do expr <- linkIExpr ie ce expr
-        return (con bndr expr)
-
-linkApp ie ce con fun arg
-   = do fun <- linkIExpr ie ce fun
-        arg <- linkIExpr ie ce arg
-       return (con fun arg)
-
-linkPrimOp ie ce con op args
-   = do args <- mapM (linkIExpr ie ce) args
-       return (con op args)
-
-lookupCon ie con = 
-  case lookupFM ie con of
-    Just (Ptr addr) -> return addr
-    Nothing   -> do
-       -- try looking up in the object files.
-        m <- lookupSymbol (nameToCLabel con "con_info")
-       case m of
-           Just addr -> return addr
-           Nothing   -> pprPanic "linkIExpr" (ppr con)
-
--- nullary constructors don't have normal _con_info tables.
-lookupNullaryCon ie con =
-  case lookupFM ie con of
-    Just (Ptr addr) -> return (ConApp addr)
-    Nothing -> do
-       -- try looking up in the object files.
-       m <- lookupSymbol (nameToCLabel con "closure")
-       case m of
-           Just (A# addr) -> return (Native (unsafeCoerce# addr))
-           Nothing   -> pprPanic "lookupNullaryCon" (ppr con)
-
-
-lookupNative ce var =
-  unsafeInterleaveIO (do
-      case lookupFM ce var of
-       Just e  -> return (Native e)
-       Nothing -> do
-           -- try looking up in the object files.
-           let lbl = (nameToCLabel var "closure")
-           m <- lookupSymbol lbl
-           case m of
-               Just (A# addr)
-                   -> do addCAF (unsafeCoerce# addr)
-                         return (Native (unsafeCoerce# addr))
-               Nothing   -> pprPanic "linkIExpr" (ppr var)
-  )
-
--- some VarI/VarP refer to top-level interpreted functions; we change
--- them into Natives here.
-lookupVar ce f v =
-  unsafeInterleaveIO (
-       case lookupFM ce (getName v) of
-           Nothing -> return (f v)
-           Just e  -> return (Native e)
-  )
-
--- HACK!!!  ToDo: cleaner
-nameToCLabel :: Name -> String{-suffix-} -> String
-nameToCLabel n suffix =
-  _UNPK_(moduleNameFS (rdrNameModule rn)) 
-  ++ '_':occNameString(rdrNameOcc rn) ++ '_':suffix
-  where rn = toRdrName n
-
--- ---------------------------------------------------------------------------
--- The interpreter proper
--- ---------------------------------------------------------------------------
-
--- The dynamic environment contains everything boxed.
--- eval* functions which look up values in it will know the
--- representation of the thing they are looking up, so they
--- can cast/unbox it as necessary.
-
--- ---------------------------------------------------------------------------
--- Evaluator for things of boxed (pointer) representation
--- ---------------------------------------------------------------------------
-
-interp :: LinkedIExpr -> HValue
-interp iexpr = unsafeCoerce# (evalP iexpr emptyUFM)
-
-evalP :: LinkedIExpr -> UniqFM boxed -> boxed
-
-{-
-evalP expr de
---   | trace ("evalP: " ++ showExprTag expr) False
-   | trace ("evalP:\n" ++ showSDoc (pprIExpr expr) ++ "\n") False
-   = error "evalP: ?!?!"
--}
-
-evalP (Native p) de  = unsafeCoerce# p
-
--- First try the dynamic env.  If that fails, assume it's a top-level
--- binding and look in the static env.  That gives an Expr, which we
--- must convert to a boxed thingy by applying evalP to it.  Because
--- top-level bindings are always ptr-rep'd (either lambdas or boxed
--- CAFs), it's always safe to use evalP.
-evalP (VarP v) de 
-   = case lookupUFM de v of
-        Just xx -> xx
-        Nothing -> error ("evalP: lookupUFM " ++ show v)
-
--- Deal with application of a function returning a pointer rep
--- to arguments of any persuasion.  Note that the function itself
--- always has pointer rep.
-evalP (AppIP e1 e2) de  = unsafeCoerce# (evalP e1 de) (evalI e2 de)
-evalP (AppPP e1 e2) de  = unsafeCoerce# (evalP e1 de) (evalP e2 de)
-evalP (AppFP e1 e2) de  = unsafeCoerce# (evalP e1 de) (evalF e2 de)
-evalP (AppDP e1 e2) de  = unsafeCoerce# (evalP e1 de) (evalD e2 de)
-
--- Lambdas always return P-rep, but we need to do different things
--- depending on both the argument and result representations.
-evalP (LamPP x b) de
-   = unsafeCoerce# (\ xP -> evalP b (addToUFM de x xP))
-evalP (LamPI x b) de
-   = unsafeCoerce# (\ xP -> evalI b (addToUFM de x xP))
-evalP (LamPF x b) de
-   = unsafeCoerce# (\ xP -> evalF b (addToUFM de x xP))
-evalP (LamPD x b) de
-   = unsafeCoerce# (\ xP -> evalD b (addToUFM de x xP))
-evalP (LamIP x b) de
-   = unsafeCoerce# (\ xI -> evalP b (addToUFM de x (unsafeCoerce# (I# xI))))
-evalP (LamII x b) de
-   = unsafeCoerce# (\ xI -> evalI b (addToUFM de x (unsafeCoerce# (I# xI))))
-evalP (LamIF x b) de
-   = unsafeCoerce# (\ xI -> evalF b (addToUFM de x (unsafeCoerce# (I# xI))))
-evalP (LamID x b) de
-   = unsafeCoerce# (\ xI -> evalD b (addToUFM de x (unsafeCoerce# (I# xI))))
-evalP (LamFP x b) de
-   = unsafeCoerce# (\ xI -> evalP b (addToUFM de x (unsafeCoerce# (F# xI))))
-evalP (LamFI x b) de
-   = unsafeCoerce# (\ xI -> evalI b (addToUFM de x (unsafeCoerce# (F# xI))))
-evalP (LamFF x b) de
-   = unsafeCoerce# (\ xI -> evalF b (addToUFM de x (unsafeCoerce# (F# xI))))
-evalP (LamFD x b) de
-   = unsafeCoerce# (\ xI -> evalD b (addToUFM de x (unsafeCoerce# (F# xI))))
-evalP (LamDP x b) de
-   = unsafeCoerce# (\ xI -> evalP b (addToUFM de x (unsafeCoerce# (D# xI))))
-evalP (LamDI x b) de
-   = unsafeCoerce# (\ xI -> evalI b (addToUFM de x (unsafeCoerce# (D# xI))))
-evalP (LamDF x b) de
-   = unsafeCoerce# (\ xI -> evalF b (addToUFM de x (unsafeCoerce# (D# xI))))
-evalP (LamDD x b) de
-   = unsafeCoerce# (\ xI -> evalD b (addToUFM de x (unsafeCoerce# (D# xI))))
-
-
--- NonRec, Rec, CaseAlg and CasePrim are the same for all result reps, 
--- except in the sense that we go on and evaluate the body with whichever
--- evaluator was used for the expression as a whole.
-evalP (NonRecP bind e) de
-   = evalP e (augment_nonrec bind de)
-evalP (RecP binds b) de
-   = evalP b (augment_rec binds de)
-evalP (CaseAlgP bndr expr alts def) de
-   = case helper_caseAlg bndr expr alts def de of
-        (rhs, de') -> evalP rhs de'
-evalP (CasePrimP bndr expr alts def) de
-   = case helper_casePrim bndr expr alts def de of
-        (rhs, de') -> evalP rhs de'
-
-evalP (ConApp (A# itbl)) de
-   = mci_make_constr0 itbl
-
-evalP (ConAppI (A# itbl) a1) de
-   = case evalI a1 de of i1 -> mci_make_constrI itbl i1
-
-evalP (ConAppP (A# itbl) a1) de
-   = evalP (ConAppGen (A# itbl) [a1]) de
---   = let p1 = evalP a1 de
---     in  mci_make_constrP itbl p1
-
-evalP (ConAppPP (A# itbl) a1 a2) de
-   = let p1 = evalP a1 de
-         p2 = evalP a2 de
-     in  mci_make_constrPP itbl p1 p2
-
-evalP (ConAppGen itbl args) de
-   = let c = case itbl of A# a# -> mci_make_constr a# in
-     c `seq` loop c 1#{-leave room for hdr-} args
-     where
-        loop :: a{-closure-} -> Int# -> [LinkedIExpr] -> a
-        loop c off [] = c
-        loop c off (a:as)
-           = case repOf a of
-                RepP -> let c' = setPtrOffClosure c off (evalP a de)
-                       in c' `seq` loop c' (off +# 1#) as
-                RepI -> case evalI a de of { i# -> 
-                       let c' = setIntOffClosure c off i#
-                       in c' `seq` loop c' (off +# 1#) as }
-               RepF -> case evalF a de of { f# -> 
-                       let c' = setFloatOffClosure c off f# 
-                       in c' `seq` loop c' (off +# 1#) as }
-               RepD -> case evalD a de of { d# -> 
-                       let c' = setDoubleOffClosure c off d#
-                       in c' `seq` loop c' (off +# 2#) as }
-
-evalP (PrimOpP IntEqOp [e1,e2]) de 
-    = case evalI e1 de of 
-         i1# -> case evalI e2 de of 
-                   i2# -> unsafeCoerce# (i1# ==# i2#)
-
-evalP (PrimOpP primop _) de
-   = error ("evalP: unhandled primop: " ++ showSDoc (ppr primop))
-evalP other de
-   = error ("evalP: unhandled case: " ++ showExprTag other)
-
---------------------------------------------------------
---- Evaluator for things of Int# representation
---------------------------------------------------------
-
--- Evaluate something which has an unboxed Int rep
-evalI :: LinkedIExpr -> UniqFM boxed -> Int#
-
-{-
-evalI expr de
---   | trace ("evalI: " ++ showExprTag expr) False
-   | trace ("evalI:\n" ++ showSDoc (pprIExpr expr) ++ "\n") False
-   = error "evalI: ?!?!"
--}
-
-evalI (LitI i#) de = i#
-
-evalI (VarI v) de = 
-   case lookupUFM de v of
-       Just e  -> case unsafeCoerce# e of I# i -> i
-       Nothing -> error ("evalI: lookupUFM " ++ show v)
-
--- Deal with application of a function returning an Int# rep
--- to arguments of any persuasion.  Note that the function itself
--- always has pointer rep.
-evalI (AppII e1 e2) de 
-   = unsafeCoerce# (evalP e1 de) (evalI e2 de)
-evalI (AppPI e1 e2) de
-   = unsafeCoerce# (evalP e1 de) (evalP e2 de)
-evalI (AppFI e1 e2) de 
-   = unsafeCoerce# (evalP e1 de) (evalF e2 de)
-evalI (AppDI e1 e2) de
-   = unsafeCoerce# (evalP e1 de) (evalD e2 de)
-
--- NonRec, Rec, CaseAlg and CasePrim are the same for all result reps, 
--- except in the sense that we go on and evaluate the body with whichever
--- evaluator was used for the expression as a whole.
-evalI (NonRecI bind b) de
-   = evalI b (augment_nonrec bind de)
-evalI (RecI binds b) de
-   = evalI b (augment_rec binds de)
-evalI (CaseAlgI bndr expr alts def) de
-   = case helper_caseAlg bndr expr alts def de of
-        (rhs, de') -> evalI rhs de'
-evalI (CasePrimI bndr expr alts def) de
-   = case helper_casePrim bndr expr alts def de of
-        (rhs, de') -> evalI rhs de'
-
--- evalI can't be applied to a lambda term, by defn, since those
--- are ptr-rep'd.
-
-evalI (PrimOpI IntAddOp [e1,e2]) de  = evalI e1 de +# evalI e2 de
-evalI (PrimOpI IntSubOp [e1,e2]) de  = evalI e1 de -# evalI e2 de
-evalI (PrimOpI DataToTagOp [e1]) de  = dataToTag# (evalP e1 de)
-
-evalI (PrimOpI primop _) de
-   = error ("evalI: unhandled primop: " ++ showSDoc (ppr primop))
-
---evalI (NonRec (IBind v e) b) de
---   = evalI b (augment de v (eval e de))
-
-evalI other de
-   = error ("evalI: unhandled case: " ++ showExprTag other)
-
---------------------------------------------------------
---- Evaluator for things of Float# representation
---------------------------------------------------------
-
--- Evaluate something which has an unboxed Int rep
-evalF :: LinkedIExpr -> UniqFM boxed -> Float#
-
-{-
-evalF expr de
---   | trace ("evalF: " ++ showExprTag expr) False
-   | trace ("evalF:\n" ++ showSDoc (pprIExpr expr) ++ "\n") False
-   = error "evalF: ?!?!"
--}
-
-evalF (LitF f#) de = f#
-
-evalF (VarF v) de = 
-   case lookupUFM de v of
-       Just e  -> case unsafeCoerce# e of F# i -> i
-       Nothing -> error ("evalF: lookupUFM " ++ show v)
-
--- Deal with application of a function returning an Int# rep
--- to arguments of any persuasion.  Note that the function itself
--- always has pointer rep.
-evalF (AppIF e1 e2) de 
-   = unsafeCoerce# (evalP e1 de) (evalI e2 de)
-evalF (AppPF e1 e2) de
-   = unsafeCoerce# (evalP e1 de) (evalP e2 de)
-evalF (AppFF e1 e2) de 
-   = unsafeCoerce# (evalP e1 de) (evalF e2 de)
-evalF (AppDF e1 e2) de
-   = unsafeCoerce# (evalP e1 de) (evalD e2 de)
-
--- NonRec, Rec, CaseAlg and CasePrim are the same for all result reps, 
--- except in the sense that we go on and evaluate the body with whichever
--- evaluator was used for the expression as a whole.
-evalF (NonRecF bind b) de
-   = evalF b (augment_nonrec bind de)
-evalF (RecF binds b) de
-   = evalF b (augment_rec binds de)
-evalF (CaseAlgF bndr expr alts def) de
-   = case helper_caseAlg bndr expr alts def de of
-        (rhs, de') -> evalF rhs de'
-evalF (CasePrimF bndr expr alts def) de
-   = case helper_casePrim bndr expr alts def de of
-        (rhs, de') -> evalF rhs de'
-
--- evalF can't be applied to a lambda term, by defn, since those
--- are ptr-rep'd.
-
-evalF (PrimOpF op _) de 
-  = error ("evalF: unhandled primop: " ++ showSDoc (ppr op))
-
-evalF other de
-  = error ("evalF: unhandled case: " ++ showExprTag other)
-
---------------------------------------------------------
---- Evaluator for things of Double# representation
---------------------------------------------------------
-
--- Evaluate something which has an unboxed Int rep
-evalD :: LinkedIExpr -> UniqFM boxed -> Double#
-
-{-
-evalD expr de
---   | trace ("evalD: " ++ showExprTag expr) False
-   | trace ("evalD:\n" ++ showSDoc (pprIExpr expr) ++ "\n") False
-   = error "evalD: ?!?!"
--}
-
-evalD (LitD d#) de = d#
-
-evalD (VarD v) de = 
-   case lookupUFM de v of
-       Just e  -> case unsafeCoerce# e of D# i -> i
-       Nothing -> error ("evalD: lookupUFM " ++ show v)
-
--- Deal with application of a function returning an Int# rep
--- to arguments of any persuasion.  Note that the function itself
--- always has pointer rep.
-evalD (AppID e1 e2) de 
-   = unsafeCoerce# (evalP e1 de) (evalI e2 de)
-evalD (AppPD e1 e2) de
-   = unsafeCoerce# (evalP e1 de) (evalP e2 de)
-evalD (AppFD e1 e2) de 
-   = unsafeCoerce# (evalP e1 de) (evalF e2 de)
-evalD (AppDD e1 e2) de
-   = unsafeCoerce# (evalP e1 de) (evalD e2 de)
-
--- NonRec, Rec, CaseAlg and CasePrim are the same for all result reps, 
--- except in the sense that we go on and evaluate the body with whichever
--- evaluator was used for the expression as a whole.
-evalD (NonRecD bind b) de
-   = evalD b (augment_nonrec bind de)
-evalD (RecD binds b) de
-   = evalD b (augment_rec binds de)
-evalD (CaseAlgD bndr expr alts def) de
-   = case helper_caseAlg bndr expr alts def de of
-        (rhs, de') -> evalD rhs de'
-evalD (CasePrimD bndr expr alts def) de
-   = case helper_casePrim bndr expr alts def de of
-        (rhs, de') -> evalD rhs de'
-
--- evalD can't be applied to a lambda term, by defn, since those
--- are ptr-rep'd.
-
-evalD (PrimOpD op _) de
-  = error ("evalD: unhandled primop: " ++ showSDoc (ppr op))
-
-evalD other de 
-  = error ("evalD: unhandled case: " ++ showExprTag other)
-
---------------------------------------------------------
---- Helper bits and pieces
---------------------------------------------------------
-
--- Find the Rep of any Expr
-repOf :: LinkedIExpr -> Rep
-
-repOf (LamPP _ _)      = RepP 
-repOf (LamPI _ _)      = RepP 
-repOf (LamPF _ _)      = RepP 
-repOf (LamPD _ _)      = RepP 
-repOf (LamIP _ _)      = RepP 
-repOf (LamII _ _)      = RepP 
-repOf (LamIF _ _)      = RepP 
-repOf (LamID _ _)      = RepP 
-repOf (LamFP _ _)      = RepP 
-repOf (LamFI _ _)      = RepP 
-repOf (LamFF _ _)      = RepP 
-repOf (LamFD _ _)      = RepP 
-repOf (LamDP _ _)      = RepP 
-repOf (LamDI _ _)      = RepP 
-repOf (LamDF _ _)      = RepP 
-repOf (LamDD _ _)      = RepP 
-
-repOf (AppPP _ _)      = RepP
-repOf (AppPI _ _)      = RepI
-repOf (AppPF _ _)      = RepF
-repOf (AppPD _ _)      = RepD
-repOf (AppIP _ _)      = RepP
-repOf (AppII _ _)      = RepI
-repOf (AppIF _ _)      = RepF
-repOf (AppID _ _)      = RepD
-repOf (AppFP _ _)      = RepP
-repOf (AppFI _ _)      = RepI
-repOf (AppFF _ _)      = RepF
-repOf (AppFD _ _)      = RepD
-repOf (AppDP _ _)      = RepP
-repOf (AppDI _ _)      = RepI
-repOf (AppDF _ _)      = RepF
-repOf (AppDD _ _)      = RepD
-
-repOf (NonRecP _ _)    = RepP
-repOf (NonRecI _ _)    = RepI
-repOf (NonRecF _ _)    = RepF
-repOf (NonRecD _ _)    = RepD
-
-repOf (RecP _ _)       = RepP
-repOf (RecI _ _)       = RepI
-repOf (RecF _ _)       = RepF
-repOf (RecD _ _)       = RepD
-
-repOf (LitI _)         = RepI
-repOf (LitF _)         = RepF
-repOf (LitD _)         = RepD
-
-repOf (Native _)       = RepP
-
-repOf (VarP _)         = RepP
-repOf (VarI _)         = RepI
-repOf (VarF _)         = RepF
-repOf (VarD _)         = RepD
-
-repOf (PrimOpP _ _)    = RepP
-repOf (PrimOpI _ _)    = RepI
-repOf (PrimOpF _ _)    = RepF
-repOf (PrimOpD _ _)    = RepD
-
-repOf (ConApp _)       = RepP
-repOf (ConAppI _ _)    = RepP
-repOf (ConAppP _ _)    = RepP
-repOf (ConAppPP _ _ _) = RepP
-repOf (ConAppGen _ _)  = RepP
-
-repOf (CaseAlgP _ _ _ _) = RepP
-repOf (CaseAlgI _ _ _ _) = RepI
-repOf (CaseAlgF _ _ _ _) = RepF
-repOf (CaseAlgD _ _ _ _) = RepD
-
-repOf (CasePrimP _ _ _ _) = RepP
-repOf (CasePrimI _ _ _ _) = RepI
-repOf (CasePrimF _ _ _ _) = RepF
-repOf (CasePrimD _ _ _ _) = RepD
-
-repOf other         
-   = error ("repOf: unhandled case: " ++ showExprTag other)
-
--- how big (in words) is one of these
-repSizeW :: Rep -> Int
-repSizeW RepI = 1
-repSizeW RepP = 1
-
-
--- Evaluate an expression, using the appropriate evaluator,
--- then box up the result.  Note that it's only safe to use this 
--- to create values to put in the environment.  You can't use it 
--- to create a value which might get passed to native code since that
--- code will have no idea that unboxed things have been boxed.
-eval :: LinkedIExpr -> UniqFM boxed -> boxed
-eval expr de
-   = case repOf expr of
-        RepI -> unsafeCoerce# (I# (evalI expr de))
-        RepP -> evalP expr de
-        RepF -> unsafeCoerce# (F# (evalF expr de))
-        RepD -> unsafeCoerce# (D# (evalD expr de))
-
--- Evaluate the scrutinee of a case, select an alternative,
--- augment the environment appropriately, and return the alt
--- and the augmented environment.
-helper_caseAlg :: Id -> LinkedIExpr -> [LinkedAltAlg] -> Maybe LinkedIExpr 
-                  -> UniqFM boxed
-                  -> (LinkedIExpr, UniqFM boxed)
-helper_caseAlg bndr expr alts def de
-   = let exprEv = evalP expr de
-     in  
-     exprEv `seq` -- vitally important; otherwise exprEv is never eval'd
-     case select_altAlg (tagOf exprEv) alts def of
-        (vars,rhs) -> (rhs, augment_from_constr (addToUFM de bndr exprEv) 
-                                                exprEv (vars,1))
-
-helper_casePrim :: Var -> LinkedIExpr -> [LinkedAltPrim] -> Maybe LinkedIExpr 
-                   -> UniqFM boxed
-                   -> (LinkedIExpr, UniqFM boxed)
-helper_casePrim bndr expr alts def de
-   = case repOf expr of
-        RepI -> case evalI expr de of 
-                   i# -> (select_altPrim alts def (LitI i#), 
-                          addToUFM de bndr (unsafeCoerce# (I# i#)))
-        RepF -> case evalF expr de of 
-                   f# -> (select_altPrim alts def (LitF f#), 
-                          addToUFM de bndr (unsafeCoerce# (F# f#)))
-        RepD -> case evalD expr de of 
-                   d# -> (select_altPrim alts def (LitD d#), 
-                          addToUFM de bndr (unsafeCoerce# (D# d#)))
-
-
-augment_from_constr :: UniqFM boxed -> a -> ([(Id,Rep)],Int) -> UniqFM boxed
-augment_from_constr de con ([],offset) 
-   = de
-augment_from_constr de con ((v,rep):vs,offset)
-   = let v_binding
-            = case rep of
-                 RepP -> indexPtrOffClosure con offset
-                 RepI -> unsafeCoerce# (I# (indexIntOffClosure con offset))
-                 RepF -> unsafeCoerce# (F# (indexFloatOffClosure con offset))
-                 RepD -> unsafeCoerce# (D# (indexDoubleOffClosure con offset))
-     in
-         augment_from_constr (addToUFM de v v_binding) con 
-                             (vs,offset + repSizeW rep)
-
--- Augment the environment for a non-recursive let.
-augment_nonrec :: LinkedIBind -> UniqFM boxed -> UniqFM boxed
-augment_nonrec (IBind v e) de  = addToUFM de v (eval e de)
-
--- Augment the environment for a recursive let.
-augment_rec :: [LinkedIBind] -> UniqFM boxed -> UniqFM boxed
-augment_rec binds de
-   = let vars   = map binder binds
-         rhss   = map bindee binds
-         rhs_vs = map (\rhs -> eval rhs de') rhss
-         de'    = addListToUFM de (zip vars rhs_vs)
-     in
-         de'
-
--- a must be a constructor?
-tagOf :: a -> Int
-tagOf x = I# (dataToTag# x)
-
-select_altAlg :: Int -> [LinkedAltAlg] -> Maybe LinkedIExpr -> ([(Id,Rep)],LinkedIExpr)
-select_altAlg tag [] Nothing = error "select_altAlg: no match and no default?!"
-select_altAlg tag [] (Just def) = ([],def)
-select_altAlg tag ((AltAlg tagNo vars rhs):alts) def
-   = if   tag == tagNo 
-     then (vars,rhs) 
-     else select_altAlg tag alts def
-
--- literal may only be a literal, not an arbitrary expression
-select_altPrim :: [LinkedAltPrim] -> Maybe LinkedIExpr -> LinkedIExpr -> LinkedIExpr
-select_altPrim [] Nothing    literal = error "select_altPrim: no match and no default?!"
-select_altPrim [] (Just def) literal = def
-select_altPrim ((AltPrim lit rhs):alts) def literal
-   = if eqLits lit literal
-     then rhs
-     else select_altPrim alts def literal
-
-eqLits (LitI i1#) (LitI i2#) = i1# ==# i2#
-
--- ----------------------------------------------------------------------
--- Grotty inspection and creation of closures
--- ----------------------------------------------------------------------
-
--- a is a constructor
-indexPtrOffClosure :: a -> Int -> b
-indexPtrOffClosure con (I# offset)
-   = case indexPtrOffClosure# con offset of (# x #) -> x
-
-indexIntOffClosure :: a -> Int -> Int#
-indexIntOffClosure con (I# offset)
-   = case wordToInt (W# (indexWordOffClosure# con offset)) of I# i# -> i#
-
-indexFloatOffClosure :: a -> Int -> Float#
-indexFloatOffClosure con (I# offset)
-   = unsafeCoerce# (indexWordOffClosure# con offset) 
-       -- TOCK TOCK TOCK! Those GHC developers are crazy.
-
-indexDoubleOffClosure :: a -> Int -> Double#
-indexDoubleOffClosure con (I# offset)
-   = unsafeCoerce# (panic "indexDoubleOffClosure")
-
-setPtrOffClosure :: a -> Int# -> b -> a
-setPtrOffClosure a i b = case setPtrOffClosure# a i b of (# c #) -> c
-
-setIntOffClosure :: a -> Int# -> Int# -> a
-setIntOffClosure a i b = case setWordOffClosure# a i (int2Word# b) of (# c #) -> c
-
-setFloatOffClosure :: a -> Int# -> Float# -> a
-setFloatOffClosure a i b = case setWordOffClosure# a i (unsafeCoerce# b) of (# c #) -> c
-
-setDoubleOffClosure :: a -> Int# -> Double# -> a
-setDoubleOffClosure a i b = unsafeCoerce# (panic "setDoubleOffClosure")
-
-------------------------------------------------------------------------
---- Manufacturing of info tables for DataCons defined in this module ---
-------------------------------------------------------------------------
-
-#if __GLASGOW_HASKELL__ <= 408
-type ItblPtr = Addr
-#else
-type ItblPtr = Ptr StgInfoTable
-#endif
-
--- Make info tables for the data decls in this module
-mkITbls :: [TyCon] -> IO ItblEnv
-mkITbls [] = return emptyFM
-mkITbls (tc:tcs) = do itbls  <- mkITbl tc
-                      itbls2 <- mkITbls tcs
-                      return (itbls `plusFM` itbls2)
-
-mkITbl :: TyCon -> IO ItblEnv
-mkITbl tc
---   | trace ("TYCON: " ++ showSDoc (ppr tc)) False
---   = error "?!?!"
-   | not (isDataTyCon tc) 
-   = return emptyFM
-   | n == length dcs  -- paranoia; this is an assertion.
-   = make_constr_itbls dcs
-     where
-        dcs = tyConDataCons tc
-        n   = tyConFamilySize tc
-
-cONSTR :: Int
-cONSTR = 1  -- as defined in ghc/includes/ClosureTypes.h
-
--- Assumes constructors are numbered from zero, not one
-make_constr_itbls :: [DataCon] -> IO ItblEnv
-make_constr_itbls cons
-   | length cons <= 8
-   = do is <- mapM mk_vecret_itbl (zip cons [0..])
-       return (listToFM is)
-   | otherwise
-   = do is <- mapM mk_dirret_itbl (zip cons [0..])
-       return (listToFM is)
-     where
-        mk_vecret_itbl (dcon, conNo)
-           = mk_itbl dcon conNo (vecret_entry conNo)
-        mk_dirret_itbl (dcon, conNo)
-           = mk_itbl dcon conNo mci_constr_entry
-
-        mk_itbl :: DataCon -> Int -> Addr -> IO (Name,ItblPtr)
-        mk_itbl dcon conNo entry_addr
-           = let (tot_wds, ptr_wds, _) 
-                    = mkVirtHeapOffsets typePrimRep (dataConRepArgTys dcon)
-                 ptrs = ptr_wds
-                 nptrs  = tot_wds - ptr_wds
-                 itbl  = StgInfoTable {
-                           ptrs = fromIntegral ptrs, nptrs = fromIntegral nptrs,
-                           tipe = fromIntegral cONSTR,
-                           srtlen = fromIntegral conNo,
-                           code0 = fromIntegral code0, code1 = fromIntegral code1,
-                           code2 = fromIntegral code2, code3 = fromIntegral code3,
-                           code4 = fromIntegral code4, code5 = fromIntegral code5,
-                           code6 = fromIntegral code6, code7 = fromIntegral code7 
-                        }
-                 -- Make a piece of code to jump to "entry_label".
-                 -- This is the only arch-dependent bit.
-                 -- On x86, if entry_label has an address 0xWWXXYYZZ,
-                 -- emit   movl $0xWWXXYYZZ,%eax  ;  jmp *%eax
-                 -- which is
-                 -- B8 ZZ YY XX WW FF E0
-                 (code0,code1,code2,code3,code4,code5,code6,code7)
-                    = (0xB8, byte 0 entry_addr_w, byte 1 entry_addr_w, 
-                             byte 2 entry_addr_w, byte 3 entry_addr_w, 
-                       0xFF, 0xE0, 
-                       0x90 {-nop-})
-
-                 entry_addr_w :: Word32
-                 entry_addr_w = fromIntegral (addrToInt entry_addr)
-             in
-                 do addr <- malloc
-                    --putStrLn ("SIZE of itbl is " ++ show (sizeOf itbl))
-                    --putStrLn ("# ptrs  of itbl is " ++ show ptrs)
-                    --putStrLn ("# nptrs of itbl is " ++ show nptrs)
-                    poke addr itbl
-                    return (getName dcon, addr `plusPtr` 8)
-
-
-byte :: Int -> Word32 -> Word32
-byte 0 w = w .&. 0xFF
-byte 1 w = (w `shiftR` 8) .&. 0xFF
-byte 2 w = (w `shiftR` 16) .&. 0xFF
-byte 3 w = (w `shiftR` 24) .&. 0xFF
-
-
-vecret_entry 0 = mci_constr1_entry
-vecret_entry 1 = mci_constr2_entry
-vecret_entry 2 = mci_constr3_entry
-vecret_entry 3 = mci_constr4_entry
-vecret_entry 4 = mci_constr5_entry
-vecret_entry 5 = mci_constr6_entry
-vecret_entry 6 = mci_constr7_entry
-vecret_entry 7 = mci_constr8_entry
-
--- entry point for direct returns for created constr itbls
-foreign label "stg_mci_constr_entry" mci_constr_entry :: Addr
--- and the 8 vectored ones
-foreign label "stg_mci_constr1_entry" mci_constr1_entry :: Addr
-foreign label "stg_mci_constr2_entry" mci_constr2_entry :: Addr
-foreign label "stg_mci_constr3_entry" mci_constr3_entry :: Addr
-foreign label "stg_mci_constr4_entry" mci_constr4_entry :: Addr
-foreign label "stg_mci_constr5_entry" mci_constr5_entry :: Addr
-foreign label "stg_mci_constr6_entry" mci_constr6_entry :: Addr
-foreign label "stg_mci_constr7_entry" mci_constr7_entry :: Addr
-foreign label "stg_mci_constr8_entry" mci_constr8_entry :: Addr
-
-
-
-data Constructor = Constructor Int{-ptrs-} Int{-nptrs-}
-
-
--- Ultra-minimalist version specially for constructors
-data StgInfoTable = StgInfoTable {
-   ptrs :: Word16,
-   nptrs :: Word16,
-   srtlen :: Word16,
-   tipe :: Word16,
-   code0, code1, code2, code3, code4, code5, code6, code7 :: Word8
-}
-
-
-instance Storable StgInfoTable where
-
-   sizeOf itbl 
-      = (sum . map (\f -> f itbl))
-        [fieldSz ptrs, fieldSz nptrs, fieldSz srtlen, fieldSz tipe,
-         fieldSz code0, fieldSz code1, fieldSz code2, fieldSz code3, 
-         fieldSz code4, fieldSz code5, fieldSz code6, fieldSz code7]
-
-   alignment itbl 
-      = (sum . map (\f -> f itbl))
-        [fieldAl ptrs, fieldAl nptrs, fieldAl srtlen, fieldAl tipe,
-         fieldAl code0, fieldAl code1, fieldAl code2, fieldAl code3, 
-         fieldAl code4, fieldAl code5, fieldAl code6, fieldAl code7]
-
-   poke a0 itbl
-      = do a1 <- store (ptrs   itbl) (castPtr a0)
-           a2 <- store (nptrs  itbl) a1
-           a3 <- store (tipe   itbl) a2
-           a4 <- store (srtlen itbl) a3
-           a5 <- store (code0  itbl) a4
-           a6 <- store (code1  itbl) a5
-           a7 <- store (code2  itbl) a6
-           a8 <- store (code3  itbl) a7
-           a9 <- store (code4  itbl) a8
-           aA <- store (code5  itbl) a9
-           aB <- store (code6  itbl) aA
-           aC <- store (code7  itbl) aB
-           return ()
-
-   peek a0
-      = do (a1,ptrs)   <- load (castPtr a0)
-           (a2,nptrs)  <- load a1
-           (a3,tipe)   <- load a2
-           (a4,srtlen) <- load a3
-           (a5,code0)  <- load a4
-           (a6,code1)  <- load a5
-           (a7,code2)  <- load a6
-           (a8,code3)  <- load a7
-           (a9,code4)  <- load a8
-           (aA,code5)  <- load a9
-           (aB,code6)  <- load aA
-           (aC,code7)  <- load aB
-           return StgInfoTable { ptrs = ptrs, nptrs = nptrs, 
-                                 srtlen = srtlen, tipe = tipe,
-                                 code0 = code0, code1 = code1, code2 = code2,
-                                 code3 = code3, code4 = code4, code5 = code5,
-                                 code6 = code6, code7 = code7 }
-
-fieldSz :: (Storable a, Storable b) => (a -> b) -> a -> Int
-fieldSz sel x = sizeOf (sel x)
-
-fieldAl :: (Storable a, Storable b) => (a -> b) -> a -> Int
-fieldAl sel x = alignment (sel x)
-
-store :: Storable a => a -> Ptr a -> IO (Ptr b)
-store x addr = do poke addr x
-                  return (castPtr (addr `plusPtr` sizeOf x))
-
-load :: Storable a => Ptr a -> IO (Ptr b, a)
-load addr = do x <- peek addr
-               return (castPtr (addr `plusPtr` sizeOf x), x)
-
------------------------------------------------------------------------------q
-
-foreign import "strncpy" strncpy :: Ptr a -> ByteArray# -> CInt -> IO ()
-#endif
-
-\end{code}
-
index 55082a7..1733d63 100644 (file)
@@ -1,5 +1,5 @@
 -----------------------------------------------------------------------------
--- $Id: DriverPipeline.hs,v 1.41 2000/12/12 14:35:08 simonmar Exp $
+-- $Id: DriverPipeline.hs,v 1.42 2000/12/18 12:43:04 sewardj Exp $
 --
 -- GHC Driver
 --
@@ -827,8 +827,8 @@ compile ghci_mode summary source_unchanged old_iface hst hit pcs = do
                -- as our "unlinked" object.
                HscInterpreted -> 
                    case maybe_interpreted_code of
-                      Just (code,itbl_env) -> do tm <- getClockTime 
-                                                  return ([Trees code itbl_env], tm)
+                      Just (bcos,itbl_env) -> do tm <- getClockTime 
+                                                  return ([BCOs bcos itbl_env], tm)
                       Nothing -> panic "compile: no interpreted code"
 
                -- we're in batch mode: finish the compilation pipeline.
index 9c01b76..a20ad02 100644 (file)
@@ -15,7 +15,6 @@ module HscMain ( HscResult(..), hscMain,
 #ifdef GHCI
 import RdrHsSyn                ( RdrNameHsExpr )
 import Rename          ( renameExpr )
-import CoreToStg       ( coreExprToStg )
 import StringBuffer    ( stringToStringBuffer, freeStringBuffer )
 import Unique          ( Uniquable(..) )
 import Type            ( Type, splitTyConApp_maybe )
@@ -72,7 +71,6 @@ import Module         ( Module, lookupModuleEnvByName )
 import Monad           ( when )
 import Maybe           ( isJust )
 import IO
-import List            ( intersperse )
 \end{code}
 
 
@@ -96,7 +94,7 @@ data HscResult
                  ModIface               -- new iface (if any compilation was done)
                 (Maybe String)          -- generated stub_h filename (in /tmp)
                 (Maybe String)          -- generated stub_c filename (in /tmp)
-                (Maybe ([UnlinkedIBind],ItblEnv)) -- interpreted code, if any
+                (Maybe ([UnlinkedBCO],ItblEnv)) -- interpreted code, if any
              
 
        -- no errors or warnings; the individual passes
@@ -236,24 +234,18 @@ hscRecomp ghci_mode dflags location maybe_checked_iface hst hit pcs_ch
                                       maybe_checked_iface new_iface new_details
 
            -------------------
-           -- CONVERT TO STG
+           -- CONVERT TO STG and COMPLETE CODE GENERATION
            -------------------
-       ; (stg_binds, cost_centre_info) 
-               <- myCoreToStg dflags this_mod tidy_binds env_tc
-
-           -------------------
-           -- COMPLETE CODE GENERATION
-           -------------------
-       ; (maybe_stub_h_filename, maybe_stub_c_filename, maybe_ibinds)
+       ; (maybe_stub_h_filename, maybe_stub_c_filename, maybe_bcos)
             <- restOfCodeGeneration dflags toInterp this_mod
                   (map ideclName (hsModuleImports rdr_module))
-                  cost_centre_info foreign_stuff env_tc stg_binds tidy_binds
+                  foreign_stuff env_tc tidy_binds
                   hit (pcs_PIT pcs_simpl)       
 
          -- and the answer is ...
        ; return (HscRecomp pcs_simpl new_details final_iface
                             maybe_stub_h_filename maybe_stub_c_filename
-                           maybe_ibinds)
+                           maybe_bcos)
          }}}}}}}
 
 
@@ -313,7 +305,7 @@ simplThenTidy dflags pcs hst this_mod is_exported binds rules
          <- core2core dflags pcs hst is_exported binds rules
 
       -- Do saturation and convert to A-normal form
-      --    NOTE: future passes cannot transform the syntax, only annotate it
+      -- NOTE: subsequent passes may not transform the syntax, only annotate it
       saturated <- coreSatPgm dflags simplified
 
       -- Do the final tidy-up
@@ -323,17 +315,21 @@ simplThenTidy dflags pcs hst this_mod is_exported binds rules
       return (pcs', tidy_binds, tidy_orphan_rules)
 
 
-restOfCodeGeneration dflags toInterp this_mod imported_module_names cost_centre_info 
-                     foreign_stuff env_tc stg_binds tidy_binds
+restOfCodeGeneration dflags toInterp this_mod imported_module_names
+                     foreign_stuff env_tc tidy_binds
                      hit pit -- these last two for mapping ModNames to Modules
  | toInterp
- = do (ibinds,itbl_env) 
-         <- stgBindsToInterpSyn dflags (map fst stg_binds) 
-               local_tycons local_classes
-      return (Nothing, Nothing, Just (ibinds,itbl_env))
+ = do (bcos,itbl_env) 
+         <- byteCodeGen dflags tidy_binds local_tycons local_classes
+      return (Nothing, Nothing, Just (bcos,itbl_env))
 
  | otherwise
- = do --------------------------  Code generation -------------------------------
+ = do
+      --------------------------  Convert to STG -------------------------------
+      (stg_binds, cost_centre_info) 
+               <- myCoreToStg dflags this_mod tidy_binds env_tc
+
+      --------------------------  Code generation -------------------------------
       -- _scc_     "CodeGen"
       abstractC <- codeGen dflags this_mod imported_modules
                            cost_centre_info fe_binders
@@ -403,7 +399,7 @@ hscExpr
   -> Module                    -- Context for compiling
   -> String                    -- The expression
   -> IO ( PersistentCompilerState, 
-         Maybe (UnlinkedIExpr, PrintUnqualified, Type) )
+         Maybe (UnlinkedBCOExpr, PrintUnqualified, Type) )
 
 hscExpr dflags hst hit pcs0 this_module expr
    = do {
@@ -439,8 +435,8 @@ hscExpr dflags hst hit pcs0 this_module expr
                                ("print (" ++ expr ++ ")")
                        case maybe_stuff of
                           Nothing -> return (new_pcs, maybe_stuff)
-                          Just (expr, _, _) ->
-                             return (new_pcs, Just (expr, print_unqual, ty))
+                          Just (bcos, _, _) ->
+                             return (new_pcs, Just (bcos, print_unqual, ty))
                else do
 
                -- Desugar it
@@ -453,15 +449,12 @@ hscExpr dflags hst hit pcs0 this_module expr
                -- Saturate it
        sat_expr <- coreSatExpr dflags simpl_expr;
 
-               -- Convert to STG
-       let stg_expr = coreExprToStg sat_expr;
-
                -- ToDo: need to do SRTs?
 
-               -- Convert to InterpSyn
-       unlinked_iexpr <- stgExprToInterpSyn dflags stg_expr;
+               -- Convert to BCOs
+       bcos <- coreExprToBCOs dflags sat_expr
 
-       return (pcs2, Just (unlinked_iexpr, print_unqual, ty));
+       return (pcs2, Just (bcos, print_unqual, ty));
      }}}}
 
 hscParseExpr :: DynFlags -> String -> IO (Maybe RdrNameHsExpr)
index 2945115..8ecb257 100644 (file)
@@ -1,5 +1,5 @@
 -----------------------------------------------------------------------------
--- $Id: Interpreter.hs,v 1.8 2000/11/20 16:28:29 simonmar Exp $
+-- $Id: Interpreter.hs,v 1.9 2000/12/18 12:43:04 sewardj Exp $
 --
 -- Interpreter subsystem wrapper
 --
@@ -9,8 +9,7 @@
 
 module Interpreter (
 #ifdef GHCI
-       module StgInterp,
-       module InterpSyn,
+       module ByteCodeGen,
        module Linker
 #else
     ClosureEnv, emptyClosureEnv, 
@@ -29,8 +28,7 @@ module Interpreter (
 --     YES!  We have an interpreter
 ---------------------------------------------
 
-import StgInterp
-import InterpSyn
+import ByteCodeGen
 import Linker
 
 #else