RFR(S) 8209361: [AOT] Unexpected number of references for JVMTI_HEAP_REFERENCE_CONSTANT_POOL [111-->111]: 0 (expected at least 1)
dean.long at oracle.com
dean.long at oracle.com
Fri Sep 7 00:32:32 UTC 2018
Thanks David!
dl
On 9/6/18 5:07 PM, David Holmes wrote:
> After some side-bar discussions I'm withdrawing my objections to this
> change.
>
> The basic background is that the compilers can perform actions under
> which the interpreter would have marked a CP entry as resolved, but
> the compilers leave it unresolved. This is not a problem for either
> the compilers or the interpreter (if it were to encounter such an
> entry it would trivially resolve it).
>
> Having JVM TI consider a CP entry to a loaded class as being resolved
> when not marked as such, allows for the case where it "should" have
> been resolved but wasn't. There is an additional case where the CP
> entry really is unresolved (ie. no action has happened that would have
> caused the interpreter to resolve it) but the class is independently
> already loaded. That will also be reported as resolved but that is not
> a problem as resolution can be eager or lazy and this mimics eager
> resolution.
>
> It's possible we may have a test somewhere that is relying on
> implementation knowledge to check for lazy resolution, but if we
> encounter such a test we will just re-educate it.
>
> Thanks for your patience with this Dean.
>
> Cheers,
> David
>
> On 6/09/2018 9:37 AM, David Holmes wrote:
>> On 6/09/2018 7:28 AM, dean.long at oracle.com wrote:
>>> Hi David.
>>>
>>> Yes, it might feel wrong if we equate the CP tag with the JVM spec
>>> definition of resolved, but I don't feel that is necessary or accurate.
>>
>> Based on what? When the JVM TI spec talks about a "resolved constant
>> pool entry" the only definition for that comes from the JVMS! There
>> is nothing else.
>>
>>> I think it's more accurate to treat the system dictionary as the
>>> ultimate authority. This change brings JVMTI in line with what the
>>> compilers have already been doing, it's just that AOT was first to
>>> expose the discrepancy. I prefer to think of these symbolic
>>> references as effectively or virtually resolved, rather than pretend.
>>
>> I'm not aware of any notion of "effectively or virtually resolved".
>> What exactly are the compilers doing here?
>>
>> I don't know where to find the test to determine exactly what the
>> test is doing or why it expects to find occurrences of
>> JVMTI_HEAP_REFERENCE_CONSTANT_POOL, but I again say either the test
>> is wrong in its assumptions, or the compilers are wrong in their
>> actions.
>>
>> I think this needs a much more in-depth investigation and/or
>> explanation.
>>
>> David
>> -----
>>
>>> I could probably update the CP entry at the same time, to make it
>>> less pretend or add new APIs to make the abstraction more explicit,
>>> but I don't think that's necessary. The JVM spec doesn't talk about
>>> CP tags. It talks about symbolic references and whether they return
>>> the same concrete value.
>>>
>>> dl
>>>
>>>
>>> On 9/5/18 2:00 PM, David Holmes wrote:
>>>> Hi Dean,
>>>>
>>>> Seems to me that if the test is expecting CP entries to be resolved
>>>> but AOT does not resolve them, then either the test is wrong or AOT
>>>> is wrong. Pretending they are resolved when not, to make the test
>>>> pass, does not seem like the right fix.
>>>>
>>>> David
>>>>
>>>> On 6/09/2018 6:29 AM, coleen.phillimore at oracle.com wrote:
>>>>> Looks good.
>>>>> Coleen
>>>>>
>>>>> On 8/30/18 8:20 PM, dean.long at oracle.com wrote:
>>>>>> https://bugs.openjdk.java.net/browse/JDK-8209361
>>>>>> http://cr.openjdk.java.net/~dlong/8209361/webrev/
>>>>>>
>>>>>> Some JCK vm/jvmti/FollowReferences tests fail with AOT. This is
>>>>>> because code generated by JIT and AOT compilers might not resolve
>>>>>> constant pool entries. Making the compiled code resolve constant
>>>>>> pool entries would hurt performance. As far as I can tell, the
>>>>>> JVMTI FollowReferences API is the only place this is visible, so
>>>>>> I went with a localized fix. The fix looks at unresolved
>>>>>> constant pool entries and treats them as resolved if the class is
>>>>>> loaded and accessible. Some entries can appear to be resolved
>>>>>> early, but this is allowed by the JVM spec, and it meets all the
>>>>>> requirements of a resolved symbolic reference (it will always
>>>>>> return the same concrete class value, JVM spec section 5.4.3).
>>>>>>
>>>>>> dl
>>>>>>
>>>>>
>>>
More information about the hotspot-dev
mailing list