[GHC] #11651: Allow plugins to define built-in rules

GHC ghc-devs at haskell.org
Fri Feb 26 18:42:02 UTC 2016


#11651: Allow plugins to define built-in rules
-------------------------------------+-------------------------------------
        Reporter:  simonpj           |                Owner:
            Type:  bug               |               Status:  merge
        Priority:  highest           |            Milestone:  8.0.1
       Component:  Compiler          |              Version:  7.10.3
      Resolution:                    |             Keywords:
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

@@ -1,2 +1,2 @@
- Conal Eliot has an application in which he wants a plugin to add some new
- `BuiltinRules` to the `mg_rules` of the `ModGuts` of the module being
+ Conal Elliott has an application in which he wants a plugin to add some
+ new `BuiltinRules` to the `mg_rules` of the `ModGuts` of the module being

New description:

 Conal Elliott has an application in which he wants a plugin to add some
 new `BuiltinRules` to the `mg_rules` of the `ModGuts` of the module being
 compiled.  He needs a built-in rule (which runs some custom code) rather
 than a vanilla `CoreRule` (which pattern-matches the argument).

 But then he got a GHC panic
 {{{
 get a GHC panic: “No match in record selector ru_args”.
 }}}
 Turns out it comes from these lines in `OccAnal`
 {{{
     imp_rule_edges = foldr (plusVarEnv_C unionVarSet) emptyVarEnv
                             [ mapVarEnv (const maps_to) (exprFreeIds arg
 `delVarSetList` ru_bndrs imp_rule)
                             | imp_rule <- imp_rules
                             , let maps_to = exprFreeIds (ru_rhs imp_rule)
                                              `delVarSetList` ru_bndrs
 imp_rule
                             , arg <- ru_args imp_rule ]
 }}}
 This code is just working out what locally-defined variables should be
 kept alive by the `mg_rules` for imported Ids.   But `BuiltinRules` don't
 have any `ru_args`.

 Easy fix: just don't traverse builtin rules in this scan.  In Conal's
 case, the rules that his plugin adds certainly don't mention locally-
 defined Ids.

 I'll do this shortly.

--

Comment (by conal):

 Fixed spelling of my last name.

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/11651#comment:4>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list