[GHC] #10871: Implement "fat" interface files which can be directly compiled without source

GHC ghc-devs at haskell.org
Mon Sep 21 07:06:40 UTC 2015


#10871: Implement "fat" interface files which can be directly compiled without
source
-------------------------------------+-------------------------------------
        Reporter:  ezyang            |                   Owner:  ezyang
            Type:  feature request   |                  Status:  new
        Priority:  normal            |               Milestone:
       Component:  Compiler          |                 Version:  7.11
      Resolution:                    |                Keywords:  backpack
Operating System:  Unknown/Multiple  |            Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |               Test Case:
      Blocked By:                    |                Blocking:
 Related Tickets:                    |  Differential Revisions:
-------------------------------------+-------------------------------------

Comment (by ezyang):

 Let's talk about recompilation avoidance and how the user-facing interface
 for fat interfaces work.

 Ideally, compilation to a fat interface (`-fno-code -fwrite-fat-
 interface`) should be similar to compilation to an interface (`-fno-code
 `-fwrite-interface`), including recompilation avoidance. This includes the
 following properties:

 1. Incremental compile. If `A` imports `B`, and I've built `B.hi-fat`, I
 should also be able to build `A.hi-fat`. (This implies that an `hi-fat`
 file should be loadable to get `TyThing`s.)

 2. If I build `A.hi-fat`, and then modify `A.hs`, if I ask GHC to build `A
 .hi-fat` again, it should be rebuilt; similarly if the `TyThing`s of any
 of its dependencies changed. However, if there are no changes, I shouldn't
 have to rebuild `A.hi-fat`.

 3. If I am compiling an `A.hi-fat` to `A.o` and `A.hi` (e.g. finishing the
 compilation), it's unreasonable to expect GHC to handle the case where the
 `A.hi-fat` is out of date relative to the `A.hs` or any of its
 dependencies. However, if it is out of date, GHC should detect this and
 give an error, rather than generate some incorrect code.

 The mental model I have is that we can think of an `hi-fat` file as
 consisting of two parts: an types only `hi` file that would have been the
 result of an `-fno-code -fwrite-interface` (so, a properly Tidied
 interface that is good for typechecking and then loading in for later
 typechecking, but without any unfoldings) as well as the `fat` bits which
 can be used to reconstruct a `ModGuts` and finish compilation. (Of course,
 you'd really like this to all be ONE file. Should look at this carefully
 and make sure it works!) Importantly, we DON'T care about fingerprinting
 the bindings and stuff for compilation; only the typechecking information.

 We have to be careful not to confuse `hi` files and `hi-fat` files in GHC.
 If I'm typechecking for an `hi-fat` file, I only want to preferentially
 use `hi-fat` files; however, if I'm actually building a module, I really
 want `hi` files (so I get the right unfoldings). We have a somewhat
 similar situation in Backpack: I really don't want the types only
 definitions polluting the EPT, because then things won't optimize.

 Here is where things get tricky, because when we typecheck a module and
 then desugar it, we are going to use the typecheck only `hi` files, but
 when we BUILD the ModGuts, we're going to want to use the actually built
 `hi` files. How do we tell if these are actually in sync? We're going to
 need some only "type-check" only hash which we can use to test for
 consistency. Hmm! ModIface should have something close to this already but
 we have to check.

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/10871#comment:7>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list