Mechanism for checking that we only enter single-entry thunks once
During this week's GHC call it came up that it would be nice to have a linting mechanism for verifying that we only enter single-entry thunks once, as currently this invariant appears to be completely unchecked.
Currently we do not record whether a thunk is intended to be single-entry when we emit its code. Moreover, I don't believe there is any room for this left in the info table to record this fact. There are two ways I can think of accomodating this,
- stealing a bit from the thunk type field
- add a flags field to
StgDebugInfosuch that the lint requires the
As far as implementing the check itself, I think it should be rather straightforward. When we enter a thunk we simply want to check whether it is single-entry. If it is then we replace it with a special type of
BLACKHOLE-like thunk which crashes the program (or merely emits a warning) on entry.