RFR[S] 8005165 Platform-independent C++ vtables for CDS
Thomas Stüfe
thomas.stuefe at gmail.com
Wed Mar 1 10:22:04 UTC 2017
Hi Ioi,
I did not yet look closely at your change yet, just a small nit: To prevent
the copying SafeFetch coding from accidentally tripping over a real
"deadbeef" value which may be a valid part of the vtable - however
completely unlikely this is - one could call SafeFetch twice with two
different bad values,eg:
const intptr_t bad1 = intptr_t(0xdeadbeef);
const intptr_t bad2 = intptr_t(0xbeefdead);
if (SafeFetchN(ptr, bad1) == bad1 && SafeFetchN(ptr, bad2) == bad2) { ...
break out ... }
Kind Regards, Thomas
On Wed, Mar 1, 2017 at 3:25 AM, Ioi Lam <ioi.lam at oracle.com> wrote:
> https://bugs.openjdk.java.net/browse/JDK-8005165
> http://cr.openjdk.java.net/~iklam/jdk10/8005165-platform-ind
> ependent-cds-vtable.v02/
>
> Hi,
>
> This is the official review (follow up of the "Determining the size of C++
> vtables" thread on hotspot-dev at openjdk.java.net).
>
> The new code has the same assumption as the existing code in JDK 10: for a
> C++ object that contains virtual methods (e.g., ConstantPool), we assume
> the first intptr_t slot of the object is a _vptr, which points to a vtable,
> which consists of no more than 150 intptr_t's.
>
> ConstantPool*p -->[ _vptr ] -------> [ vtable slot 0 ]
> [ field #0 ] [ vtable slot 1 ]
> [ field #1 ] [ vtable slot 2 ]
> [ field #2 ] [ vtable slot 3 ]
> [ .... ] [ vtable slot 4]
> [ vtable slot 5 ]
> [ ... ]
>
> + In the existing code, we were pointing the vtable slots to
> code that's generated by HotSpot.
>
> + In the new code, we copy the vtable slots from an existing
> vtable (generated by the C++ linker).
>
> Per Thomas Stüfe's advice, I don't try to determine the size of the vtable
> (as that would add one more compiler requirement where new virtual methods
> added by a subclass must be placed at a higher offset in the vtable).
>
> Instead, I have added code in non-product builds to ensure that the
> vtables are no longer than 150 entries. You can run with
> "-XX:+PrintSharedSpaces -Xshare:dump" to print out the actual size of the
> vtables for your particular platform:
>
> ConstantPool has 12 virtual methods
> InstanceKlass has 113 virtual methods
> InstanceClassLoaderKlass has 113 virtual methods
> InstanceMirrorKlass has 113 virtual methods
> InstanceRefKlass has 113 virtual methods
> Method has 12 virtual methods
> ObjArrayKlass has 114 virtual methods
> TypeArrayKlass has 114 virtual methods
>
> As mentioned in the code comments, if you have an esoteric C++ compiler,
> the verify_sufficient_size() function will probably fail, but hopefully
> that would give you some hints for porting this code.
>
> To avoid accidentally touching an unmapped page, the code uses SafeFetchN
> for copying the vtable contents, and would shrink the vtable to less than
> 150 entries if necessary. I can't test this for real, but I've added some
> code to simulate an error:
>
> for (int i=0; i<n; i++) {
> const intptr_t bad = intptr_t(0xdeadbeef);
> intptr_t num = SafeFetchN(&srcvtab[i], bad);
> if (num == bad
> // || i > 120 /* uncomment this line to test */
> ) {
> _info->set_vtab_size(i-1);
> break;
> }
> dstvtab[i] = num;
> }
>
> Results:
>
> + Removed 850 lines of CPU-dependent code
>
> + CDS image is about 50K smaller
>
> + Previously Metadata objects must live in the read-write section in the
> CDS
> archive, because their _vptr was updated at run time. Now _vptr is no
> longer
> updated, so ConstantPool can be moved to the read-only section (see
> JDK-8171392).
>
> Thanks
> - Ioi
>
>
>
>
More information about the hotspot-dev
mailing list