RFR(S): 8031475: Missing oopmap in patching stubs
Christian Thalinger
christian.thalinger at oracle.com
Wed May 21 16:39:52 UTC 2014
Yes, that looks good.
On May 21, 2014, at 2:40 AM, Nils Eliasson <nils.eliasson at oracle.com> wrote:
> Hi,
>
> Thanks for the feedback. I found a piece of code that was supposed to make sure the oopmaps for patch stubs was correct but it only matched patching lir_moves. Since lir_checkcast and lir_moves need different checks for if they are patching I added a virtual method and replaced the earlier check.
>
> Also removed a duplicate method and did a slight renaming for clarity.
>
> http://cr.openjdk.java.net/~neliasso/8031475/webrev.06/
>
> Thanks,
> Nils
>
> On 2014-04-30 15:06, Nils Eliasson 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? Do you see any potential for breaking anything? It is difficult to trigger a GC at exact this point during a test.
>>
>> http://cr.openjdk.java.net/~neliasso/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
>>
>
More information about the hotspot-compiler-dev
mailing list