[Dwarf-Discuss] Representing the location of smaller values in vector registers

Michael Eager eager at eagercon.com
Wed Mar 9 08:36:44 PST 2016

On 03/04/2016 01:12 PM, Adrian Prantl wrote:
> I have a best-practice kind of question:
> The x86_64 System V ABI passes floating point values in the xmm0, xmm1, ... 128-bit SSE vector registers. I’m wondering what the correct DWARF v4 (lacking the DWARF 5 type conversions) expression for a 32-bit float in xmm0 is.
> Given the following program:
> float return_float() __attribute__((noinline)) { return 3.14f; }
> int main(int argc, char** argv) {
>    float f = return_float();
>    return (int)f;
> }
> Clang (-O1) currently produces the following DWARF for the variable f:
>   DW_TAG_variable
>     DW_AT_location( reg17 )   // xmm0 = 17
>     DW_AT_name( "f" )
>     DW_AT_decl_file( "test.c" )
>     DW_AT_decl_line( 8 )
>     DW_AT_type( {0x0000004a} ( float ) )
> Which causes LLDB to complain that the size of register xmm0 (128 Bits) is different from the size of f (32 Bits). I wonder who is wrong? Is LLDB being too strict, or should clang actually emit something like DW_OP_reg 17 (xmm0) DW_OP_piece 4 to make it abundantly clear that only the lower 32 bits of the vector register are interesting?

How is the "float" type described?

A value which is contained in a register larger than the size of
the value should be described by a DW_TAG_base_type.  (DWARF 4,
Sect. 5.1, bottom of page 75).

For a 32-bit float in a 128-bit container, use something like the following:

     DW_AT_name "float"
     DW_AT_encoding DW_ATE_float
     DW_AT_byte_size 16
     DW_AT_bit_size 32
     DW_AT_data_bit_offset 0

Note that there is no requirement that the names on base types
be unique.  There may be more than one with the name "float".

Michael Eager	 eager at eagercon.com
1960 Park Blvd., Palo Alto, CA 94306  650-325-8077

More information about the Dwarf-Discuss mailing list