Mercurial > hg > graal-compiler
comparison src/cpu/x86/vm/assembler_x86.hpp @ 3249:e1162778c1c8
7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
Summary: A referent object that is only weakly reachable at the start of concurrent marking but is re-attached to the strongly reachable object graph during marking may not be marked as live. This can cause the reference object to be processed prematurely and leave dangling pointers to the referent object. Implement a read barrier for the java.lang.ref.Reference::referent field by intrinsifying the Reference.get() method, and intercepting accesses though JNI, reflection, and Unsafe, so that when a non-null referent object is read it is also logged in an SATB buffer.
Reviewed-by: kvn, iveresov, never, tonyp, dholmes
author | johnc |
---|---|
date | Thu, 07 Apr 2011 09:53:20 -0700 |
parents | 41d4973cf100 |
children | 92add02409c9 |
comparison
equal
deleted
inserted
replaced
3248:e6beb62de02d | 3249:e1162778c1c8 |
---|---|
1442 // on arguments should also go in here. | 1442 // on arguments should also go in here. |
1443 | 1443 |
1444 class MacroAssembler: public Assembler { | 1444 class MacroAssembler: public Assembler { |
1445 friend class LIR_Assembler; | 1445 friend class LIR_Assembler; |
1446 friend class Runtime1; // as_Address() | 1446 friend class Runtime1; // as_Address() |
1447 | |
1447 protected: | 1448 protected: |
1448 | 1449 |
1449 Address as_Address(AddressLiteral adr); | 1450 Address as_Address(AddressLiteral adr); |
1450 Address as_Address(ArrayAddress adr); | 1451 Address as_Address(ArrayAddress adr); |
1451 | 1452 |
1663 | 1664 |
1664 // Stores | 1665 // Stores |
1665 void store_check(Register obj); // store check for obj - register is destroyed afterwards | 1666 void store_check(Register obj); // store check for obj - register is destroyed afterwards |
1666 void store_check(Register obj, Address dst); // same as above, dst is exact store location (reg. is destroyed) | 1667 void store_check(Register obj, Address dst); // same as above, dst is exact store location (reg. is destroyed) |
1667 | 1668 |
1669 #ifndef SERIALGC | |
1670 | |
1668 void g1_write_barrier_pre(Register obj, | 1671 void g1_write_barrier_pre(Register obj, |
1669 #ifndef _LP64 | 1672 Register pre_val, |
1670 Register thread, | 1673 Register thread, |
1671 #endif | |
1672 Register tmp, | 1674 Register tmp, |
1673 Register tmp2, | 1675 bool tosca_live, |
1674 bool tosca_live); | 1676 bool expand_call); |
1677 | |
1675 void g1_write_barrier_post(Register store_addr, | 1678 void g1_write_barrier_post(Register store_addr, |
1676 Register new_val, | 1679 Register new_val, |
1677 #ifndef _LP64 | |
1678 Register thread, | 1680 Register thread, |
1679 #endif | |
1680 Register tmp, | 1681 Register tmp, |
1681 Register tmp2); | 1682 Register tmp2); |
1682 | 1683 |
1684 #endif // SERIALGC | |
1683 | 1685 |
1684 // split store_check(Register obj) to enhance instruction interleaving | 1686 // split store_check(Register obj) to enhance instruction interleaving |
1685 void store_check_part_1(Register obj); | 1687 void store_check_part_1(Register obj); |
1686 void store_check_part_2(Register obj); | 1688 void store_check_part_2(Register obj); |
1687 | 1689 |