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

David Blaikie dblaikie@gmail.com
Wed Mar 9 16:39:53 GMT 2016


On Mar 9, 2016 8:36 AM, "Michael Eager" <eager at eagercon.com> wrote:
>
> 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".

After you suggesting that this float type would be used only for floats in
register and a different float type would be used for floats in memory?

I'm not sure how that would be used to describe a single variable that at
some points in its lifetime resides in memory and at others in register.

>
>
> --
> Michael Eager    eager at eagercon.com
> 1960 Park Blvd., Palo Alto, CA 94306  650-325-8077
>
>
> _______________________________________________
> Dwarf-Discuss mailing list
> Dwarf-Discuss at lists.dwarfstd.org
> http://lists.dwarfstd.org/listinfo.cgi/dwarf-discuss-dwarfstd.org
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.dwarfstd.org/private.cgi/dwarf-discuss-dwarfstd.org/attachments/20160309/0f0b75b4/attachment.htm>



More information about the Dwarf-discuss mailing list