[commit: ghc] wip/T9858-typeable-ben2: Generate Typeable info at definition sites (285cd00)

git at git.haskell.org git at git.haskell.org
Mon Sep 28 12:45:36 UTC 2015


Repository : ssh://git@git.haskell.org/ghc

On branch  : wip/T9858-typeable-ben2
Link       : http://ghc.haskell.org/trac/ghc/changeset/285cd0012dfafb3a03cbb002e8519199df3329e1/ghc

>---------------------------------------------------------------

commit 285cd0012dfafb3a03cbb002e8519199df3329e1
Author: Ben Gamari <ben at smart-cactus.org>
Date:   Wed Aug 26 18:24:34 2015 +0200

    Generate Typeable info at definition sites
    
    This patch implements the idea floated in Trac #9858, namely that we
    should generate type-representation information at the data type
    declaration site, rather than when solving a Typeable constraint.
    
    However, this turned out quite a bit harder than I expected. I still
    think it's the right thing to do, and it's done now, but it was quite
    a struggle.
    
    See particularly
    
     * Note [Grand plan for Typeable] in TcTypeable (which is a new module)
     * Note [The overall promotion story] in DataCon (clarifies existing stuff)
    
    The most painful bit was that to generate Typeable instances (ie
    TyConRepName bindings) for every TyCon is tricky for types in ghc-prim
    etc:
    
     * We need to have enough data types around to *define* a TyCon
     * Many of these types are wired-in
    
    Also, to minimise the code generated for each data type, I wanted to
    generate pure data, not CAFs with unpackCString# stuff floating about.
    
    Performance
    ~~~~~~~~~~~
    Three perf/compiler tests start to allocate quite a bit more. This isn't
    surprising, because they all allocate zillions of data types, with
    practically no other code, esp. T1969
    
     * T1969:  GHC allocates 30% more
     * T5642:  GHC allocates 14% more
     * T9872d: GHC allocates  5% more
    
    I'm treating this as acceptable. The payoff comes in Typeable-heavy
    code.
    
    Remaining to do
    ~~~~~~~~~~~~~~~
    
     * I think that "TyCon" and "Module" are over-generic names to use for
       the runtime type representations used in GHC.Typeable. Better might be
       "TrTyCon" and "TrModule". But I have not yet done this
    
     * Add more info the the "TyCon" e.g. source location where it was
       defined
    
     * Use the new "Module" type to help with Trac Trac #10068
    
     * It would be possible to generate TyConRepName (ie Typeable
       instances) selectively rather than all the time. We'd need to persist
       the information in interface files. Lacking a motivating reason I have
       not done this, but it would not be difficult.
    
    Refactoring
    ~~~~~~~~~~~
    As is so often the case, I ended up refactoring more than I intended.
    In particular
    
     * In TyCon, a type *family* (whether type or data) is repesented by a
       FamilyTyCon
         * a algebraic data type (including data/newtype instances) is
           represented by AlgTyCon This wasn't true before; a data family
           was represented as an AlgTyCon. There are some corresponding
           changes in IfaceSyn.
    
         * Also get rid of the (unhelpfully named) tyConParent.
    
     * In TyCon define 'Promoted', isomorphic to Maybe, used when things are
       optionally promoted; and use it elsewhere in GHC.
    
     * Cleanup handling of knownKeyNames
    
     * Each TyCon, including promoted TyCons, contains its TyConRepName, if
       it has one. This is, in effect, the name of its Typeable instance.
    
     * Move mkDefaultMethodIds, mkRecSelBinds from TcTyClsDecls to TcTyDecls


>---------------------------------------------------------------

285cd0012dfafb3a03cbb002e8519199df3329e1
 compiler/basicTypes/DataCon.hs                 | 222 ++++++++++----
 compiler/basicTypes/OccName.hs                 |  19 +-
 compiler/basicTypes/Unique.hs                  |  51 ++-
 compiler/deSugar/DsBinds.hs                    | 277 ++++++++---------
 compiler/ghc.cabal.in                          |   1 +
 compiler/hsSyn/HsUtils.hs                      |   6 +-
 compiler/iface/BuildTyCl.hs                    |  42 ++-
 compiler/iface/IfaceSyn.hs                     |  97 +++---
 compiler/iface/MkIface.hs                      |  11 +-
 compiler/iface/TcIface.hs                      |  89 +++---
 compiler/main/HscMain.hs                       |  13 +-
 compiler/main/HscTypes.hs                      |  12 +-
 compiler/prelude/PrelInfo.hs                   | 111 +++----
 compiler/prelude/PrelNames.hs                  |  79 +++--
 compiler/prelude/TysPrim.hs                    |  38 ++-
 compiler/prelude/TysWiredIn.hs                 |  55 ++--
 compiler/typecheck/TcBinds.hs                  |  35 ++-
 compiler/typecheck/TcEvidence.hs               |  53 +++-
 compiler/typecheck/TcGenGenerics.hs            |  41 ++-
 compiler/typecheck/TcHsSyn.hs                  |  28 +-
 compiler/typecheck/TcHsType.hs                 |   8 +-
 compiler/typecheck/TcInstDcls.hs               |  19 +-
 compiler/typecheck/TcInteract.hs               | 147 +++++----
 compiler/typecheck/TcPatSyn.hs                 |   4 +-
 compiler/typecheck/TcRnDriver.hs               |  40 ++-
 compiler/typecheck/TcRnMonad.hs                |   2 +-
 compiler/typecheck/TcRnTypes.hs                |   7 +-
 compiler/typecheck/TcTyClsDecls.hs             | 330 ++++----------------
 compiler/typecheck/TcTyDecls.hs                | 330 +++++++++++++++-----
 compiler/typecheck/TcTypeNats.hs               |  12 +-
 compiler/typecheck/TcTypeable.hs               | 206 +++++++++++++
 compiler/types/TyCon.hs                        | 409 ++++++++++++++-----------
 compiler/types/Type.hs                         |   9 +
 compiler/utils/Binary.hs                       |  11 +-
 compiler/vectorise/Vectorise/Generic/PData.hs  |   4 +-
 compiler/vectorise/Vectorise/Type/Env.hs       |   4 +-
 compiler/vectorise/Vectorise/Type/TyConDecl.hs |   7 +-
 libraries/base/Data/Typeable.hs                |   3 +-
 libraries/base/Data/Typeable/Internal.hs       | 336 ++++++++++++--------
 libraries/base/GHC/Show.hs                     |  10 +
 libraries/base/GHC/Stack/Types.hs              |  13 +
 libraries/ghc-prim/GHC/Classes.hs              |  36 ++-
 libraries/ghc-prim/GHC/Magic.hs                |   2 +
 libraries/ghc-prim/GHC/Tuple.hs                |   3 +
 libraries/ghc-prim/GHC/Types.hs                |  54 +++-
 utils/haddock                                  |   2 +-
 46 files changed, 2024 insertions(+), 1264 deletions(-)

Diff suppressed because of size. To see it, use:

    git diff-tree --root --patch-with-stat --no-color --find-copies-harder --ignore-space-at-eol --cc 285cd0012dfafb3a03cbb002e8519199df3329e1


More information about the ghc-commits mailing list