[cxx-abi-dev] Key functions and templates
Lawrence Crowl
crowl at google.com
Mon Feb 22 21:50:46 UTC 2010
On 2/22/10, Mark Mitchell <mark at codesourcery.com> wrote:
> Alasdair Grant wrote:
> > are G_key_defined<int>::f() and G_key_nodef<int>::f() key
> > functions?
> >
> > By the letter of the ABI they are, since each of them is the
> > first non-inline non-pure virtual function of its class.
>
> Yes, this has bothered me for a while. They are key functions,
> but is this useful?
I don't think so. The point of key functions is to prevent redundant
virtual table generation by making their generation a side effect
of something that is only done once. That property doesn't exist
with templates.
> > But surely the spirit of the ABI is to use the key function
> > as a 'key' to identify a unique translation unit - but these
> > functions may be multiply defined. So if the vtables for
> > G_key_defined<int> and G_key_nodef<int> are defined at all,
> > they must be defined with vague linkage.
>
> Yes, my interpretation is that the compiler must define the
> vtable every time it provides a definition of the key function,
> and that those vtables must have vague linkage.
Plausible.
> > Implementations (at least of the ARM variant of the ABI) seem
> > to differ about whether the code above should define the vtable
> > for G_key_nodef<int>. GCC 4.4 for ARM does define the vtable -
> > which suggests it is not treating G_key_nodef<int>::f() as a
> > key function (if it did, it could rely on some other unit to
> > be defining f(), and hence the vtable).
>
> Given that there is vague linkage involved, how does this matter?
> It sounds to me like GCC is being wasteful, in that it's defining
> a vtable not needed in this object file, and guaranteed to be
> present anyhow, but as vague linkage will collapse the definitions,
> it sounds like this is "just" a waste of space in object files,
> not in final executables.
>
> Even if -- as on Symbian, where I suspect this question arises :-)
> -- the waste makes it into a DSO, how is that an ABI conformance
> problem?
How about the following scenario?
A translation unit declares an "extern template" specialization
of G_key_defined<int>::f(). The compiler infers that the virtual
table need not be generated even though the translation unit
otherwise instantiates G_key_defined<int>. The specialization of
f() is not subsequently used, and so the vtable will fail to exist.
--
Lawrence Crowl
More information about the cxx-abi-dev
mailing list