Peeking into StgInfoTable in cmm

Andrew Martin andrew.thaddeus at gmail.com
Wed Feb 6 22:36:43 UTC 2019


Woah, that's pretty neat. I didn't even realize that GHCi could do that.
>From a quick perusal of the GHCi docs, it looks like :print and :force are
related commands. How is GHCi used to show the type of a closure though?

On Wed, Feb 6, 2019 at 5:29 PM Simon Peyton Jones <simonpj at microsoft.com>
wrote:

> You might also find compiler/ghci/RtClosureInspect.hs useful.
>
>
>
> It’s the main module of the GHCi debugger, and allows Haskell code to
> inspect the Haskell heap.    So it has mechanisms for unpacking arbitrary
> closures, all in Haskell.
>
>
>
> It’s tough going though.   It was written a long time ago by Pepe Iborra
> (in a GSoC project), and has not received much love since.  Maybe you could
> be a source of love?!
>
>
>
> Simon
>
>
>
> *From:* Libraries <libraries-bounces at haskell.org> *On Behalf Of *Andrew
> Martin
> *Sent:* 06 February 2019 20:57
> *To:* Matthew Pickering <matthewtpickering at gmail.com>
> *Cc:* Haskell Libraries <libraries at haskell.org>
> *Subject:* Re: Peeking into StgInfoTable in cmm
>
>
>
> Or even better, it looks like cmmGetClosureType already combines the two
> for me.
>
>
>
> On Wed, Feb 6, 2019 at 3:49 PM Andrew Martin <andrew.thaddeus at gmail.com>
> wrote:
>
> Thanks. The source code of ghc-heap has led me to what I was looking for.
> That whole library hinges upon unpackClosure# (stg_unpackClosurezh), whose
> implementation opens with the telling:
>
>
>
>     info  = %GET_STD_INFO(UNTAG(closure));
>
>
>
> In CmmParse.y, we find the implementation of GET_STD_INFO, and just a few
> lines below is the INFO_TYPE macro. The combination of these (along with a
> cmm implementation of UNTAG, which I am still unsure of exactly how to
> accomplish) should do the trick.
>
>
>
> On Wed, Feb 6, 2019 at 2:53 PM Matthew Pickering <
> matthewtpickering at gmail.com> wrote:
>
> Unless I am misunderstanding you want something which works like ghc-heap.
>
> If so, perhaps these three files will be instructive?
>
>
> https://gitlab.haskell.org/ghc/ghc/blob/master/libraries/ghc-heap/GHC/Exts/Heap/InfoTable.hsc
> <https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgitlab.haskell.org%2Fghc%2Fghc%2Fblob%2Fmaster%2Flibraries%2Fghc-heap%2FGHC%2FExts%2FHeap%2FInfoTable.hsc&data=02%7C01%7Csimonpj%40microsoft.com%7C06915c8ff0cf44831aa208d68c75bb48%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C636850834616930861&sdata=7AOF4PAMQw7jFWNo0t6Hq4tWiT%2FOscQ40xm25gag6Ys%3D&reserved=0>
>
> https://gitlab.haskell.org/ghc/ghc/blob/master/libraries/ghc-heap/GHC/Exts/Heap/InfoTableProf.hsc
> <https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgitlab.haskell.org%2Fghc%2Fghc%2Fblob%2Fmaster%2Flibraries%2Fghc-heap%2FGHC%2FExts%2FHeap%2FInfoTableProf.hsc&data=02%7C01%7Csimonpj%40microsoft.com%7C06915c8ff0cf44831aa208d68c75bb48%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C636850834616930861&sdata=YzGRBEBOVYFNdAQdfEk2wZqJ7t3vJW7VFs0B%2FfNY7ik%3D&reserved=0>
>
> https://gitlab.haskell.org/ghc/ghc/blob/master/libraries/ghc-heap/GHC/Exts/Heap/Closures.hs#L25
> <https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgitlab.haskell.org%2Fghc%2Fghc%2Fblob%2Fmaster%2Flibraries%2Fghc-heap%2FGHC%2FExts%2FHeap%2FClosures.hs%23L25&data=02%7C01%7Csimonpj%40microsoft.com%7C06915c8ff0cf44831aa208d68c75bb48%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C636850834616940859&sdata=%2FrzmmYNnEBkPeFPMiwaerspjuOxJKI4B519Ev041zN4%3D&reserved=0>
>
> Cheers,
>
> Matt
>
> On Wed, Feb 6, 2019 at 7:29 PM Andrew Martin <andrew.thaddeus at gmail.com>
> wrote:
> >
> > For an optimization I’m implementing, I’m trying to write an inline
> primop that gives me lets me inspect the closure type of an arbitrary
> heap-allocated value. I’m close to figuring this out, and the FCode
> machinery is starting to make sense, but one thing eludes me. Starting from
> a StgHeader, I get the info table pointer. This is easy since it’s the
> first field in the struct. But next I have to deference the info table
> pointer and get the closure type. There are two fields at the beginning of
> an info table that may or may not be present. I don’t know how to figure
> out if they are present or not. I suspect that there is something I can get
> out of DynFlags that tells me this, but I can’t find anything else in the
> stg-to-cmm pass that reads from an info table.
> >
> > Sent from my iPhone
> > _______________________________________________
> > Libraries mailing list
> > Libraries at haskell.org
> > http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
> <https://nam06.safelinks.protection.outlook.com/?url=http%3A%2F%2Fmail.haskell.org%2Fcgi-bin%2Fmailman%2Flistinfo%2Flibraries&data=02%7C01%7Csimonpj%40microsoft.com%7C06915c8ff0cf44831aa208d68c75bb48%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C636850834616940859&sdata=7%2Fc3qcuTEGeUjd9lG%2FXYVnb3bZ8%2B61jEf4XidnEgfUw%3D&reserved=0>
>
>
>
>
> --
>
> -Andrew Thaddeus Martin
>
>
>
>
> --
>
> -Andrew Thaddeus Martin
>


-- 
-Andrew Thaddeus Martin
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/libraries/attachments/20190206/4d36e8fa/attachment.html>


More information about the Libraries mailing list