[Fwd: Request for review (S): CR 6889740 - G1: OpenDS fails with "unhandled exception in compiled code"]

Christian Thalinger Christian.Thalinger at Sun.COM
Wed Oct 28 01:36:12 PDT 2009

On Tue, 2009-10-27 at 15:10 -0700, john cuthbertson - Sun Microsystems
> Can I have a couple of volunteers to review the proposed fix for this 
> bug? The webrev can be found at 
> http://cr.openjdk.java.net/~johnc/6889740/webrev.0/.
> The issue is that bad code was being generated for the store operation 
> in the null case of the aastore bytecode template. The bad code was 
> caused by there being only one version of the store_heap_oop routine 
> that took a Register as the second argument. When the calling code 
> passed in NULL_WORD (0) to this routine the value was used as a Register 
> encoding and converted to Register(0), which is rax. Thus the generated 
> store was "mov (dst), $rax" instead of "mov (dst), $0x0". This is 
> normally not a problem as the preceding code in the template fetches the 
> value to be stored into rax. When the G1 pre-barrier code calls the 
> runtime, however, the value in rax can be overwritten and the heap can 
> become corrupted.

Why do you actually pass in a src and then assert on it's value?

+void MacroAssembler::store_heap_oop(Address dst, intptr_t src) {
+  assert(src == NULL_WORD, "use something else otherwise");

It seems it must be null anyway and we could use something like:

void MacroAssembler::store_heap_oop_null(Address dst) {

-- Christian

More information about the hotspot-compiler-dev mailing list