[GHC] #12733: Orphan hashes are not being propagated correctly
GHC
ghc-devs at haskell.org
Tue Oct 18 06:07:32 UTC 2016
#12733: Orphan hashes are not being propagated correctly
-------------------------------------+-------------------------------------
Reporter: ezyang | Owner:
Type: bug | Status: new
Priority: normal | Milestone:
Component: Driver | Version: 8.1
Keywords: | Operating System: Unknown/Multiple
Architecture: | Type of failure: None/Unknown
Unknown/Multiple |
Test Case: | Blocked By:
Blocking: | Related Tickets:
Differential Rev(s): | Wiki Page:
-------------------------------------+-------------------------------------
In Phab:D2607, simonpj asked why we didn't also put class instances in the
export hash. Why indeed. In the course of investigating, I discovered
another bug in how we handle orphan recompilation.
Unfortunately, this bug needs two packages to manifest.
{{{
-- p/P.hs
module P where
instance Show (a -> b) where
--instance Show (IO a) where
-- q/Q.hs
module Q where
import P
-- q/Q2.hs
module Q2 where
import Q
}}}
Put in some default Cabal files, with q depending on p, and then build the
entire kaboodle. Then edit `p/P.hs` to uncomment the second orphan
instance. Rebuild.
{{{
ezyang at sabre:~/Dev/labs/orph$ cabal new-build q -w ghc-head
In order, the following will be built (use -v for more details):
- p-0.1.0.0 (lib) (file P.hs changed)
- q-0.1.0.0 (lib) (dependency rebuilt)
Preprocessing library p-0.1.0.0...
[1 of 1] Compiling P ( P.hs, /srv/code/labs/orph/dist-
newstyle/build/x86_64-linux/ghc-8.1.20161016/p-0.1.0.0/build/P.o )
P.hs:2:10: warning: [-Wmissing-methods]
• No explicit implementation for
either ‘showsPrec’ or ‘show’
• In the instance declaration for ‘Show (a -> b)’
P.hs:3:10: warning: [-Wmissing-methods]
• No explicit implementation for
either ‘showsPrec’ or ‘show’
• In the instance declaration for ‘Show (IO a)’
module Q2 where
Preprocessing library q-0.1.0.0...
[1 of 2] Compiling Q ( Q.hs, /srv/code/labs/orph/dist-
newstyle/build/x86_64-linux/ghc-8.1.20161016/q-0.1.0.0/build/Q.o ) [P
changed]
ezyang at sabre:~/Dev/labs/orph$
}}}
Notice: Q2 never got rebuilt. This is wrong wrong wrong: P changed, and we
need to rebuild Q2!
Here are the hashes for Q.hi before and after:
{{{
-- Before
interface Q 80120161016
interface hash: 2ffc06a1552565a73c888110ab4cf8df
ABI hash: b2768862866252ea5a63401d2aa05aaa
export-list hash: 092acc280445a8bcc96904afb8b766b0
orphan hash: 693e9af84d3dfcc71e640e005bdc5e2e
flag hash: f01bb78d3c47152bc5253f256b2a60d3
-- After
interface Q 80120161016
interface hash: 009db9e5ecbe49e36b7bf38e02087e75
ABI hash: b2768862866252ea5a63401d2aa05aaa
export-list hash: 092acc280445a8bcc96904afb8b766b0
orphan hash: 693e9af84d3dfcc71e640e005bdc5e2e
flag hash: f01bb78d3c47152bc5253f256b2a60d3
}}}
The orphan hash didn't get updated.
At the moment, when we compute the orphan hash, we only consider the
orphan hashes from the home package. Here's the comment justifying it:
{{{
-- the export hash of a module depends on the orphan hashes of the
-- orphan modules below us in the dependency tree. This is the way
-- that changes in orphans get propagated all the way up the
-- dependency tree. We only care about orphan modules in the current
-- package, because changes to orphans outside this package will be
-- tracked by the usage on the ABI hash of package modules that we
import.
}}}
It is true that we know to rebuild Q.hs when P.hs changes. But that is not
much solace for Q2.hs...
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/12733>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list