On Mar 4, 2016, at 2:00 PM, Robinson, Paul <paul_robin...@playstation.sony.com> wrote: > I tried a CU with an int variable instead of float, and enough other > stuff to keep it from being optimized away completely. > gcc produced DW_OP_reg3, while Clang produced "DW_OP_reg3; DW_OP_piece 4" > for the same variable. > > DW_OP_piece is really meant for assembling partial values in different > places, not subdividing a register.
The introduction to the "piece" opcodes says that subdividing a register is part of their intended use (as Jakub Jelinek says, you have a similar situation if you're storing "char"s in a wider register): > 2.6.1.2 Composite Location Descriptions > > A composite location description describes an object or value which may be > contained in part of a register or stored in more than one location. [....] > There may be one or more composition operations in a single composite > location description. Using a single composition operation to describe a value which is located in part of a register is explicitly an intended case for the piece operators. DW_OP_piece can be used to specify a value shorter than an entire register when "the placement of the piece within that register is defined by the ABI"; DW_OP_bit_piece can be used "when the piece to be assembled into a value [...] is not at the start of a register". So it seems to me that Clang's output (reg; piece) is correct; I think GCC's is also reasonable, since the ABI defines how to store a float32 in a 128-bit register. _______________________________________________ Dwarf-Discuss mailing list Dwarf-Discuss@lists.dwarfstd.org http://lists.dwarfstd.org/listinfo.cgi/dwarf-discuss-dwarfstd.org