6889740: G1: OpenDS fails with "unhandled exception in compiled code"
Summary: Incorrect code was being generated for the store operation in the null case of the aastore bytecode template. The bad code was generated by the store_heap_oop routine which takes a Register as its second argument. Passing NULL_WORD (0) as the second argument causes the value to be converted to Register(0), which is rax. Thus the generated store was "mov (dst), $rax" instead of "mov (dst), $0x0". Changed calls to store_heap_oop that pass NULL_WORD as the second argument to a new routine store_heap_oop_null.
Reviewed-by: kvn, twisti
--- a/hotspot/src/cpu/x86/vm/assembler_x86.cpp Wed Oct 28 11:16:42 2009 -0700
+++ b/hotspot/src/cpu/x86/vm/assembler_x86.cpp Thu Oct 29 09:42:26 2009 -0700
@@ -8214,6 +8214,15 @@
}
}
+// Used for storing NULLs.
+void MacroAssembler::store_heap_oop_null(Address dst) {
+ if (UseCompressedOops) {
+ movl(dst, (int32_t)NULL_WORD);
+ } else {
+ movslq(dst, (int32_t)NULL_WORD);
+ }
+}
+
// Algorithm must match oop.inline.hpp encode_heap_oop.
void MacroAssembler::encode_heap_oop(Register r) {
assert (UseCompressedOops, "should be compressed");
--- a/hotspot/src/cpu/x86/vm/assembler_x86.hpp Wed Oct 28 11:16:42 2009 -0700
+++ b/hotspot/src/cpu/x86/vm/assembler_x86.hpp Thu Oct 29 09:42:26 2009 -0700
@@ -1682,6 +1682,17 @@
void load_heap_oop(Register dst, Address src);
void store_heap_oop(Address dst, Register src);
+
+ // This dummy is to prevent a call to store_heap_oop from
+ // converting a zero (like NULL) into a Register by giving
+ // the compiler two choices it can't resolve
+
+ void store_heap_oop(Address dst, void* dummy);
+
+ // Used for storing NULL. All other oop constants should be
+ // stored using routines that take a jobject.
+ void store_heap_oop_null(Address dst);
+
void encode_heap_oop(Register r);
void decode_heap_oop(Register r);
void encode_heap_oop_not_null(Register r);
--- a/hotspot/src/cpu/x86/vm/templateTable_x86_64.cpp Wed Oct 28 11:16:42 2009 -0700
+++ b/hotspot/src/cpu/x86/vm/templateTable_x86_64.cpp Thu Oct 29 09:42:26 2009 -0700
@@ -139,7 +139,7 @@
}
__ g1_write_barrier_pre(rdx, r8, rbx, val != noreg);
if (val == noreg) {
- __ store_heap_oop(Address(rdx, 0), NULL_WORD);
+ __ store_heap_oop_null(Address(rdx, 0));
} else {
__ store_heap_oop(Address(rdx, 0), val);
__ g1_write_barrier_post(rdx, val, r8, rbx);
@@ -152,7 +152,7 @@
case BarrierSet::CardTableExtension:
{
if (val == noreg) {
- __ store_heap_oop(obj, NULL_WORD);
+ __ store_heap_oop_null(obj);
} else {
__ store_heap_oop(obj, val);
// flatten object address if needed
@@ -168,7 +168,7 @@
case BarrierSet::ModRef:
case BarrierSet::Other:
if (val == noreg) {
- __ store_heap_oop(obj, NULL_WORD);
+ __ store_heap_oop_null(obj);
} else {
__ store_heap_oop(obj, val);
}