mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-28 15:24:43 +02:00
Merge
This commit is contained in:
commit
0ce26421c4
6 changed files with 190 additions and 15 deletions
|
@ -66,6 +66,7 @@
|
|||
LOG_TAG(metaspace) \
|
||||
LOG_TAG(modules) \
|
||||
LOG_TAG(monitorinflation) \
|
||||
LOG_TAG(monitormismatch) \
|
||||
LOG_TAG(os) \
|
||||
LOG_TAG(phases) \
|
||||
LOG_TAG(plab) \
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
|
||||
#include "precompiled.hpp"
|
||||
#include "interpreter/bytecodeStream.hpp"
|
||||
#include "logging/log.hpp"
|
||||
#include "oops/generateOopMap.hpp"
|
||||
#include "oops/oop.inline.hpp"
|
||||
#include "oops/symbol.hpp"
|
||||
|
@ -32,6 +33,7 @@
|
|||
#include "runtime/relocator.hpp"
|
||||
#include "runtime/timerTrace.hpp"
|
||||
#include "utilities/bitMap.inline.hpp"
|
||||
#include "utilities/ostream.hpp"
|
||||
#include "prims/methodHandles.hpp"
|
||||
|
||||
//
|
||||
|
@ -787,7 +789,7 @@ void GenerateOopMap::merge_state_into_bb(BasicBlock *bb) {
|
|||
bb->set_changed(true);
|
||||
}
|
||||
} else {
|
||||
if (TraceMonitorMismatch) {
|
||||
if (log_is_enabled(Info, monitormismatch)) {
|
||||
report_monitor_mismatch("monitor stack height merge conflict");
|
||||
}
|
||||
// When the monitor stacks are not matched, we set _monitor_top to
|
||||
|
@ -856,7 +858,7 @@ CellTypeState GenerateOopMap::monitor_pop() {
|
|||
_monitor_safe = false;
|
||||
_monitor_top = bad_monitors;
|
||||
|
||||
if (TraceMonitorMismatch) {
|
||||
if (log_is_enabled(Info, monitormismatch)) {
|
||||
report_monitor_mismatch("monitor stack underflow");
|
||||
}
|
||||
return CellTypeState::ref; // just to keep the analysis going.
|
||||
|
@ -872,7 +874,7 @@ void GenerateOopMap::monitor_push(CellTypeState cts) {
|
|||
_monitor_safe = false;
|
||||
_monitor_top = bad_monitors;
|
||||
|
||||
if (TraceMonitorMismatch) {
|
||||
if (log_is_enabled(Info, monitormismatch)) {
|
||||
report_monitor_mismatch("monitor stack overflow");
|
||||
}
|
||||
return;
|
||||
|
@ -1245,7 +1247,7 @@ void GenerateOopMap::do_exception_edge(BytecodeStream* itr) {
|
|||
// We don't set _monitor_top to bad_monitors because there are no successors
|
||||
// to this exceptional exit.
|
||||
|
||||
if (TraceMonitorMismatch && _monitor_safe) {
|
||||
if (log_is_enabled(Info, monitormismatch) && _monitor_safe) {
|
||||
// We check _monitor_safe so that we only report the first mismatched
|
||||
// exceptional exit.
|
||||
report_monitor_mismatch("non-empty monitor stack at exceptional exit");
|
||||
|
@ -1255,11 +1257,11 @@ void GenerateOopMap::do_exception_edge(BytecodeStream* itr) {
|
|||
}
|
||||
|
||||
void GenerateOopMap::report_monitor_mismatch(const char *msg) {
|
||||
#ifndef PRODUCT
|
||||
tty->print(" Monitor mismatch in method ");
|
||||
method()->print_short_name(tty);
|
||||
tty->print_cr(": %s", msg);
|
||||
#endif
|
||||
ResourceMark rm;
|
||||
outputStream* out = LogHandle(monitormismatch)::info_stream();
|
||||
out->print("Monitor mismatch in method ");
|
||||
method()->print_short_name(out);
|
||||
out->print_cr(": %s", msg);
|
||||
}
|
||||
|
||||
void GenerateOopMap::print_states(outputStream *os,
|
||||
|
@ -1782,7 +1784,7 @@ void GenerateOopMap::do_monitorenter(int bci) {
|
|||
_monitor_top = bad_monitors;
|
||||
_monitor_safe = false;
|
||||
|
||||
if (TraceMonitorMismatch) {
|
||||
if (log_is_enabled(Info, monitormismatch)) {
|
||||
report_monitor_mismatch("nested redundant lock -- bailout...");
|
||||
}
|
||||
return;
|
||||
|
@ -1820,7 +1822,7 @@ void GenerateOopMap::do_monitorexit(int bci) {
|
|||
bb->set_changed(true);
|
||||
bb->_monitor_top = bad_monitors;
|
||||
|
||||
if (TraceMonitorMismatch) {
|
||||
if (log_is_enabled(Info, monitormismatch)) {
|
||||
report_monitor_mismatch("improper monitor pair");
|
||||
}
|
||||
} else {
|
||||
|
@ -1846,7 +1848,7 @@ void GenerateOopMap::do_return_monitor_check() {
|
|||
// Since there are no successors to the *return bytecode, it
|
||||
// isn't necessary to set _monitor_top to bad_monitors.
|
||||
|
||||
if (TraceMonitorMismatch) {
|
||||
if (log_is_enabled(Info, monitormismatch)) {
|
||||
report_monitor_mismatch("non-empty monitor stack at return");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -438,6 +438,7 @@ static AliasedFlag const removed_develop_logging_flags[] = {
|
|||
{ "TraceClassLoaderData", "-Xlog:classloaderdata" },
|
||||
{ "TraceDefaultMethods", "-Xlog:defaultmethods=debug" },
|
||||
{ "TraceItables", "-Xlog:itables=debug" },
|
||||
{ "TraceMonitorMismatch", "-Xlog:monitormismatch=info" },
|
||||
{ "TraceSafepoint", "-Xlog:safepoint=debug" },
|
||||
{ "TraceStartupTime", "-Xlog:startuptime" },
|
||||
{ "TraceVMOperation", "-Xlog:vmoperation=debug" },
|
||||
|
|
|
@ -1451,9 +1451,6 @@ public:
|
|||
develop(bool, TimeOopMap2, false, \
|
||||
"Time calls to GenerateOopMap::compute_map() individually") \
|
||||
\
|
||||
develop(bool, TraceMonitorMismatch, false, \
|
||||
"Trace monitor matching failures during OopMapGeneration") \
|
||||
\
|
||||
develop(bool, TraceOopMapRewrites, false, \
|
||||
"Trace rewriting of method oops during oop map generation") \
|
||||
\
|
||||
|
|
114
hotspot/test/runtime/logging/MonitorMismatchHelper.jasm
Normal file
114
hotspot/test/runtime/logging/MonitorMismatchHelper.jasm
Normal file
|
@ -0,0 +1,114 @@
|
|||
/*
|
||||
* Copyright (c) 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
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
super public class MonitorMismatchHelper
|
||||
version 52:0
|
||||
{
|
||||
|
||||
private Field c:I;
|
||||
|
||||
public Method "<init>":"()V"
|
||||
stack 2 locals 1
|
||||
{
|
||||
aload_0;
|
||||
invokespecial Method java/lang/Object."<init>":"()V";
|
||||
aload_0;
|
||||
iconst_0;
|
||||
putfield Field c:"I";
|
||||
return;
|
||||
}
|
||||
|
||||
public synchronized Method increment:"()V"
|
||||
stack 3 locals 1
|
||||
{
|
||||
aload_0;
|
||||
dup;
|
||||
getfield Field c:"I";
|
||||
iconst_1;
|
||||
iadd;
|
||||
putfield Field c:"I";
|
||||
return;
|
||||
}
|
||||
|
||||
public synchronized Method decrement:"()V"
|
||||
stack 3 locals 1
|
||||
{
|
||||
aload_0;
|
||||
dup;
|
||||
getfield Field c:"I";
|
||||
iconst_1;
|
||||
isub;
|
||||
putfield Field c:"I";
|
||||
return;
|
||||
}
|
||||
|
||||
public synchronized Method value:"()I"
|
||||
stack 1 locals 1
|
||||
{
|
||||
aload_0;
|
||||
getfield Field c:"I";
|
||||
ireturn;
|
||||
}
|
||||
|
||||
public static varargs Method main:"([Ljava/lang/String;)V"
|
||||
stack 2 locals 4
|
||||
{
|
||||
new class MonitorMismatchHelper;
|
||||
dup;
|
||||
invokespecial Method "<init>":"()V";
|
||||
astore_1;
|
||||
aload_1;
|
||||
dup;
|
||||
astore_2;
|
||||
monitorenter;
|
||||
try t0;
|
||||
aload_1;
|
||||
invokevirtual Method increment:"()V";
|
||||
aload_1;
|
||||
invokevirtual Method increment:"()V";
|
||||
aload_1;
|
||||
invokevirtual Method decrement:"()V";
|
||||
getstatic Field java/lang/System.out:"Ljava/io/PrintStream;";
|
||||
aload_1;
|
||||
invokevirtual Method value:"()I";
|
||||
invokevirtual Method java/io/PrintStream.print:"(I)V";
|
||||
aload_2;
|
||||
monitorexit;
|
||||
endtry t0;
|
||||
goto L44;
|
||||
catch t0 #0;
|
||||
catch t1 #0;
|
||||
try t1;
|
||||
stack_frame_type full;
|
||||
locals_map class "[Ljava/lang/String;", class MonitorMismatchHelper, class java/lang/Object;
|
||||
stack_map class java/lang/Throwable;
|
||||
astore_3;
|
||||
aload_2;
|
||||
endtry t1;
|
||||
aload_3;
|
||||
athrow;
|
||||
L44: stack_frame_type chop1;
|
||||
return;
|
||||
}
|
||||
|
||||
} // end Class MonitorMismatchHelper
|
60
hotspot/test/runtime/logging/MonitorMismatchTest.java
Normal file
60
hotspot/test/runtime/logging/MonitorMismatchTest.java
Normal file
|
@ -0,0 +1,60 @@
|
|||
/*
|
||||
* Copyright (c) 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
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* @test MonitorMismatchTest
|
||||
* @bug 8150084
|
||||
* @library /testlibrary
|
||||
* @compile MonitorMismatchHelper.jasm
|
||||
* @build jdk.test.lib.OutputAnalyzer jdk.test.lib.ProcessTools jdk.test.lib.Platform
|
||||
* @run driver MonitorMismatchTest
|
||||
*/
|
||||
|
||||
import jdk.test.lib.OutputAnalyzer;
|
||||
import jdk.test.lib.ProcessTools;
|
||||
import jdk.test.lib.Platform;
|
||||
|
||||
public class MonitorMismatchTest {
|
||||
|
||||
public static void main(String... args) throws Exception {
|
||||
if (!Platform.isEmbedded()){
|
||||
// monitormismatch should turn on.
|
||||
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-Xcomp",
|
||||
"-XX:+TieredCompilation",
|
||||
"-Xlog:monitormismatch=info",
|
||||
"MonitorMismatchHelper");
|
||||
OutputAnalyzer o = new OutputAnalyzer(pb.start());
|
||||
o.shouldContain("[monitormismatch] Monitor mismatch in method");
|
||||
|
||||
// monitormismatch should turn off.
|
||||
pb = ProcessTools.createJavaProcessBuilder("-Xcomp",
|
||||
"-XX:+TieredCompilation",
|
||||
"-Xlog:monitormismatch=off",
|
||||
"MonitorMismatchHelper");
|
||||
o = new OutputAnalyzer(pb.start());
|
||||
o.shouldNotContain("[monitormismatch]");
|
||||
}
|
||||
};
|
||||
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue