[Dwarf-Discuss] DWARF piece questions
arnez at linux.vnet.ibm.com
Mon Dec 12 06:28:22 PST 2016
On Fri, Dec 09 2016, Adrian Prantl wrote:
> Here's my take on this.
>> On Dec 9, 2016, at 11:11 AM, Andreas Arnez <arnez at linux.vnet.ibm.com> wrote:
>> Although I've already created public comments for (most of) this,
>> Michael Eager suggested that I post my questions regarding DWARF pieces
>> on this list (again).
>> All of these questions are related to the definition of DW_OP_piece and
>> * Is "DW_OP_piece(n)" equivalent to "DW_OP_bit_piece(8*n, 0)"?
> I would think the answer to this is yes, and if it isn't I would
> really like to see the counterexample added to the Appendix.
Right, I think clarification would be appropriate either way.
Does anybody vote for "no"?
>> * What is the correct placement rule for register pieces? ABI-defined
>> or lsb0-ordered? If lsb0-ordered, how exactly is that order defined
>> for non-integer registers?
> "If the location is a register, the offset is from the least
> significant bit end of the register."
> Does this text from the latest draft answer the question?
> If not, can you give an example where it isn't?
The definition of DW_OP_piece differs, though: "[...] the placement of
the piece within that register is defined by the ABI."
>> * Shall DW_OP_bit_piece ignore the offset for stack- and implicit
> "If the location is any implicit value or stack value, the
> DW_OP_bit_piece operation describes a sequence of bits using the least
> significant bits of that value."
Really? IMHO the wording implies that the least significant bit always
belongs to the piece.
>> * What is the "least significant bit" of an implicit value? And is it
>> intentional that the placement rule differs between implicit- and
>> memory values?
> I don't know.
>> * Some DWARF producers describe a register pair just with a single
>> DW_OP_reg<n>. Can a register piece reach into the next register like
>> that as well?
> You mean for a pair of r1,r2 they would emit only DW_OP_reg1? I don't
> think this use is supported by the DWARF specification.
OK. Are there other opinions?
>> * Is "DW_OP_reg*" followed by "DW_OP_piece(size of object type)" always
>> equivalent to omitting the piece operation?
> If sizeof(obj) == sizeof(reg) it is obviously.
> If sizeof(obj) > sizeof(reg) the expression is malformed because there
> are undefined bits in the object that should have been represented
> with an empty DW_OP_piece.
GCC may describe a long double struct member on x86 as
DW_OP_regx: 33 (st0); DW_OP_piece: 16
where st0 is only 10 bytes wide. Is that invalid then?
> If sizeof(obj) < sizeof(reg) the expression is overspecified, but
> still sound, so I would say yes.
So you'd say the placement rules for DW_OP_reg* and DW_OP_piece shall be
compatible, both defined by the ABI -- not necessarily lsb0-ordered?
And the bytes referred to by a "DW_OP_reg*"-location may depend on the
object's size, but not its type, right?
Note that this wouldn't work well with cases like the "SPU preferred
slots"; see https://sourceware.org/ml/gdb/2016-01/msg00013.html, section
More information about the Dwarf-Discuss