diff options
author | Sylvain Henry <sylvain@haskus.fr> | 2021-03-15 18:19:16 +0100 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2021-03-23 13:01:15 -0400 |
commit | 05c5c0549bee022be84344cef46f0eded5564c3b (patch) | |
tree | 1c50af925a1993c602b78c96155126b65c477af7 /compiler/GHC/StgToByteCode.hs | |
parent | 7a6577513633b943202fc82ab7aa162e1d293c0a (diff) | |
download | haskell-05c5c0549bee022be84344cef46f0eded5564c3b.tar.gz |
Move loader state into Interp
The loader state was stored into HscEnv. As we need to have two
interpreters and one loader state per interpreter in #14335, it's
natural to make the loader state a field of the Interp type.
As a side effect, many functions now only require a Interp parameter
instead of HscEnv. Sadly we can't fully free GHC.Linker.Loader of HscEnv
yet because the loader is initialised lazily from the HscEnv the first
time it is used. This is left as future work.
HscEnv may not contain an Interp value (i.e. hsc_interp :: Maybe Interp).
So a side effect of the previous side effect is that callers of the
modified functions now have to provide an Interp. It is satisfying as it
pushes upstream the handling of the case where HscEnv doesn't contain an
Interpreter. It is better than raising a panic (less partial functions,
"parse, don't validate", etc.).
Diffstat (limited to 'compiler/GHC/StgToByteCode.hs')
-rw-r--r-- | compiler/GHC/StgToByteCode.hs | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/compiler/GHC/StgToByteCode.hs b/compiler/GHC/StgToByteCode.hs index e14de72eb5..b2743ece43 100644 --- a/compiler/GHC/StgToByteCode.hs +++ b/compiler/GHC/StgToByteCode.hs @@ -117,7 +117,7 @@ byteCodeGen hsc_env this_mod binds tycs mb_modBreaks StgTopStringLit b str -> [Left (b, str)] flattenBind (StgNonRec b e) = [(b,e)] flattenBind (StgRec bs) = bs - stringPtrs <- allocateTopStrings hsc_env strings + stringPtrs <- allocateTopStrings interp strings us <- mkSplitUniqSupply 'y' (BcM_State{..}, proto_bcos) <- @@ -134,7 +134,7 @@ byteCodeGen hsc_env this_mod binds tycs mb_modBreaks "Proto-BCOs" FormatByteCode (vcat (intersperse (char ' ') (map ppr proto_bcos))) - cbc <- assembleBCOs hsc_env proto_bcos tycs (map snd stringPtrs) + cbc <- assembleBCOs interp profile proto_bcos tycs (map snd stringPtrs) (case modBreaks of Nothing -> Nothing Just mb -> Just mb{ modBreaks_breakInfo = breakInfo }) @@ -151,14 +151,16 @@ byteCodeGen hsc_env this_mod binds tycs mb_modBreaks where dflags = hsc_dflags hsc_env logger = hsc_logger hsc_env + interp = hscInterp hsc_env + profile = targetProfile dflags allocateTopStrings - :: HscEnv + :: Interp -> [(Id, ByteString)] -> IO [(Var, RemotePtr ())] -allocateTopStrings hsc_env topStrings = do +allocateTopStrings interp topStrings = do let !(bndrs, strings) = unzip topStrings - ptrs <- iservCmd hsc_env $ MallocStrings strings + ptrs <- interpCmd interp $ MallocStrings strings return $ zip bndrs ptrs {- @@ -169,7 +171,7 @@ literals: 1. Top-level string literal bindings are separated from the rest of the module. -2. The strings are allocated via iservCmd, in allocateTopStrings +2. The strings are allocated via interpCmd, in allocateTopStrings 3. The mapping from binders to allocated strings (topStrings) are maintained in BcM and used when generating code for variable references. @@ -207,9 +209,11 @@ stgExprToBCOs hsc_env this_mod expr_ty expr dumpIfSet_dyn logger dflags Opt_D_dump_BCOs "Proto-BCOs" FormatByteCode (ppr proto_bco) - assembleOneBCO hsc_env proto_bco + assembleOneBCO interp profile proto_bco where dflags = hsc_dflags hsc_env logger = hsc_logger hsc_env + profile = targetProfile dflags + interp = hscInterp hsc_env -- we need an otherwise unused Id for bytecode generation dummy_id = mkSysLocal (fsLit "BCO_toplevel") (mkPseudoUniqueE 0) @@ -1601,8 +1605,8 @@ generateCCall d0 s p (CCallSpec target cconv safety) result_ty args_r_to_l let ffires = primRepToFFIType platform r_rep ffiargs = map (primRepToFFIType platform) a_reps - hsc_env <- getHscEnv - token <- ioToBc $ iservCmd hsc_env (PrepFFI conv ffiargs ffires) + interp <- hscInterp <$> getHscEnv + token <- ioToBc $ interpCmd interp (PrepFFI conv ffiargs ffires) recordFFIBc token let |