Determining the size of C++ vtables
Ioi Lam
ioi.lam at oracle.com
Fri Feb 24 03:55:26 UTC 2017
On 2/23/17 7:47 PM, Ioi Lam wrote:
> Hi,
>
> I am working on https://bugs.openjdk.java.net/browse/JDK-8005165 (Remove
> CPU-dependent code in self-patching vtables), I need a way find out
> the size
> of a C++ vtable. I ended up doing this:
>
>
> // Objects of the Metadata types (such as Klass and ConstantPool) have
> C++ vtables.
> // (In GCC this is the field <Type>::_vptr, i.e., first word in the
> object.)
> //
> // Addresses of the vtables and the methods may be different across
> JVM runs,
> // if libjvm.so is dynamically loaded at a different base address.
> //
> // To ensure that the Metadata objects in the CDS archive always have
> the correct vtable:
> //
> // + at dump time: we redirect the _vptr to point to our own vtables
> inside
> // the CDS image
> // + at run time: we clone the actual contents of the vtables from
> libjvm.so
> // into our own tables.
> //
> // To determine the size of the vtable for each type, we use the
> following
> // trick by declaring 2 subclasses:
> //
> // class CppVtabTesterA: public InstanceKlass {
> // virtual int last_virtual_method() {return 1;}
> // };
> // class CppVtabTesterB: public InstanceKlass {
> // virtual void* last_virtual_method() {return NULL};
> // };
> //
> // CppVtabTesterA and CppVtabTesterB's vtables have the following
> properties:
> // - Their size (N+1) is exactly one more than the size of
> InstanceKlass's vtable (N)
> // - The first N entries have are exactly the same as in
> InstanceKlass's vtable.
> // - Their last entry is different.
> //
> // So to determine the value of N, we just walk CppVtabTesterA and
> CppVtabTesterB's tables
> // and find the first entry that's different
>
>
> Could anyone comment if this is acceptable? I know it's not 100%
> portable (C++ doesn't
> specify where to find the vtable, or what's inside), but my
> assumptions is the same as
> the existing code. I.e., _vptr is a pointer located at offset 0 of the
> object, and it
> points to a one-dimensional array.
>
> So at least it's not any worse than before?
>
> Thanks
> - Ioi
>
By the way, I first tried having only a single "tester" class and walk
the vtable to look for &last_virtual_method, but the C++ compiler told
me that taking the address of a non-static function is not allowed .....
so I ended up creating two tester classes and checking their differences.
More information about the hotspot-dev
mailing list