Default method resolution question
David Holmes
david.holmes at oracle.com
Mon Sep 16 04:51:01 PDT 2013
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