Need help with GHC API and GHC internals

I'm attempting to write a call-graph generator for Haskell using the GHC API. I.e., for each top level value definition, I want a list of the top-level names used in the definition. Using GHC API, once I have a 'CheckedModule', I have a dilemma: a) If I use this field parsedSource :: ParsedSource I've got a giant AST that I need to traverse for names, there being no help in the compiler to do so, AFAIK. b) If I use this field coreBinds :: Maybe [CoreBind] although I've got a simpler type to deal with, and some useful functions (e.g. exprFreeNames), I believe I'm now swimming in waters a bit deep for me or maybe this is just a flawed approach: - the core bindings created do not correspond exactly to the bindings in the source and 'exprFreeNames' is acting in surprising ways. - etc, etc. Does anyone have any advice for me here? Is there some way I can get approach (b) to work without becoming a wizard in GHC internals? Is there anything I'm missing? Thanks, Mark

API. I.e., for each top level value definition, I want a list of the top-level names used in the definition.
Using GHC API, once I have a 'CheckedModule', I have a dilemma: a) If I use this field parsedSource :: ParsedSource I've got a giant AST that I need to traverse for names, there being no help in the compiler to do so, AFAIK.
Have a look at http://hackage.haskell.org/trac/ghc/wiki/GhcApiAstTraversals and its attachments (Instances.hs/Instances0.hs provides some Data/Typeable instances for Ghc's Ast types using standalone deriving, Utils.hs/APSSybTesting.hs show some uses). There seems to be agreement that Data/Typeable instances (though not necessarily these) should come with the Ghc Api in the future. If you stop with the parsed AST, there is no scope information, so you might still want to use the output of later phases for your task (renamedSource might be suitable). Hth, Claus
b) If I use this field coreBinds :: Maybe [CoreBind] although I've got a simpler type to deal with, and some useful functions (e.g. exprFreeNames), I believe I'm now swimming in waters a bit deep for me or maybe this is just a flawed approach: - the core bindings created do not correspond exactly to the bindings in the source and 'exprFreeNames' is acting in surprising ways. - etc, etc.
Does anyone have any advice for me here? Is there some way I can get approach (b) to work without becoming a wizard in GHC internals? Is there anything I'm missing?
Thanks,
Mark
_______________________________________________ Glasgow-haskell-users mailing list Glasgow-haskell-users@haskell.org http://www.haskell.org/mailman/listinfo/glasgow-haskell-users

* Claus is right to say that you want the *renamed* tree, not the *parsed* tree. * He's also right to point to the under-development generic programming stuff for the GHC API. I'm not certain about how settled they are right now though. * But in fact you can get exactly what you want from the mg_used_names fields of the ModGuts (post desugaring). Simon | -----Original Message----- | From: glasgow-haskell-users-bounces@haskell.org [mailto:glasgow-haskell-users-bounces@haskell.org] On | Behalf Of Mark Tullsen | Sent: 02 August 2008 04:06 | To: glasgow-haskell-users@haskell.org | Subject: Need help with GHC API and GHC internals | | I'm attempting to write a call-graph generator for Haskell using the GHC | API. I.e., for each top level value definition, I want a list of the | top-level | names used in the definition. | | Using GHC API, once I have a 'CheckedModule', I have a dilemma: | a) If I use this field | parsedSource :: ParsedSource | I've got a giant AST that I need to traverse for names, there | being no | help in the compiler to do so, AFAIK. | b) If I use this field | coreBinds :: Maybe [CoreBind] | although I've got a simpler type to deal with, and some useful | functions | (e.g. exprFreeNames), I believe I'm now swimming in waters a bit | deep for me or maybe this is just a flawed approach: | - the core bindings created do not correspond exactly to the | bindings | in the source and 'exprFreeNames' is acting in surprising ways. | - etc, etc. | | Does anyone have any advice for me here? Is there some way I can get | approach | (b) to work without becoming a wizard in GHC internals? Is there | anything I'm | missing? | | Thanks, | | Mark | | _______________________________________________ | Glasgow-haskell-users mailing list | Glasgow-haskell-users@haskell.org | http://www.haskell.org/mailman/listinfo/glasgow-haskell-users
participants (3)
-
Claus Reinke
-
Mark Tullsen
-
Simon Peyton-Jones