
Ömer Sinan Ağacan
I have a very simple Core plugin that generates some functions. After my Core-to-Core pass is done, I'm running the linter to make sure the Core generated by my plugin is well-formed and well-typed. However, even though lint checker passes, the code generated by my plugin is failing with a segfault.
...
So my questions are: Am I right in assuming that CoreLint accepted programs should not segfault? What about internal invariants? Should CoreLint check for those? Is there any pass that checks for invariants and prints helpful messages in case of a invariant invalidation?
My understanding is that CoreLint should (in principle) check all internal invariants necessary to ensure the soundness of the Core. If a Core program passes CoreLint it ought not to segfault. It sounds like you found a bug in CoreLint.
As an attempt at debugging the code generated by my plugin, I wrote the function that is supposed to be generated by my Core pass in Haskell and compiled with GHC. Generated Core is mostly the same, except at one point it has an extra lambda directly applied to a void#, something like ((\_ -> ...) void#). Where can I learn more about why GHC is doing that?
Hmm, interesting. I'm afraid I'm not sure what semantics void# has in Core but it sure does sound fishy. Sadly grepping the source tree for clues doesn't turn much up. Simon, perhaps you could comment here? Cheers, - Ben