3 months agoNote [Don't flatten tuples from HsSyn] in MkCore
Richard Eisenberg [Tue, 23 Jul 2019 19:39:06 +0000 (15:39 -0400)] 
Note [Don't flatten tuples from HsSyn] in MkCore

Previously, we would sometimes flatten 1-tuples and sometimes
not. This didn't cause damage because there is no way to
generate HsSyn with 1-tuples. But, with the upcoming fix to #16881,
there will be. Without this patch, obscure lint errors would
have resulted.

No test case, as there is not yet a way to tickle this.

3 months agoMerge TcTypeableValidity into TcTypeable, document treatment of casts
Ryan Scott [Wed, 19 Jun 2019 00:17:00 +0000 (20:17 -0400)] 
Merge TcTypeableValidity into TcTypeable, document treatment of casts

This patch:

* Implements a refactoring (suggested in
  that moves all functions from `TcTypeableValidity` back to
  `TcTypeable`, as the former module doesn't really need to live on its
* Adds `Note [Typeable instances for casted types]` to `TcTypeable`
  explaining why the `Typeable` solver currently does not support
  types containing casts.

Resolves #16835.

3 months agoTypo in comment [ci skip] wip/ggreif-typo
Gabor Greif [Thu, 3 Oct 2019 12:15:50 +0000 (08:15 -0400)] 
Typo in comment [ci skip]

3 months agoMake small INLINE functions behave properly
Ömer Sinan Ağacan [Fri, 13 Sep 2019 06:46:17 +0000 (09:46 +0300)] 
Make small INLINE functions behave properly

Simon writes:

Currently we check for a type arg rather than isTyCoArg.   This in turn
makes INLINE things look bigger than they should be, and stops them
being inlined into boring contexts when they perfectly well could be.

    f x = g <refl> x
    {-# INLINE g #-}

    ... (map (f x) xs) ...

The context is boring, so don't inline unconditionally.  But f's RHS is
no bigger than its call, provided you realise that the coercion argument
is ultimately cost-free.

This happens in practice for $WHRefl. It's not a big deal: at most it
means we have an extra function call overhead.  But it's untidy, and
actually worse than what happens without an INLINE pragma.

Fixes #17182

This makes 0.0% change in nofib binary sizes.

3 months agoHadrian: do not cache GHC configure rule
David Eichmann [Thu, 18 Jul 2019 16:18:45 +0000 (17:18 +0100)] 
Hadrian: do not cache GHC configure rule

3 months agoHadrian: Libffi rule now `produces` dynamic library files.
David Eichmann [Wed, 17 Jul 2019 15:14:01 +0000 (16:14 +0100)] 
Hadrian: Libffi rule now `produces` dynamic library files.

3 months agoRefactor some cruft in TcDeriv
Ryan Scott [Sat, 28 Sep 2019 12:09:33 +0000 (08:09 -0400)] 
Refactor some cruft in TcDeriv

* `mk_eqn_stock`, `mk_eqn_anyclass`, and `mk_eqn_no_mechanism` all
  took a continuation of type
  `DerivSpecMechanism -> DerivM EarlyDerivSpec` to represent its
  primary control flow. However, in practice this continuation was
  always instantiated with the `mk_originative_eqn` function, so
  there's not much point in making this be a continuation in the
  first place.

  This patch removes these continuations in favor of invoking
  `mk_originative_eqn` directly, which is simpler.
* There were several parts of `TcDeriv` that took different code
  paths if compiling an `.hs-boot` file. But this is silly, because
  ever since 101a8c770b9d3abd57ff289bffea3d838cf25c80 we simply error
  eagerly whenever attempting to derive any instances in an
  `.hs-boot` file.

  This patch removes all of the unnecessary `.hs-boot` code paths,
  leaving only one (which errors out).
* Remove various error continuation arguments from `mk_eqn_stock`
  and related functions.

3 months agoAdd testcases inspired by Luke Maranget's pattern match series wip/add-testcases
Sebastian Graf [Fri, 27 Sep 2019 12:57:17 +0000 (12:57 +0000)] 
Add testcases inspired by Luke Maranget's pattern match series

In his paper "Warnings for Pattern Matching", Luke Maranget describes
three series in his appendix for which GHC's pattern match checker
scaled very badly. We mostly avoid this now with !1752. This commit adds
regression tests for each of the series.

Fixes #17264.

3 months agoAdd a bunch of testcases for the pattern match checker
Sebastian Graf [Fri, 27 Sep 2019 10:36:19 +0000 (10:36 +0000)] 
Add a bunch of testcases for the pattern match checker

Adds regression tests for tickets #17207, #17208, #17215, #17216,
 #17218, #17219, #17248

3 months agoBump process submodule
Ben Gamari [Sat, 28 Sep 2019 17:48:17 +0000 (13:48 -0400)] 
Bump process submodule

Marks process003 as fragile, as noted in #17245.

3 months agotestsuite: Mark T3389 as broken in hpc way on i386
Ben Gamari [Sat, 28 Sep 2019 17:39:21 +0000 (13:39 -0400)] 
testsuite: Mark T3389 as broken in hpc way on i386

See #17256.

3 months agoDo not rely on CUSKs in 'base'
Vladislav Zavialov [Sat, 28 Sep 2019 12:20:39 +0000 (15:20 +0300)] 
Do not rely on CUSKs in 'base'

Use standalone kind signatures instead of complete user-specified kinds
in Data.Type.Equality and Data.Typeable

3 months agotestsuite: Add minimal test for :doc command
Takenobu Tani [Sat, 28 Sep 2019 05:02:01 +0000 (14:02 +0900)] 
testsuite: Add minimal test for :doc command

Currently, there are no testcases for GHCi `:doc` command.
Perhaps because it was experimental. And it could be changed in the future.

But `:doc` command is already useful, so I add a minimal regression test
to keep current behavior.

See also 85309a3cda for implementation of `:doc` command.

3 months agoMove pattern match checker modules to GHC.HsToCore.PmCheck
Sebastian Graf [Fri, 27 Sep 2019 16:42:42 +0000 (16:42 +0000)] 
Move pattern match checker modules to GHC.HsToCore.PmCheck

3 months agoAdd help message for GHCi :instances command
Takenobu Tani [Fri, 27 Sep 2019 11:16:00 +0000 (20:16 +0900)] 
Add help message for GHCi :instances command

This commit updates GHCi's help message for GHC 8.10.

3 months agoFix arguments for unbound binders in RULE application
Simon Peyton Jones [Wed, 25 Sep 2019 15:26:29 +0000 (16:26 +0100)] 
Fix arguments for unbound binders in RULE application

We were failing to correctly implement Note [Unbound RULE binders]
in Rules.hs.  In particular, when cooking up a fake Refl,
were were failing to apply the substitition.

This patch fixes that problem, and simultaneously tidies
up the impedence mis-match between RuleSubst and TCvSubst.

Thanks to Sebastian!

3 months agoRefactor iface file generation:
Ömer Sinan Ağacan [Wed, 21 Aug 2019 14:31:49 +0000 (17:31 +0300)] 
Refactor iface file generation:

This commit refactors interface file generation to allow information
from the later passed (NCG, STG) to be stored in interface files.

We achieve this by splitting interface file generation into two parts:
* Partial interfaces, built based on the result of the core pipeline
* A fully instantiated interface, which also contains the final
fingerprints and can optionally contain information produced by the backend.

This change is required by !1304 and !1530.

-dynamic-too handling is refactored too: previously when generating code
we'd branch on -dynamic-too *before* code generation, but now we do it

(Original code written by @AndreasK in !1530)


Before this patch interface files where created and immediately flushed
to disk which made space leaks impossible.
With this change we instead use NFData to force all iface related data
structures to avoid space leaks.

In the process of refactoring it was discovered that the code in the
ToIface Module allocated a lot of thunks which were immediately forced
when writing/forcing the interface file. So we made this module more
strict to avoid creating many of those thunks.

Bottom line is that allocations go down by about ~0.1% compared to
Residency is not meaningfully different after this patch.
Runtime was not benchmarked.

Co-Authored-By: Andreas Klebinger <>
Co-Authored-By: Ömer Sinan Ağacan <>
3 months ago`exprOkForSpeculation` for Note [IO hack in the demand analyser]
Sebastian Graf [Fri, 27 Sep 2019 09:38:47 +0000 (09:38 +0000)] 
`exprOkForSpeculation` for Note [IO hack in the demand analyser]

In #14998 I realised that the notion of speculative execution
*exactly matches* eager evaluation of expressions in a case alternative
where the scrutinee is an IO action.

Normally we have to `deferIO` any result from that single case
alternative to prevent this speculative execution, so we had a special
case in place in the demand analyser that would check if the scrutinee
was a prim-op, in which case we assumed that it would be ok to do the
eager evaluation.

Now we just check if the scrutinee is `exprOkForSpeculation`,
corresponding to the notion that we want to push evaluation of the
scrutinee *after* eagerly evaluating stuff from the case alternative.

This fixes #14988, because it resolves the last open Item 4 there.

3 months agoPmCheck: No ConLike instantiation in pmcheck
Sebastian Graf [Mon, 16 Sep 2019 16:52:21 +0000 (16:52 +0000)] 
PmCheck: No ConLike instantiation in pmcheck

`pmcheck` used to call `refineToAltCon` which would refine the knowledge
we had about a variable by equating it to a `ConLike` application.
Since we weren't particularly smart about this in the Check module, we
simply freshened the constructors existential and term binders utimately
through a call to `mkOneConFull`.

But that instantiation is unnecessary for when we match against a
concrete pattern! The pattern will already have fresh binders and field
types. So we don't call `refineToAltCon` from `Check` anymore.

Subsequently, we can simplify a couple of call sites and functions in
`PmOracle`. Also implementing `computeCovered` becomes viable and we
don't have to live with the hack that was `addVarPatVecCt` anymore.

A side-effect of not indirectly calling `mkOneConFull` anymore is that
we don't generate the proper strict argument field constraints anymore.
Instead we now desugar ConPatOuts as if they had bangs on their strict
fields. This implies that `PmVar` now carries a `HsImplBang` that we
need to respect by a (somewhat ephemeral) non-void check. We fix #17234
in doing so.

3 months agotestsuite: Mark TH tests as fragile in LLVM built external-interpreter
Ben Gamari [Thu, 26 Sep 2019 15:40:15 +0000 (11:40 -0400)] 
testsuite: Mark TH tests as fragile in LLVM built external-interpreter

Due to #16087. This drops the previous explicit list of broken tests and rather
encompasses the entire set of tests since they all appear to be broken.

3 months agotestsuite: Mark T3389 as broken in profiled ways on i386
Ben Gamari [Thu, 26 Sep 2019 15:11:36 +0000 (11:11 -0400)] 
testsuite: Mark T3389 as broken in profiled ways on i386

As noted in #17256.

3 months agotestsuite: Mark hs_try_putmvar003 as fragile in threaded1
Ben Gamari [Thu, 26 Sep 2019 14:42:24 +0000 (10:42 -0400)] 
testsuite: Mark hs_try_putmvar003 as fragile in threaded1

Due to #16361. Note that I'm leaving out threaded2 since it's not clear
whether the single crash in that way was due to other causes.

3 months agotestsuite: Mark compact_gc as fragile in the ghci way
Ben Gamari [Thu, 26 Sep 2019 14:01:29 +0000 (10:01 -0400)] 
testsuite: Mark compact_gc as fragile in the ghci way

As noted in #17253.

3 months agoRaise minimum GHC version to 8.6
Daniel Gröber [Wed, 25 Sep 2019 22:00:44 +0000 (00:00 +0200)] 
Raise minimum GHC version to 8.6

commit 795986aaf33e ("Remove unneeded CPP now that GHC 8.6 is the minimum")
broke the 8.4 build.

3 months agotestsuite: Mark cgrun071 as broken on i386
Ben Gamari [Wed, 25 Sep 2019 20:41:12 +0000 (16:41 -0400)] 
testsuite: Mark cgrun071 as broken on i386

As described in #17247.

3 months agoAdd test for expected dependencies of 'Parser'
Shayne Fletcher [Wed, 25 Sep 2019 19:28:00 +0000 (15:28 -0400)] 
Add test for expected dependencies of 'Parser'

3 months agoPmCheck: Look at precendence to give type signatures to some wildcards
Sebastian Graf [Wed, 25 Sep 2019 16:16:53 +0000 (16:16 +0000)] 
PmCheck: Look at precendence to give type signatures to some wildcards

Basically do what we currently only do for -XEmptyCase in other cases
where adding the type signature won't distract from pattern
matches in other positions.

We use the precedence to guide us, equating "need to parenthesise" with
"too much noise".

3 months agoExpand description of DataKinds to mention data constructors, and include mention...
chris-martin [Wed, 25 Sep 2019 19:17:00 +0000 (15:17 -0400)] 
Expand description of DataKinds to mention data constructors, and include mention of TypeError

3 months agoClarify the purpose and status of the GHC.TypeLits module
chris-martin [Wed, 25 Sep 2019 00:35:56 +0000 (20:35 -0400)] 
Clarify the purpose and status of the GHC.TypeLits module

3 months agoghc-prim: Fix documentation of Type
Ben Gamari [Tue, 24 Sep 2019 21:29:36 +0000 (17:29 -0400)] 
ghc-prim: Fix documentation of Type

As pointed out in #17243, `Type` is not the only kind
having values.

3 months agoJust get RTS libs from its package conf
John Ericson [Wed, 11 Sep 2019 00:00:23 +0000 (20:00 -0400)] 
Just get RTS libs from its package conf

`rts.conf` already contains this exact information in its
`extra-libraries` stanza.

3 months agoconfigure: Don't depend upon alex in source dist build
Ben Gamari [Thu, 19 Sep 2019 03:50:20 +0000 (23:50 -0400)] 
configure: Don't depend upon alex in source dist build

This fixes #16860 by verifying that the generated sources don't already
exist before asserting that the `alex` executable was found. This
replicates the logic already used for `happy` in the case of `alex`.

3 months agoAllow users to disable Unicode with an env var
Ron Mordechai [Sun, 18 Aug 2019 16:22:01 +0000 (19:22 +0300)] 
Allow users to disable Unicode with an env var

Unicode renders funny on my terminal and I like to avoid it where
possible. Most applications which print out non-ascii characters allow
users to disable such prints with an environment variable (e.g.

This diff disables Unicode usage when the environment variable
`GHC_NO_UNICODE` is set. To test, set the env var and compile a bad
program. Note that GHC does not print Unicode bullets but instead prints
out asterisks:

$ GHC_NO_UNICODE= _build/stage1/bin/ghc ../Temp.hs
[1 of 1] Compiling Temp             ( ../Temp.hs, ../Temp.o )

../Temp.hs:4:23: error:
    * Couldn't match type `Bool' with `a -> Bool'
      Expected type: Bool -> a -> Bool
        Actual type: Bool -> Bool
    * In the first argument of `foldl', namely `(&& (flip $ elem u))'
      In the expression: foldl (&& (flip $ elem u)) True v
      In an equation for `isPermut':
          isPermut u v = foldl (&& (flip $ elem u)) True v
    * Relevant bindings include
        v :: [a] (bound at ../Temp.hs:4:12)
        u :: [a] (bound at ../Temp.hs:4:10)
        isPermut :: [a] -> [a] -> Bool (bound at ../Temp.hs:4:1)
4 | isPermut u v = foldl (&& (flip $ elem u)) True v
  |                       ^^^^^^^^^^^^^^^^^^

(Broken code taken from Stack Overflow)

3 months agoPmCheck: Elaborate what 'model' means in the user guide [skip ci]
Sebastian Graf [Thu, 26 Sep 2019 08:46:22 +0000 (08:46 +0000)] 
PmCheck: Elaborate what 'model' means in the user guide [skip ci]

3 months agoMake -fbyte-code prevent unboxed tuples/sums from implying object code (#16876)
Ryan Scott [Thu, 8 Aug 2019 17:26:13 +0000 (13:26 -0400)] 
Make -fbyte-code prevent unboxed tuples/sums from implying object code (#16876)

This resolves #16876 by making the explicit use of `-fbyte-code`
prevent code that enables `UnboxedTuples` or `UnboxedSums` from
automatically compiling to object code. This allows for a nice
middle ground where most code that enables `UnboxedTuples`/-`Sums`
will still benefit from automatically enabling `-fobject-code`, but
allows power users who wish to avoid this behavior in certain corner
cases (such as `lens`, whose use case is documented in #16876) to do

Along the way, I did a little cleanup of the relevant code and

* `enableCodeGenForUnboxedTuples` was only checking for the presence
  of `UnboxedTuples`, but `UnboxedSums` has the same complications.
  I fixed this and renamed the function to
* I amended the users' guide with a discussion of these issues.

3 months agoStandalone kind signatures (#16794) wip/top-level-kind-signatures
Vladislav Zavialov [Fri, 29 Mar 2019 07:18:03 +0000 (10:18 +0300)] 
Standalone kind signatures (#16794)

Implements GHC Proposal #54: .../ghc-proposals/blob/master/proposals/0054-kind-signatures.rst

With this patch, a type constructor can now be given an explicit
standalone kind signature:

  {-# LANGUAGE StandaloneKindSignatures #-}
  type Functor :: (Type -> Type) -> Constraint
  class Functor f where
    fmap :: (a -> b) -> f a -> f b

This is a replacement for CUSKs (complete user-specified
kind signatures), which are now scheduled for deprecation.

User-facing changes

* A new extension flag has been added, -XStandaloneKindSignatures, which
  implies -XNoCUSKs.

* There is a new syntactic construct, a standalone kind signature:

    type <name> :: <kind>

  Declarations of data types, classes, data families, type families, and
  type synonyms may be accompanied by a standalone kind signature.

* A standalone kind signature enables polymorphic recursion in types,
  just like a function type signature enables polymorphic recursion in
  terms. This obviates the need for CUSKs.

* TemplateHaskell AST has been extended with 'KiSigD' to represent
  standalone kind signatures.

* GHCi :info command now prints the kind signature of type constructors:

    ghci> :info Functor
    type Functor :: (Type -> Type) -> Constraint


* 'forall'-bound type variables of a standalone kind signature do not
  scope over the declaration body, even if the -XScopedTypeVariables is
  enabled. See #16635 and #16734.

* Wildcards are not allowed in standalone kind signatures, as partial
  signatures do not allow for polymorphic recursion.

* Associated types may not be given an explicit standalone kind
  signature. Instead, they are assumed to have a CUSK if the parent class
  has a standalone kind signature and regardless of the -XCUSKs flag.

* Standalone kind signatures do not support multiple names at the moment:

    type T1, T2 :: Type -> Type   -- rejected
    type T1 = Maybe
    type T2 = Either String

  See #16754.

* Creative use of equality constraints in standalone kind signatures may
  lead to GHC panics:

    type C :: forall (a :: Type) -> a ~ Int => Constraint
    class C a where
      f :: C a => a -> Int

  See #16758.

Implementation notes

* The heart of this patch is the 'kcDeclHeader' function, which is used to
  kind-check a declaration header against its standalone kind signature.
  It does so in two rounds:

    1. check user-written binders
    2. instantiate invisible binders a la 'checkExpectedKind'

* 'kcTyClGroup' now partitions declarations into declarations with a
  standalone kind signature or a CUSK (kinded_decls) and declarations
  without either (kindless_decls):

    * 'kinded_decls' are kind-checked with 'checkInitialKinds'
    * 'kindless_decls' are kind-checked with 'getInitialKinds'

* DerivInfo has been extended with a new field:

    di_scoped_tvs :: ![(Name,TyVar)]

  These variables must be added to the context in case the deriving clause
  references tcTyConScopedTyVars. See #16731.

3 months agoRemove unneeded CPP now that GHC 8.6 is the minimum
Ryan Scott [Tue, 24 Sep 2019 14:32:05 +0000 (10:32 -0400)] 
Remove unneeded CPP now that GHC 8.6 is the minimum

The minimum required GHC version for bootstrapping is 8.6, so we can
get rid of some unneeded `#if `__GLASGOW_HASKELL__` CPP guards, as
well as one `MIN_VERSION_ghc_prim(0,5,3)` guard (since GHC 8.6 bundles

3 months agobase: Move Ix typeclass to GHC.Ix
Ben Gamari [Mon, 16 Sep 2019 14:51:08 +0000 (10:51 -0400)] 
base: Move Ix typeclass to GHC.Ix

The `Ix` class seems rather orthogonal to its original home in

3 months agoPmCheck: Only ever check constantly many models against a single pattern
Sebastian Graf [Wed, 18 Sep 2019 17:56:35 +0000 (17:56 +0000)] 
PmCheck: Only ever check constantly many models against a single pattern

Introduces a new flag `-fmax-pmcheck-deltas` to achieve that. Deprecates
the old `-fmax-pmcheck-iter` mechanism in favor of this new flag.

From the user's guide:

Pattern match checking can be exponential in some cases. This limit makes sure
we scale polynomially in the number of patterns, by forgetting refined
information gained from a partially successful match. For example, when
matching `x` against `Just 4`, we split each incoming matching model into two
sub-models: One where `x` is not `Nothing` and one where `x` is `Just y` but
`y` is not `4`. When the number of incoming models exceeds the limit, we
continue checking the next clause with the original, unrefined model.

This also retires the incredibly hard to understand "maximum number of
refinements" mechanism, because the current mechanism is more general
and should catch the same exponential cases like PrelRules at the same

Metric Decrease:

3 months agoincludes/CodeGen.Platform.hs don't include ghcautoconf.h
John Ericson [Fri, 13 Sep 2019 22:19:54 +0000 (18:19 -0400)] 
includes/CodeGen.Platform.hs don't include ghcautoconf.h

It doesn't need it, and it shouldn't need it or else multi-target will

3 months agoAdd -Wderiving-defaults (#15839)
Kari Pahula [Tue, 24 Sep 2019 13:33:15 +0000 (16:33 +0300)] 
Add -Wderiving-defaults (#15839)

Enabling both DeriveAnyClass and GeneralizedNewtypeDeriving can cause
a warning when no explicit deriving strategy is in use. This change adds
an enable/suppress flag for it.

3 months agoAdd ghcide configuration files
Matthew Pickering [Fri, 20 Sep 2019 10:09:23 +0000 (11:09 +0100)] 
Add ghcide configuration files

This commit adds three new files

1. A hie.yaml file to the project root which specifies to IDEs how to
set up the correct environment for loading GHC. This currently
specifies to call the `./hadrian/hie-bios` script.
2. A `hie.yaml` file for the hadrian subcomponent, which uses the
`cabal` cradle type.
2. The `./hadrian/hie-bios` script which supplies the correct arguments
for an IDE to start a session.

With these two files it is possible to run

ghcide compiler/

and successfully load all the modules for use in the IDE.


ghcide --cwd hadrian/ src/

to test loading all of Hadrian's modules.

Closes #17194

3 months agoFix bounds check in ocResolve_PEi386 for relocation values.
Andreas Klebinger [Wed, 4 Sep 2019 13:34:09 +0000 (15:34 +0200)] 
Fix bounds check in ocResolve_PEi386 for relocation values.

The old test was wrong at least for gcc and the value -2287728808L.

It also relied on implementation defined behaviour (right shift
on a negative value), which might or might not be ok.
Either way it's now a simple comparison which will always work.

4 months agotestsuite: Mark threadstatus-9333 as fragile in profthreaded
Ben Gamari [Mon, 23 Sep 2019 18:23:52 +0000 (14:23 -0400)] 
testsuite: Mark threadstatus-9333 as fragile in profthreaded

Due to #16555.

4 months agohadrian: Update source-repository
Ben Gamari [Mon, 23 Sep 2019 16:00:16 +0000 (12:00 -0400)] 
hadrian: Update source-repository

4 months agogitlab-ci: Bump ci-images
Ben Gamari [Thu, 19 Sep 2019 03:57:01 +0000 (23:57 -0400)] 
gitlab-ci: Bump ci-images

This bumps the CI Docker images to

4 months agobase: Add link to "A reflection on types"
Ben Gamari [Thu, 12 Sep 2019 18:17:45 +0000 (14:17 -0400)] 
base: Add link to "A reflection on types"

Fixes #17181.

4 months agoFix some duplication in the parser
Sebastian Graf [Mon, 23 Sep 2019 10:34:01 +0000 (10:34 +0000)] 
Fix some duplication in the parser

D3673 experienced reduce/reduce conflicts when trying to use
opt_instance for associated data families.

That was probably because the author tried to use it for
Haskell98-syntax without also applying it to GADT-syntax, which actually
leads to a reduce/reduce conflict. Consider the following state:

data . T = T
data . T where T :: T

The parser must decide at this point whether or not to reduce an empty
`opt_instance`. But doing so would also commit to either
Haskell98 or GADT syntax! Good thing we also accept an optional
"instance" for GADT syntax, so the `opt_instance` is there in both
productions and there's no reduce/reduce conflict anymore.

Also no need to inline `opt_instance`, how it used to be.

4 months agoHadrian: Add -haddock option for GHCi's :doc command
Takenobu Tani [Sun, 22 Sep 2019 03:13:28 +0000 (12:13 +0900)] 
Hadrian: Add -haddock option for GHCi's :doc command

This commit adds -haddock option to Hadrian-based build system.

To enable :doc command on GHCi, core libraries must be compiled
with -haddock option.
Especially, the `-haddock` option is essential for a release build.

Assuming current GitLab CI condition (.gitlab-ci.yml),
I add -haddock option to the default flavour only.

This has already been done for Make-based build system.
Please see #16415.

4 months agoSome leftovers from !1732. Comments only [skip ci]
Sebastian Graf [Mon, 23 Sep 2019 15:40:19 +0000 (15:40 +0000)] 
Some leftovers from !1732. Comments only [skip ci]

4 months agoAdd -fkeep-going to make compiler continue despite errors (#15424)
Kari Pahula [Fri, 20 Sep 2019 07:11:53 +0000 (10:11 +0300)] 
Add -fkeep-going to make compiler continue despite errors (#15424)

Add a new optional failure handling for upsweep which continues
the compilation on other modules if any of them has errors.

4 months ago[hadrian] Rebuild programs on dynamicGhcPrograms/ghcProfiled change
Artem Pyanykh [Wed, 11 Sep 2019 20:12:32 +0000 (21:12 +0100)] 
[hadrian] Rebuild programs on dynamicGhcPrograms/ghcProfiled change

Currently, if you change these ^ flavour parameters, rebuilding is not
triggered, since `programContext` doesn't set up a dependency on
those values.

Exposing these values via an oracle does set the dependency and
properly triggers a rebuild of binaries.

Several attempts to factor out these actions ended up in cyclic
dependency here or there. I'm not absolutely happy with this variant
either, but at least it works.


Issue repro:

In UserSettings.hs:
dbgDynamic = defaultFlavour { name = "dbg-dynamic"
                            , dynamicGhcPrograms = pure True,
                            ... }

dbgStatic = defaultFlavour { name = "dbg-static"
                           , dynamicGhcPrograms = pure False
                           ... }

Then in console:

$ hadrian/ -j --flavour=dbg-dynamic
... does the build
$ hadrian/ -j --flavour=dbg-static
... does nothing, considers binaries up to date

4 months agosort-paragraphs in runBuilderWith
Björn Gohla [Sat, 21 Sep 2019 13:13:30 +0000 (15:13 +0200)] 
sort-paragraphs in runBuilderWith

4 months agoalphabetical ordering
Björn Gohla [Sat, 21 Sep 2019 13:09:33 +0000 (15:09 +0200)] 
alphabetical ordering

4 months agoexplicit dependence on makeinfo
Björn Gohla [Fri, 30 Aug 2019 18:13:08 +0000 (20:13 +0200)] 
explicit dependence on makeinfo

4 months agodetect makeinfo in configure(.ac)
Björn Gohla [Fri, 30 Aug 2019 01:18:10 +0000 (03:18 +0200)] 
detect makeinfo in configure(.ac)

4 months agouse the Make builder instead of raw cmd_
Björn Gohla [Fri, 30 Aug 2019 00:53:26 +0000 (02:53 +0200)] 
use the Make builder instead of raw cmd_

4 months agoadd Hadrian rule to build user guide as Info book
Björn Gohla [Mon, 26 Aug 2019 22:05:45 +0000 (00:05 +0200)] 
add Hadrian rule to build user guide as Info book

4 months agobase: add newtypes for socklen_t and ndfs_t to System.Posix.Types #16568
Adam Sandberg Eriksson [Fri, 2 Aug 2019 14:04:28 +0000 (16:04 +0200)] 
base: add newtypes for socklen_t and ndfs_t to System.Posix.Types #16568

Metric Increase:

4 months agousers-guide: Fix links and formats for GHC 8.10
Takenobu Tani [Mon, 23 Sep 2019 07:34:03 +0000 (16:34 +0900)] 
users-guide: Fix links and formats for GHC 8.10

This commit only fixes links and markdown syntax.

[skip ci]

4 months agogitlab-ci: Fix URL of Windows cabal-install tarball
Ben Gamari [Sun, 22 Sep 2019 13:50:57 +0000 (09:50 -0400)] 
gitlab-ci: Fix URL of Windows cabal-install tarball

4 months agorts: TraverseHeap: Add doc comment for getTraverseStackMaxSize
Daniel Gröber [Sun, 22 Sep 2019 13:33:41 +0000 (15:33 +0200)] 
rts: TraverseHeap: Add doc comment for getTraverseStackMaxSize

4 months agorts: RetainerProfile: Explain retainVisitClosure return values
Daniel Gröber [Thu, 12 Sep 2019 22:07:28 +0000 (00:07 +0200)] 
rts: RetainerProfile: Explain retainVisitClosure return values

[ci skip]

4 months agorts: TraverseHeap: Move stackElement.cp back into nextPos union
Daniel Gröber [Tue, 9 Jul 2019 09:09:34 +0000 (11:09 +0200)] 
rts: TraverseHeap: Move stackElement.cp back into nextPos union

The 'cp' field really is only used when type==posTypeFresh so it's more
space efficient to have it in the nextPos union.

4 months agorts: TraverseHeap: Make pushStackElement argument const
Daniel Gröber [Mon, 8 Jul 2019 12:53:32 +0000 (14:53 +0200)] 
rts: TraverseHeap: Make pushStackElement argument const

4 months agorts: TraverseHeap: Make comment style consistent
Daniel Gröber [Sat, 6 Jul 2019 04:30:40 +0000 (06:30 +0200)] 
rts: TraverseHeap: Make comment style consistent

4 months agorts: Split heap traversal from retainer profiler
Daniel Gröber [Thu, 4 Jul 2019 03:11:09 +0000 (05:11 +0200)] 
rts: Split heap traversal from retainer profiler

This finally moves the newly generalised heap traversal code from the
retainer profiler into it's own file.

4 months agorts: RetainerProfile.c: Minimize #includes
Daniel Gröber [Thu, 4 Jul 2019 03:09:21 +0000 (05:09 +0200)] 
rts: RetainerProfile.c: Minimize #includes

A lot of these includes are presumably leftovers from when the retainer
profiler still did it's own heap profiling.

4 months agorts: RetainerProfile.c: Re-enable and fix warnings
Daniel Gröber [Thu, 4 Jul 2019 02:48:07 +0000 (04:48 +0200)] 
rts: RetainerProfile.c: Re-enable and fix warnings

Turns out some genius disabled warnings for RetainerProfile.c in the build
system. That would have been good to know about five silent type mismatch
crashes ago.. :)

4 months agorts: retainer: Improve Note [Profiling heap traversal visited bit]
Daniel Gröber [Tue, 16 Jul 2019 14:05:36 +0000 (16:05 +0200)] 
rts: retainer: Improve Note [Profiling heap traversal visited bit]

4 months agorts: retainer: Make visit callback easier to implement
Daniel Gröber [Tue, 16 Jul 2019 14:02:05 +0000 (16:02 +0200)] 
rts: retainer: Make visit callback easier to implement

Currently it is necessary for user code to expend at least one extra bit in
the closure header just to know whether visit() should return true or
false, to indicate if children should be traversed.

The generic traversal code already has this information in the visited bit
so simply pass it to the visit callback.

4 months agorts: retainer: Move mut_list reset to generic traversal code
Daniel Gröber [Mon, 24 Jun 2019 19:29:10 +0000 (21:29 +0200)] 
rts: retainer: Move mut_list reset to generic traversal code

4 months agorts: retainer: Remove traverse-stack chunk support
Daniel Gröber [Fri, 5 Jul 2019 07:30:53 +0000 (09:30 +0200)] 
rts: retainer: Remove traverse-stack chunk support

There's simply no need anymore for this whole business. Instead of
individually traversing roots in retainRoot() we just push them all onto
the stack and traverse everything in one go.

This feature was not really used anyways. There is an
`ASSERT(isEmptyWorkStack(ts))` at the top of retainRoot() which means there
really can't ever have been any chunks at the toplevel.

The only place where this was probably used is in traversePushStack but
only way back when we were still using explicit recursion on the
C callstack.

Since the code was changed to use an explicit traversal-stack these
stack-chunks can never escape one call to traversePushStack anymore.  See
commit 5f1d949ab9 ("Remove explicit recursion in retainer profiling")

4 months agorts: retainer: Move actual 'flip' bit flip to generic traversal code
Daniel Gröber [Tue, 16 Jul 2019 13:59:34 +0000 (15:59 +0200)] 
rts: retainer: Move actual 'flip' bit flip to generic traversal code

4 months agorts: retainer: Update obsolete docs for traverseMaybeInitClosureData
Daniel Gröber [Mon, 24 Jun 2019 18:08:38 +0000 (20:08 +0200)] 
rts: retainer: Update obsolete docs for traverseMaybeInitClosureData

4 months agorts: retainer: Abstract maxStackSize for generic traversal
Daniel Gröber [Mon, 24 Jun 2019 19:32:56 +0000 (21:32 +0200)] 
rts: retainer: Abstract maxStackSize for generic traversal

4 months agorts: retainer: Move heap traversal declarations to new header
Daniel Gröber [Mon, 24 Jun 2019 16:24:30 +0000 (18:24 +0200)] 
rts: retainer: Move heap traversal declarations to new header

4 months agorts: retainer: Use global STATIC_INLINE macro
Daniel Gröber [Mon, 24 Jun 2019 16:20:03 +0000 (18:20 +0200)] 
rts: retainer: Use global STATIC_INLINE macro

STATIC_INLINE already does what the code wanted here, no need to duplicate
the functionality here.

4 months agorts: retainer: Remove outdated invariants on traversePushStack
Daniel Gröber [Sun, 23 Jun 2019 16:54:50 +0000 (18:54 +0200)] 
rts: retainer: Remove outdated invariants on traversePushStack

These invariants don't seem to make any sense in the current code.  The
text talks about c_child_r as if it were an StgClosure, for which RSET()
would make sense, but it's a retainer aka 'CostCentreStack*'.

4 months agorts: retainer: Cleanup comments and strings for traversal extraction
Daniel Gröber [Sun, 23 Jun 2019 14:33:25 +0000 (16:33 +0200)] 
rts: retainer: Cleanup comments and strings for traversal extraction

A lot of comments and strings are still talking about old names, fix

4 months agorts: retainer: Reduce DEBUG_RETAINER ifdef noise
Daniel Gröber [Sun, 23 Jun 2019 16:41:40 +0000 (18:41 +0200)] 
rts: retainer: Reduce DEBUG_RETAINER ifdef noise

Keeping track of the maximum stack seems like a good idea in all
configurations. The associated ASSERTs only materialize in debug mode but
having the statistic is nice.

To make the debug code less prone to bitrotting I introduce a function
'debug()' which doesn't actually print by default and is #define'd away
only when the standard DEBUG define is off.

4 months agorts: retainer: Rename heap traversal functions for extraction
Daniel Gröber [Sun, 23 Jun 2019 14:30:12 +0000 (16:30 +0200)] 
rts: retainer: Rename heap traversal functions for extraction

This gets all remaining functions in-line with the new 'traverse' prefix
and module name.

4 months agorts: retainer: Remove obsolete debug code
Daniel Gröber [Thu, 20 Jun 2019 18:48:12 +0000 (20:48 +0200)] 
rts: retainer: Remove obsolete debug code

Commit dbef766ce7 ("Profiling cleanup.") made this debug code obsolete by
removing the 'cost' function without a replacement. As best I can tell the
retainer profiler used to do some heap census too and this debug code was
mainly concerned with that.

4 months agorts: RetainerSet: Remove obsolete fist/second-approach choice
Daniel Gröber [Thu, 20 Jun 2019 18:13:45 +0000 (20:13 +0200)] 
rts: RetainerSet: Remove obsolete fist/second-approach choice

In the old code when DEBUG_RETAINER was set, FIRST_APPROACH is
implied. However ProfHeap.c now depends on printRetainerSetShort which is
only available with SECOND_APPROACH. This is because with FIRST_APPROACH
retainerProfile() will free all retainer sets before returning so by the
time ProfHeap calls dumpCensus the retainer set pointers are segfaulty.

Since all of this debugging code obviously hasn't been compiled in ages
anyways I'm taking the liberty of just removing it.

Remember guys: Dead code is a liability not an asset :)

4 months agorts: Add note reference to SET_PROF_HDR for profiling 'flip' bit
Daniel Gröber [Thu, 20 Jun 2019 17:59:53 +0000 (19:59 +0200)] 
rts: Add note reference to SET_PROF_HDR for profiling 'flip' bit

4 months agorts: retainer: simplify pop() control flow
Daniel Gröber [Mon, 17 Jun 2019 09:46:07 +0000 (11:46 +0200)] 
rts: retainer: simplify pop() control flow

Instead of breaking out of the switch-in-while construct using `return` this
uses `goto out` which makes it possible to share a lot of the out-variable
assignment code in all the cases.

I also replaced the nasty `while(true)` business by the real loop
condition: `while(*c == NULL)`. All `break` calls inside the switch aready
have either a check for NULL or an assignment of `c` to NULL so this should
not change any behaviour.

Using `goto out` also allowed me to remove another minor wart: In the
MVAR_*/WEAK cases the popOff() call used to happen before reading the
stackElement. This looked like a use-after-free hazard to me as the stack
is allocated in blocks and depletion of a block could mean it getting freed
and possibly overwritten by zero or garbage, depending on the block
allocator's behaviour.

4 months agorts: retainer: Pull retainer specific code into a callback
Daniel Gröber [Sun, 16 Jun 2019 12:38:02 +0000 (14:38 +0200)] 
rts: retainer: Pull retainer specific code into a callback

This essentially turns the heap traversal code into a visitor. You add a
bunch of roots to the work-stack and then the callback you give to
traverseWorkStack() will be called with every reachable closure at least

4 months agorts: GC: Remove redundant #include "RetainerProfiler.h"
Daniel Gröber [Fri, 14 Jun 2019 16:02:49 +0000 (18:02 +0200)] 
rts: GC: Remove redundant #include "RetainerProfiler.h"

4 months agorts: Generalise profiling heap traversal flip bit handling
Daniel Gröber [Fri, 14 Jun 2019 16:01:59 +0000 (18:01 +0200)] 
rts: Generalise profiling heap traversal flip bit handling

This commit starts renaming some flip bit related functions for the
generalised heap traversal code and adds provitions for sharing the
per-closure profiling header field currently used exclusively for retainer
profiling with other heap traversal profiling modes.

4 months agorts: retainer: Fix comment typo s/keeps/keep/
Daniel Gröber [Fri, 14 Jun 2019 12:31:15 +0000 (14:31 +0200)] 
rts: retainer: Fix comment typo s/keeps/keep/

4 months agorts: retainer: Generalise per-stackElement data
Daniel Gröber [Fri, 14 Jun 2019 12:27:07 +0000 (14:27 +0200)] 
rts: retainer: Generalise per-stackElement data

This essentially ammounts to s/retainer/stackData/, s/c_child_r/data/ and
some temporary casting of c_child_r to stackData until refactoring of this
module is completed by a subsequent commit. We also introduce a new union
'stackData' which will contain the actual extra data to be stored on the

The idea is to make the heap traversal logic of the retainer profiler ready
for extraction into it's own module. So talking about "retainers" there
doesn't really make sense anymore.

Essentially the "retainers" we store in the stack are just data associated
with the push()ed closures which we return when pop()ing it.

4 months agorts: retainer: Move to stackElement
Daniel Gröber [Thu, 6 Jun 2019 07:19:44 +0000 (09:19 +0200)] 
rts: retainer: Move to stackElement

I don't see a point in having this live in 'info', just seems to make the
code more complicated.

4 months agorts: retainer: Turn global traversal state into a struct
Daniel Gröber [Thu, 6 Jun 2019 07:15:39 +0000 (09:15 +0200)] 
rts: retainer: Turn global traversal state into a struct

Global state is ugly and hard to test. Since the profiling code isn't quite
as performance critical as, say, GC we should prefer better code here.

I would like to move the 'flip' bit into the struct too but that's
complicated by the fact that the defines which use it directly are also
called from ProfHeap where the traversalState is not easily
available. Maybe in a future commit.

4 months agorts: Fix outdated references to 'ldvTime'
Daniel Gröber [Thu, 20 Jun 2019 17:42:10 +0000 (19:42 +0200)] 
rts: Fix outdated references to 'ldvTime'

This got renamed to 'era' in dbef766ce7 ("[project @ 2001-11-26 16:54:21 by
simonmar] Profiling cleanup").

4 months agorts: Remove bitrotten retainer debug code
Daniel Gröber [Thu, 20 Jun 2019 17:22:45 +0000 (19:22 +0200)] 
rts: Remove bitrotten retainer debug code

The `defined(DEBUG_RETAINER) == true` branch doesn't even compile anymore
because 1) retainerSet was renamed to RetainerSet and 2) even if I fix that
the context in Rts.h seems to have changed such that it's not in scope. If
3) I fix that 'flip' is still not in scope :)  At that point I just gave up.

4 months agorts: retainer: Remove cStackSize debug counter
Daniel Gröber [Thu, 6 Jun 2019 07:28:47 +0000 (09:28 +0200)] 
rts: retainer: Remove cStackSize debug counter

This can only ever be one since 5f1d949ab9 ("Remove explicit recursion in
retainer profiling"), so it's pointless.

4 months agoFix haddocks for marker events in Debug.Trace
Alp Mestanogullari [Fri, 20 Sep 2019 11:41:07 +0000 (07:41 -0400)] 
Fix haddocks for marker events in Debug.Trace

4 months agoGet rid of PmFake wip/pmcheck-nofake
Sebastian Graf [Wed, 18 Sep 2019 16:15:36 +0000 (16:15 +0000)] 
Get rid of PmFake

The pattern match oracle can now cope with the abundance of information
that ViewPatterns, NPlusKPats, overloaded lists, etc. provide.

No need to have PmFake anymore!

Also got rid of a spurious call to `allCompleteMatches`, which we used to call
*for every constructor* match. Naturally this blows up quadratically for
programs like `ManyAlternatives`.

Metric Decrease:

Metric Increase:

4 months agoDocument MIN_PAYLOAD_SIZE and mark-compact GC mark bits
Ömer Sinan Ağacan [Thu, 19 Sep 2019 07:16:09 +0000 (10:16 +0300)] 
Document MIN_PAYLOAD_SIZE and mark-compact GC mark bits

This updates the documentation of the MIN_PAYLOAD_SIZE constant and adds
a new Note [Mark bits in mark-compact collector] explaning why the
mark-compact collector uses two bits per objet and why we need

4 months agoPredType for type constraints in the pattern match checker instead of EvVar
Sebastian Graf [Mon, 16 Sep 2019 16:04:00 +0000 (16:04 +0000)] 
PredType for type constraints in the pattern match checker instead of EvVar

Using EvVars for capturing type constraints implied side-effects in DsM
when we just wanted to *construct* type constraints.

But giving names to type constraints is only necessary when passing
Givens to the type checker, of which the majority of the pattern match
checker should be unaware.

Thus, we simply generate `newtype TyCt = TyCt PredType`, which are
nicely stateless. But at the same time this means we have to allocate
EvVars when we want to query the type oracle! So we keep the type oracle
state as `newtype TyState = TySt (Bag EvVar)`, which nicely makes a
distinction between new, unchecked `TyCt`s and the inert set in