[cfe-dev] Could we emit inline virtual member functions as available_externally when there's a key function (same as vtable and debug info)?

John McCall via cfe-dev cfe-dev at lists.llvm.org
Fri Jun 3 19:07:53 PDT 2016


> On Jun 3, 2016, at 7:05 PM, John McCall via cfe-dev <cfe-dev at lists.llvm.org> wrote:
>> On Jun 3, 2016, at 8:43 AM, David Blaikie via cfe-dev <cfe-dev at lists.llvm.org> wrote:
>> I assume there's a good reason we don't do this - but I can't quite figure it out off the top of my head.
>> 
>> Any thoughts?
> 
> The translation unit that emits the key function is required to emit the v-table symbol with as a strong definition with the type's visibility.  It is not required to emit visible symbols for any of the inline virtual functions.  It is, of course, required to emit those functions as part of emitting the v-table; but it doesn't have to provide symbols for them at all, because even if it were possible to take the address of a virtual member function in a comparable way, there is no way to take that address *via the v-table* and so the v-table's reference may be to its own implementation.  This is good because it allows virtual methods to be given hidden visibility by default; it also permits v-tables to contain specialized method implementations, e.g. methods that use a known most-derived class.

To be clear, your idea would be a reasonable guarantee to make in a revised C++ ABI; it's just that it's not guaranteed to work under the current one.

John.


More information about the cfe-dev mailing list