[cxx-abi-dev] question on the virtual base offset
Mark Mitchell
mark at codesourcery.com
Tue Nov 9 06:55:36 UTC 2004
Kerch Holt wrote:
The question raised here was how an unnamed bitfield should be handled
in a non-POD. (In a POD, the C++ ABI is clear -- follow the rules of
the C ABI.)
> Since E only contains an "unnamed bitfield" which is not even considered
> a member (see 9.6 P2) I think the nvalign(E) should be 1.
Wow, I didn't realize an unnamed bitfield was not a member.
> Does this need extra wording in the ABI to deal with the special case
> of unnamed bitfields? Perhaps alter 2.4 II 1. to say:
> If D is not an unnamed bitfield
> update align(C) to max(align(C),align(T))
I think the right thing to do is to handle unnamed bitfields as they
would be handled in the underlying C ABI. In some C ABIs, that results
in an update to the alignment; in other C ABIs it does not.
2.4 II 1 is already trying to make the identifier optional through the
use of "[b]" in the declarator. I suggest making several edits to this
section to try to clarify these points:
1) Revise the first paragraph of 2.4 II to say:
"then the non-static data members (including unnamed bitfields, although
they are not members in ISO C++) in declaration order"
2) Replace the introductory clause in 2.4.II.1 with:
"If D is a (possibly unnamed) bitfield whose declared type is T and
whose declared width is n bits,"
3) Update 2.4.II.1.a to read:
"If sizeof (T) * 8 >= n, the bitfield is allocated as required by the
underlying C psABI, subject to the constraint that a bitfield is never
placed in the tail padding of a base class of C.
For example, on Itanium, the bitfield is placed in the next available n
bits, subject to the constraint that it does not cross an alignment
boundary for type T. If dsize(C) > 0, and the byte at offset dsize(C) -
1 is partially filled by a bitfield, and that bitfield is also a data
member declared in C (but not in one of C's proper base classes), the
next available bits are the unfilled bits at offset dsize(C) - 1.
Otherwise, the next available bits are at offset dsize(C). Update
align(C) to max (align(C), align(T))."
I will make these clarifications in a few days, if there are no objections.
Thanks,
--
Mark Mitchell
CodeSourcery, LLC
mark at codesourcery.com
More information about the cxx-abi-dev
mailing list