Core, implicit bindings are emitted in the wrong order

Tobias Gedell d99getob at dtek.chalmers.se
Sat Jan 25 06:54:25 EST 2003


The implicit bindings are emitted in the wrong order when generating Core.

It seems like the problem occurs since the implicit bindings does not 
only consist of wrappers and class functions but also conversion 
functions. These conversion functions sometimes use wrappers that have 
not yet been defined.

An example of this is found at line 240 in Base.hcr (generated with the 
-O0 flag):

-------------
GHCziBase.zdgfromBool ::
      GHCziBase.Bool ->
      GHCziBase.ZCzpZC GHCziBase.Unit GHCziBase.Unit =
  \ (g::GHCziBase.Bool) ->
   %case g %of (g1::GHCziBase.Bool)
   {
    GHCziBase.False ->
     GHCziBase.Inl @ GHCziBase.Unit @ GHCziBase.Unit GHCziBase.Unit;
    GHCziBase.True ->
     GHCziBase.Inr @ GHCziBase.Unit @ GHCziBase.Unit GHCziBase.Unit
   };
--------------

Here we try to use the wrappers GHCziBase.Inl and GHCziBase.Inr but they 
are defined first at line 346.


Maybe these conversion functions only use GHCziBase.ZCzpZC and then a 
possible fix would be to make sure that GHCziBase.Inl and GHCziBase.Inr 
are defined before all other implicit bindings.

Another possible fix that I have implemented is to make sure that all 
wrappers are defined before all other implicit bindings.


I have replaced line 53-70 in ghc/compiler/coreSyn/MkExternalCore.lhs with:

----------
mkExternalCore :: ModGuts -> C.Module
mkExternalCore (ModGuts {mg_module=this_mod, mg_types = type_env, 
mg_binds = binds})
   = C.Module mname tdefs vdefs
   where
     mname  = make_mid this_mod
     tdefs  = foldr collect_tdefs [] tycons
	-- Don't forget to include the implicit bindings!
     vdefs  = map make_vdef (implicit_wbinds ++ implicit_binds ++ binds)
     tycons = map classTyCon (typeEnvClasses type_env) ++ typeEnvTyCons 
type_env

     tything = typeEnvElts type_env
     implicit_wbinds = map get_defn $ concatMap implicit_wids tything
     implicit_binds = map get_defn $ concatMap implicit_ids tything

-- Get only the wrappers
implicit_wids :: TyThing -> [Id]
-- C.f. HscTypes.mkImplicitBinds, but we do not include constructor workers
implicit_wids (ATyCon tc) = map dataConWrapId (tyConDataCons_maybe tc 
`orElse` [])
implicit_wids other       = []

-- Get all other bindings
implicit_ids :: TyThing -> [Id]
implicit_ids (ATyCon tc) = tyConSelIds tc ++ tyConGenIds tc
implicit_ids (AClass cl) = classSelIds cl
implicit_ids other       = []
----------




Sincerely,
  Tobias




More information about the Glasgow-haskell-bugs mailing list