RFR(M) 8148481: Devirtualize Klass::vtable
Coleen Phillimore
coleen.phillimore at oracle.com
Mon Feb 1 15:41:19 UTC 2016
On 2/1/16 9:32 AM, Mikael Gerdin wrote:
> Hi Coleen,
>
> On 2016-02-01 14:22, Coleen Phillimore wrote:
>>
>> Mikael,
>> This looks good also.
>>
>> http://cr.openjdk.java.net/~mgerdin/8148481/webrev.0/src/share/vm/oops/instanceKlass.cpp.udiff.html
>>
>>
>>
>> Why didn't you move print_vtable to klass.cpp too rather than casting to
>> intptr_t? That looks odd.
>
> Well, what I actually did was overload print_vtable with a variant
> that casts the parameter to intptr_t*.
> The reason it can't take a vtableEntry* is that print_vtable is called
> for printing itables as well, and they have a more complex layout.
Ah, I see.
>
> I'm not entirely happy with the solution but I'd rather not have
> start_of_vtable return an intptr_t* just to avoid casting when dumping
> some debug output, and doing a cast in the print line felt ugly for
> some reason.
Agree.
>
> print_vtable should probably be named maybe_dump_metadata since it
> actually dumps memory contents and if it's metadata it tries to call
> the virtual print function on the metadata.
>
I don't know but you should leave it. I like when printing functions
start with print.
Coleen
> /Mikael
>
>>
>> Thanks,
>> Coleen
>>
>> On 1/28/16 11:13 AM, Mikael Gerdin wrote:
>>> Hi all,
>>>
>>> Due to my recent changes in this area, Klass is now responsible for
>>> maintaining the offsets and length of the embedded vtable and
>>> therefore it makes sense to move all code related to the Java vtables
>>> to Klass.
>>>
>>> This also allows us to remove a few unsafe casts where an ArrayKlass
>>> was cast to an InstanceKlass just to get at the methods_at_vtable().
>>> These casts were removed from reflection.cpp, jni.cpp,
>>> jvmciCompilerToVM.cpp and linkResolver.cpp, in cpCache.cpp there was
>>> an alternate approach to the same problem which I've rewritten to use
>>> the new way of accessing the vtable directly through Klass.
>>>
>>> Some notes:
>>> * I took the liberty of changing the return type of start_of_vtable()
>>> to vtableEntry* since that is in fact what it is.
>>> * method_at_vtable is no longer inline, but I don't think that should
>>> be a performance problem since it's usually only being called from
>>> link resolving, cpCache or JNI calls, all of which are not
>>> particularly hot paths.
>>>
>>>
>>> Bug link: https://bugs.openjdk.java.net/browse/JDK-8148481
>>> Webrev: http://cr.openjdk.java.net/~mgerdin/8148481/webrev.0
>>>
>>> Testing: JPRT + RBT on Oracle platforms.
>>>
>>> /Mikael
>>
>
More information about the hotspot-dev
mailing list