GDB | DWARF expression | Extracting a range of bits from an 'xmm' register

Zaric, Zoran (Zare)
Mon May 24 10:00:48 GMT 2021

On 5/21/21 10:09 PM, vaibhav kurhe wrote:
> [CAUTION: External Email]
> On Fri, May 21, 2021 at 10:36 PM Zaric, Zoran (Zare) via Gdb
> <> wrote:
>> On 5/21/21 3:03 PM, Andrew Burgess wrote:
>>> * vaibhav kurhe via Gdb <> [2021-05-21 14:27:15 +0530]:
>>>> Hello all,
>>>> For a use case, I am trying to build a DWARF expression which represents
>>>> the value of an arbitrary range of bits (e.g. 96-127 bits) in an *128-bit
>>>> xmm register* to be used as a *location attribute value* for a variable DIE.
>>>> I am using GDB to consume the debug info and test it.
>>>> Following is the expression I started with to test out a shift operation on
>>>> an 128-bit xmm0 register using Typed DWARF stack :-
>>>> *"DW_OP_GNU_regval_type: 21 (xmm0) <0x30>; DW_OP_GNU_const_type: <0x30>  16
>>>> byte block: 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ; DW_OP_shl;
>>> I'm probably just not understanding correctly, but I'm confused by the
>>> use of DW_OP_GNU_const_type.  Isn't this providing the number of bits
>>> to shift?  I'd have expected something like 'DW_OP_const1u 96'.
>>> Thanks,
>>> Andrew
>> Hi Vaibhav,
>> Maybe I am missing something, but what is the end goal that you are
>> trying to accomplish?
>> The way how you formed your expression, you can only get a read only
>> stack value location description.
>> Why not use the DW_OP_bit_piece with your register being the only piece
>> inside of it and then use that as your end location description?
>> Thanks,
>> Zoran
> Hi Zoran,
> Thanks for the reply!
> Actually I am trying to improve an object file's debug info in case of
> a vectorized transformation by the compiler.
> e.g. when a source variable, 'sum' = (xmm0[0-31] + xmm0[32-63] +
> xmm0[64-95] + xmm0[96-127]).
> Thanks for pointing out the DW_OP_bit_piece operation! It worked in a
> setting where a source variable resides directly in a 32-bit chunk of
> an 128-bit xmm register.
> But, I think it won't be possible for the above example(?).
> Here, we'll have to do 128-bit operations (such as DW_OP_shl) on the
> register to get its 32-bit chunks. Is that correct?
> Regards,
> Vaibhav

Right, so for that use case, Andrew's suggestion is the way to go and it 
should work unless there are bugs in gdb evaluator (which there could be).

Your original approach should work too, but there seems to be some 
unexpected limitation when using the shift operation with user based 
types or something similar.

I would also suggest to use the DWARF standard operations instead of GNU 
extensions whenever possible (like DW_OP_regval_type).

On another note, if you are trying to support debugging of a heavily 
optimized and vectorized code, maybe it would be worth your time 
checking out what we are trying to do with our extensions of the DWARF 

The idea is to support more descriptive and better compose-able location 
descriptions and expressions.

You can find more on this link:

There is also a working implementation in gdb that is currently being 
reviewed and can be found here:

We would greatly appreciate any input you might have about it.

Hope this helps,

More information about the Gdb mailing list