summaryrefslogtreecommitdiff
path: root/compiler/iface
Commit message (Collapse)AuthorAgeFilesLines
...
* Tidy up the commit for Trac #3725Simon Peyton Jones2013-10-032-42/+58
| | | | | | | | | In particular, the mi_ann_fn field in ModIface was only being used totally locally in MkIface, so I made it local. Other than that I just refactored data types slightly, * Adding synonym Annotations.AnnPayload for the cryptic Serialized * Adding MkIface.IfaceIdExtras to common up some of the identical code
* Persist annotations to interface files (#3725)Austin Seipp2013-10-012-33/+50
| | | | | Authored-by: Gergely Risko <gergely@risko.hu> Signed-off-by: Austin Seipp <austin@well-typed.com>
* Move defaultClassMinimalDef from BuildTyCl to TcClassDclunknown2013-10-011-11/+1
| | | | | | | Simple refactoring. Also in Vectorise.Types/TyConDecl, simply propagate the classMinimalDef from the class we are vectorising. Simpler and more direct.
* Globally replace "hackage.haskell.org" with "ghc.haskell.org"Simon Marlow2013-10-014-5/+5
|
* Restructure compilation pipeline to allow hooksAustin Seipp2013-09-221-1/+4
| | | | | | | | | | | | | | | | This commit exposes GHC's internal compiler pipeline through a `Hooks` module in the GHC API. It currently allows you to hook: * Foreign import/exports declarations * The frontend up to type checking * The one shot compilation mode * Core compilation, and the module iface * Linking and the phases in DriverPhases.hs * Quasiquotation Authored-by: Luite Stegeman <stegeman@gmail.com> Authored-by: Edsko de Vries <edsko@well-typed.com> Signed-off-by: Austin Seipp <austin@well-typed.com>
* Refactor AMP warnings a bitSimon Peyton Jones2013-09-201-9/+15
| | | | | | There was a bit of clutter (tryTc stuff) caused by the fact that tcLookupImported didn't return a MaybeErr. Now it does. That finishes up Trac #8004.
* Ignore Tickish Breakpoints when serialising Core into interface filesSimon Peyton Jones2013-09-201-5/+9
| | | | | | This fixes Trac #8333 Thanks to 'klao', who identified the cause and provided the patch
* Implement checkable "minimal complete definitions" (#7633)Twan van Laarhoven2013-09-184-7/+25
| | | | | | | | | | | | | | This commit adds a `{-# MINIMAL #-}` pragma, which defines the possible minimal complete definitions for a class. The body of the pragma is a boolean formula of names. The old warning for missing methods is replaced with this new one. Note: The interface file format is changed to store the minimal complete definition. Authored-by: Twan van Laarhoven <twanvl@gmail.com> Signed-off-by: Herbert Valerio Riedel <hvr@gnu.org>
* Change role annotation syntax.Richard Eisenberg2013-09-172-20/+24
| | | | | | | | | This fixes bugs #8185, #8234, and #8246. The new syntax is explained in the comments to #8185, appears in the "Roles" subsection of the manual, and on the [wiki:Roles] wiki page. This change also removes the ability for a role annotation on type synonyms, as noted in #8234.
* Add support for evaluation of type-level natural numbers.Iavor S. Diatchki2013-09-124-1/+38
| | | | | | | | | | | | | | | | | | | | | | | | | This patch implements some simple evaluation of type-level expressions featuring natural numbers. We can evaluate *concrete* expressions that use the built-in type families (+), (*), (^), and (<=?), declared in GHC.TypeLits. We can also do some type inference involving these functions. For example, if we encounter a constraint such as `(2 + x) ~ 5` we can infer that `x` must be 3. Note, however, this is used only to resolve unification variables (i.e., as a form of a constraint improvement) and not to generate new facts. This is similar to how functional dependencies work in GHC. The patch adds a new form of coercion, `AxiomRuleCo`, which makes use of a new form of axiom called `CoAxiomRule`. This is the form of evidence generate when we solve a constraint, such as `(1 + 2) ~ 3`. The patch also adds support for built-in type-families, by adding a new form of TyCon rhs: `BuiltInSynFamTyCon`. such built-in type-family constructors contain a record with functions that are used by the constraint solver to simplify and improve constraints involving the built-in function (see `TcInteract`). The record in defined in `FamInst`. The type constructors and rules for evaluating the type-level functions are in a new module called `TcTypeNats`.
* Put the interface-file typechecking of IfUnpackCo inside forkMSimon Peyton Jones2013-09-041-7/+10
| | | | | | Now that IfBangs can contain coercions, which can mention the very type being typechecked, the tc_strict call must be inside forkM. This led to Trac #8221
* Remove the final vestiges of InlineWrappersSimon Peyton Jones2013-09-023-42/+3
| | | | | | | | | | | | | | | Part of Nick Frisby's patch (c080f727ba5f83921b842fcff71e9066adbdc250) for late demand-analysis removed the over-zealous short-cut whereby strictness wrappers were not spelled out in detail in interface files. This patch completes the process by * removing InlineWrapper from UnfoldingSource * removing IfWrapper from IfaceUnfolding There was a tiny bit of special ad-hocery for wrappers, in OccurAnal, but fortunately that too turns out to be rendered irrelevant by the more uniform treatment, and after that there was no need to remember which functions are wrappers.
* simplified the .hi format and added the -flate-dmd-anal flag (fixes #7782)Nicolas Frisby2013-08-294-67/+51
| | | | cf http://ghc.haskell.org/trac/ghc/wiki/LateDmd
* Remove trailing whitespace from MkIfaceAustin Seipp2013-08-221-86/+86
| | | | Signed-off-by: Austin Seipp <aseipp@pobox.com>
* Fix interface hashes including time stamp of dependent files.Niklas Hambüchen2013-08-221-9/+9
| | | | | | | | | | | | | | | | | | | | | | | Fixes #8144. Before, the modification time of e.g. #included files (and everything that ends up as a UsageFile, e.g. via addDependentFile) was taken as input for the interface hash of a module. This lead to different hashes for identical inputs on every compilation. We now use file content hashes instead. This changes the interface file format. You will get "Binary.get(Usage): 50" when you try to do an incremental using .hi files that were created with a GHC 7.7 (only) older than this commit. To calculate the md5 hash (`Fingerprint`) of a file in constant space, there now is GHC.Fingerprint.getFileHash, and a fallback version for older GHCs that needs to load the file into memory completely (only used when compiling stage1 with an older GHC). Signed-off-by: Austin Seipp <aseipp@pobox.com>
* MkIface: Be consistent with do notationNiklas Hambüchen2013-08-221-118/+122
| | | | Signed-off-by: Austin Seipp <aseipp@pobox.com>
* MkIface: When printing the recomp reason, make clear only mtime is usedNiklas Hambüchen2013-08-221-1/+1
| | | | Signed-off-by: Austin Seipp <aseipp@pobox.com>
* MkIface: More specific comment about what forms the interface hashNiklas Hambüchen2013-08-221-1/+1
| | | | Signed-off-by: Austin Seipp <aseipp@pobox.com>
* MkIface: Mention that #include now adds dependent filesNiklas Hambüchen2013-08-221-2/+4
| | | | Signed-off-by: Austin Seipp <aseipp@pobox.com>
* Added support for writing and checking closed type families is hs-boot files.Richard Eisenberg2013-08-053-11/+20
| | | | | | | | As documented in the users' guide, you can now write type family Foo a where .. in a hs-boot file to declare an abstract closed type family.
* Implement "roles" into GHC.Richard Eisenberg2013-08-026-206/+403
| | | | | | | | | | | | | | | | Roles are a solution to the GeneralizedNewtypeDeriving type-safety problem. Roles were first described in the "Generative type abstraction" paper, by Stephanie Weirich, Dimitrios Vytiniotis, Simon PJ, and Steve Zdancewic. The implementation is a little different than that paper. For a quick primer, check out Note [Roles] in Coercion. Also see http://ghc.haskell.org/trac/ghc/wiki/Roles and http://ghc.haskell.org/trac/ghc/wiki/RolesImplementation For a more formal treatment, check out docs/core-spec/core-spec.pdf. This fixes Trac #1496, #4846, #7148.
* Beautify a few Binary instancesIan Lynagh2013-07-271-9/+10
|
* De-orphan a load of Binary instancesIan Lynagh2013-07-273-1079/+593
|
* Break loop in interface typechecking (fixes Trac #8002)Simon Peyton Jones2013-06-241-2/+7
|
* Revise implementation of overlapping type family instances.Richard Eisenberg2013-06-218-74/+126
| | | | | | | | | | | | | | | | | | | This commit changes the syntax and story around overlapping type family instances. Before, we had "unbranched" instances and "branched" instances. Now, we have closed type families and open ones. The behavior of open families is completely unchanged. In particular, coincident overlap of open type family instances still works, despite emails to the contrary. A closed type family is declared like this: > type family F a where > F Int = Bool > F a = Char The equations are tried in order, from top to bottom, subject to certain constraints, as described in the user manual. It is not allowed to declare an instance of a closed family.
* Typo in noteGabor Greif2013-06-211-1/+1
|
* Comments about the Name CacheSimon Peyton Jones2013-06-061-0/+20
|
* Fix a trailing case in making FamInstTyCon,Simon Peyton Jones2013-05-301-5/+12
| | | | | where the invariant didn't hold, leading to subsequent chaos. Happily an ASSERT caught it.
* Make 'SPECIALISE instance' work againSimon Peyton Jones2013-05-304-23/+15
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This is a long-standing regression (Trac #7797), which meant that in particular the Eq [Char] instance does not get specialised. (The *methods* do, but the dictionary itself doesn't.) So when you call a function f :: Eq a => blah on a string type (ie a=[Char]), 7.6 passes a dictionary of un-specialised methods. This only matters when calling an overloaded function from a specialised context, but that does matter in some programs. I remember (though I cannot find the details) that Nick Frisby discovered this to be the source of some pretty solid performanc regresisons. Anyway it works now. The key change is that a DFunUnfolding now takes a form that is both simpler than before (the DFunArg type is eliminated) and more general: data Unfolding = ... | DFunUnfolding { -- The Unfolding of a DFunId -- See Note [DFun unfoldings] -- df = /\a1..am. \d1..dn. MkD t1 .. tk -- (op1 a1..am d1..dn) -- (op2 a1..am d1..dn) df_bndrs :: [Var], -- The bound variables [a1..m],[d1..dn] df_con :: DataCon, -- The dictionary data constructor (never a newtype datacon) df_args :: [CoreExpr] -- Args of the data con: types, superclasses and methods, } -- in positional order That in turn allowed me to re-enable the DFunUnfolding specialisation in DsBinds. Lots of details here in TcInstDcls: Note [SPECIALISE instance pragmas] I also did some refactoring, in particular to pass the InScopeSet to exprIsConApp_maybe (which in turn means it has to go to a RuleFun). NB: Interface file format has changed!
* Fixed moer tyopsGabor Greif2013-04-251-1/+1
|
* Updated documentation; changed "group" to "branched" in type familiesRichard Eisenberg2013-04-243-13/+13
|
* Typo in debug print messageSimon Peyton Jones2013-04-231-1/+1
|
* Remove readIface's unused argumentIan Lynagh2013-03-172-4/+4
|
* Fix -dynamic-too with -boot filesIan Lynagh2013-03-091-1/+2
| | | | | It was looking for Foo.dyn_hi rather than Foo.dyn_hi-boot, and so falling back to the slow way
* Squash some typosGabor Greif2013-02-151-1/+1
|
* Export tcIfaceExpr as requested by Trac #7683Simon Peyton Jones2013-02-131-1/+4
|
* Merge branch 'refs/heads/vect-avoid' into vect-avoid-mergeManuel M T Chakravarty2013-02-063-31/+31
|\ | | | | | | | | | | | | | | | | Conflicts: compiler/rename/RnSource.lhs compiler/simplCore/OccurAnal.lhs compiler/vectorise/Vectorise/Exp.hs NB: Merging instead of rebasing for a change. During rebase Git got confused due to the lack of the submodules in my quite old fork.
| * Rewrote vectorisation avoidance (based on the HS paper)Manuel M T Chakravarty2012-12-053-31/+31
| | | | | | | | | | | | | | * Vectorisation avoidance is now the default * Types and values from unvectorised modules are permitted in scalar code * Simplified the VECTORISE pragmas (see http://hackage.haskell.org/trac/ghc/wiki/DataParallel/VectPragma for the spec) * Vectorisation information is now included in the annotated Core AST
* | Merge branch 'master' of darcs.haskell.org:/srv/darcs//ghcIan Lynagh2013-01-311-1/+1
|\ \
| * | typosGabor Greif2013-01-301-1/+1
| | |
* | | Change a few throwGhcException uses to throwGhcExceptionIOIan Lynagh2013-01-303-3/+3
|/ /
* | Pure refactoringSimon Peyton Jones2013-01-281-0/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | * Move tidyType and friends from TcType to TypeRep (It was always wrong to have it in TcType.) * Move mkCoAxBranch and friends from FamInst to Coercion * Move pprCoAxBranch and friends from FamInstEnv to Coercion No change in functionality, though there might be a little wibble in error message output, because I combined two different functions both called pprCoAxBranch!
* | More refactoring of FamInst/FamInstEnv; finally fixes Trac #7524Simon Peyton Jones2013-01-284-59/+29
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Quite a bit of tidying up here; the fix to #7524 is actually only a small part. * Be fully clear that the cab_tvs in a CoAxBranch are not fresh. See Note [CoAxBranch type variables] in CoAxiom. * Use CoAxBranch to replace the ATDfeault type in Class. CoAxBranch is perfect here. This change allowed me to delete quite a bit of boilerplate code, including the corresponding IfaceSynType. * Tidy up the construction of CoAxBranches, and when FamIntBranch is freshened. The latter onw happens only in FamInst.newFamInst. * Tidy the tyvars of a CoAxBranch when we build them, done in FamInst.mkCoAxBranch. See Note [Tidy axioms when we build them] in that module. This is what fixes #7524. Much niceer now.
* | Merge branch 'master' of http://darcs.haskell.org/ghcSimon Peyton Jones2013-01-254-123/+29
|\ \
| * | Major patch to implement the new Demand AnalyserSimon Peyton Jones2013-01-174-123/+29
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This patch is the result of Ilya Sergey's internship at MSR. It constitutes a thorough overhaul and simplification of the demand analyser. It makes a solid foundation on which we can now build. Main changes are * Instead of having one combined type for Demand, a Demand is now a pair (JointDmd) of - a StrDmd and - an AbsDmd. This allows strictness and absence to be though about quite orthogonally, and greatly reduces brain melt-down. * Similarly in the DmdResult type, it's a pair of - a PureResult (indicating only divergence/non-divergence) - a CPRResult (which deals only with the CPR property * In IdInfo, the strictnessInfo field contains a StrictSig, not a Maybe StrictSig demandInfo field contains a Demand, not a Maybe Demand We don't need Nothing (to indicate no strictness/demand info) any more; topSig/topDmd will do. * Remove "boxity" analysis entirely. This was an attempt to avoid "reboxing", but it added complexity, is extremely ad-hoc, and makes very little difference in practice. * Remove the "unboxing strategy" computation. This was an an attempt to ensure that a worker didn't get zillions of arguments by unboxing big tuples. But in fact removing it DRAMATICALLY reduces allocation in an inner loop of the I/O library (where the threshold argument-count had been set just too low). It's exceptional to have a zillion arguments and I don't think it's worth the complexity, especially since it turned out to have a serious performance hit. * Remove quite a bit of ad-hoc cruft * Move worthSplittingFun, worthSplittingThunk from WorkWrap to Demand. This allows JointDmd to be fully abstract, examined only inside Demand. Everything else really follows from these changes. All of this is really just refactoring, so we don't expect big performance changes, but acutally the numbers look quite good. Here is a full nofib run with some highlights identified: Program Size Allocs Runtime Elapsed TotalMem -------------------------------------------------------------------------------- expert -2.6% -15.5% 0.00 0.00 +0.0% fluid -2.4% -7.1% 0.01 0.01 +0.0% gg -2.5% -28.9% 0.02 0.02 -33.3% integrate -2.6% +3.2% +2.6% +2.6% +0.0% mandel2 -2.6% +4.2% 0.01 0.01 +0.0% nucleic2 -2.0% -16.3% 0.11 0.11 +0.0% para -2.6% -20.0% -11.8% -11.7% +0.0% parser -2.5% -17.9% 0.05 0.05 +0.0% prolog -2.6% -13.0% 0.00 0.00 +0.0% puzzle -2.6% +2.2% +0.8% +0.8% +0.0% sorting -2.6% -35.9% 0.00 0.00 +0.0% treejoin -2.6% -52.2% -9.8% -9.9% +0.0% -------------------------------------------------------------------------------- Min -2.7% -52.2% -11.8% -11.7% -33.3% Max -1.8% +4.2% +10.5% +10.5% +7.7% Geometric Mean -2.5% -2.8% -0.4% -0.5% -0.4% Things to note * Binary sizes are smaller. I don't know why, but it's good. * Allocation is sometiemes a *lot* smaller. I believe that all the big numbers (I checked treejoin, gg, sorting) arise from one place, namely a function GHC.IO.Encoding.UTF8.utf8_decode, which is strict in two Buffers both of which have several arugments. Not w/w'ing both arguments (which is what we did before) has a big effect. So the big win in actually somewhat accidental, gained by removing the "unboxing strategy" code. * A couple of benchmarks allocate slightly more. This turns out to be due to reboxing (integrate). But the biggest increase is mandel2, and *that* turned out also to be a somewhat accidental loss of CSE, and pointed the way to doing better CSE: see Trac #7596. * Runtimes are never very reliable, but seem to improve very slightly. All in all, a good piece of work. Thank you Ilya!
* | | Refactor and improve the promotion inferenceSimon Peyton Jones2013-01-255-25/+20
|/ / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | It should be the case that either an entire mutually recursive group of data type declarations can be promoted, or none of them. It's really odd to promote some data constructors of a type but not others. Eg data T a = T1 a | T2 Int Here T1 is sort-of-promotable but T2 isn't (becuase Int isn't promotable). This patch makes it all-or-nothing. At the same time I've made the TyCon point to its promoted cousin (via the tcPromoted field of an AlgTyCon), as well as vice versa (via the ty_con field of PromotedTyCon). The inference for the group is done in TcTyDecls, the same place that infers which data types are recursive, another global question.
* | Be willing to parse {-# UNPACK #-} without '!'Simon Peyton Jones2013-01-141-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | This change gives a more helpful error message when the user says data T = MkT {-# UNPACK #-} Int which should have a strictness '!' as well. Rather than just a parse error, we get T7562.hs:3:14: Warning: UNPACK pragma lacks '!' on the first argument of `MkT' Fixes Trac #7562
* | Refactor invariants for FamInsts.Richard Eisenberg2013-01-051-1/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | This commit mirrors work done in the commit for ClsInsts, 5efe9b... Specifically: - All FamInsts have *fresh* type variables. So, no more freshness work in addLocalFamInst Also: - Some pretty-printing code around FamInsts was cleaned up a bit This caused location information to be added to CoAxioms and index information to be added to FamInstBranches.
* | Comments and white space onlySimon Peyton Jones2013-01-011-2/+2
| |
* | Refactor the invariants for ClsInstsSimon Peyton Jones2013-01-011-4/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | We now have the invariant for a ClsInst that the is_tvs field is always completely fresh type variables. See Note [Template tyvars are fresh] in InstEnv. (Previously we frehened them when extending the instance environment, but that seems messier because it was an invariant only when the ClsInst was in an InstEnv. Moreover, there was an invariant that thet tyvars of the DFunid in the ClsInst had to match, and I have removed that invariant altogether; there is no need for it.) Other changes I made at the same time: * Make is_tvs into a *list*, in the right order for the dfun type arguments. This removes the wierd need for the dfun to have the same tyvars as the ClsInst template, an invariant I have always hated. The cost is that we need to make it a VarSet when matching. We could cache an is_tv_set instead. * Add a cached is_cls field to the ClsInst, to save fishing the Class out of the DFun. (Renamed is_cls to is_cls_nm.) * Make tcSplitDFunTy return the dfun args, not just the *number* of dfun args * Make InstEnv.instanceHead return just the *head* of the instance declaration. Add instanceSig to return the whole thing.