[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_TAG_base_type
     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