Request for review (XXS): -XX:+TraceBytecodes does not work with -XX:+UseCompressedOops
Volker Simonis
volker.simonis at gmail.com
Fri Dec 16 09:20:07 PST 2011
Hi,
I've just realized that -XX:+TraceBytecodes does not work anymore if
-XX:+UseCompressedOops is set.
This is because TemplateInterpreterGenerator::trace_bytecode() uses
'r12' which holds the heap base for temporary saving the 'sp' before
calling the Interpreter::trace_code() template:
__ mov(r12, rsp); // remember sp (can only use r12 if not using call_VM)
__ andptr(rsp, -16); // align stack as required by ABI
__ call(RuntimeAddress(Interpreter::trace_code(t->tos_in())));
__ mov(rsp, r12); // restore sp
__ reinit_heapbase();
Notice that the comment explicitly mentions that 'r12' can only be
used if 'call_VM' will not be used subsequently.
But this is exactly what Interpreter::trace_code() does:
address TemplateInterpreterGenerator::generate_trace_code(TosState state) {
...
__ call_VM(noreg,...
void MacroAssembler::call_VM(Register oop_result,
...
call_VM_helper(oop_result, entry_point, 3, check_exceptions);
void MacroAssembler::call_VM_helper(Register oop_result, address
entry_point, int number_of_arguments, bool check_exceptions) {
...
call_VM_base(oop_result, noreg, rax, entry_point,
number_of_arguments, check_exceptions);
void MacroAssembler::call_VM_base(Register oop_result,
...
LP64_ONLY(if (UseCompressedOops) verify_heapbase("call_VM_base");)
This finally leads to a call to 'verify_heapbase()' which will fail
because 'r12' has been overwritten.
The proposed fix is trivial: don't do the check if we are running with
-XX:+TraceBytecodes:
diff -r 86cbe939f0c7 src/cpu/x86/vm/assembler_x86.cpp
--- a/src/cpu/x86/vm/assembler_x86.cpp Mon Sep 19 12:18:46 2011 -0700
+++ b/src/cpu/x86/vm/assembler_x86.cpp Fri Dec 16 18:01:31 2011 +0100
@@ -5967,7 +5967,7 @@
assert(number_of_arguments >= 0 , "cannot have negative number of
arguments");
LP64_ONLY(assert(java_thread == r15_thread, "unexpected register"));
#ifdef ASSERT
- LP64_ONLY(if (UseCompressedOops) verify_heapbase("call_VM_base");)
+ LP64_ONLY(if (UseCompressedOops && !TraceBytecodes)
verify_heapbase("call_VM_base");)
#endif // ASSERT
assert(java_thread != oop_result , "cannot use the same register
for java_thread & oop_result");
For your convenience I've also attached the patch as a file to this message.
Regards,
Volker
-------------- next part --------------
A non-text attachment was scrubbed...
Name: TraceBytecodes.patch
Type: text/x-patch
Size: 666 bytes
Desc: not available
Url : http://mail.openjdk.java.net/pipermail/hotspot-runtime-dev/attachments/20111216/6ced5449/TraceBytecodes.patch
More information about the hotspot-runtime-dev
mailing list