[Dwarf-Discuss] DWARF piece questions
arnez at linux.vnet.ibm.com
Mon Jan 30 06:00:26 PST 2017
On Fri, Jan 27 2017, Cary Coutant wrote:
>>> I think the original intent of this wording was to describe the bit
>>> offset of a field within a structure, given the byte address of the
>>> beginning of the structure. Said bit offset would be the total number
>>> of bits occupied by preceding fields plus internal padding, as
>>> demonstrated in the big- and little-endian examples in D.2.8. We
>>> should never have implied that this bit numbering was meant to match
>>> the bit numbering convention used in the ABI specification.
>> Unfortunately, that's exactly what DWARF says.
> But it's not what we meant, and we should fix it.
>>> This is not the only place we use this bit numbering convention -- we
>>> also use it for the DW_AT_data_bit_offset attribute, and it's defined
>>> in Section 5.7, with a reference to the examples in D.2.8.
>> Also, not what we want.
> Why is this not what we want? There's really no better way to define a
> field's position within a structure.
I must admit, I have trouble following this discussion...
Maybe we can get more concrete? Let's say a DWARF consumer is requested
to print a variable that has a composite DW_AT_location. First it
concatenates the individual pieces into a destination buffer, to
represent the variable's value as if it were located in the program's
memory. Then it uses its usual from-memory print function for the given
In that scenario, suppose that the DWARF consumer has already copied the
first p-1 pieces, whose bit sizes add up to k bits. Next is the p'th
piece, which is described as a DW_OP_bit_piece (say) with offset m and
bit size n. Now the DWARF consumer copies the bits for this piece to
the destination buffer with this pseudo-code:
FOR i IN (0 .. n-1)
COPY source_bit(m + i) TO dest_bit(k + i)
where source_bit() and dest_bit() somehow map an integer to a bit in the
underlying source- and destination object, respectively.
So, with this scenario in mind, I thought we were discussing how to
define the source_bit() mapping for the various flavors of underlying
objects (memory, register, stack value, indirect value), right?
And is it correct that for memory pieces source_bit() provides the same
relative mapping as dest_bit()?
And that dest_bit(j) addresses the same bit as DW_AT_data_bit_offset(j)?
And that DW_AT_data_bit_offset(j) addresses the same bit as the bit
field 'x' in the following C structure?
unsigned char : 1;
[ ... ] /* (j-1) copies of the line above */
unsigned char x : 1;
More information about the Dwarf-Discuss