--- a/hotspot/src/share/vm/ci/ciField.cpp Thu Jun 21 17:07:40 2012 -0700
+++ b/hotspot/src/share/vm/ci/ciField.cpp Tue Jun 26 10:27:11 2012 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2012, 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
@@ -67,7 +67,7 @@
// ------------------------------------------------------------------
// ciField::ciField
-ciField::ciField(ciInstanceKlass* klass, int index): _known_to_link_with(NULL) {
+ciField::ciField(ciInstanceKlass* klass, int index): _known_to_link_with_put(NULL), _known_to_link_with_get(NULL) {
ASSERT_IN_VM;
CompilerThread *thread = CompilerThread::current();
@@ -143,7 +143,7 @@
initialize_from(&field_desc);
}
-ciField::ciField(fieldDescriptor *fd): _known_to_link_with(NULL) {
+ciField::ciField(fieldDescriptor *fd): _known_to_link_with_put(NULL), _known_to_link_with_get(NULL) {
ASSERT_IN_VM;
_cp_index = -1;
@@ -315,6 +315,10 @@
bool ciField::will_link(ciInstanceKlass* accessing_klass,
Bytecodes::Code bc) {
VM_ENTRY_MARK;
+ assert(bc == Bytecodes::_getstatic || bc == Bytecodes::_putstatic ||
+ bc == Bytecodes::_getfield || bc == Bytecodes::_putfield,
+ "unexpected bytecode");
+
if (_offset == -1) {
// at creation we couldn't link to our holder so we need to
// maintain that stance, otherwise there's no safe way to use this
@@ -322,8 +326,22 @@
return false;
}
- if (_known_to_link_with == accessing_klass) {
- return true;
+ // Check for static/nonstatic mismatch
+ bool is_static = (bc == Bytecodes::_getstatic || bc == Bytecodes::_putstatic);
+ if (is_static != this->is_static()) {
+ return false;
+ }
+
+ // Get and put can have different accessibility rules
+ bool is_put = (bc == Bytecodes::_putfield || bc == Bytecodes::_putstatic);
+ if (is_put) {
+ if (_known_to_link_with_put == accessing_klass) {
+ return true;
+ }
+ } else {
+ if (_known_to_link_with_get == accessing_klass) {
+ return true;
+ }
}
FieldAccessInfo result;
@@ -334,8 +352,13 @@
true, false, KILL_COMPILE_ON_FATAL_(false));
// update the hit-cache, unless there is a problem with memory scoping:
- if (accessing_klass->is_shared() || !is_shared())
- _known_to_link_with = accessing_klass;
+ if (accessing_klass->is_shared() || !is_shared()) {
+ if (is_put) {
+ _known_to_link_with_put = accessing_klass;
+ } else {
+ _known_to_link_with_get = accessing_klass;
+ }
+ }
return true;
}
--- a/hotspot/src/share/vm/ci/ciField.hpp Thu Jun 21 17:07:40 2012 -0700
+++ b/hotspot/src/share/vm/ci/ciField.hpp Tue Jun 26 10:27:11 2012 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2012, 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
@@ -49,7 +49,8 @@
ciType* _type;
int _offset;
bool _is_constant;
- ciInstanceKlass* _known_to_link_with;
+ ciInstanceKlass* _known_to_link_with_put;
+ ciInstanceKlass* _known_to_link_with_get;
ciConstant _constant_value;
// Used for will_link
--- a/hotspot/src/share/vm/classfile/verifier.cpp Thu Jun 21 17:07:40 2012 -0700
+++ b/hotspot/src/share/vm/classfile/verifier.cpp Tue Jun 26 10:27:11 2012 -0700
@@ -1884,10 +1884,10 @@
VerificationType type = current_frame->pop_stack(
VerificationType::reference_check(), CHECK_VERIFY(this));
if (type == VerificationType::uninitialized_this_type()) {
- // The method must be an <init> method of either this class, or one of its
- // superclasses
+ // The method must be an <init> method of this class or its superclass
+ klassOop superk = current_class()->super();
if (ref_class_type.name() != current_class()->name() &&
- !name_in_supers(ref_class_type.name(), current_class())) {
+ ref_class_type.name() != superk->klass_part()->name()) {
verify_error(bci, "Bad <init> method call");
return;
}
--- a/hotspot/src/share/vm/compiler/compilerOracle.cpp Thu Jun 21 17:07:40 2012 -0700
+++ b/hotspot/src/share/vm/compiler/compilerOracle.cpp Tue Jun 26 10:27:11 2012 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2012, 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
@@ -551,13 +551,21 @@
}
static const char* cc_file() {
+#ifdef ASSERT
if (CompileCommandFile == NULL)
return ".hotspot_compiler";
+#endif
return CompileCommandFile;
}
+
+bool CompilerOracle::has_command_file() {
+ return cc_file() != NULL;
+}
+
bool CompilerOracle::_quiet = false;
void CompilerOracle::parse_from_file() {
+ assert(has_command_file(), "command file must be specified");
FILE* stream = fopen(cc_file(), "rt");
if (stream == NULL) return;
@@ -600,6 +608,7 @@
}
void CompilerOracle::append_comment_to_file(const char* message) {
+ assert(has_command_file(), "command file must be specified");
fileStream stream(fopen(cc_file(), "at"));
stream.print("# ");
for (int index = 0; message[index] != '\0'; index++) {
@@ -610,6 +619,7 @@
}
void CompilerOracle::append_exclude_to_file(methodHandle method) {
+ assert(has_command_file(), "command file must be specified");
fileStream stream(fopen(cc_file(), "at"));
stream.print("exclude ");
Klass::cast(method->method_holder())->name()->print_symbol_on(&stream);
@@ -624,7 +634,9 @@
void compilerOracle_init() {
CompilerOracle::parse_from_string(CompileCommand, CompilerOracle::parse_from_line);
CompilerOracle::parse_from_string(CompileOnly, CompilerOracle::parse_compile_only);
- CompilerOracle::parse_from_file();
+ if (CompilerOracle::has_command_file()) {
+ CompilerOracle::parse_from_file();
+ }
if (lists[PrintCommand] != NULL) {
if (PrintAssembly) {
warning("CompileCommand and/or .hotspot_compiler file contains 'print' commands, but PrintAssembly is also enabled");
--- a/hotspot/src/share/vm/compiler/compilerOracle.hpp Thu Jun 21 17:07:40 2012 -0700
+++ b/hotspot/src/share/vm/compiler/compilerOracle.hpp Tue Jun 26 10:27:11 2012 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2012, 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
@@ -36,6 +36,10 @@
static bool _quiet;
public:
+
+ // True if the command file has been specified or is implicit
+ static bool has_command_file();
+
// Reads from file and adds to lists
static void parse_from_file();
--- a/hotspot/src/share/vm/opto/runtime.cpp Thu Jun 21 17:07:40 2012 -0700
+++ b/hotspot/src/share/vm/opto/runtime.cpp Tue Jun 26 10:27:11 2012 -0700
@@ -896,7 +896,8 @@
methodOop method = ((nmethod*)n)->method();
tty->print_cr("# Method where it happened %s.%s ", Klass::cast(method->method_holder())->name()->as_C_string(), method->name()->as_C_string());
tty->print_cr("#");
- if (ShowMessageBoxOnError && UpdateHotSpotCompilerFileOnError) {
+ if (ShowMessageBoxOnError && UpdateHotSpotCompilerFileOnError &&
+ CompilerOracle::has_command_file()) {
const char* title = "HotSpot Runtime Error";
const char* question = "Do you want to exclude compilation of this method in future runs?";
if (os::message_box(title, question)) {
--- a/hotspot/src/share/vm/runtime/arguments.cpp Thu Jun 21 17:07:40 2012 -0700
+++ b/hotspot/src/share/vm/runtime/arguments.cpp Tue Jun 26 10:27:11 2012 -0700
@@ -3017,12 +3017,14 @@
}
}
+#ifdef ASSERT
// Parse default .hotspotrc settings file
if (!settings_file_specified) {
if (!process_settings_file(".hotspotrc", false, args->ignoreUnrecognized)) {
return JNI_EINVAL;
}
}
+#endif
if (PrintVMOptions) {
for (index = 0; index < args->nOptions; index++) {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/7110720/Test7110720.sh Tue Jun 26 10:27:11 2012 -0700
@@ -0,0 +1,122 @@
+#
+# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+
+
+#
+# @test Test7110720.sh
+# @bug 7110720
+# @summary improve VM configuration file loading
+# @run shell Test7110720.sh
+#
+
+if [ "${TESTSRC}" = "" ]
+ then TESTSRC=.
+fi
+
+if [ "${TESTJAVA}" = "" ]
+then
+ PARENT=`dirname \`which java\``
+ TESTJAVA=`dirname ${PARENT}`
+ echo "TESTJAVA not set, selecting " ${TESTJAVA}
+ echo "If this is incorrect, try setting the variable manually."
+fi
+
+if [ "${TESTCLASSES}" = "" ]
+then
+ echo "TESTCLASSES not set. Test cannot execute. Failed."
+ exit 1
+fi
+
+# Jtreg sets TESTVMOPTS which may include -d64 which is
+# required to test a 64-bit JVM on some platforms.
+# If another test harness still creates HOME/JDK64BIT,
+# we can recognise that.
+
+# set platform-dependent variables
+OS=`uname -s`
+case "$OS" in
+ SunOS | Linux )
+ FS="/"
+ RM=/bin/rm
+ CP=/bin/cp
+ MV=/bin/mv
+ ## for solaris, linux it's HOME
+ FILE_LOCATION=$HOME
+ if [ -f ${FILE_LOCATION}${FS}JDK64BIT -a ${OS} = "SunOS" ]
+ then
+ TESTVMOPTS=`cat ${FILE_LOCATION}${FS}JDK64BIT`
+ fi
+ ;;
+ Windows_* )
+ FS="\\"
+ RM=rm
+ CP=cp
+ MV=mv
+ ;;
+ * )
+ echo "Unrecognized system!"
+ exit 1;
+ ;;
+esac
+
+
+JAVA=${TESTJAVA}${FS}bin${FS}java
+
+# Don't test debug builds, they do read the config files:
+${JAVA} ${TESTVMOPTS} -version 2>&1 | grep "debug" >/dev/null
+if [ "$?" = "0" ]; then
+ echo Skipping test for debug build.
+ exit 0
+fi
+
+ok=yes
+
+$RM -f .hotspot_compiler .hotspotrc
+
+${JAVA} ${TESTVMOPTS} -version 2>&1 | grep "garbage in" >/dev/null
+if [ "$?" = "0" ]; then
+ echo "FAILED: base case failure"
+ exit 1
+fi
+
+
+echo "garbage in, garbage out" > .hotspot_compiler
+${JAVA} ${TESTVMOPTS} -version 2>&1 | grep "garbage in" >/dev/null
+if [ "$?" = "0" ]; then
+ echo "FAILED: .hotspot_compiler was read"
+ ok=no
+fi
+
+$MV .hotspot_compiler hs_comp.txt
+${JAVA} ${TESTVMOPTS} -XX:CompileCommandFile=hs_comp.txt -version 2>&1 | grep "garbage in" >/dev/null
+if [ "$?" = "1" ]; then
+ echo "FAILED: explicit compiler command file not read"
+ ok=no
+fi
+
+$RM -f .hotspot_compiler hs_comp.txt
+
+echo "garbage" > .hotspotrc
+${JAVA} ${TESTVMOPTS} -version 2>&1 | grep "garbage" >/dev/null
+if [ "$?" = "0" ]; then
+ echo "FAILED: .hotspotrc was read"
+ ok=no
+fi
+
+$MV .hotspotrc hs_flags.txt
+${JAVA} ${TESTVMOPTS} -XX:Flags=hs_flags.txt -version 2>&1 | grep "garbage" >/dev/null
+if [ "$?" = "1" ]; then
+ echo "FAILED: explicit flags file not read"
+ ok=no
+fi
+
+if [ "${ok}" = "no" ]; then
+ echo "Some tests failed."
+ exit 1
+else
+ echo "Passed"
+ exit 0
+fi
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/7160757/Test7160757.java Tue Jun 26 10:27:11 2012 -0700
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2012, 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 Test7160757.java
+ * @bug 7160757
+ * @summary Tests that superclass initialization is not skipped
+ */
+
+public class Test7160757 {
+
+ public static void main(String args[]) throws Exception {
+
+ ClassLoader loader = new SLoader();
+ try {
+ Class.forName("S", true, loader);
+ System.out.println("FAILED");
+ throw new Exception("Should have thrown a VerifyError.");
+ } catch (VerifyError e) {
+ System.out.println(e);
+ System.out.println("PASSED");
+ }
+ }
+
+ static class SLoader extends ClassLoader {
+
+ /**
+ * public class S extends Throwable {
+ * public S() {
+ * aload_0
+ * invokespecial Object.<init>()
+ * return
+ * }
+ * }
+ */
+ static byte b(int i) { return (byte)i; }
+ static byte S_class[] = {
+ b(0xca), b(0xfe), b(0xba), b(0xbe), 0x00, 0x00, 0x00, 0x32,
+ 0x00, 0x0c, 0x0a, 0x00, 0x0b, 0x00, 0x07, 0x07,
+ 0x00, 0x08, 0x07, 0x00, 0x09, 0x01, 0x00, 0x06,
+ 0x3c, 0x69, 0x6e, 0x69, 0x74, 0x3e, 0x01, 0x00,
+ 0x03, 0x28, 0x29, 0x56, 0x01, 0x00, 0x04, 0x43,
+ 0x6f, 0x64, 0x65, 0x0c, 0x00, 0x04, 0x00, 0x05,
+ 0x01, 0x00, 0x01, 0x53, 0x01, 0x00, 0x13, 0x6a,
+ 0x61, 0x76, 0x61, 0x2f, 0x6c, 0x61, 0x6e, 0x67,
+ 0x2f, 0x54, 0x68, 0x72, 0x6f, 0x77, 0x61, 0x62,
+ 0x6c, 0x65, 0x01, 0x00, 0x10, 0x6a, 0x61, 0x76,
+ 0x61, 0x2f, 0x6c, 0x61, 0x6e, 0x67, 0x2f, 0x4f,
+ 0x62, 0x6a, 0x65, 0x63, 0x74, 0x07, 0x00, 0x0a,
+ 0x00, 0x21, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x04,
+ 0x00, 0x05, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00,
+ 0x00, 0x11, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x05, 0x2a, b(0xb7), 0x00, 0x01, b(0xb1), 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00
+ };
+
+ public Class findClass(String name) throws ClassNotFoundException {
+ return defineClass(name, S_class, 0, S_class.length);
+ }
+ }
+}