Compile modules that are needed by template haskell, even with -fno-code.
authorDouglas Wilson <douglas.wilson@gmail.com>
Sat, 20 May 2017 16:47:41 +0000 (12:47 -0400)
committerBen Gamari <ben@smart-cactus.org>
Sat, 20 May 2017 20:29:18 +0000 (16:29 -0400)
commit53c78be0aab76a3107c4dacbb1d177afacdd37fa
tree2ce5906fc856e3c49d6e4657d6c95870e6f55b83
parent0102e2b731d33abdff4c3cde6938d1bede8f51cb
Compile modules that are needed by template haskell, even with -fno-code.

This patch relates to Trac #8025

The goal here is to enable typechecking of packages that contain some
template haskell. Prior to this patch, compilation of a package with
-fno-code would fail if any functions in the package were called from
within a splice.

downsweep is changed to do an additional pass over the modules,
targetting any ModSummaries transitively depended on by a module that
has LangExt.TemplateHaskell enabled. Those targeted modules have
hscTarget changed from HscNothing to the default target of the platform.

There is a small change to the prevailing_target logic to enable this.

A simple test is added.

I have benchmarked with and without a patched haddock
(available:https://github.com/duog/haddock/tree/wip-no-explicit-th-compi
lation).  Running cabal haddock on the wreq package results in a 25%
speedup on my machine:

time output from patched cabal haddock:

real    0m5.780s
user    0m5.304s
sys     0m0.496s
time output from unpatched cabal haddock:

real    0m7.712s
user    0m6.888s
sys     0m0.736s

Reviewers: austin, bgamari, ezyang

Reviewed By: bgamari

Subscribers: bgamari, DanielG, rwbarton, thomie

GHC Trac Issues: #8025

Differential Revision: https://phabricator.haskell.org/D3441
compiler/backpack/DriverBkp.hs
compiler/main/DriverPipeline.hs
compiler/main/DynFlags.hs
compiler/main/GhcMake.hs
compiler/main/HscTypes.hs
testsuite/tests/th/should_compile/T8025/A.hs [new file with mode: 0644]
testsuite/tests/th/should_compile/T8025/B.hs [new file with mode: 0644]
testsuite/tests/th/should_compile/T8025/Makefile [new file with mode: 0644]
testsuite/tests/th/should_compile/T8025/all.T [new file with mode: 0644]