RFR(S): 8031475: Missing oopmap in patching stubs

Nils Eliasson nils.eliasson at oracle.com
Thu May 8 11:56:19 UTC 2014


answer inline.

On 2014-04-30 21:17, Christian Thalinger wrote:
>
> On Apr 30, 2014, at 3:06 AM, Nils Eliasson <nils.eliasson at oracle.com 
> <mailto:nils.eliasson at oracle.com>> wrote:
>
>> Hi,
>>
>> I would like some feedback on this change from the c1 experts. It's 
>> made in platform dependent code and will be added to the other 
>> plattforms as well before submit.
>>
>> This change fixes a bug that has been observed in testing, and dug up 
>> from a core file, but haven't reproduced standalone yet. When 
>> patching for checkcast the oop we are casting is not kept in an 
>> oopmap during the runtime patching call, a one time chance per run.
>>
>> The current change is for all the patching stub cases 
>> (access_field_id, load_klass_id, load_mirror_id, load_appendix_id) - 
>> is that needed? 
>
> This looks reasonable.  What you are saying is that at:
>
>  0x00007f20c94359c5: callq  0x00007f20c942e3e0  ; OopMap{[32]=Oop off=266}
>
> the OopMap does not contain the object (in this case in rdx) and so is 
> not handled during a GC, correct?

Yes

>
>> Do you see any potential for breaking anything? It is difficult to 
>> trigger a GC at exact this point during a test.
>
> Can’t you trigger a GC inside the runtime call by calling:
>
> Universe::heap()->collect(GCCause::_java_lang_system_gc);
>
> ?

Yes, that did the trick. Now I have a reliable reproducer.

Thank you!

//Nils

>
>>
>> http://cr.openjdk.java.net/~neliasso/8031475/webrev.01/ 
>> <http://cr.openjdk.java.net/%7Eneliasso/8031475/webrev.01/>
>> https://bugs.openjdk.java.net/browse/JDK-8031475
>>
>> Thanks,
>> Nils Eliasson
>>
>>
>> Code example:
>>
>>  0x00007f20c943590c: mov    $0x718d65d38,%rdx  ;   {oop(a 
>> 'BeanImpl2')}   // oops to be casted in rdx
>>  0x00007f20c9435916: cmp    $0x0,%rdx
>>  0x00007f20c943591a: je     0x00007f20c9435967   // jump to patching stub
>>  // patch location
>>  0x00007f20c9435920: jmpq   0x00007f20c94359c5  ;   {no_reloc}
>>  0x00007f20c9435925: add    %al,(%rax)
>>  0x00007f20c9435927: add    %al,(%rax)
>>  0x00007f20c9435929: add    %cl,-0x3eb7f786(%rbx)
>>  0x00007f20c943592f: out    %eax,$0x3
>>  // end of patch location
>>  0x00007f20c9435931: cmp    %rbx,%rdi
>>  0x00007f20c9435934: je     0x00007f20c9435967 // A dereference of 
>> rdx somewhere here may crash if the oop has moved during a gc
>>  0x00007f20c943593a: mov    0x10(%rbx),%esi
>>  0x00007f20c943593d: cmp    (%rdi,%rsi,1),%rbx
>>  0x00007f20c9435941: je     0x00007f20c9435967
>>
>>  ...
>>
>>  ;; PatchingStub slow case
>>  ;;  patch template
>>  0x00007f20c94359b6: mov    $0x0,%rbx          ;   {metadata(NULL)}
>>  ;; patch data encoded as movl
>>  0x00007f20c94359c0: mov    $0xa050f00,%eax
>>  ;; patch entry point
>>  0x00007f20c94359c5: callq  0x00007f20c942e3e0  ; OopMap{[32]=Oop 
>> off=266}   // rdx not live here, may safepoint on return from runtime 
>> call
>>                                                ;*checkcast
>>                                                ; - 
>> TestCheckCast::main at 25 (line 24)
>>                                                ;   {runtime_call}
>>  0x00007f20c94359ca: jmpq   0x00007f20c9435920   // back to normal 
>> control flow after patching
>>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/hotspot-compiler-dev/attachments/20140508/d6d44251/attachment.html>


More information about the hotspot-compiler-dev mailing list