Default method resolution question
Vladimir Ivanov
vladimir.x.ivanov at oracle.com
Mon Sep 16 05:02:19 PDT 2013
David,
It's in rt.jar.
Best regards,
Vladimir Ivanov
On 9/16/13 3:51 PM, David Holmes wrote:
> Hi Vladimir,
>
> I don't know if it would make any difference but is that the TreeSet
> from rt.jar or alt-rt.jar ?
>
> David
>
> On 16/09/2013 9:39 PM, Vladimir Ivanov wrote:
>> Hi,
>>
>> I hit an assert when doing CHA for a default method during
>> JIT-compilation:
>> # Internal Error (src/share/vm/code/dependencies.cpp:1411)
>> # assert(wf.check_method_context(ctxk, m)) failed: proper context
>>
>> Call stack:
>> Dependencies::find_unique_concrete_method
>> ciMethod::find_monomorphic_target
>> Compile::optimize_inlining
>> Compile::optimize_virtual_call
>> Parse::do_call
>> ...
>>
>> What does check_method_context do it resolves the method again and then
>> do pointer comparison to check that result it the same. And it doesn't
>> work for default methods:
>> Dependency method not found in the associated context:
>> context = javasoft.sqe.tests.api.java.util.TreeSet.SharedData$1
>> method = java.util.TreeSet::parallelStream
>> found = java.util.TreeSet::parallelStream
>>
>> My main suspicion is that the problem is in check_method_context (the
>> check is imprecise and already has a number of exceptions), but I want
>> to double-check. Does method resolution behavior I see look normal?
>>
>> Here are my observations.
>>
>> Method passed into Dependencies::find_unique_concrete_method:
>> {method}
>> - this oop: 0xb69eab58
>> - method holder: 'java/util/TreeSet'
>> - constants: 0xb69eacd8 constant pool [305] {0xb69eacdc} for
>> 'java/util/TreeSet' cache=0xb69eb2b8
>> - access: 0x80001041 public volatile synthetic
>> - name: 'parallelStream'
>> - signature: '()Ljava/util/stream/Stream;'
>> - max stack: 2
>> - max locals: 1
>> - size of params: 1
>> - method size: 14
>> - highest level: 4
>> - vtable index: 22
>> - i2i entry: 0xfa00b940
>> - adapters: AHE at 0x081982ac: 0xa0000000 i2c: 0xfa0aaec0 c2i:
>> 0xfa0aaf49 c2iUV: 0xfa0aaf28
>> - compiled entry 0xfa1704ec
>> - code size: 5
>> - code start: 0xb69eab44
>> - code end (excl): 0xb69eab49
>> - method data: 0xb6806b10
>> - checked ex length: 0
>> - localvar length: 0
>> - compiled code: nmethod 584533 988 java.util.TreeSet::parallelStream
>> (5 bytes)
>>
>> Method resolved in check_method_context:
>> {method}
>> - this oop: 0xb69ea978
>> - method holder: 'java/util/TreeSet'
>> - constants: 0xb69eacd8 constant pool [305] {0xb69eacdc} for
>> 'java/util/TreeSet' cache=0xb69eb2b8
>> - access: 0x1041 public volatile synthetic
>> - name: 'parallelStream'
>> - signature: 'Ljava/util/stream/Stream'
>> - max stack: 2
>> - max locals: 1
>> - size of params: 1
>> - method size: 14
>> - vtable index: 22
>> - i2i entry: 0xfa00b940
>> - adapters: AHE at 0x081982ac: 0xa0000000 i2c: 0xfa0aaec0 c2i:
>> 0xfa0aaf49 c2iUV: 0xfa0aaf28
>> - compiled entry 0xfa0aaf49
>> - code size: 5
>> - code start: 0xb69ea964
>> - code end (excl): 0xb69ea969
>> - method data: 0xb6584270
>> - checked ex length: 0
>> - localvar length: 0
>>
>> Class hierarchy:
>> javasoft.sqe.tests.api.java.util.TreeSet.SharedData$1 extends
>> java.util.TreeSet<E>
>>
>> java.util.TreeSet<E> extends java.util.AbstractSet<E>
>> implements java.util.NavigableSet<E>,
>> java.lang.Cloneable,
>> java.io.Serializable
>>
>> public interface Collection<E> extends Iterable<E> {
>> default Stream<E> parallelStream() { ... }
>>
>> Original method pointer is acquired through ciMethod::resolve_invoke
>> call.
>>
>> resolved_method && CallInfo from LinkResolver::resolve_virtual_call:
>>
>> (dbx) print resolved_method
>> resolved_method = {
>> _value = 0xb69ea978 <=============
>> _thread = 0x8232c00
>> }
>>
>> (dbx) print result
>> result = {
>> _resolved_klass = {
>> _value = 0xb69ea618
>> }
>> _selected_klass = {
>> _value = 0xb69f3bb0
>> }
>> _resolved_method = {
>> _value = 0xb69ea978 <===========
>> _thread = 0x8232c00
>> }
>> _selected_method = {
>> _value = 0xb69eab58 <===========
>> _thread = 0x8232c00
>> }
>> _vtable_index = 22
>> _resolved_appendix = {
>> _handle = (nil)
>> }
>> _resolved_method_type = {
>> _handle = (nil)
>> }
>> }
>>
>> _resolved_method is the same as computed in check_method_context.
>>
>> _selected_method is loaded from vtable at linkResolver.cpp:943:
>> selected_method = methodHandle(THREAD,
>> inst->method_at_vtable(vtable_index));
>>
>> Best regards,
>> Vladimir Ivanov
More information about the hotspot-runtime-dev
mailing list