What does "return" keyword mean in INFO_TABLE_RET declarations?

Rahul Muttineni rahulmutt at gmail.com
Mon Mar 19 00:53:48 UTC 2018

Hi Omer,

An INFO_TABLE_RET is a frame that "can be returned to" and the return
keyword allows you to provide a name for the value(s) that was(were)
returned to this frame and do something with it if you wish. If you didn't
have this keyword, you would have to do low-level stack manipulations
yourself to get a handle on the return value and it's easy to mess up.

You can think of INFO_TABLE_RET as a traditional stack frame in languages
like C, except it's powerful because you can specify custom logic on how
you deal with the returned value. In some cases, like stg_atomically_frame,
you may not even return the value further down into the stack until certain
conditions are met (the transaction is valid).

Hope that helps,

On Sun, Mar 18, 2018 at 8:18 PM, Ömer Sinan Ağacan <omeragacan at gmail.com>

> Hi,
> I'm trying to understand what a "return" list in INFO_TABLE_RET declaration
> line specifies. As far as I understand a "return" in the declaration line
> is
> something different than a "return" in the body. For example, in this
> definition: (in HeapStackCheck.cmm)
>     INFO_TABLE_RET ( stg_ret_p, RET_SMALL, W_ info_ptr, P_ ptr )
>         return (/* no return values */)
>     {
>         return (ptr);
>     }
> The return list is empty and it even says "no return values" explicitly,
> yet it
> returns something.
> My guess is that the "return" list in the header is actually for
> arguments. I
> found this info table which has an argument: (in StgMiscClosures.cmm)
>     INFO_TABLE_RET (stg_restore_cccs_eval, RET_SMALL, W_ info_ptr, W_ cccs)
>         return (P_ ret)
>     {
>         unwind Sp = Sp + WDS(2);
>     #if defined(PROFILING)
>         CCCS = cccs;
>     #endif
>         jump stg_ap_0_fast(ret);
>     }
> This is the use site: (in Interpreter.c)
>     #if defined(PROFILING)
>         // restore the CCCS after evaluating the closure
>         Sp_subW(2);
>         SpW(1) = (W_)cap->r.rCCCS;
>         SpW(0) = (W_)&stg_restore_cccs_eval_info;
>     #endif
>         Sp_subW(2);
>         SpW(1) = (W_)tagged_obj;
>         SpW(0) = (W_)&stg_enter_info;
>         RETURN_TO_SCHEDULER_NO_PAUSE(ThreadRunGHC, ThreadYielding);
> If I understand this correctly, the "tagged_obj" code will put the return
> value
> in R1, pop the stack (which will have stg_restore_ccs_eval_info at the
> bottom)
> and jump to this the info table code shown above. So `P_ ret` is the value
> of
> `tagged_obj`, and the "return" list is actually for parameters.
> Did I get this right? If I did, I'm curious why it's called "return" and
> not
> "args" or something like that.
> Thanks,
> Ömer
> _______________________________________________
> ghc-devs mailing list
> ghc-devs at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs

Rahul Muttineni
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/ghc-devs/attachments/20180319/03d9a5a7/attachment.html>

More information about the ghc-devs mailing list