What does "return" keyword mean in INFO_TABLE_RET declarations?

Ömer Sinan Ağacan omeragacan at gmail.com
Mon Mar 19 10:02:47 UTC 2018


Hi Rahul,

Thanks, that is really helpful.

So my intuition was correct. I think the naming here is a bit unfortunate
because unless you're already familiar with Cmm, when you see this:

    INFO_TABLE_RET ( stg_ret_p, RET_SMALL, W_ info_ptr, P_ ptr )
        return (/* no return values */)
    {
        return (ptr);
    }

you will be _very_ confused.

Ömer

2018-03-19 3:53 GMT+03:00 Rahul Muttineni <rahulmutt at gmail.com>:
> 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,
> Rahul
>
> On Sun, Mar 18, 2018 at 8:18 PM, Ömer Sinan Ağacan <omeragacan at gmail.com>
> wrote:
>>
>> 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


More information about the ghc-devs mailing list