diff options
author | Luite Stegeman <stegeman@gmail.com> | 2021-01-22 00:09:17 +0100 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2021-03-20 07:49:15 -0400 |
commit | 1f94e0f7601f8e22fdd81a47f130650265a44196 (patch) | |
tree | d06d02317049b56763b2f1da27f71f3663efa5a0 /compiler/GHC/Driver | |
parent | 7de3532f0317032f75b76150c5d3a6f76178be04 (diff) | |
download | haskell-1f94e0f7601f8e22fdd81a47f130650265a44196.tar.gz |
Generate GHCi bytecode from STG instead of Core and support unboxed
tuples and sums.
fixes #1257
Diffstat (limited to 'compiler/GHC/Driver')
-rw-r--r-- | compiler/GHC/Driver/Backend.hs | 6 | ||||
-rw-r--r-- | compiler/GHC/Driver/Main.hs | 72 | ||||
-rw-r--r-- | compiler/GHC/Driver/Make.hs | 30 |
3 files changed, 67 insertions, 41 deletions
diff --git a/compiler/GHC/Driver/Backend.hs b/compiler/GHC/Driver/Backend.hs index 845a5f36c0..39789607d9 100644 --- a/compiler/GHC/Driver/Backend.hs +++ b/compiler/GHC/Driver/Backend.hs @@ -67,10 +67,10 @@ data Backend -- Produce ByteCode objects (BCO, see "GHC.ByteCode") that -- can be interpreted. It is used by GHCi. -- - -- Currently some extensions are not supported (unboxed - -- tuples/sums, foreign primops). + -- Currently some extensions are not supported + -- (foreign primops). -- - -- See "GHC.CoreToByteCode" + -- See "GHC.StgToByteCode" | NoBackend -- ^ No code generated. diff --git a/compiler/GHC/Driver/Main.hs b/compiler/GHC/Driver/Main.hs index a910cdf23f..50e5a0a067 100644 --- a/compiler/GHC/Driver/Main.hs +++ b/compiler/GHC/Driver/Main.hs @@ -114,7 +114,7 @@ import GHC.Hs.Stats ( ppSourceStats ) import GHC.HsToCore -import GHC.CoreToByteCode ( byteCodeGen, coreExprToBCOs ) +import GHC.StgToByteCode ( byteCodeGen, stgExprToBCOs ) import GHC.IfaceToCore ( typecheckIface ) @@ -132,6 +132,8 @@ import GHC.Core import GHC.Core.Tidy ( tidyExpr ) import GHC.Core.Type ( Type, Kind ) import GHC.Core.Lint ( lintInteractiveExpr ) +import GHC.Core.Multiplicity +import GHC.Core.Utils ( exprType ) import GHC.Core.ConLike import GHC.Core.Opt.Pipeline import GHC.Core.TyCon @@ -156,6 +158,7 @@ import GHC.Stg.Pipeline ( stg2stg ) import GHC.Builtin.Utils import GHC.Builtin.Names +import GHC.Builtin.Uniques ( mkPseudoUniqueE ) import qualified GHC.StgToCmm as StgToCmm ( codeGen ) import GHC.StgToCmm.Types (CgInfos (..), ModuleLFInfos) @@ -1551,7 +1554,7 @@ hscGenHardCode hsc_env cgguts location output_filename = do withTiming logger dflags (text "CoreToStg"<+>brackets (ppr this_mod)) (\(a, b, (c,d)) -> a `seqList` b `seq` c `seqList` d `seqList` ()) - (myCoreToStg logger dflags this_mod location prepd_binds) + (myCoreToStg logger dflags (hsc_IC hsc_env) this_mod location prepd_binds) let cost_centre_info = (S.toList local_ccs ++ caf_ccs, caf_cc_stacks) @@ -1622,8 +1625,12 @@ hscInteractive hsc_env cgguts location = do -- Do saturation and convert to A-normal form (prepd_binds, _) <- {-# SCC "CorePrep" #-} corePrepPgm hsc_env this_mod location core_binds data_tycons + + (stg_binds, _infotable_prov, _caf_ccs__caf_cc_stacks) + <- {-# SCC "CoreToStg" #-} + myCoreToStg logger dflags (hsc_IC hsc_env) this_mod location prepd_binds ----------------- Generate byte code ------------------ - comp_bc <- byteCodeGen hsc_env this_mod prepd_binds data_tycons mod_breaks + comp_bc <- byteCodeGen hsc_env this_mod stg_binds data_tycons mod_breaks ------------------ Create f-x-dynamic C-side stuff ----- (_istub_h_exists, istub_c_exists) <- outputForeignStubs logger tmpfs dflags (hsc_units hsc_env) this_mod location foreign_stubs @@ -1760,22 +1767,43 @@ doCodeGen hsc_env this_mod denv data_tycons return (Stream.mapM dump2 pipeline_stream) -myCoreToStg :: Logger -> DynFlags -> Module -> ModLocation -> CoreProgram +myCoreToStgExpr :: Logger -> DynFlags -> InteractiveContext + -> Module -> ModLocation -> CoreExpr + -> IO ( StgRhs + , InfoTableProvMap + , CollectedCCs ) +myCoreToStgExpr logger dflags ictxt this_mod ml prepd_expr = do + {- Create a temporary binding (just because myCoreToStg needs a + binding for the stg2stg step) -} + let bco_tmp_id = mkSysLocal (fsLit "BCO_toplevel") + (mkPseudoUniqueE 0) + Many + (exprType prepd_expr) + ([StgTopLifted (StgNonRec _ stg_expr)], prov_map, collected_ccs) <- + myCoreToStg logger + dflags + ictxt + this_mod + ml + [NonRec bco_tmp_id prepd_expr] + return (stg_expr, prov_map, collected_ccs) + +myCoreToStg :: Logger -> DynFlags -> InteractiveContext + -> Module -> ModLocation -> CoreProgram -> IO ( [StgTopBinding] -- output program , InfoTableProvMap , CollectedCCs ) -- CAF cost centre info (declared and used) -myCoreToStg logger dflags this_mod ml prepd_binds = do +myCoreToStg logger dflags ictxt this_mod ml prepd_binds = do let (stg_binds, denv, cost_centre_info) = {-# SCC "Core2Stg" #-} coreToStg dflags this_mod ml prepd_binds stg_binds2 <- {-# SCC "Stg2Stg" #-} - stg2stg logger dflags this_mod stg_binds + stg2stg logger dflags ictxt this_mod stg_binds return (stg_binds2, denv, cost_centre_info) - {- ********************************************************************** %* * \subsection{Compiling a do-statement} @@ -1911,9 +1939,18 @@ hscParsedDecls hsc_env decls = runInteractiveHsc hsc_env $ do (prepd_binds, _) <- {-# SCC "CorePrep" #-} liftIO $ corePrepPgm hsc_env this_mod iNTERACTIVELoc core_binds data_tycons + (stg_binds, _infotable_prov, _caf_ccs__caf_cc_stacks) + <- {-# SCC "CoreToStg" #-} + liftIO $ myCoreToStg (hsc_logger hsc_env) + (hsc_dflags hsc_env) + (hsc_IC hsc_env) + this_mod + iNTERACTIVELoc + prepd_binds + {- Generate byte code -} cbc <- liftIO $ byteCodeGen hsc_env this_mod - prepd_binds data_tycons mod_breaks + stg_binds data_tycons mod_breaks let src_span = srcLocSpan interactiveSrcLoc liftIO $ loadDecls hsc_env src_span cbc @@ -2077,10 +2114,25 @@ hscCompileCoreExpr' hsc_env srcspan ds_expr {- Lint if necessary -} ; lintInteractiveExpr (text "hscCompileExpr") hsc_env prepd_expr + ; let iNTERACTIVELoc = ModLocation{ ml_hs_file = Nothing, + ml_hi_file = panic "hscCompileCoreExpr':ml_hi_file", + ml_obj_file = panic "hscCompileCoreExpr':ml_obj_file", + ml_hie_file = panic "hscCompileCoreExpr':ml_hie_file" } + + ; let ictxt = hsc_IC hsc_env + ; (stg_expr, _, _) <- + myCoreToStgExpr (hsc_logger hsc_env) + (hsc_dflags hsc_env) + ictxt + (icInteractiveModule ictxt) + iNTERACTIVELoc + prepd_expr {- Convert to BCOs -} - ; bcos <- coreExprToBCOs hsc_env - (icInteractiveModule (hsc_IC hsc_env)) prepd_expr + ; bcos <- stgExprToBCOs hsc_env + (icInteractiveModule ictxt) + (exprType prepd_expr) + stg_expr {- load it -} ; loadExpr hsc_env srcspan bcos } diff --git a/compiler/GHC/Driver/Make.hs b/compiler/GHC/Driver/Make.hs index bd885d9042..20fb7ecc86 100644 --- a/compiler/GHC/Driver/Make.hs +++ b/compiler/GHC/Driver/Make.hs @@ -2267,7 +2267,6 @@ downsweep hsc_env old_summaries excl_mods allow_dup_roots let tmpfs = hsc_tmpfs hsc_env map1 <- case backend dflags of NoBackend -> enableCodeGenForTH logger tmpfs home_unit default_backend map0 - Interpreter -> enableCodeGenForUnboxedTuplesOrSums logger tmpfs default_backend map0 _ -> return map0 if null errs then pure $ concat $ modNodeMapElems map1 @@ -2377,33 +2376,8 @@ enableCodeGenForTH logger tmpfs home_unit = -- can't compile anything anyway! See #16219. isHomeUnitDefinite home_unit --- | Update the every ModSummary that is depended on --- by a module that needs unboxed tuples. We enable codegen to --- the specified target, disable optimization and change the .hi --- and .o file locations to be temporary files. --- --- This is used in order to load code that uses unboxed tuples --- or sums into GHCi while still allowing some code to be interpreted. -enableCodeGenForUnboxedTuplesOrSums - :: Logger - -> TmpFs - -> Backend - -> ModNodeMap [Either ErrorMessages ExtendedModSummary] - -> IO (ModNodeMap [Either ErrorMessages ExtendedModSummary]) -enableCodeGenForUnboxedTuplesOrSums logger tmpfs = - enableCodeGenWhen logger tmpfs condition should_modify TFL_GhcSession TFL_CurrentModule - where - condition ms = - unboxed_tuples_or_sums (ms_hspp_opts ms) && - not (gopt Opt_ByteCode (ms_hspp_opts ms)) && - (isBootSummary ms == NotBoot) - unboxed_tuples_or_sums d = - xopt LangExt.UnboxedTuples d || xopt LangExt.UnboxedSums d - should_modify (ModSummary { ms_hspp_opts = dflags }) = - backend dflags == Interpreter - --- | Helper used to implement 'enableCodeGenForTH' and --- 'enableCodeGenForUnboxedTuples'. In particular, this enables +-- | Helper used to implement 'enableCodeGenForTH'. +-- In particular, this enables -- unoptimized code generation for all modules that meet some -- condition (first parameter), or are dependencies of those -- modules. The second parameter is a condition to check before |