8037138: x86: problem with JVMTI breakpoint
Summary: do aload(0) after rewriting aload bytecodes to fast version for frequent pairs.
Reviewed-by: dlong, dholmes, dcubed
--- a/hotspot/src/cpu/aarch64/vm/templateTable_aarch64.cpp Thu Aug 18 11:11:40 2016 +0000
+++ b/hotspot/src/cpu/aarch64/vm/templateTable_aarch64.cpp Thu Aug 18 10:47:09 2016 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2014, Red Hat Inc. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -852,26 +852,23 @@
// get next bytecode
__ load_unsigned_byte(r1, at_bcp(Bytecodes::length_for(Bytecodes::_aload_0)));
- // do actual aload_0
- aload(0);
-
// if _getfield then wait with rewrite
__ cmpw(r1, Bytecodes::Bytecodes::_getfield);
__ br(Assembler::EQ, done);
- // if _igetfield then reqrite to _fast_iaccess_0
+ // if _igetfield then rewrite to _fast_iaccess_0
assert(Bytecodes::java_code(Bytecodes::_fast_iaccess_0) == Bytecodes::_aload_0, "fix bytecode definition");
__ cmpw(r1, Bytecodes::_fast_igetfield);
__ movw(bc, Bytecodes::_fast_iaccess_0);
__ br(Assembler::EQ, rewrite);
- // if _agetfield then reqrite to _fast_aaccess_0
+ // if _agetfield then rewrite to _fast_aaccess_0
assert(Bytecodes::java_code(Bytecodes::_fast_aaccess_0) == Bytecodes::_aload_0, "fix bytecode definition");
__ cmpw(r1, Bytecodes::_fast_agetfield);
__ movw(bc, Bytecodes::_fast_aaccess_0);
__ br(Assembler::EQ, rewrite);
- // if _fgetfield then reqrite to _fast_faccess_0
+ // if _fgetfield then rewrite to _fast_faccess_0
assert(Bytecodes::java_code(Bytecodes::_fast_faccess_0) == Bytecodes::_aload_0, "fix bytecode definition");
__ cmpw(r1, Bytecodes::_fast_fgetfield);
__ movw(bc, Bytecodes::_fast_faccess_0);
@@ -887,9 +884,10 @@
patch_bytecode(Bytecodes::_aload_0, bc, r1, false);
__ bind(done);
- } else {
- aload(0);
}
+
+ // Do actual aload_0 (must do this after patch_bytecode which might call VM and GC might change oop).
+ aload(0);
}
void TemplateTable::istore()
--- a/hotspot/src/cpu/sparc/vm/templateTable_sparc.cpp Thu Aug 18 11:11:40 2016 +0000
+++ b/hotspot/src/cpu/sparc/vm/templateTable_sparc.cpp Thu Aug 18 10:47:09 2016 -0400
@@ -705,9 +705,6 @@
// get next byte
__ ldub(at_bcp(Bytecodes::length_for(Bytecodes::_aload_0)), G3_scratch);
- // do actual aload_0
- aload(0);
-
// if _getfield then wait with rewrite
__ cmp_and_br_short(G3_scratch, (int)Bytecodes::_getfield, Assembler::equal, Assembler::pn, done);
@@ -738,9 +735,10 @@
__ bind(rewrite);
patch_bytecode(Bytecodes::_aload_0, G4_scratch, G3_scratch, false);
__ bind(done);
- } else {
- aload(0);
}
+
+ // Do actual aload_0 (must do this after patch_bytecode which might call VM and GC might change oop).
+ aload(0);
}
void TemplateTable::istore() {
--- a/hotspot/src/cpu/x86/vm/templateTable_x86.cpp Thu Aug 18 11:11:40 2016 +0000
+++ b/hotspot/src/cpu/x86/vm/templateTable_x86.cpp Thu Aug 18 10:47:09 2016 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -858,26 +858,23 @@
// get next byte
__ load_unsigned_byte(rbx, at_bcp(Bytecodes::length_for(Bytecodes::_aload_0)));
- // do actual aload_0
- aload(0);
-
// if _getfield then wait with rewrite
__ cmpl(rbx, Bytecodes::_getfield);
__ jcc(Assembler::equal, done);
- // if _igetfield then reqrite to _fast_iaccess_0
+ // if _igetfield then rewrite to _fast_iaccess_0
assert(Bytecodes::java_code(Bytecodes::_fast_iaccess_0) == Bytecodes::_aload_0, "fix bytecode definition");
__ cmpl(rbx, Bytecodes::_fast_igetfield);
__ movl(bc, Bytecodes::_fast_iaccess_0);
__ jccb(Assembler::equal, rewrite);
- // if _agetfield then reqrite to _fast_aaccess_0
+ // if _agetfield then rewrite to _fast_aaccess_0
assert(Bytecodes::java_code(Bytecodes::_fast_aaccess_0) == Bytecodes::_aload_0, "fix bytecode definition");
__ cmpl(rbx, Bytecodes::_fast_agetfield);
__ movl(bc, Bytecodes::_fast_aaccess_0);
__ jccb(Assembler::equal, rewrite);
- // if _fgetfield then reqrite to _fast_faccess_0
+ // if _fgetfield then rewrite to _fast_faccess_0
assert(Bytecodes::java_code(Bytecodes::_fast_faccess_0) == Bytecodes::_aload_0, "fix bytecode definition");
__ cmpl(rbx, Bytecodes::_fast_fgetfield);
__ movl(bc, Bytecodes::_fast_faccess_0);
@@ -893,9 +890,10 @@
patch_bytecode(Bytecodes::_aload_0, bc, rbx, false);
__ bind(done);
- } else {
- aload(0);
}
+
+ // Do actual aload_0 (must do this after patch_bytecode which might call VM and GC might change oop).
+ aload(0);
}
void TemplateTable::istore() {