RTTI queries

Nathan Sidwell nathan at acm.org
Thu Jan 6 11:20:09 UTC 2000


Hi,
I'm in the process of implementing the runtime rtti code in g++ for
CodeSourcery LLC. I have a number of queries and comments on the 
C++ ABI for IA64: Data Layout document
(http://reality.sgi.com/dehnert_engr/cxx/abi-layout.html)

1) the declaration of __vmi_class_info uses a helper class of the
following
        struct __base_class_info {
        type_info *type;
        ptrdiff_t offset;
        int vmi_flags;
        }
1.1) I beleive `type' should be declared `__class_type_info const *type'
(the description of __ptr_to_member_type_info has such a pointer and uses
__class_type_info). The description of __si_class_type_info is vague on the
base pointer's type, but that too should be `__class_type_info const *type'.

1.2) From the description of __vmi_class_info it appears that the base
class array uses the trailing array struct hack. This is ok, because
it is always generated by the compiler. This is not documented.

1.3) I cannot find a definition of what the `offset' member of
__base_class_info is an offset for. For a virtual base it cannot be
the offset from this base to the virtual base as that changes for different
bases in a heirarchy. I presume it must be the offset in the vtable to the
base offset. This is not documented.

2) The ABI document specifies

void *__dynamic_cast (void *sub, __class_type_info *src,
                __class_type_info *dst, ptrdiff_t sr2dst_offset);

this is not const correct, I beleive it should be

void *__dynamic_cast (const void *sub, const __class_type_info *src,
                const __class_type_info *dst, ptrdiff_t sr2dst_offset);

3) __class_type_info contains a set of details flags. Whilst these look
useful, I'm not sure that they are. When porting g++'s current dynamic_cast
machinery (which as the document points out is semantically the same), these
flags showed little use.

3.1) flag 0x8 says `has privately inherited base'. Does this really mean
private or does it actually mean non-public? both catch matching and dynamic
cast distinguish public and non-public, not private and non-private.

3.2) More useful for dynamic cast, (and possibly catch matching) would be
the following flags
	* Contains non-diamond shaped multiple base object
	* Is diamond shaped
	* has virtual base
	* has non-virtual base
	* has public base
	* has non-public base
Note that the virtual/non-virtual and public/non-public are not mutually
exclusive. Also note that I have not actually implemented anything with these
flags, so I could be wrong.

4) The name mangling scheme for type_info objects is not defined. Therefore
I don't know how to name the type_info objects required in the runtime for
the fundamental types (and their pointers). I see this is on today's agenda.

nathan

-- 
Dr Nathan Sidwell :: sidwell at codesourcery.com
nathan at acm.org  http://www.cs.bris.ac.uk/~nathan/




More information about the cxx-abi-dev mailing list