From fbcf78297ff3832f0c1ffa4d117985851096ae05 Mon Sep 17 00:00:00 2001 From: Keith McGuigan Date: Thu, 29 Mar 2012 18:55:32 -0400 Subject: [PATCH 1/7] 7110720: Issue with vm config file loadingIssue with vm config file loading Disabling default config files if -XX:-ReadDefaultConfigFiles Reviewed-by: phh, jrose, dcubed, dholmes --- .../src/share/vm/compiler/compilerOracle.cpp | 16 ++- .../src/share/vm/compiler/compilerOracle.hpp | 6 +- hotspot/src/share/vm/opto/runtime.cpp | 5 +- hotspot/src/share/vm/runtime/arguments.cpp | 2 + hotspot/test/runtime/7110720/Test7110720.sh | 122 ++++++++++++++++++ 5 files changed, 146 insertions(+), 5 deletions(-) create mode 100644 hotspot/test/runtime/7110720/Test7110720.sh diff --git a/hotspot/src/share/vm/compiler/compilerOracle.cpp b/hotspot/src/share/vm/compiler/compilerOracle.cpp index 6ac45b41345..07bc969b872 100644 --- a/hotspot/src/share/vm/compiler/compilerOracle.cpp +++ b/hotspot/src/share/vm/compiler/compilerOracle.cpp @@ -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 @@ void CompilerOracle::parse_from_line(char* line) { } 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::parse_from_string(const char* str, void (*parse_line)(char* } 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_comment_to_file(const char* message) { } 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::append_exclude_to_file(methodHandle method) { 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"); diff --git a/hotspot/src/share/vm/compiler/compilerOracle.hpp b/hotspot/src/share/vm/compiler/compilerOracle.hpp index 7a32967b920..f736a4eebfc 100644 --- a/hotspot/src/share/vm/compiler/compilerOracle.hpp +++ b/hotspot/src/share/vm/compiler/compilerOracle.hpp @@ -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 @@ class CompilerOracle : AllStatic { 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(); diff --git a/hotspot/src/share/vm/opto/runtime.cpp b/hotspot/src/share/vm/opto/runtime.cpp index b97f06a024f..d315f101041 100644 --- a/hotspot/src/share/vm/opto/runtime.cpp +++ b/hotspot/src/share/vm/opto/runtime.cpp @@ -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 @@ -896,7 +896,8 @@ static void report_null_exception_in_code_cache(address exception_pc) { 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)) { diff --git a/hotspot/src/share/vm/runtime/arguments.cpp b/hotspot/src/share/vm/runtime/arguments.cpp index 1072daf6b04..a7195f2fc90 100644 --- a/hotspot/src/share/vm/runtime/arguments.cpp +++ b/hotspot/src/share/vm/runtime/arguments.cpp @@ -3002,12 +3002,14 @@ jint Arguments::parse(const JavaVMInitArgs* args) { } } +#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++) { diff --git a/hotspot/test/runtime/7110720/Test7110720.sh b/hotspot/test/runtime/7110720/Test7110720.sh new file mode 100644 index 00000000000..c90c054fe4b --- /dev/null +++ b/hotspot/test/runtime/7110720/Test7110720.sh @@ -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 + From 3e6d198cf73185722ec1c9538e8f2a52c341038f Mon Sep 17 00:00:00 2001 From: Tom Rodriguez Date: Wed, 4 Apr 2012 20:44:38 -0700 Subject: [PATCH 2/7] 7152811: Issues in client compiler Reviewed-by: kvn, jrose --- hotspot/src/share/vm/ci/ciField.cpp | 36 +++++++++++++++++++++++------ hotspot/src/share/vm/ci/ciField.hpp | 5 ++-- 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/hotspot/src/share/vm/ci/ciField.cpp b/hotspot/src/share/vm/ci/ciField.cpp index ab7bed4aa3e..e0090c2bcc0 100644 --- a/hotspot/src/share/vm/ci/ciField.cpp +++ b/hotspot/src/share/vm/ci/ciField.cpp @@ -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 @@ ciField::ciField(ciInstanceKlass* klass, int index): _known_to_link_with(NULL) { 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 @@ ciType* ciField::compute_type_impl() { 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,21 @@ bool ciField::will_link(ciInstanceKlass* accessing_klass, 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; + } + if (_known_to_link_with_get == accessing_klass) { + return true; + } } FieldAccessInfo result; @@ -334,8 +351,13 @@ bool ciField::will_link(ciInstanceKlass* accessing_klass, 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; } diff --git a/hotspot/src/share/vm/ci/ciField.hpp b/hotspot/src/share/vm/ci/ciField.hpp index bd65abe9893..ff96c99313c 100644 --- a/hotspot/src/share/vm/ci/ciField.hpp +++ b/hotspot/src/share/vm/ci/ciField.hpp @@ -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 @@ private: 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 From 24500364ed888c69f3569bfefd96661493bde64e Mon Sep 17 00:00:00 2001 From: Tom Rodriguez Date: Thu, 12 Apr 2012 12:07:09 -0700 Subject: [PATCH 3/7] 7160677: missing else in fix for 7152811 Reviewed-by: kvn, kevinw --- hotspot/src/share/vm/ci/ciField.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/hotspot/src/share/vm/ci/ciField.cpp b/hotspot/src/share/vm/ci/ciField.cpp index e0090c2bcc0..b9bc23be361 100644 --- a/hotspot/src/share/vm/ci/ciField.cpp +++ b/hotspot/src/share/vm/ci/ciField.cpp @@ -338,6 +338,7 @@ bool ciField::will_link(ciInstanceKlass* accessing_klass, if (_known_to_link_with_put == accessing_klass) { return true; } + } else { if (_known_to_link_with_get == accessing_klass) { return true; } From ff66fcc442a06303e2b96b1223e9472d7286b2de Mon Sep 17 00:00:00 2001 From: Keith McGuigan Date: Thu, 3 May 2012 15:37:46 -0400 Subject: [PATCH 4/7] 7160757: Problem with hotspot/runtime_classfile Allow only current and super invokespecials of Reviewed-by: never, coleenp, dcubed --- hotspot/src/share/vm/classfile/verifier.cpp | 6 +- hotspot/test/runtime/7160757/Test7160757.java | 82 +++++++++++++++++++ 2 files changed, 85 insertions(+), 3 deletions(-) create mode 100644 hotspot/test/runtime/7160757/Test7160757.java diff --git a/hotspot/src/share/vm/classfile/verifier.cpp b/hotspot/src/share/vm/classfile/verifier.cpp index 9ab47f7b664..376e878010c 100644 --- a/hotspot/src/share/vm/classfile/verifier.cpp +++ b/hotspot/src/share/vm/classfile/verifier.cpp @@ -1880,10 +1880,10 @@ void ClassVerifier::verify_invoke_init( VerificationType type = current_frame->pop_stack( VerificationType::reference_check(), CHECK_VERIFY(this)); if (type == VerificationType::uninitialized_this_type()) { - // The method must be an method of either this class, or one of its - // superclasses + // The method must be an 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 method call"); return; } diff --git a/hotspot/test/runtime/7160757/Test7160757.java b/hotspot/test/runtime/7160757/Test7160757.java new file mode 100644 index 00000000000..833e8b8963f --- /dev/null +++ b/hotspot/test/runtime/7160757/Test7160757.java @@ -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.() + * 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); + } + } +} From 9b279135421fa849d3f8fdc299cb46af613e864e Mon Sep 17 00:00:00 2001 From: Staffan Larsen Date: Mon, 11 Jun 2012 20:52:00 +0200 Subject: [PATCH 5/7] 7175802: Missing jdk_jfr in top-level make file Reviewed-by: alanb --- test/Makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/Makefile b/test/Makefile index f5352e34fad..f1dfe1dbd3c 100644 --- a/test/Makefile +++ b/test/Makefile @@ -74,7 +74,8 @@ JDK_NONDEFAULT_TEST_LIST = \ jdk_rmi \ jdk_sound \ jdk_swing \ - jdk_tools1 jdk_tools2 + jdk_tools1 jdk_tools2 \ + jdk_jfr # All jdk tests JDK_ALL_TEST_LIST = $(JDK_DEFAULT_TEST_LIST) $(JDK_NONDEFAULT_TEST_LIST) From 04f6e273611f96fe10cad5d869387ab4f0f4e19f Mon Sep 17 00:00:00 2001 From: David Katleman Date: Thu, 21 Jun 2012 17:07:24 -0700 Subject: [PATCH 6/7] Added tag jdk8-b44 for changeset 053c1b820253 --- .hgtags-top-repo | 1 + 1 file changed, 1 insertion(+) diff --git a/.hgtags-top-repo b/.hgtags-top-repo index cda4949ebf7..44ad17af265 100644 --- a/.hgtags-top-repo +++ b/.hgtags-top-repo @@ -165,3 +165,4 @@ a2b2d435f1d275fa8010774c653197c64e326d3a jdk8-b40 1a8c7c530f8a9b7f5bdb9b0693b2f5435ca5205e jdk8-b41 1ce5dc16416611c58b7480ca67a2eee5153498a6 jdk8-b42 661c9aae602bbd9766d12590800c90f1edd1d8dd jdk8-b43 +e4f81a817447c3a4f6868f083c81c2fb1b15d44c jdk8-b44 From 769bc4a4205d2b78b9a270ea8913959628801487 Mon Sep 17 00:00:00 2001 From: David Katleman Date: Thu, 21 Jun 2012 17:07:40 -0700 Subject: [PATCH 7/7] Added tag jdk8-b44 for changeset 1531e68c3b60 --- hotspot/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/hotspot/.hgtags b/hotspot/.hgtags index 905d081f32c..4a7f07f305b 100644 --- a/hotspot/.hgtags +++ b/hotspot/.hgtags @@ -255,3 +255,4 @@ bd568544be7fcd12a9327e6c448592198d57b043 hs24-b13 55954061c6e8750ea39a63523fd65d580db6eeb1 jdk8-b42 e77b8e0ed1f84e3e268239e276c7ab64fa573baa jdk8-b43 5ba29a1db46ecb80a321ca873adb56a3fe6ad320 hs24-b14 +831e5c76a20af18f3c08c5a95ed31be0e128a010 jdk8-b44