<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/82260>82260</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Synthetic children not working for certain types in lldb
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          wolfpld
      </td>
    </tr>
</table>

<pre>
    I'm trying to add a synthetic children provider for the `__m128i` type, but I'm not able to get it to work properly.

I have the following script (`simd.py`) that I hook to lldb:

```python
import lldb

class TestPrinter:
    def __init__(self, valobj, internal_dict):
        self.valobj = valobj

    def update(self):
        logger = lldb.formatters.Logger.Logger()
        logger >> "update"

 def num_children(self):
        logger = lldb.formatters.Logger.Logger()
        logger >> "num_children"
 return 4

    def get_child_index(self, name):
        logger = lldb.formatters.Logger.Logger()
        logger >> "get_child_index: " + name
        return int(name.lstrip('[').rstrip(']'))

    def get_child_at_index(self, index):
        logger = lldb.formatters.Logger.Logger()
        logger >> "get_child_index: " + str(index)
        match index:
            case 0:
 return self.valobj.CreateValueFromExpression('u8x16', 'nullptr')
 case 1:
                return self.valobj.CreateValueFromExpression('i8x16', 'nullptr')
            case 2:
                return self.valobj.CreateValueFromExpression('u16x8', 'nullptr')
            case 3:
                return self.valobj.CreateValueFromExpression('i16x8', 'nullptr')
            case _:
                return None

def __lldb_init_module(debugger, dict):
    lldb.formatters.Logger._lldb_formatters_debug_level = 2
 debugger.HandleCommand('type synthetic add -w simd -l simd.TestPrinter __m128i')
    debugger.HandleCommand('type synthetic add -w simd -l simd.TestPrinter TestType')
    debugger.HandleCommand('type category enable simd')
```

Test program:

```c++
#include <immintrin.h>

struct TestType
{
    int a;
    int b;
};

int main()
{
    TestType tt;
    __m128i simd;
}
```

Debugger behavior:

```
(lldb) b a.cpp:13
Breakpoint 1: where = a.out`main + 4 at a.cpp:13:1, address = 0x0000000000001124
(lldb) r
Process 3664 launched: '/home/wolf/a.out' (x86_64)
Process 3664 stopped
* thread #1, name = 'a.out', stop reason = breakpoint 1.1
    frame #0: 0x0000555555555124 a.out`main at a.cpp:13:1
   10   {
   11           TestType tt;
   12 __m128i simd;
-> 13   }
(lldb) v tt
update
num_children
get_child_index: 0
update
num_children
get_child_index: 1
update
num_children
get_child_index: 2
update
num_children
get_child_index: 3
update
num_children
get_child_index: 0
update
get_child_index: 1
update
get_child_index: 2
update
get_child_index: 3
(TestType) tt = (u8x16 = 0x0000000000000000, i8x16 = 0x0000000000000000, u16x8 = 0x0000000000000000, i16x8 = 0x0000000000000000)
(lldb) v simd
update
(__m128i) simd = (140737353696512, 3348558691198135399)
(lldb)
```

In case of the `TestType` type all the expected methods are called and synthetic children are printed. In case of `__m128i` only a single call to `update` is executed, and then pretty printing is no longer in action.

It is possible to reference the synthetic children individually in `__m128i`, in which case the pretty printer is invoked as expected.

```
(lldb) v simd[0]
num_children
get_child_index: 0
(std::nullptr_t) u8x16 = 0x0000000000000000
```

This behavior can be observed on `lldb version 16.0.6` and `lldb version 19.0.0git (https://github.com/llvm/llvm-project.git revision 652081ca9eefc910bbd3257bac9b2bb44756aa21)`
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzEWFuP4yoS_jXkpTSWjRNfHvLQl4l2pNXqSHu0rxE2lZgzGCzA6c6_XxXOxZlOz0yPZvdYUccN1FdfFVCXCO_V3iCu2eqRrZ4XYgyddesXq3eDlovGyuP6C-NlD8EdldlDsCCkBAH-aEKHQbXQdkpLhwYGZw9KooOddRA6BFak222f8UqxIoVwHJDxJ2jGABOmsQFEo5FQ9xhABXp7se4rYQ3o9DFh6TNLH6a_X6ATB4zQO6u1fSFGvnVqCMB4xYrUq14mw5EVKeM1hE4E-AKdtV8JWGvZsPxhjkgL42c4hs6aaVD1g3VhWj5b22rhPfyJPvzhlAnoLlgAABJ3sN0qo8J2y3jlUe_I2IPQtvmL3qKIEXorVRsYr2-k6SGRZFoPLH8-i84YnPWMgxQBL1reQmm736OLKGRFsrOuFyGg88k_49Tpi5zG63dkP7P8MzDOz9r4DRXiYcZ-e979_xebW50nTuAwjM7A8p639hgmia0yEl9nm2NEj_9zwt-qzx9oFBh_nPTfSJ_sUCYwXtF0on1waoiaSrqkvGS8TtzN6PM0euHynv0ivHHB6f-_zwc-EMSFxg1OL0LbwVnkdo6eVniE9Dp18t7sIiVPDkXA_wg94sbZ_vPr4NB7Zc3ku7F6zYrovSdgvDSj1gMRKq9copLsrv7Zjn1Ap_qxzm9t5L9R_ZgVr9XH1Oe_0_qPq9_-SP2_rMH5yZ9iMR3bKSD3Vo6a4qXEZpwO7RPcC8PvnPQJ6jq-jThbjQfU8YbwS1Cc8JN_CCM1Ptm-F0ZOhlP6m2VNyqKfXoASFnzS8TuZ5RY4J85vHPMbNdD7nzEnf1BFKwLurTsCmpi9CXkOckmq8z0hbZTV90707yXhlvFH-kyjPFem1aNEYPmT6ntlglMm6SiszKR9cGMbrtZMU-Xj1SBlAgiWfzPSXEZY-Xx9nyoAE6AXysyD2w3kWRuEcAN82rXJJXP89x3zfHI3NNiJg7LuPe-c3VLFwoTX0IBI2mFg-UOWT5OPDsXXwRJ9iljw0qHDeEJFYsfAipSsinF3CSLM5fOHjG6FkJKua5RJX9PZk2V8-YaCm0b-cLYlqbwolqDFaNoO5RTlS8Y3naU8u6GqkvHNRIWXVLK9VsW2WF58fIPjgx0GlGedDxA6h0IC43l2zt6RJ-PlGZPGSQ4cCm9NnG5mTkmy617tXATgOWWQk7Gr85Px5a3P3nrrDJSlADA_HVk2C1HvnJSM3z8rnyhjZnlEfH7j7gOhxMFTURbfb0qiOHIn36a_KJf9ohz_Rbn899n3c9b8HPf3mTJeXSNpDSGczmQVa4s7F4meWHr9YD4m6u_Jf3e-vnN44kl7Yxrj1SXZ1FO6OFmQLdMyL_NVXtTFKuOkNM-X1WpVFXWW1VWWr_K6vqPrO-Hui5mSut2dW8SL9049Igit4xy-DtgGlNBj6Kz0IBwlH61RgjDyXgtKK4aY32QCM1W3nag1-kgtrDJ7PSFSe8iK9OSWIgXlAV-xHQPKGBaNJErU42IIx0kHdZ_Kg7GgraEITmGiDcqa26410KrBeq9Ova7DHTo07dTK3jFDGakOSo5C6yOh3tCfynZ46VTbTQYSypwYUfGgzMF-JVf5iyeTn0ssp5Oyekypt_jwHaT2IlD4Z_nDqb7bUqkF370R3ykdOuUv2RFaYaBBsI1Hd0AJNrqHqMMBHRWakBVJmhS0jbRvb2brJE3SvYq_GXQhDJ6o8g3jm70K3dgkre0Z32h9OH99Gpz9C9uQkJTDg4pAxYqnVdaKGnHX1lnaNDLnq7IRbd3wplkuy1UhBM_oQhTpQq5zWee1WOA6K9MqX9W8XC66ddVWospzsSt5KrN2txRVncm0rdocsyLLFmrNU75MeVZnRbbMlwnWvGzbdJcXq6qu8pwtU-yF0glxTazbL5T3I64rzot0oUWD2sdfeDg3-AJxknrn1fPCraN9zbj3bJlq5YO_ogQVNK7__fZ8GhvizzR0A3a0J-gCJUm6vnTwYiG9GJ1ef8y_jG8iOc_4JpL_bwAAAP__jzx3ug">