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

Nils Eliasson nils.eliasson at oracle.com
Wed Apr 30 13:06:01 UTC 2014


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