[cfe-dev] Optimizing vcalls from structors and virtual this-adjusting thunks

John McCall rjmccall at apple.com
Sat Nov 9 18:46:47 PST 2013


On Nov 9, 2013, at 5:24 AM, Timur Iskhodzhanov <timurrrr at google.com> wrote:
> 2013/11/7 Timur Iskhodzhanov <timurrrr at google.com>:
>> Hi John,
>> ...
>> I also have a somewhat related ABI question.
>> Is there any reason to keep virtual this-adjusting thunks in the
>> vtable when the class is fully constructed?
>> I think all the offsets between bases are known statically at the end
>> of the complete object constructor, so a special "final vtable" with
>> only static this adjusting thunks can be used instead of a regular
>> vtable?
>> Am I missing something?
> 
> John, do you have any opinions on the most derived class vtable question?

This is a special case of the general optimization called customization, described e.g. here:
  http://dl.acm.org/citation.cfm?id=74831
The idea is to reduce dynamism in a function by emitting a version of it that's only valid when a parameter (typically "this") has an exact dynamic type.

In general, customization is both valid and useful, with the caveat that it’s a trade-off between dynamic performance and code size.  For the specific case of thunks, though, the code size cost is probably tiny enough to not be worth worrying about, especially if you make a point of sharing customized thunks when possible.

However, you do have to worry about the thing that thunks always have to worry about, though, which is that you cannot always faithfully forward a function call.  If the call ABI relies on the exact position on the stack (e.g. if the call is variadic or has non-trivially-copyable arguments under the MS C++ ABI), then it can only be forwarded with a tail call.  That’s not always possible — e.g. if your thunk is also a covariant return thunk — and, even when it is, LLVM does not currently provide a guaranteed replace-this-argument-and-tail-call operation.

As a special case, when emitting v-base adjustment thunks for a method defined in a final class, we should always be using a static adjustment.

John.



More information about the cfe-dev mailing list