Mercurial > hg > truffle
diff src/cpu/x86/vm/assembler_x86_32.cpp @ 117:deadee49286e
6644928: Internal Error (src/share/vm/code/relocInfo.hpp:1089)
Summary: Cardtable base can be zero, ExternalAddress can't take a NULL.
author | sgoldman |
---|---|
date | Fri, 11 Apr 2008 06:18:44 -0700 |
parents | 3d62cb85208d |
children | d1605aabd0a1 37f87013dfd8 |
line wrap: on
line diff
--- a/src/cpu/x86/vm/assembler_x86_32.cpp Wed Apr 09 15:10:22 2008 -0700 +++ b/src/cpu/x86/vm/assembler_x86_32.cpp Fri Apr 11 06:18:44 2008 -0700 @@ -3405,10 +3405,16 @@ assert(bs->kind() == BarrierSet::CardTableModRef, "Wrong barrier set kind"); CardTableModRefBS* ct = (CardTableModRefBS*)bs; assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code"); - ExternalAddress cardtable((address)ct->byte_map_base); - Address index(noreg, obj, Address::times_1); - - movb(as_Address(ArrayAddress(cardtable, index)), 0); + + // The calculation for byte_map_base is as follows: + // byte_map_base = _byte_map - (uintptr_t(low_bound) >> card_shift); + // So this essentially converts an address to a displacement and + // it will never need to be relocated. On 64bit however the value may be too + // large for a 32bit displacement + + intptr_t disp = (intptr_t) ct->byte_map_base; + Address cardtable(noreg, obj, Address::times_1, disp); + movb(cardtable, 0); }