What does "return" keyword mean in INFO_TABLE_RET declarations?

Simon Peyton Jones simonpj at microsoft.com
Mon Mar 19 10:15:03 UTC 2018


It'd be good to document this clearly somewhere; and explain how it is used.  So that the next time someone wonders, they don't have to reproduce Omer's journey

Simon

|  -----Original Message-----
|  From: ghc-devs <ghc-devs-bounces at haskell.org> On Behalf Of Ömer Sinan
|  Agacan
|  Sent: 19 March 2018 10:03
|  To: Rahul Muttineni <rahulmutt at gmail.com>
|  Cc: ghc-devs <ghc-devs at haskell.org>
|  Subject: Re: What does "return" keyword mean in INFO_TABLE_RET
|  declarations?
|  
|  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
|  >>
|  https://na01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fmail.
|  >> haskell.org%2Fcgi-bin%2Fmailman%2Flistinfo%2Fghc-
|  devs&data=04%7C01%7C
|  >>
|  simonpj%40microsoft.com%7Cb990019591bd43f5ba2508d58d80b93d%7C72f988bf
|  >>
|  86f141af91ab2d7cd011db47%7C1%7C0%7C636570506392775790%7CUnknown%7CTWF
|  >>
|  pbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwifQ%3D%3D
|  >> %7C-
|  1&sdata=ULVGoJr6gEijZOI7uQCLJ9JR4xS6SoNGPo5sIvGff50%3D&reserved=0
|  >
|  >
|  >
|  >
|  > --
|  > Rahul Muttineni
|  _______________________________________________
|  ghc-devs mailing list
|  ghc-devs at haskell.org
|  https://na01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fmail.h
|  askell.org%2Fcgi-bin%2Fmailman%2Flistinfo%2Fghc-
|  devs&data=04%7C01%7Csimonpj%40microsoft.com%7Cb990019591bd43f5ba2508d5
|  8d80b93d%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C6365705063927858
|  00%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI
|  6Ik1haWwifQ%3D%3D%7C-
|  1&sdata=sEL63DuafSAYG0GgGcu30qdU22xkmnq5XLNJVKFlNtA%3D&reserved=0


More information about the ghc-devs mailing list