[commit: ghc] wip/T9858-typeable-ben2: Generate Typeable info at definition sites (e5c95e2)
git at git.haskell.org
git at git.haskell.org
Wed Sep 23 20:40:52 UTC 2015
Repository : ssh://git@git.haskell.org/ghc
On branch : wip/T9858-typeable-ben2
Link : http://ghc.haskell.org/trac/ghc/changeset/e5c95e22585568aa84be972de621dbc274089b6e/ghc
>---------------------------------------------------------------
commit e5c95e22585568aa84be972de621dbc274089b6e
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
>---------------------------------------------------------------
e5c95e22585568aa84be972de621dbc274089b6e
compiler/basicTypes/DataCon.hs | 222 ++++++++++----
compiler/basicTypes/OccName.hs | 19 +-
compiler/basicTypes/Unique.hs | 51 +++-
compiler/deSugar/DsBinds.hs | 276 +++++++++--------
compiler/ghc.cabal.in | 1 +
compiler/hsSyn/HsUtils.hs | 6 +-
compiler/iface/BuildTyCl.hs | 31 +-
compiler/iface/IfaceSyn.hs | 107 +++----
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 | 73 +++--
compiler/prelude/TysPrim.hs | 38 ++-
compiler/prelude/TysWiredIn.hs | 55 ++--
compiler/typecheck/TcBinds.hs | 35 ++-
compiler/typecheck/TcEvidence.hs | 53 ++--
compiler/typecheck/TcGenGenerics.hs | 38 ++-
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/TcSplice.hs | 14 +
compiler/typecheck/TcTyClsDecls.hs | 324 ++++----------------
compiler/typecheck/TcTyDecls.hs | 330 +++++++++++++++-----
compiler/typecheck/TcTypeNats.hs | 12 +-
compiler/typecheck/TcTypeable.hs | 206 +++++++++++++
compiler/types/TyCon.hs | 404 ++++++++++++++-----------
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/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 | 55 +++-
libraries/hpc | 2 +-
utils/haddock | 2 +-
47 files changed, 2003 insertions(+), 1267 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 e5c95e22585568aa84be972de621dbc274089b6e
More information about the ghc-commits
mailing list