Depuração de registros SSE e AVX no LLDB

Como a abordagem do LLDB aqui parece ser um pouco diferente da do GDB, demorei um pouco para acertar, então aqui está como fiz:

Digamos que paramos nosso programa em algum ponto e desejamos saber o estado do xmm0registrador que contém 4 floats. Uma impressão simples produzirá apenas o seguinte:

(lldb) po $xmm0
(unsigned char __attribute__((ext_vector_type(16)))) $6 = {
[0] = ''
...
[15] = '@'
}

Não é realmente útil. Para obter a saída adequada, precisamos converter o registrador para o tipo adequado, como este:

po (float __attribute__((ext_vector_type(4)))) $xmm0
([0] = 1, [1] = 2, [2] = 3, [3] = 4)

Para que isso funcione, deve-se modificar tanto o tipo (neste caso char -> float) quanto a quantidade de elementos no vetor ( 16 -> 4). O tamanho do tipo multiplicado pelo número de elementos deve corresponder ao tamanho do registro SIMD, caso contrário, o LLDB reclamará. Nesse caso, xmm0tem 128 bits de largura e 32 (tamanho do flutuador) * 4 é igual a 128.