6918006: G1: spill space must be reserved on the stack for barrier calls on Windows x64
Summary: Stub code generated to call G1 barriers does not allocate spill space on the stack as required by Windows x64 ABI. The fix is to use more ABI-friendly call_VM_leaf().
Reviewed-by: iveresov, never, kvn
--- a/hotspot/src/cpu/x86/vm/stubGenerator_x86_32.cpp Thu Jan 21 14:47:01 2010 -0800
+++ b/hotspot/src/cpu/x86/vm/stubGenerator_x86_32.cpp Thu Jan 21 18:51:10 2010 -0800
@@ -718,10 +718,8 @@
case BarrierSet::G1SATBCTLogging:
{
__ pusha(); // push registers
- __ push(count);
- __ push(start);
- __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, BarrierSet::static_write_ref_array_pre)));
- __ addptr(rsp, 2*wordSize);
+ __ call_VM_leaf(CAST_FROM_FN_PTR(address, BarrierSet::static_write_ref_array_pre),
+ start, count);
__ popa();
}
break;
@@ -752,10 +750,8 @@
case BarrierSet::G1SATBCTLogging:
{
__ pusha(); // push registers
- __ push(count);
- __ push(start);
- __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, BarrierSet::static_write_ref_array_post)));
- __ addptr(rsp, 2*wordSize);
+ __ call_VM_leaf(CAST_FROM_FN_PTR(address, BarrierSet::static_write_ref_array_post),
+ start, count);
__ popa();
}
break;
--- a/hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp Thu Jan 21 14:47:01 2010 -0800
+++ b/hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp Thu Jan 21 18:51:10 2010 -0800
@@ -1172,7 +1172,7 @@
__ movptr(c_rarg0, addr);
__ movptr(c_rarg1, count);
}
- __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, BarrierSet::static_write_ref_array_pre)));
+ __ call_VM_leaf(CAST_FROM_FN_PTR(address, BarrierSet::static_write_ref_array_pre), 2);
__ popa();
}
break;
@@ -1212,7 +1212,7 @@
__ shrptr(scratch, LogBytesPerHeapOop); // convert to element count
__ mov(c_rarg0, start);
__ mov(c_rarg1, scratch);
- __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, BarrierSet::static_write_ref_array_post)));
+ __ call_VM_leaf(CAST_FROM_FN_PTR(address, BarrierSet::static_write_ref_array_post), 2);
__ popa();
}
break;