Min closure payload size?

Ömer Sinan Ağacan omeragacan at gmail.com
Tue Feb 5 13:37:48 UTC 2019


I just came across a closure that is according to this code is not valid:

    >>> print *get_itbl(0x7b2870)
    $8 = {
      layout = {
        payload = {
          ptrs = 0,
          nptrs = 0
        },
        bitmap = 0,
        large_bitmap_offset = 0,
        __pad_large_bitmap_offset = 0,
        selector_offset = 0
      },
      type = 21,
      srt = 3856568,
      code = 0x404ef0 <r1Al_info>
"H\215E\360L9\370rDH\203\354\bL\211\350H\211\336H\211\307\061\300\350|\034\062"
    }

This is a THUNK_STATIC with 0 ptrs and nptrs in the payload.

Ömer

Ömer Sinan Ağacan <omeragacan at gmail.com>, 4 Şub 2019 Pzt, 16:23
tarihinde şunu yazdı:
>
> Hi,
>
> I was trying to understand why some info tables that have no ptrs and nptrs like
> GCD_CAF end up with 1 nptrs in the generated info table and found this code in
> Constants.h:
>
>     /* -----------------------------------------------------------------------------
>        Minimum closure sizes
>
>        This is the minimum number of words in the payload of a
>        heap-allocated closure, so that the closure has enough room to be
>        overwritten with a forwarding pointer during garbage collection.
>        --------------------------------------------------------------------------
> */
>
>     #define MIN_PAYLOAD_SIZE 1
>
> We use this in a few places in the compiler and add at least one word space in
> the payload. However the comment is actually wrong, forwarding pointers are made
> by tagging the info ptr field so we don't need a word in the payload for
> forwarding pointers. I tried updating this as 0 but that caused a lot of test
> failures (mostly in GHCi). I'm wondering if I'm missing anything or is it just
> some code assuming min payload size 1 without using this macro.
>
> Any ideas?
>
> Ömer


More information about the ghc-devs mailing list