diff options
author | Thomas Schilling <nominolo@googlemail.com> | 2008-11-25 15:32:01 +0000 |
---|---|---|
committer | Thomas Schilling <nominolo@googlemail.com> | 2008-11-25 15:32:01 +0000 |
commit | e06951a75a1f519e8f015880c363a8dedc08ff9c (patch) | |
tree | d1ab226ca277e7b169869452ba42156b2de4a306 /compiler/main/DriverPipeline.hs | |
parent | 524207589f410be34a7eec942e112739eb1519f8 (diff) | |
download | haskell-e06951a75a1f519e8f015880c363a8dedc08ff9c.tar.gz |
Major clean-up of HscMain.
This patch entails a major restructuring of HscMain and a small bugfix
to MkIface (which required the restructuring in HscMain).
In MkIface:
- mkIface* no longer outputs orphan warnings directly and also no
longer quits GHC when -Werror is set. Instead, errors are
reported using the common IO (Messages, Maybe result) scheme.
In HscMain:
- Get rid of the 'Comp' monad. This monad was mostly GhcMonad + two
reader arguments, a ModSummary for the currently compiled module
and a possible old interface. The latter actually lead to a small
space-leak since only its hash was needed (to check whether the
newly-generated interface file was the same as the original one).
Functions originally of type 'Comp' now only take the arguments
that they actually need. This leads to slighly longer argument
lists in some places, however, it is now much easier to see what
is actually going on.
- Get rid of 'myParseModule'. Rename 'parseFile' to 'hscParse'.
- Join 'deSugarModule' and 'hscDesugar' (keeping the latter).
- Rename 'typecheck{Rename}Module{'}' to 'hscTypecheck{Rename}'.
One variant keeps the renamed syntax, the other doesn't.
- Parameterise 'HscStatus', so that 'InteractiveStatus' is just a
different parameterisation of 'HscStatus'.
- 'hscCompile{OneShot,Batch,Nothing,Interactive}' are now
implemented using a (local) typeclass called 'HsCompiler'. The
idea is to make the common structure more obvious. Using this
typeclass we now have two functions 'genericHscCompile' (original
'hscCompiler') and 'genericHscRecompile' (original 'genComp')
describing the default pipeline. The methods of the typeclass
describe a sort of "hook" interface (in OO-terms this would be
called the "template method" pattern).
One problem with this approach is that we parameterise over the
/result/ type which, in fact, is not actually different for
"nothing" and "batch" mode. To avoid functional dependencies or
associated types, we use type tags to make them artificially
different and parameterise the type class over the result type.
A perhaps better approach might be to use records instead.
- Drop some redundant 'HscEnv' arguments. These were likely
different from what 'getSession' would return because during
compilation we temporarily set the module's DynFlags as well as a
few other fields. We now use the 'withTempSession' combinator to
temporarily change the 'HscEnv' and automatically restore the
original session after the enclosed action has returned (even in
case of exceptions).
- Rename 'hscCompile' to 'hscGenHardCode' (since that is what it
does).
Calls in 'GHC' and 'DriverPipeline' accordingly needed small
adaptions.
Diffstat (limited to 'compiler/main/DriverPipeline.hs')
-rw-r--r-- | compiler/main/DriverPipeline.hs | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/compiler/main/DriverPipeline.hs b/compiler/main/DriverPipeline.hs index 3a883187ef..2846eafaec 100644 --- a/compiler/main/DriverPipeline.hs +++ b/compiler/main/DriverPipeline.hs @@ -153,7 +153,7 @@ compile hsc_env0 summary mod_index nmods mb_old_iface maybe_old_linkable = ASSERT (isJust maybe_old_linkable) return maybe_old_linkable - handleBatch (HscRecomp hasStub) + handleBatch (HscRecomp hasStub _) | isHsBoot src_flavour = do when (isObjectTarget hsc_lang) $ -- interpreted reaches here too liftIO $ SysTools.touch dflags' "Touching object file" @@ -179,10 +179,10 @@ compile hsc_env0 summary mod_index nmods mb_old_iface maybe_old_linkable (hs_unlinked ++ stub_unlinked) return (Just linkable) - handleInterpreted InteractiveNoRecomp + handleInterpreted HscNoRecomp = ASSERT (isJust maybe_old_linkable) return maybe_old_linkable - handleInterpreted (InteractiveRecomp hasStub comp_bc modBreaks) + handleInterpreted (HscRecomp hasStub (comp_bc, modBreaks)) = do stub_unlinked <- getStubLinkable hasStub let hs_unlinked = [BCOs comp_bc modBreaks] unlinked_time = ms_hs_date summary @@ -830,7 +830,7 @@ runPhase (Hsc src_flavour) stop hsc_env basename suff input_fn get_output_fn _ma -- than the source file (else we wouldn't be in HscNoRecomp) -- but we touch it anyway, to keep 'make' happy (we think). return (StopLn, dflags', Just location4, o_file) - (HscRecomp hasStub) + (HscRecomp hasStub _) -> do when hasStub $ do stub_o <- compileStub hsc_env' mod location4 liftIO $ consIORef v_Ld_inputs stub_o |