2 months agoFix #8487: Debugger confuses variables
Roland Senn [Thu, 18 Jul 2019 08:41:44 +0000 (10:41 +0200)] 
Fix #8487: Debugger confuses variables

To display the free variables for a single breakpoint, GHCi pulls out the
information from the fields `modBreaks_breakInfo` and `modBreaks_vars`
of the `ModBreaks` data structure. For a specific breakpoint this gives 2
lists of types 'Id` (`Var`) and `OccName`. They are used to create the Id's
for the free variables and must be kept in sync:
If we remove an element from the Names list, then we also must remove the
corresponding element from the OccNames list.

2 months agoDo not ignore events deletion when events to be added are provided (#16916)
Ivan Kasatenko [Sat, 20 Jul 2019 12:09:00 +0000 (15:09 +0300)] 
Do not ignore events deletion when events to be added are provided (#16916)

Kqueue/kevent implementation used to ignore events to be unsubscribed
from when events to be subscribed to were provided. This resulted in a
lost notification subscription, when GHC runtime didn't listen for any
events, yet the kernel considered otherwise and kept waking up the IO
manager thread.

This commit fixes this issue by always adding and removing all of the
provided subscriptions.

2 months agoExpose the GhcPrelude module.
Andreas Klebinger [Wed, 10 Jul 2019 08:55:49 +0000 (10:55 +0200)] 
Expose the GhcPrelude module.

This makes it simpler to load Modules importing it
when using ghc-the-package.

Metric Decrease:

2 months agohadrian: Remove RTS -Waggregate-return warning
Matthew Pickering [Fri, 19 Jul 2019 16:12:56 +0000 (12:12 -0400)] 
hadrian: Remove RTS -Waggregate-return warning

This was removed from make in 077b92fa39839a8e83cd87398435424403cf6486

2 months agoBump nofib submodule.
Andreas Klebinger [Mon, 15 Jul 2019 14:28:28 +0000 (16:28 +0200)] 
Bump nofib submodule.

2 months agoLine wrap when pp long expressions (fixes #16874)
Alfredo Di Napoli [Sat, 13 Jul 2019 16:07:17 +0000 (18:07 +0200)] 
Line wrap when pp long expressions (fixes #16874)

This commit fixes #16874 by using `fsep` rather than `sep` when pretty
printing long patterns and expressions.

2 months agoAdded do-notation examples for Functor, Applicative and Monad combinators.
Baldur Blöndal [Sat, 13 Jul 2019 15:46:39 +0000 (16:46 +0100)] 
Added do-notation examples for Functor, Applicative and Monad combinators.

2 months agoAdd module doc for Plugins.
Richard Eisenberg [Thu, 18 Jul 2019 17:51:57 +0000 (13:51 -0400)] 
Add module doc for Plugins.

This was requested in #15650.

2 months agoDon't maintainer-clean libraries/ghc-boot/ (#16953)
Ryan Scott [Thu, 18 Jul 2019 13:54:11 +0000 (09:54 -0400)] 
Don't maintainer-clean libraries/ghc-boot/ (#16953)

This makes the `maintainer-clean` rule in `` slightly more
sophisticated so that it does not remove the version-controlled
file `libraries/ghc-boot/`, which was checked into version
control in commit 24782b89907ab36fb5aef3a17584f4c10f1e2690.

Fixes #16953.

2 months agousers-guide: corrected -fmax-relevant-binds reverse to be -fno-max-relevant-binds
James Foster [Wed, 17 Jul 2019 15:16:32 +0000 (11:16 -0400)] 
users-guide: corrected -fmax-relevant-binds reverse to be -fno-max-relevant-binds

2 months agoMake generated ghc-stage<n> scripts executable
Sebastian Graf [Wed, 17 Jul 2019 10:08:15 +0000 (10:08 +0000)] 
Make generated ghc-stage<n> scripts executable

2 months agoFix #16870 by improving documentation (only)
Richard Eisenberg [Tue, 16 Jul 2019 21:17:01 +0000 (17:17 -0400)] 
Fix #16870 by improving documentation (only)

2 months agoDrop the orphan roles check (#16941)
Vladislav Zavialov [Mon, 15 Jul 2019 21:28:18 +0000 (00:28 +0300)] 
Drop the orphan roles check (#16941)

9366e019 introduced a check for orphan roles to fix #8485

6ab5da99 changed the lookup code and made the check redundant.

Now it is removed.

2 months agoHide "Loading package environment" message with -v0 (fix #16879)
Artem Pelenitsyn [Thu, 27 Jun 2019 21:29:41 +0000 (21:29 +0000)] 
Hide "Loading package environment" message with -v0 (fix #16879)

2 months agotestsuite: Mark T4808 as broken in threaded2 way
Ben Gamari [Thu, 18 Jul 2019 15:40:28 +0000 (11:40 -0400)] 
testsuite: Mark T4808 as broken in threaded2 way

As noted in #16909.

2 months agotestsuite: Unmark recomp007 as broken
Ben Gamari [Mon, 15 Jul 2019 13:52:15 +0000 (09:52 -0400)] 
testsuite: Unmark recomp007 as broken

Fixed in #14759.

2 months agotestsuite: Mark test-hole-plugin as req_th
Ben Gamari [Tue, 9 Jul 2019 22:45:21 +0000 (18:45 -0400)] 
testsuite: Mark test-hole-plugin as req_th

This requires code loading and therefore can't be run in the profiled
ways when GHC is dynamically linked.

2 months agotestsuite: Skip forking tests in profiled ways
Ben Gamari [Tue, 9 Jul 2019 22:39:59 +0000 (18:39 -0400)] 
testsuite: Skip forking tests in profiled ways

As noted in #11645 and #8862, forking and profiling don't go well

Bumps hpc and unix submodules.

2 months agotestsuite: Fix some ints used as bools
Ben Gamari [Tue, 9 Jul 2019 15:54:28 +0000 (11:54 -0400)] 
testsuite: Fix some ints used as bools

2 months agotestsuite: Print output from hp2ps
Ben Gamari [Tue, 9 Jul 2019 00:31:35 +0000 (20:31 -0400)] 
testsuite: Print output from hp2ps

2 months agotestsuite: Mark hWaitForInput-accurate-stdin as broken in all threaded ways
Ben Gamari [Mon, 8 Jul 2019 13:56:33 +0000 (09:56 -0400)] 
testsuite: Mark hWaitForInput-accurate-stdin as broken in all threaded ways

Previously it was not marked as broken in profthreaded

2 months agoFix formatting of --info's "Debug on" field
Ben Gamari [Fri, 5 Jul 2019 15:31:32 +0000 (11:31 -0400)] 
Fix formatting of --info's "Debug on" field

As noted in #16914, the value `True` was used instead of `YES` here, in
contrast to the other boolean fields emitted by `--info`. This confused
the testsuite driver and broke the `ghc_debugged` testsuite predicate.

2 months agotestsuite: Fix req_th
Ben Gamari [Thu, 4 Jul 2019 15:28:15 +0000 (11:28 -0400)] 
testsuite: Fix req_th

2 months agotestsuite: Set -dinitial-unique when reversing uniques
Ben Gamari [Thu, 4 Jul 2019 15:17:04 +0000 (11:17 -0400)] 
testsuite: Set -dinitial-unique when reversing uniques

Otherwise the unique counter starts at 0, causing us to immediately

2 months agotestsuite: Mark static-plugins as broken in profiled ways
Ben Gamari [Thu, 4 Jul 2019 15:11:02 +0000 (11:11 -0400)] 
testsuite: Mark static-plugins as broken in profiled ways

See #16803.

2 months agoAdd HasDebugCallStack to unionLists
Ben Gamari [Thu, 4 Jul 2019 15:08:34 +0000 (11:08 -0400)] 
Add HasDebugCallStack to unionLists

This should help identify a few cases where this is throwing warnings

2 months agotestsuite: More type checking fixes
Ben Gamari [Tue, 2 Jul 2019 02:45:17 +0000 (22:45 -0400)] 
testsuite: More type checking fixes

2 months agogitlab-ci: Run slow validate in -debug job
Ben Gamari [Wed, 26 Jun 2019 12:25:02 +0000 (08:25 -0400)] 
gitlab-ci: Run slow validate in -debug job

Otherwise we don't compile the stage2 compiler with DEBUG, meaning the
testsuite isn't checked with assertions.

Metric Increase:

2 months agoMake GHC-in-GHCi work on Windows
Sebastian Graf [Tue, 16 Jul 2019 15:05:39 +0000 (16:05 +0100)] 
Make GHC-in-GHCi work on Windows

By not building anything in the dynamic way on Windows, where we don't
have a working story for DLLs yet.

Also the ghcid command needs to call bash on the hadrian/ script
explicitly as the path gets interpreted differently otherwise.

2 months agoCreate {Int,Word}32Rep
John Ericson [Mon, 10 Jun 2019 13:32:50 +0000 (09:32 -0400)] 
Create {Int,Word}32Rep

This prepares the way for making Int32# and Word32# the actual size they
claim to be.

Updates binary submodule for (de)serializing the new runtime reps.

2 months agorts: Rename the nondescript initProfiling2 to refreshProfilingCCSs
Daniel Gröber [Wed, 10 Jul 2019 15:14:24 +0000 (17:14 +0200)] 
rts: Rename the nondescript initProfiling2 to refreshProfilingCCSs

2 months agorts: Divorce init of Heap profiler from CCS profiler
Daniel Gröber [Wed, 10 Jul 2019 15:16:33 +0000 (17:16 +0200)] 
rts: Divorce init of Heap profiler from CCS profiler

Currently initProfiling gets defined by Profiling.c only if PROFILING is
defined. Otherwise the ProfHeap.c defines it.

This is just needlessly complicated so in this commit I make Profiling and
ProfHeap into properly seperate modules and call their respective init
functions from RtsStartup.c.

2 months agoRevert "Add support for SIMD operations in the NCG"
Ben Gamari [Tue, 9 Jul 2019 18:49:32 +0000 (14:49 -0400)] 
Revert "Add support for SIMD operations in the NCG"

Unfortunately this will require more work; register allocation is
quite broken.

This reverts commit acd795583625401c5554f8e04ec7efca18814011.

2 months agoSort out Hadrian colored output flags (fix #16397)
Artem Pelenitsyn [Fri, 12 Jul 2019 20:41:34 +0000 (20:41 +0000)] 
Sort out Hadrian colored output flags (fix #16397)

Hadrian used to have a separate flag --progress-colour to control
colored output during the build. After introduction of a Shake flag
with similar purpose Hadrian's flag became redundant. The commit removes
--progress-colour and switches to Shake's flag. The only difference
between the two is that Hadrian has special default mode when it tries
to determine if the terminal support colored output. The user can
override it using (Shake's) `--[no-]color`.

3 months agoPV is not P (#16611)
Vladislav Zavialov [Tue, 30 Apr 2019 13:56:32 +0000 (16:56 +0300)] 
PV is not P (#16611)

3 months agoDecouple AddAnn from P
Vladislav Zavialov [Mon, 29 Apr 2019 19:36:23 +0000 (22:36 +0300)] 
Decouple AddAnn from P

3 months agoAdd a note in the simplifier about in-scope set as a substitution
Arnaud Spiwack [Fri, 26 Apr 2019 15:58:52 +0000 (17:58 +0200)] 
Add a note in the simplifier about in-scope set as a substitution

See also the discussion at #16592

3 months agogitlab-ci: Disable submodule linter for now
Ben Gamari [Mon, 15 Jul 2019 04:14:22 +0000 (00:14 -0400)] 
gitlab-ci: Disable submodule linter for now

3 months agoprimops: haddock: Fix typo in referenced function.
Niklas Hambüchen [Sat, 13 Jul 2019 17:47:52 +0000 (13:47 -0400)] 
primops: haddock: Fix typo in referenced function.

Found by @lehins.

3 months agorename type parameter in `instance Applicative ((->) a)`, fixing #16928
xplorld [Sat, 13 Jul 2019 20:20:56 +0000 (13:20 -0700)] 
rename type parameter in `instance Applicative ((->) a)`, fixing #16928

3 months agoExpunge #ifdef and #ifndef from the codebase
John Ericson [Wed, 10 Jul 2019 15:54:47 +0000 (11:54 -0400)] 
Expunge #ifdef and #ifndef from the codebase

These are unexploded minds as far as the linter is concerned. I don't
want to hit in my MRs by mistake!

I did this with `sed`, and then rolled back some changes in the docs,
config.guess, and the linter itself.

3 months agoMake CPP linter skip certain files
John Ericson [Wed, 10 Jul 2019 16:16:52 +0000 (12:16 -0400)] 
Make CPP linter skip certain files

 - docs which document the lint and need to contain the unutterable

 - vendored code which is outside our purview

3 months agoRemove LLVM_TARGET platform macros
John Ericson [Mon, 8 Apr 2019 02:33:21 +0000 (22:33 -0400)] 
Remove LLVM_TARGET platform macros

Instead following @angerman's suggestion put them in the config file.
Maybe we could re-key llvm-targets someday, but this is good for now.

3 months agoDon't package settings in bindist
Ben Gamari [Sun, 7 Jul 2019 13:54:57 +0000 (09:54 -0400)] 
Don't package settings in bindist

Since !712 the `settings` file is produced by the build system instead
of autoconf. However, this introduced a subtle bug where we would fail
to rebuild the `settings` file with what we have learned from the
install-time `configure` invocation. Fix this by not packaging
`settings` in the bindist tarball. The build system will take care of
the rest.

Also fix a bug where the value of `UseLibdw` was not being persisted to
the install time `configure`.

3 months agohadrian: Build debug rts with -O0 -g3 and disable rts stripping
Matthew Pickering [Sun, 7 Jul 2019 09:17:51 +0000 (10:17 +0100)] 
hadrian: Build debug rts with -O0 -g3 and disable rts stripping

Fixes #16920

3 months agoRemove purely external primops
John Ericson [Mon, 1 Jul 2019 03:33:09 +0000 (23:33 -0400)] 
Remove purely external primops

The compiler doesn't create uses nor compiles the uses that exist
specially. These are just plain C-- FFI.

These `await*` ones are especially important to so convert because "true"
primops are hard to make platform-specific currently.

The other exports are part of this commit so this module always exports
something, which avoids silly CPP elsewhere. More will be added later
once `foreign import prim` is extended.

3 months agoMinor refactoring in CmmBuildInfoTables
Ömer Sinan Ağacan [Fri, 12 Jul 2019 12:36:32 +0000 (15:36 +0300)] 
Minor refactoring in CmmBuildInfoTables

- Replace `catMaybes (map ...)` with `mapMaybe ...`
- Remove a list->set->list conversion

3 months agoMake HsInstances and DynFlags compile with -O0 for Stage0 to speed up Hadrian builds...
James Foster [Sat, 13 Jul 2019 00:23:30 +0000 (01:23 +0100)] 
Make HsInstances and DynFlags compile with -O0 for Stage0 to speed up Hadrian builds (fixes #16936)

3 months agoAdd two CmmSwitch optimizations.
Andreas Klebinger [Fri, 12 Jul 2019 13:17:02 +0000 (15:17 +0200)] 
Add two CmmSwitch optimizations.

Move switch expressions into a local variable when generating switches.
This avoids duplicating the expression if we translate the switch
to a tree search. This fixes #16933.

Further we now check if all branches of a switch have the same
destination, replacing the switch with a direct branch if that
is the case.

Both of these patterns appear in the ENTER macro used by the RTS
but are unlikely to occur in intermediate Cmm generated by GHC.

Nofib result summary:

        Program           Size    Allocs   Runtime   Elapsed  TotalMem
            Min          -0.0%     -0.0%    -15.7%    -15.6%      0.0%
            Max          -0.0%      0.0%     +5.4%     +5.5%      0.0%
 Geometric Mean          -0.0%     -0.0%     -1.0%     -1.0%     -0.0%

Compiler allocations go up slightly: +0.2%

Example output before and after the change taken from RTS code below.

All but one of the memory loads `I32[_c3::I64 - 8]` are eliminated.
Instead the data is loaded once from memory in block c6.

Also the switch in block `ud` in the original code has been
eliminated completely.

Cmm without this commit:

stg_ap_0_fast() { //  [R1]
        { []
      ca: _c1::P64 = R1;   // CmmAssign
          goto c2;   // CmmBranch
      c2: if (_c1::P64 & 7 != 0) goto c4; else goto c6;
      c6: _c3::I64 = I64[_c1::P64];
          if (I32[_c3::I64 - 8] < 26 :: W32) goto ub; else goto ug;
      ub: if (I32[_c3::I64 - 8] < 15 :: W32) goto uc; else goto ue;
      uc: if (I32[_c3::I64 - 8] < 8 :: W32) goto c7; else goto ud;
      ud: switch [8 .. 14] (%MO_SS_Conv_W32_W64(I32[_c3::I64 - 8])) {
              case 8, 9, 10, 11, 12, 13, 14 : goto c4;
      ue: if (I32[_c3::I64 - 8] >= 25 :: W32) goto c4; else goto uf;
      uf: if (%MO_SS_Conv_W32_W64(I32[_c3::I64 - 8]) != 23) goto c7; else goto c4;
      c4: R1 = _c1::P64;
          call (P64[Sp])(R1) args: 8, res: 0, upd: 8;
      ug: if (I32[_c3::I64 - 8] < 28 :: W32) goto uh; else goto ui;
      uh: if (I32[_c3::I64 - 8] < 27 :: W32) goto c7; else goto c8;
      ui: if (I32[_c3::I64 - 8] < 29 :: W32) goto c8; else goto c7;
      c8: _c1::P64 = P64[_c1::P64 + 8];
          goto c2;
      c7: R1 = _c1::P64;
          call (_c3::I64)(R1) args: 8, res: 0, upd: 8;

Cmm with this commit:

stg_ap_0_fast() { //  [R1]
        { []
      ca: _c1::P64 = R1;
          goto c2;
      c2: if (_c1::P64 & 7 != 0) goto c4; else goto c6;
      c6: _c3::I64 = I64[_c1::P64];
          _ub::I64 = %MO_SS_Conv_W32_W64(I32[_c3::I64 - 8]);
          if (_ub::I64 < 26) goto uc; else goto uh;
      uc: if (_ub::I64 < 15) goto ud; else goto uf;
      ud: if (_ub::I64 < 8) goto c7; else goto c4;
      uf: if (_ub::I64 >= 25) goto c4; else goto ug;
      ug: if (_ub::I64 != 23) goto c7; else goto c4;
      c4: R1 = _c1::P64;
          call (P64[Sp])(R1) args: 8, res: 0, upd: 8;
      uh: if (_ub::I64 < 28) goto ui; else goto uj;
      ui: if (_ub::I64 < 27) goto c7; else goto c8;
      uj: if (_ub::I64 < 29) goto c8; else goto c7;
      c8: _c1::P64 = P64[_c1::P64 + 8];
          goto c2;
      c7: R1 = _c1::P64;
          call (_c3::I64)(R1) args: 8, res: 0, upd: 8;

3 months agocompiler: trace SysTools commands to emit start/stop eventlog markers
Alp Mestanogullari [Thu, 11 Jul 2019 11:15:17 +0000 (13:15 +0200)] 
compiler: trace SysTools commands to emit start/stop eventlog markers

This patch was motivated by some performance characterization work done
for #16822, where we suspected that GHC was spending a lot of time waiting
on the linker to be done. (That turned out to be true.)

The tracing is taken care of by ErrUtils.withTiming, so this patch just defines
and uses a little wrapper around that function in all the helpers for
calling the various systools (C compiler, linker, unlit, ...).

With this patch, assuming a GHC executable linked against an eventlog-capable
RTS (RTS ways that contain the debug, profiling or eventlog way units), we can
measure how much time is spent in each of the SysTools when building hello.hs
by simply doing:

  ghc hello.hs -ddump-timings +RTS -l

The event names are "systool:{cc, linker, as, unlit, ...}".

3 months agobase: Data.Fixed: make HasResolution poly-kinded (#10055, #15622)
Ashley Yakeley [Mon, 11 Mar 2019 20:02:13 +0000 (13:02 -0700)] 
base: Data.Fixed: make HasResolution poly-kinded (#10055, #15622)

3 months 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

3 months 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.)

3 months 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

3 months 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.

3 months 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)

3 months 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.

3 months 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.

3 months 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)

3 months 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

3 months 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.

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

3 months 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.

3 months 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.

3 months 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)

3 months 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.

3 months 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

3 months 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.

3 months 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.

3 months 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.

3 months 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

3 months 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.

3 months 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.

3 months 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)

3 months 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.

3 months 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

3 months 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.

3 months 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

3 months 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.

3 months 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!

3 months 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

3 months 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’

3 months 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.

3 months 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

3 months 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.

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

3 months 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.

3 months 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.

3 months 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 <>
3 months 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.

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

3 months 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

3 months 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

3 months 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

3 months 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

3 months 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.


3 months 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

3 months 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.

3 months 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.

3 months 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 <>