Add RdrEnv to vectorisation state
[ghc-hetmet.git] / compiler / vectorise / VectMonad.hs
index 1beb550..56efb2b 100644 (file)
@@ -21,6 +21,7 @@ module VectMonad (
   lookupVar, defGlobalVar,
   lookupTyCon, defTyCon,
   lookupDataCon, defDataCon,
+  lookupTyConPA, defTyConPA,
   lookupTyVarPA, defLocalTyVar, defLocalTyVarWithPA, localTyVars,
 
   lookupInst, lookupFamInst
@@ -41,6 +42,7 @@ import OccName
 import Name
 import NameEnv
 import TysPrim       ( intPrimTy )
+import RdrName
 
 import DsMonad
 import PrelNames
@@ -131,6 +133,10 @@ data GlobalEnv = GlobalEnv {
                   --
                 , global_datacons :: NameEnv DataCon
 
+                  -- Mapping from TyCons to their PA dfuns
+                  --
+                , global_pa_funs :: NameEnv Var
+
                 -- External package inst-env & home-package inst-env for class
                 -- instances
                 --
@@ -143,6 +149,10 @@ data GlobalEnv = GlobalEnv {
 
                 -- Hoisted bindings
                 , global_bindings :: [(Var, CoreExpr)]
+
+                  -- Global Rdr environment (from ModGuts)
+                  --
+                , global_rdr_env :: GlobalRdrEnv
                 }
 
 data LocalEnv = LocalEnv {
@@ -163,8 +173,9 @@ data LocalEnv = LocalEnv {
                }
               
 
-initGlobalEnv :: VectInfo -> (InstEnv, InstEnv) -> FamInstEnvs -> Builtins -> GlobalEnv
-initGlobalEnv info instEnvs famInstEnvs bi
+initGlobalEnv :: VectInfo -> (InstEnv, InstEnv) -> FamInstEnvs -> Builtins -> GlobalRdrEnv
+              -> GlobalEnv
+initGlobalEnv info instEnvs famInstEnvs bi rdr_env
   = GlobalEnv {
       global_vars          = mapVarEnv snd $ vectInfoVar info
     , global_exported_vars = emptyVarEnv
@@ -172,9 +183,11 @@ initGlobalEnv info instEnvs famInstEnvs bi
                                            (tyConName funTyCon) (closureTyCon bi)
                               
     , global_datacons      = mapNameEnv snd $ vectInfoDataCon info
+    , global_pa_funs       = mapNameEnv snd $ vectInfoPADFun info
     , global_inst_env      = instEnvs
     , global_fam_inst_env  = famInstEnvs
     , global_bindings      = []
+    , global_rdr_env       = rdr_env
     }
 
 setInstEnvs :: InstEnv -> FamInstEnv -> GlobalEnv -> GlobalEnv
@@ -198,6 +211,7 @@ updVectInfo env tyenv info
       vectInfoVar     = global_exported_vars env
     , vectInfoTyCon   = mk_env typeEnvTyCons global_tycons
     , vectInfoDataCon = mk_env typeEnvDataCons global_datacons
+    , vectInfoPADFun  = mk_env typeEnvTyCons global_pa_funs
     }
   where
     mk_env from_tyenv from_env = mkNameEnv [(name, (from,to))
@@ -377,6 +391,13 @@ defDataCon :: DataCon -> DataCon -> VM ()
 defDataCon dc dc' = updGEnv $ \env ->
   env { global_datacons = extendNameEnv (global_datacons env) (dataConName dc) dc' }
 
+lookupTyConPA :: TyCon -> VM (Maybe Var)
+lookupTyConPA tc = readGEnv $ \env -> lookupNameEnv (global_pa_funs env) (tyConName tc)
+
+defTyConPA :: TyCon -> Var -> VM ()
+defTyConPA tc pa = updGEnv $ \env ->
+  env { global_pa_funs = extendNameEnv (global_pa_funs env) (tyConName tc) pa }
+
 lookupTyVarPA :: Var -> VM (Maybe CoreExpr)
 lookupTyVarPA tv = readLEnv $ \env -> lookupVarEnv (local_tyvar_pa env) tv 
 
@@ -465,7 +486,11 @@ initV hsc_env guts info p
     go instEnvs famInstEnvs = 
       do
         builtins <- initBuiltins
-        r <- runVM p builtins (initGlobalEnv info instEnvs famInstEnvs builtins) 
+        r <- runVM p builtins (initGlobalEnv info
+                                             instEnvs
+                                             famInstEnvs
+                                             builtins
+                                             (mg_rdr_env guts))
                    emptyLocalEnv
         case r of
           Yes genv _ x -> return $ Just (new_info genv, x)