Code generation/SRT question

Ömer Sinan Ağacan omeragacan at gmail.com
Wed Jan 1 09:34:33 UTC 2020


Hi Simon,

In Cmm if I have a recursive group of functions f and g, and I'm using f's
closure as the SRT for this group, should f's entry block's info table have
f_closure as its SRT?

In Cmm syntax

     f_entry() {
             { info_tbls: [...
                           (c1vn,
                            label: ...
                            rep: ...
                            srt: ??????]
               stack_info: ...
             }
         {offset
           c1vn:
             ...
         }
     }

Here should I have `f_closure` in the srt field?

I'd expect yes, but looking at the current SRT code, in
CmmBuildInfoTables.updInfoSRTs, we have this:

  (newInfo, srtEntries) = case mapLookup (g_entry g) funSRTEnv of

    Nothing ->
      -- if we don't add SRT entries to this closure, then we
      -- want to set the srt field in its info table as usual
      (info_tbl { cit_srt = mapLookup (g_entry g) srt_env }, [])

    Just srtEntries -> srtTrace "maybeStaticFun" (ppr res)
      (info_tbl { cit_rep = new_rep }, res)
      where res = [ CmmLabel lbl | SRTEntry lbl <- srtEntries ]

Here we only update SRT field of the block if we're not adding SRT entries to
the function's closure, so in the example above, because we're using the
function as SRT (and adding SRT entries to its closure) SRT field of c1vn won't
be updated.

Am I missing anything?

Thanks,

Ömer


More information about the ghc-devs mailing list