Actions

icon Post
text/html Subscribe
text/html Unsubscribe

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [cxx-abi-dev] question on the virtual base offset


  • To: Kerch Holt <kerch@xxxxxxxxxx>
  • Subject: Re: [cxx-abi-dev] question on the virtual base offset
  • From: Mark Mitchell <mark@xxxxxxxxxxxxxxxx>
  • Date: Mon, 08 Nov 2004 22:55:36 -0800

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@xxxxxxxxxxxxxxxx