4 days agoUse run-time tablesNextToCode in compiler exclusively (#15548) wip/D5082
Joachim Breitner [Mon, 21 Jan 2019 00:25:26 +0000 (19:25 -0500)] 
Use run-time tablesNextToCode in compiler exclusively (#15548)


 - There is no more use of the TABLES_NEXT_TO_CODE CPP macro in
   `compiler/`. GHCI_TABLES_NEXT_TO_CODE is also removed entirely.
   The field within `PlatformMisc` within `DynFlags` is used instead.

 - The field is still not exposed as a CLI flag. We might consider some
   way to ensure the right RTS / libraries are used before doing that.

Original reviewers:

Original subscribers: TerrorJack, rwbarton, carter

Original Differential Revision:

4 days agoMerge branch 'always-enable-external-interpreter' into HEAD
John Ericson [Sun, 14 Jul 2019 02:58:42 +0000 (22:58 -0400)] 
Merge branch 'always-enable-external-interpreter' into HEAD

4 days agoConsolidate `TablesNextToCode` and `GhcUnreigsterised` in configure (#15548)
Joachim Breitner [Mon, 21 Jan 2019 00:25:26 +0000 (19:25 -0500)] 
Consolidate `TablesNextToCode` and `GhcUnreigsterised` in configure (#15548)

`TablesNextToCode` is now a substituted by configure, where it has the
correct defaults and error handling. Nowhere else needs to duplicate
that, though we may want the compiler to to guard against bogus settings

I renamed it from `GhcEnableTablesNextToCode` to `TablesNextToCode` to:

 - Help me guard against any unfixed usages

 - Remove any lingering connotation that this flag needs to be combined
   with `GhcUnreigsterised`.

Original reviewers:

Original subscribers: TerrorJack, rwbarton, carter

Original Differential Revision:

4 days agoAlways enable the external interpreter
John Ericson [Thu, 11 Jul 2019 22:42:35 +0000 (18:42 -0400)] 
Always enable the external interpreter

You can always just not use or even build `iserv`. I don't think the
maintenance cost of the CPP is worth...I can't even tell what the
benefit is.

4 days agoAdd tryFindTopDir to look for the top dir without blowing up if it is
John Ericson [Fri, 12 Jul 2019 22:45:49 +0000 (18:45 -0400)] 
Add tryFindTopDir to look for the top dir without blowing up if it is
not found.

4 days agoPull out the settings file parsing code into it's own module.
John Ericson [Fri, 12 Jul 2019 21:55:56 +0000 (17:55 -0400)] 
Pull out the settings file parsing code into it's own module.

This has two benefits:

1. One less hunk of code dependent on DynFlags

2. Add a little bit of error granularity to distrinugish between missing
   data and bad data. This could someday be shared with ghc-pkg which
   aims to work even with a missing file. I also am about to to make
   --supported-extensions use this too.

4 days agoFactor out a smaller part of Platform for host fallback
John Ericson [Fri, 12 Jul 2019 16:04:08 +0000 (12:04 -0400)] 
Factor out a smaller part of Platform for host fallback

5 days agoAdd shake 0.18.3 to extra deps
Shayne Fletcher [Tue, 9 Jul 2019 18:08:18 +0000 (14:08 -0400)] 
Add shake 0.18.3 to extra deps

5 days agoFix kind-checking for data/newtypes
Simon Peyton Jones [Wed, 26 Jun 2019 11:24:55 +0000 (12:24 +0100)] 
Fix kind-checking for data/newtypes

In one spot in kcConDecl we were passing in the return
kind signature rether than the return kind. e.g. #16828

   newtype instance Foo :: Type -> Type where
     MkFoo :: a -> Foo a

We were giving kcConDecl the kind (Type -> Type), whereas it
was expecting the ultimate return kind, namely Type.

This "looking past arrows" was being done, independently,
in several places, but we'd missed one.  This patch moves it all
to one place -- the new function kcConDecls (note the plural).

I also took the opportunity to rename
  tcDataFamHeader  to   tcDataFamInstHeader

(The previous name was consistently a source of confusion.)

6 days agohead.hackage: Run builds with -dcore-lint
Ben Gamari [Mon, 8 Jul 2019 11:35:08 +0000 (07:35 -0400)] 
head.hackage: Run builds with -dcore-lint

6 days agohead.hackage: Run build on head.hackage's master branch
Ben Gamari [Mon, 8 Jul 2019 11:33:03 +0000 (07:33 -0400)] 
head.hackage: Run build on head.hackage's master branch

The GitLab CI infrastructure is now in the master branch.

6 days agoAllow reusing temporary object files generated by GHCi by writing to -odir in case...
nineonine [Mon, 8 Jul 2019 07:09:15 +0000 (00:09 -0700)] 
Allow reusing temporary object files generated by GHCi by writing to -odir in case -fwrite-interface was specified (#16670)

6 days agoDon't typecheck too much (or too little) in DerivingVia (#16923)
Ryan Scott [Mon, 8 Jul 2019 00:14:14 +0000 (20:14 -0400)] 
Don't typecheck too much (or too little) in DerivingVia (#16923)

Previously, GHC would typecheck the `via` type once per class in a
`deriving` clause, which caused the problems observed in #16923.
This patch restructures some of the functionality in `TcDeriv` and
`TcHsType` to avoid this problem. We now typecheck the `via` type
exactly once per `deriving` clause and *then* typecheck all of the
classes in the clause.
See `Note [Don't typecheck too much in DerivingVia]` in `TcDeriv`
for the full details.

6 days agoSpecial case a few common patterns in unionLists.
Andreas Klebinger [Sun, 7 Jul 2019 19:50:56 +0000 (21:50 +0200)] 
Special case a few common patterns in unionLists.

In particular we very often pass one empty list and in these
cases we want to avoid the overhead of computing `xs ++ []`.

This should fix #14759 and #16911.

6 days agoAdd regression test for old panic on inlining undeclared identifier (#495)
Kevin Buhr [Tue, 7 May 2019 16:01:14 +0000 (11:01 -0500)] 
Add regression test for old panic on inlining undeclared identifier (#495)

8 days agoFix erroneous float in CoreOpt
Simon Peyton Jones [Mon, 8 Jul 2019 14:09:52 +0000 (15:09 +0100)] 
Fix erroneous float in CoreOpt

The simple optimiser was making an invalid transformation
to join points -- yikes.  The fix is easy.

I also added some documentation about the fact that GHC uses
a slightly more restrictive version of join points than does
the paper.

Fix #16918

8 days agohadrian/doc: Add some discussion of compilation stages
Ben Gamari [Mon, 8 Jul 2019 12:00:55 +0000 (08:00 -0400)] 
hadrian/doc: Add some discussion of compilation stages

This documents some of the lore surrounding the nature and naming of
GHC's stage numbers.

8 days agoT16804: adjust src spans
Eric Wolf [Sun, 7 Jul 2019 17:08:22 +0000 (19:08 +0200)] 
T16804: adjust src spans

8 days agoAdd testcase T16804 for #16804
Eric Wolf [Sat, 6 Jul 2019 15:36:24 +0000 (17:36 +0200)] 
Add testcase T16804 for #16804

slightly larger testcase for :type-at and :uses
so we can see changes, if #16804 is done.

8 days agoMinor refactoring in CoreSimpl
Ömer Sinan Ağacan [Sun, 7 Jul 2019 06:13:13 +0000 (09:13 +0300)] 
Minor refactoring in CoreSimpl

When `join_ids` is empty `extendVarSetList existing_joins join_ids` is
already no-op, so no need to check whether `join_ids` is empty or not
before extending the joins set.

8 days agoTestsuite tweaks and refactoring
Ömer Sinan Ağacan [Thu, 27 Jun 2019 08:46:20 +0000 (11:46 +0300)] 
Testsuite tweaks and refactoring

- Rename requires_th to req_th for consistency with other req functions
  (e.g. req_interp, req_profiling etc.)

- req_th (previously requires_th) now checks for interpreter (via
  req_interp). With this running TH tests are skipped when running the
  test suite with stage=1.

- Test tweaks:
    - T9360a, T9360b: Use req_interp
    - recomp009, T13938, RAE_T32a: Use req_th

- Fix check-makefiles linter: it now looks for Makefiles instead of .T
  files (which are actually Python files)

8 days agoHadrian: fix source-dist rule
Alp Mestanogullari [Tue, 25 Jun 2019 12:21:59 +0000 (14:21 +0200)] 
Hadrian: fix source-dist rule

The first problem was that the list of files/dirs to embed or ignore was not
up-to-date. The second problem was that the 'Cwd' option used when running the
Tar builder in the source-dist rule didn't actually change the current directory
and was therefore failing. Finally, the source-dist rule did not pre-generate
Haskell modules derived from .x (alex) and .y (happy) files, like the Make
build system does -- this is now fixed.

We might be doing too much work for that last step (we seem to be building
many things until we get to generating the source distribution), but extracting
the distribution and running

    ./configure && hadrian/ --flavour=quickest -j

from there does work for me now.

8 days agoHadrian: implement key-value settings for builder options
Alp Mestanogullari [Mon, 24 Jun 2019 18:43:49 +0000 (20:43 +0200)] 
Hadrian: implement key-value settings for builder options

They take the general form ` [+]= some values`, where
`=` completely overrides the arguments for a builder and `+=` extends
them. We currenly only support settings for updating the GHC and C
compiler options, of the form:

  {stage0, ..., stage3 or *}.{package name or *}
                            .ghc.{c, hs, link, deps, toolargs or *}.opts

  {stage0, ..., stage3 or *}.{package name or *}
                            .cc.{c, deps or *}.opts

The supported settings and their use is covered in the new section
of `hadrian/doc/`, while the implementation is explained
in a new Note [Hadrian settings].

Most of the logic is implemented in a new module, `Settings.Parser`, which
contains key-value assignment/extension parsers as well as utilities for
specifying allowed settings at a high-level, generating a `Predicate` from
such a description or generating the list of possible completions for a given

The additions to the `Settings` module make use of this to describe the
settings that Hadrian currently supports, and apply all such
key-value settings (from the command line and `<root>/hadrian.settings`)
to the flavour that Hadrian is going to proceed with.

This new setting system comes with support for generating Bash completions,
implemented in `hadrian/` and Hadrian's `autocomplete` target:

> source hadrian/
> hadrian/ stage1.base.ghc.<TAB>
stage1.base.ghc.c.opts     stage1.base.ghc.hs.opts
stage1.base.ghc.*.opts     stage1.base.ghc.deps.opts  stage1.base.ghc.toolargs.opts

8 days agotestsuite: Fix #16818
Ben Gamari [Mon, 24 Jun 2019 17:25:50 +0000 (13:25 -0400)] 
testsuite: Fix #16818

Renames performance metrics to include whether they are compile-time or
runtime metrics.

8 days agoDeduplicate "unique subdir" code between GHC and Cabal
John Ericson [Thu, 20 Jun 2019 22:04:30 +0000 (18:04 -0400)] 
Deduplicate "unique subdir" code between GHC and Cabal

The code, including the generated module with the version, is now in
ghc-boot. Config.hs reexports stuff as needed, ghc-pkg doesn't need any
tricks at all.

8 days agoRemove most uses of TARGET platform macros
John Ericson [Mon, 8 Apr 2019 02:33:21 +0000 (22:33 -0400)] 
Remove most uses of TARGET platform macros

These prevent multi-target builds. They were gotten rid of in 3 ways:

1. In the compiler itself, replacing `#if` with runtime `if`. In these
cases, we care about the target platform still, but the target platform
is dynamic so we must delay the elimination to run time.

2. In the compiler itself, replacing `TARGET` with `HOST`. There was
just one bit of this, in some code splitting strings representing lists
of paths. These paths are used by GHC itself, and not by the compiled
binary. (They are compiler lookup paths, rather than RPATHS or something
that does matter to the compiled binary, and thus would legitamentally
be target-sensative.) As such, the path-splitting method only depends on
where GHC runs and not where code it produces runs. This should have
been `HOST` all along.

3. Changing the RTS. The RTS doesn't care about the target platform,
full stop.

4. `includes/stg/HaskellMachRegs.h` This file is also included in the
genapply executable. This is tricky because the RTS's host platform
really is that utility's target platform. so that utility really really
isn't multi-target either. But at least it isn't an installed part of
GHC, but just a one-off tool when building the RTS. Lying with the
`HOST` to a one-off program (genapply) that isn't installed doesn't seem so bad.
It's certainly better than the other way around of lying to the RTS
though not to genapply. The RTS is more important, and it is installed,
*and* this header is installed as part of the RTS.

8 days agoFix two more `#ifndef` for the linter
John Ericson [Fri, 21 Jun 2019 00:30:25 +0000 (20:30 -0400)] 
Fix two more `#ifndef` for the linter

8 days agoFix #16511: changes in interface dependencies should trigger recompilation
Phuong Trinh [Wed, 8 May 2019 16:59:14 +0000 (17:59 +0100)] 
Fix #16511: changes in interface dependencies should trigger recompilation

If the union of dependencies of imported modules change, the `mi_deps`
field of the interface files should change as well. Because of that, we
need to check for changes in this in recompilation checker which we are
not doing right now. This adds a checks for that.

8 days agoUse an empty data type in TTG extension constructors (#15247)
Ryan Scott [Tue, 19 Mar 2019 21:47:55 +0000 (17:47 -0400)] 
Use an empty data type in TTG extension constructors (#15247)

To avoid having to `panic` any time a TTG extension constructor is
consumed, this MR introduces an uninhabited 'NoExtCon' type and uses
that in every extension constructor's type family instance where it
is appropriate. This also introduces a 'noExtCon' function which
eliminates a 'NoExtCon', much like 'Data.Void.absurd' eliminates
a 'Void'.

I also renamed the existing `NoExt` type to `NoExtField` to better
distinguish it from `NoExtCon`. Unsurprisingly, there is a lot of
code churn resulting from this.

Bumps the Haddock submodule. Fixes #15247.

9 days agoAdd test for old issue w/ bad source locations for warnings in .lhs files (#515)
Kevin Buhr [Tue, 7 May 2019 04:05:34 +0000 (23:05 -0500)] 
Add test for old issue w/ bad source locations for warnings in .lhs files (#515)

9 days agoBump Shake and copy instead of hard link from cloud cache
David Eichmann [Wed, 3 Jul 2019 10:25:11 +0000 (11:25 +0100)] 
Bump Shake and copy instead of hard link from cloud cache

This is important as in hard link mode shake  makes all such files
read only to avoid accidentally modifying cache files via the
hard link. It turns out, many Hadrian rules attempt read access
to such files and hence fail in the hard link mode. These
rules could be refactored to avoid write access, but using
copy instead of hard link a much simpler solution.

12 days agoFix #16895 by checking whether infix expression operator is a variable
nineonine [Tue, 2 Jul 2019 19:44:22 +0000 (12:44 -0700)] 
Fix #16895 by checking whether infix expression operator is a variable

12 days agoMore sensible SrcSpans for recursive pattern synonym errors (#16900)
Ryan Scott [Tue, 2 Jul 2019 16:55:37 +0000 (12:55 -0400)] 
More sensible SrcSpans for recursive pattern synonym errors (#16900)

Attach the `SrcSpan` of the first pattern synonym binding involved in
the recursive group when throwing the corresponding error message,
similarly to how it is done for type synonyms.

Fixes #16900.

12 days agoMake all submodules have absolute URLs
Artem Pelenitsyn [Sat, 22 Jun 2019 07:40:00 +0000 (07:40 +0000)] 
Make all submodules have absolute URLs

The relative URLs were a workaround to let most contributors fork from
Github due to a weakness in the server.

This workaround is no longer needed. And relative submodule URLs are
an impediment to forking which makes contributions harder than they
should be.

The URLs are chosen to clone from https, because this makes sure that
anybody, even not a registered Gitlab user, can clone a fork

13 days agoDont gather ticks when only striping them in STG.
Andreas Klebinger [Thu, 4 Jul 2019 10:50:00 +0000 (12:50 +0200)] 
Dont gather ticks when only striping them in STG.

Adds stripStgTicksTopE which only returns the stripped expression.
So far we also allocated a list for the stripped ticks which was
never used.

Allocation difference is as expected very small but present.
About 0.02% difference when compiling with -O.

13 days agoFix over-eager implication constraint discard
Simon Peyton Jones [Thu, 4 Jul 2019 07:41:12 +0000 (08:41 +0100)] 
Fix over-eager implication constraint discard

Ticket #16247 showed that we were discarding an implication
constraint that had empty ic_wanted, when we still needed to
keep it so we could check whether it had a bad telescope.

Happily it's a one line fix.  All the rest is comments!

13 days agorts: Fix -hT option with profiling rts
Daniel Gröber [Thu, 4 Jul 2019 04:49:15 +0000 (06:49 +0200)] 
rts: Fix -hT option with profiling rts

In dumpCensus we switch/case on doHeapProfile twice. The second switch
tries to barf on unknown doHeapProfile modes but HEAP_BY_CLOSURE_TYPE is
checked by the first switch and not included in the second.

So when trying to pass -hT to the profiling rts it barfs.

This commit simply merges the two switches into one which fixes this

13 days agoAdd a missing zonk (fixes #16902)
Simon Peyton Jones [Wed, 3 Jul 2019 07:55:26 +0000 (08:55 +0100)] 
Add a missing zonk (fixes #16902)

In the eager unifier, when unifying (tv1 ~ tv2),
when we decide to swap them over, to unify (tv2 ~ tv1),
I'd forgotten to ensure that tv1's kind was fully zonked,
which is an invariant of uUnfilledTyVar2.

That could lead us to build an infinite kind, or (in the
case of #16902) update the same unification variable twice.


Now we get an error message rather than non-termination,
which is much better.  The error message is not great,
but it's a very strange program, and I can't see an easy way
to improve it, so for now I'm just committing this fix.

Here's the decl
 data F (a :: k) :: (a ~~ k) => Type where
    MkF :: F a

and the rather error message of which I am not proud

  T16902.hs:11:10: error:
    • Expected a type, but found something with kind ‘a1’
    • In the type ‘F a’

13 days agoProduce all DerivInfo in tcTyAndClassDecls
Vladislav Zavialov [Fri, 28 Jun 2019 18:01:39 +0000 (21:01 +0300)] 
Produce all DerivInfo in tcTyAndClassDecls

Before this refactoring:

* DerivInfo for data family instances was returned from tcTyAndClassDecls
* DerivInfo for data declarations was generated with mkDerivInfos and added at a
  later stage of the pipeline in tcInstDeclsDeriv

After this refactoring:

* DerivInfo for both data family instances and data declarations is returned from
  tcTyAndClassDecls in a single list.

This uniform treatment results in a more convenient arrangement to fix #16731.

13 days agogitlab: Reduce size of template headings
Ben Gamari [Tue, 2 Jul 2019 13:53:29 +0000 (09:53 -0400)] 
gitlab: Reduce size of template headings

13 days agoMake printer untag when chasing a pointer in a RET_FUN frame
Siddharth Bhat [Mon, 1 Jul 2019 10:33:36 +0000 (12:33 +0200)] 
Make printer untag when chasing a pointer in a RET_FUN frame

This is to mimic what `Scav.c` does. This should fix a crash in
the printer.

13 days agoBump parsec submodule to
Ben Gamari [Wed, 3 Jul 2019 05:45:50 +0000 (01:45 -0400)] 
Bump parsec submodule to

2 weeks agoBump template-haskell version to
Ryan Scott [Tue, 2 Jul 2019 22:22:39 +0000 (18:22 -0400)] 
Bump template-haskell version to

Commit cef80c0b9edca3d21b5c762f51dfbab4c5857d8a debuted a breaking
change to `template-haskell`, so in order to guard against it
properly with CPP, we need to bump the `template-haskell` version
number accordingly.

2 weeks agogitlab-ci: Fix doc-tarball job
Ben Gamari [Tue, 2 Jul 2019 16:21:36 +0000 (12:21 -0400)] 
gitlab-ci: Fix doc-tarball job

Previously we used the deb9-debug job which used the `validate` build
flavour which disabled `BUILD_SPHINX_PDF`. Fix this.

Fixes #16890.

2 weeks agoAdd support for SIMD operations in the NCG
Abhiroop Sarkar [Thu, 27 Sep 2018 19:28:46 +0000 (15:28 -0400)] 
Add support for SIMD operations in the NCG

This adds support for constructing vector types from Float#, Double# etc
and performing arithmetic operations on them

Cleaned-Up-By: Ben Gamari <>
2 weeks agoHadrian: disable cloud build cache for symlinks #16800
David Eichmann [Thu, 27 Jun 2019 10:11:28 +0000 (11:11 +0100)] 
Hadrian: disable cloud build cache for symlinks #16800

This is a temporary workaround shake not supporting symlinks
when using cloud/cached builds.

2 weeks agoFix stage 1 warnings
Ömer Sinan Ağacan [Wed, 26 Jun 2019 11:25:30 +0000 (14:25 +0300)] 
Fix stage 1 warnings

2 weeks agoAdd test for #16575
Eric Wolf [Tue, 25 Jun 2019 18:34:55 +0000 (20:34 +0200)] 
Add test for #16575

just use the test to show the defective behaviour, so we can see
the difference, when it gets fixed

2 weeks agoFix #15843 by extending Template Haskell AST for tuples to support sections
nineonine [Mon, 24 Jun 2019 05:44:37 +0000 (22:44 -0700)] 
Fix #15843 by extending Template Haskell AST for tuples to support sections

2 weeks agoApply suggestion to rts/linker/Elf.c
Ben Gamari [Tue, 11 Jun 2019 16:35:12 +0000 (12:35 -0400)] 
Apply suggestion to rts/linker/Elf.c

2 weeks agoApply suggestion to rts/linker/elf_got.c
Ben Gamari [Tue, 11 Jun 2019 16:35:07 +0000 (12:35 -0400)] 
Apply suggestion to rts/linker/elf_got.c

2 weeks agoNo atomics on arm32; this will just yield stubs.
Moritz Angermann [Wed, 22 May 2019 03:19:41 +0000 (11:19 +0800)] 
No atomics on arm32; this will just yield stubs.

As such the internal linker will fail for them.  The alternative
would be to implement them as stubs in the linker and have them
barf when called.

> Not all operations are supported by all target processors. If a
  particular operation cannot be implemented on the target processor,
  a warning is generated and a call an external function is
  generated. The external function carries the same name as the
  built-in version, with an additional suffix ‘_n’ where n is the size
  of the data type.


2 weeks agoLookup _GLOBAL_OFFSET_TABLE by symbol->addr when doing relocations
Edward Amsden [Thu, 16 May 2019 23:41:30 +0000 (19:41 -0400)] 
Lookup _GLOBAL_OFFSET_TABLE by symbol->addr when doing relocations

2 weeks agoAdd _GLOBAL_OFFSET_TABLE_ support
Moritz Angermann [Thu, 16 May 2019 05:35:31 +0000 (13:35 +0800)] 

This adds lookup logic for _GLOBAL_OFFSET_TABLE_ as well as
relocation logic for R_ARM_BASE_PREL and R_ARM_GOT_BREL which
the gnu toolchain (gas, gcc, ...) prefers to produce.  Apparently
recent llvm toolchains will produce those as well.

2 weeks agorts: Assert that LDV profiling isn't used with parallel GC wip/memory-barriers
Ben Gamari [Fri, 14 Jun 2019 15:15:16 +0000 (11:15 -0400)] 
rts: Assert that LDV profiling isn't used with parallel GC

I'm not entirely sure we are careful about ensuring this; this is a
last-ditch check.

2 weeks agoCorrect closure observation, construction, and mutation on weak memory machines.
Travis Whitaker [Wed, 3 Apr 2019 22:26:16 +0000 (15:26 -0700)] 
Correct closure observation, construction, and mutation on weak memory machines.

Here the following changes are introduced:
    - A read barrier machine op is added to Cmm.
    - The order in which a closure's fields are read and written is changed.
    - Memory barriers are added to RTS code to ensure correctness on
      out-or-order machines with weak memory ordering.

Cmm has a new CallishMachOp called MO_ReadBarrier. On weak memory machines, this
is lowered to an instruction that ensures memory reads that occur after said
instruction in program order are not performed before reads coming before said
instruction in program order. On machines with strong memory ordering properties
(e.g. X86, SPARC in TSO mode) no such instruction is necessary, so
MO_ReadBarrier is simply erased. However, such an instruction is necessary on
weakly ordered machines, e.g. ARM and PowerPC.

Weam memory ordering has consequences for how closures are observed and mutated.
For example, consider a closure that needs to be updated to an indirection. In
order for the indirection to be safe for concurrent observers to enter, said
observers must read the indirection's info table before they read the
indirectee. Furthermore, the entering observer makes assumptions about the
closure based on its info table contents, e.g. an INFO_TYPE of IND imples the
closure has an indirectee pointer that is safe to follow.

When a closure is updated with an indirection, both its info table and its
indirectee must be written. With weak memory ordering, these two writes can be
arbitrarily reordered, and perhaps even interleaved with other threads' reads
and writes (in the absence of memory barrier instructions). Consider this
example of a bad reordering:

- An updater writes to a closure's info table (INFO_TYPE is now IND).
- A concurrent observer branches upon reading the closure's INFO_TYPE as IND.
- A concurrent observer reads the closure's indirectee and enters it. (!!!)
- An updater writes the closure's indirectee.

Here the update to the indirectee comes too late and the concurrent observer has
jumped off into the abyss. Speculative execution can also cause us issues,

- An observer is about to case on a value in closure's info table.
- The observer speculatively reads one or more of closure's fields.
- An updater writes to closure's info table.
- The observer takes a branch based on the new info table value, but with the
  old closure fields!
- The updater writes to the closure's other fields, but its too late.

Because of these effects, reads and writes to a closure's info table must be
ordered carefully with respect to reads and writes to the closure's other
fields, and memory barriers must be placed to ensure that reads and writes occur
in program order. Specifically, updates to a closure must follow the following

- Update the closure's (non-info table) fields.
- Write barrier.
- Update the closure's info table.

Observing a closure's fields must follow the following pattern:

- Read the closure's info pointer.
- Read barrier.
- Read the closure's (non-info table) fields.

This patch updates RTS code to obey this pattern. This should fix long-standing
SMP bugs on ARM (specifically newer aarch64 microarchitectures supporting
out-of-order execution) and PowerPC. This fixes issue #15449.

Co-Authored-By: Ben Gamari <>
2 weeks agotypo in the docs for DynFlags.hs
Artem Pelenitsyn [Wed, 26 Jun 2019 08:33:17 +0000 (04:33 -0400)] 
typo in the docs for DynFlags.hs

2 weeks agoFix GCC warnings with __clear_cache builtin (#16867)
Sylvain Henry [Tue, 25 Jun 2019 16:53:22 +0000 (18:53 +0200)] 
Fix GCC warnings with __clear_cache builtin (#16867)

2 weeks agotestsuite: Add more type annotations to perf_notes
Ben Gamari [Wed, 26 Jun 2019 16:58:42 +0000 (12:58 -0400)] 
testsuite: Add more type annotations to perf_notes

2 weeks agoFix #16805 by formatting warning message
nineonine [Wed, 26 Jun 2019 00:45:14 +0000 (17:45 -0700)] 
Fix #16805 by formatting warning message

2 weeks agogetExecutablePath: get path from sysctl on FreeBSD
Fraser Tweedale [Tue, 25 Jun 2019 02:17:30 +0000 (12:17 +1000)] 
getExecutablePath: get path from sysctl on FreeBSD

2 weeks agoFix Happy deps for Stack (#16825)
Sylvain Henry [Mon, 24 Jun 2019 16:36:07 +0000 (18:36 +0200)] 
Fix Happy deps for Stack (#16825)

2 weeks agoconfigure: prefer cc over gcc
Roland Zumkeller [Sun, 23 Jun 2019 17:15:16 +0000 (19:15 +0200)] 
configure: prefer cc over gcc

Fixes #16857.

2 weeks agoImprove doc for :type-at. (#14780)
Roland Senn [Sat, 22 Jun 2019 16:25:58 +0000 (18:25 +0200)] 
Improve doc for :type-at. (#14780)

2 weeks agorts: Do not traverse nursery for dead closures in LDV profile
Matthew Pickering [Thu, 6 Jun 2019 13:07:06 +0000 (14:07 +0100)] 
rts: Do not traverse nursery for dead closures in LDV profile

It is important that `heapCensus` and `LdvCensusForDead` traverse the
same areas.

`heapCensus` increases the `not_used` counter which tracks how many
closures are live but haven't been used yet.

`LdvCensusForDead` increases the `void_total` counter which tracks how
many dead closures there are.

The `LAG` is then calculated by substracting the `void_total` from
`not_used` and so it is essential that `not_used >= void_total`. This
fact is checked by quite a few assertions.

However, if a program has low maximum residency but allocates a lot in
the nursery then these assertions were failing (see #16753 and #15903)
because `LdvCensusForDead` was observing dead closures from the nursery
which totalled more than the `not_used`. The same closures were not
counted by `heapCensus`.

Therefore, it seems that the correct fix is to make `LdvCensusForDead`
agree with `heapCensus` and not traverse the nursery for dead closures.

Fixes #16100 #16753 #15903 #8982

2 weeks agorts: Correct assertion in LDV_recordDead
Matthew Pickering [Thu, 6 Jun 2019 13:05:43 +0000 (14:05 +0100)] 
rts: Correct assertion in LDV_recordDead

It is possible that void_total is exactly equal to not_used and the
other assertions for this check for <= rather than <.

2 weeks agorts: Correct handling of LARGE ARR_WORDS in LDV profiler
Matthew Pickering [Thu, 6 Jun 2019 13:03:50 +0000 (14:03 +0100)] 
rts: Correct handling of LARGE ARR_WORDS in LDV profiler

This implements the correct fix for #11627 by skipping over the slop
(which is zeroed) rather than adding special case logic for LARGE
ARR_WORDS which runs the risk of not performing a correct census by
ignoring any subsequent blocks.

This approach implements similar logic to that in Sanity.c

3 weeks agotestsuite: More type signatures wip/run-fragile-tests
Ben Gamari [Tue, 25 Jun 2019 22:19:42 +0000 (18:19 -0400)] 
testsuite: More type signatures

3 weeks agotestsuite: Run and report on fragile tests
Ben Gamari [Tue, 25 Jun 2019 22:16:32 +0000 (18:16 -0400)] 
testsuite: Run and report on fragile tests

This allows us to run (but ignore the result of) fragile testcases.
Hopefully this should allow us to more easily spot when a fragile test
becomes un-fragile.

3 weeks agotestsuite: Mark T5611 and T5611a as fragile
Ben Gamari [Tue, 25 Jun 2019 22:00:29 +0000 (18:00 -0400)] 
testsuite: Mark T5611 and T5611a as fragile

3 weeks agotestsuite: Add T5611a
Ben Gamari [Wed, 19 Jun 2019 16:17:10 +0000 (12:17 -0400)] 
testsuite: Add T5611a

This is the same as T5611 but with an unsafe call to sleep.

3 weeks agotestsuite: Use safe FFI call in T5611
Ben Gamari [Wed, 19 Jun 2019 15:58:42 +0000 (11:58 -0400)] 
testsuite: Use safe FFI call in T5611

The original issue, #5611, was concerned with safe calls. However, the
test inexplicably used an unsafe call. Fix this.

3 weeks ago[skip ci] add a blurb about the purpose of Printer.c
Siddharth Bhat [Tue, 25 Jun 2019 13:16:24 +0000 (15:16 +0200)] 
[skip ci] add a blurb about the purpose of Printer.c

3 weeks agotestsuite: Fix T16832
Ben Gamari [Wed, 26 Jun 2019 12:09:18 +0000 (08:09 -0400)] 
testsuite: Fix T16832

The test seems to have been missing the name of its script and didn't
build with HEAD. How it made it through CI is beyond me.

3 weeks agoAdd -Wmissing-safe-haskell-mode warning
Oleg Grenrus [Tue, 7 May 2019 09:02:15 +0000 (12:02 +0300)] 
Add -Wmissing-safe-haskell-mode warning

3 weeks agoAdd -Winferred-safe-imports warning
Oleg Grenrus [Mon, 6 May 2019 20:14:52 +0000 (23:14 +0300)] 
Add -Winferred-safe-imports warning

This commit partly reverts e69619e923e84ae61a6bb4357f06862264daa94b
commit by reintroducing Sf_SafeInferred SafeHaskellMode.

We preserve whether module was declared or inferred Safe.  When
declared-Safe module imports inferred-Safe, we warn.  This inferred
status is volatile, often enough it's a happy coincidence, something
which cannot be relied upon. However, explicitly Safe or Trustworthy
packages won't accidentally become Unsafe.

Updates haddock submodule.

3 weeks agoBump Cabal submodule to what will become
Ben Gamari [Tue, 25 Jun 2019 03:44:01 +0000 (23:44 -0400)] 
Bump Cabal submodule to what will become

Metric Increase:

3 weeks agoBump containers submodule to v0.6.2.1
Ben Gamari [Wed, 12 Jun 2019 15:53:57 +0000 (11:53 -0400)] 
Bump containers submodule to v0.6.2.1

3 weeks agoRemove unused UniqSupply functions
Ömer Sinan Ağacan [Tue, 25 Jun 2019 10:35:35 +0000 (13:35 +0300)] 
Remove unused UniqSupply functions

3 weeks agotestsuite: Unbreak T16608 tests
Ben Gamari [Tue, 25 Jun 2019 03:31:44 +0000 (23:31 -0400)] 
testsuite: Unbreak T16608 tests

Sleep to avoid non-determinism due to Darwin's poor mtime resolution.
Fixes #16855.

3 weeks agoDon't eta-expand unsaturated primops
Ben Gamari [Fri, 21 Jun 2019 16:42:53 +0000 (12:42 -0400)] 
Don't eta-expand unsaturated primops

Previously, as described in Note [Primop wrappers], `hasNoBinding` would
return False in the case of `PrimOpId`s. This would result in eta
expansion of unsaturated primop applications during CorePrep. Not only
did this expansion result in unnecessary allocations, but it also meant
lead to rather nasty inconsistencies between the CAFfy-ness
determinations made by TidyPgm and CorePrep.

This fixes #16846.

3 weeks agoCoreToStg: Enable CAFfyness checking with -dstg-lint
Ben Gamari [Fri, 21 Jun 2019 15:24:50 +0000 (11:24 -0400)] 
CoreToStg: Enable CAFfyness checking with -dstg-lint

The debugging involved in finding #16846 wouldn't have been necessary
had the consistentCafInfo check been enabled. However, :wq

3 weeks agotestsuite: Add test for #16846
Ben Gamari [Thu, 20 Jun 2019 17:40:13 +0000 (13:40 -0400)] 
testsuite: Add test for #16846

3 weeks ago[skip ci] Typo fix: b*ar*nches -> b*ra*nches
Siddharth Bhat [Tue, 25 Jun 2019 13:12:45 +0000 (15:12 +0200)] 
[skip ci] Typo fix: b*ar*nches -> b*ra*nches

3 weeks agotestsuite: Mark ghci058 as broken on Windows
Ben Gamari [Mon, 24 Jun 2019 22:31:50 +0000 (18:31 -0400)] 
testsuite: Mark ghci058 as broken on Windows

Due to #16858.

3 weeks agotestsuite: Fix expected output for caf_crash
Ben Gamari [Mon, 24 Jun 2019 17:29:50 +0000 (13:29 -0400)] 
testsuite: Fix expected output for caf_crash

3 weeks agotestsuite: Don't run T16525a with -DS unless compiler_debugged
Ben Gamari [Sun, 23 Jun 2019 15:23:15 +0000 (11:23 -0400)] 
testsuite: Don't run T16525a with -DS unless compiler_debugged

Originally I was thinking of just skipping the test unless
compiled_debugged==True. However, the test will likely be useful even
without -DS, so let's run it either way.

3 weeks agogitlab-ci: Add testsuite typechecking lint
Ben Gamari [Sun, 23 Jun 2019 14:28:31 +0000 (10:28 -0400)] 
gitlab-ci: Add testsuite typechecking lint

3 weeks agotestsuite: Fix a few issues in JUnit output
Ben Gamari [Sun, 23 Jun 2019 14:39:57 +0000 (10:39 -0400)] 
testsuite: Fix a few issues in JUnit output

 * Make it pass mypy
 * Fix a typo in test name field
 * Report more stderr output
 * Report stdout output

3 weeks agotestsuite: A major revamp of the driver
Ben Gamari [Wed, 19 Jun 2019 17:25:07 +0000 (13:25 -0400)] 
testsuite: A major revamp of the driver

This tries to put the testsuite driver into a slightly more maintainable

* Add type annotations where easily done
* Use pathlib.Path instead of str paths
* Make it pass the mypy typechecker

3 weeks agoSimplify link_caf and mkForeignLabel functions
Ömer Sinan Ağacan [Mon, 24 Jun 2019 11:24:58 +0000 (14:24 +0300)] 
Simplify link_caf and mkForeignLabel functions

3 weeks agoFix cyclic dependencies when using --configure
Andrey Mokhov [Sat, 22 Jun 2019 23:50:43 +0000 (00:50 +0100)] 
Fix cyclic dependencies when using --configure

This resolves #16809 (

This patch removes the unnecessary dependency on configure-generated
flags `windowsHost`, `osxHost` and `iosHost`, using the information
provided by the module `System.Info` instead.

We also take care to use the `CrossCompiling` flag generated by the
configure script only after the latter had a chance to run.

3 weeks agoAdd MonadFail instance for ParserM
Erik de Castro Lopo [Sat, 22 Jun 2019 03:50:14 +0000 (13:50 +1000)] 
Add MonadFail instance for ParserM

3 weeks agoFixes for LLVM 7
Erik de Castro Lopo [Sat, 22 Jun 2019 00:13:51 +0000 (10:13 +1000)] 
Fixes for LLVM 7

LLVM version numberinf changed recently. Previously, releases were numbered
4.0, 5.0 and 6.0 but with version 7, they dropped the redundant ".0".

Fix requires for Llvm detection and some code.

3 weeks agoRefactor UnliftedNewtypes-relation kind signature validity checks
Ryan Scott [Sun, 16 Jun 2019 00:21:34 +0000 (20:21 -0400)] 
Refactor UnliftedNewtypes-relation kind signature validity checks

This fixes three infelicities related to the programs that are
(and aren't) accepted with `UnliftedNewtypes`:

* Enabling `UnliftedNewtypes` would permit newtypes to have return
  kind `Id Type`, which had disastrous results (i.e., GHC panics).
* Data family declarations ending in kind `TYPE r` (for some `r`)
  weren't being accepted if `UnliftedNewtypes` wasn't enabled,
  despite the GHC proposal specifying otherwise.
* GHC wasn't warning about programs that _would_ typecheck if
  `UnliftedNewtypes` were enabled in certain common cases.

As part of fixing these issues, I factored out the logic for checking
all of the various properties about data type/data family return
kinds into a single `checkDataKindSig` function. I also cleaned up
some of the formatting in the existing error message that gets

Fixes #16821, fixes #16827, and fixes #16829.

3 weeks agoghci: Load static objects in batches
Ben Gamari [Fri, 14 Jun 2019 20:53:12 +0000 (16:53 -0400)] 
ghci: Load static objects in batches

Previously in the case where GHC was dynamically linked we would load
static objects one-by-one by linking each into its own shared object and
dlopen'ing each in order. However, this meant that the link would fail
in the event that the objects had cyclic symbol dependencies.

Here we fix this by merging each "run" of static objects into a single
shared object and loading this.

Fixes #13786 for the case where GHC is dynamically linked.

3 weeks agotestsuite: Test for #13786
Ben Gamari [Fri, 14 Jun 2019 21:38:04 +0000 (17:38 -0400)] 
testsuite: Test for #13786

3 weeks agotestsuite: Add caf_crash testcase
Ben Gamari [Tue, 18 Jun 2019 16:17:48 +0000 (12:17 -0400)] 
testsuite: Add caf_crash testcase

3 weeks agorts: Reset STATIC_LINK field of reverted CAFs
Ben Gamari [Tue, 18 Jun 2019 16:07:50 +0000 (12:07 -0400)] 
rts: Reset STATIC_LINK field of reverted CAFs

When we revert a CAF we must reset the STATIC_LINK field lest the GC
might ignore the CAF (e.g. as it carries the STATIC_FLAG_LIST flag) and
will consequently overlook references to object code that we are trying
to unload. This would result in the reachable object code being
unloaded. See Note [CAF lists] and Note [STATIC_LINK fields].

This fixes #16842.

Idea-due-to: Phuong Trinh <>

3 weeks agotestsuite: Mark T5611 as broken in ghci way
Ben Gamari [Wed, 19 Jun 2019 15:56:49 +0000 (11:56 -0400)] 
testsuite: Mark T5611 as broken in ghci way

As described in #16845.