hadrian: optimise Rules.Compile
authorAlp Mestanogullari <alpmestan@gmail.com>
Fri, 7 Dec 2018 09:42:08 +0000 (10:42 +0100)
committerAlp Mestanogullari <alpmestan@gmail.com>
Fri, 7 Dec 2018 09:42:08 +0000 (10:42 +0100)
commiteee1b61f85d949aa7c4bc496b5579cf759d1861e
tree28ac739c9b651904d88a3001262975c8df59ac18
parentfb669f51b3f2cae79511ac3d1c43939d951b1f69
hadrian: optimise Rules.Compile

Previously, as reported in #15938, resuming a build "in the middle",
e.g when building _build/stage1/libraries/base/, hadrian would take up
to a whole minute to get started doing actual work, building code.

This was mostly due to a big enumeration that we do in Rules.hs, to
generate all the possible patterns for object files for 1) all ways, 2)
all packages and 3) all stages. Since rule enumeration is always
performed, whatever the target, we were always paying this cost, which
seemed to grow bigger the farther in the build we stopped and were
resuming from.

Instead, this patch borrows the approach that we took for Rules.Library
in https://github.com/snowleopard/hadrian/pull/571, which exposes all the
relevant object files under as few catch-all rules as possible (8 here),
and parses all the information we need out of the object's path.

The concrete effect of this patch that I have observed is to reduce the
45-60 seconds pause to <5 seconds. Along with the Shake performance
improvements that Neil mentions in #15938, most of the pause should
effectively disappear.

Reviewers: snowleopard, bgamari, goldfire

Reviewed By: snowleopard

Subscribers: rwbarton, carter

GHC Trac Issues: #15938

Differential Revision: https://phabricator.haskell.org/D5412
hadrian/hadrian.cabal
hadrian/src/Hadrian/BuildPath.hs [new file with mode: 0644]
hadrian/src/Rules.hs
hadrian/src/Rules/Compile.hs
hadrian/src/Rules/Library.hs