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);
 }