RFR (S) 8013942: JSR 292: assert(type() == T_OBJECT) failed: type check
Markus Grönlund
markus.gronlund at oracle.com
Fri Jun 27 08:12:23 UTC 2014
Hi Serguei,
I am not convinced this is the right way to do this - by removing the #ifdef ENABLE_ZAP_DEAD_LOCALS" (which is an COMPILER2 specific #define under an ASSERT), we have now unconditionally increased the bitsize for every oopmap entry to two (compared to one previously) - the inlined oop_map bits_size cache is predefined to hold two words.
This means the oopmap bitmap cache is effectively halved unconditionally.
/Markus
-----Original Message-----
From: Serguei Spitsyn
Sent: den 27 juni 2014 00:15
To: Vladimir Ivanov; hotspot-dev at openjdk.java.net Developers; serviceability-dev at openjdk.java.net
Subject: Re: RFR (S) 8013942: JSR 292: assert(type() == T_OBJECT) failed: type check
Thanks, Vladimir!
Serguei
On 6/26/14 3:02 PM, Vladimir Ivanov wrote:
> Looks good.
>
> Best regards,
> Vladimir Ivanov
>
> On 6/25/14 5:57 PM, serguei.spitsyn at oracle.com wrote:
>> Please, review the fix for:
>> https://bugs.openjdk.java.net/browse/JDK-8013942
>>
>>
>> Open webrev:
>> http://cr.openjdk.java.net/~sspitsyn/webrevs/2014/hotspot/8013942-JVM
>> TI-lobj.1
>>
>>
>>
>>
>> Summary:
>>
>> This is a Nightly Stabilization issue.
>>
>> The problem is that the JVMTI GetLocalObject() function is hitting
>> the assert
>> as the type of the local at current bci is not T_OBJECT as expected.
>> It is because this local is alive only in a narrow scope of one
>> condition in the method but current bci is out of this csope.
>>
>> A fragment from the target method:
>>
>> static Class<?> canonicalize(Class<?> t, int how) {
>> Class<?> ct; <== The local
>> if (t == Object.class) {
>> // no change, ever
>> } else if (!t.isPrimitive()) {
>> switch (how) {
>> case UNWRAP:
>> ct = Wrapper.asPrimitiveType(t); <== Initialized
>> here
>> if (ct != t) return ct;
>> break;
>> case RAW_RETURN:
>> case ERASE:
>> return Object.class;
>> }
>> } else if (t == void.class) { <== The
>> GetLocalObject() is called with bci in this block
>> // no change, usually
>> switch (how) {
>> case RAW_RETURN:
>> return int.class;
>> case WRAP:
>> return Void.class;
>> }
>> } else {
>> . . .
>>
>> The local 'ct' is only alive in the block of condition "if
>> (!t.isPrimitive())".
>> However, it is dead local in the next block.
>>
>> The fix suggested in the webrev above is to use the oop_mask for
>> the method's current bci.
>> It tells when the local is dead in the scope of this bci.
>> Return the JVMTI_ERROR_INVALID_SLOT error in such a case.
>>
>> The fix also includes the tweeks which are necessary to enable the
>> InterpreterOopMap.is_dead()
>> function in the product mode as it was originally defined only
>> under "#ifdef ENABLE_ZAP_DEAD_LOCALS".
>> This makes the code in the oopMapCache.?pp a little bit more simple.
>>
>>
>> Testing:
>> Running the failing tests: vm.mlvm.indy.func.jvmti
>> In progress: nsk.jvmti, nsk.jdi, nsk.jdwp test runs on sparcv9 and
>> amd64
>>
>>
>> Thanks,
>> Serguei
>>
More information about the serviceability-dev
mailing list