diff --git a/src/share/vm/compiler/compilerOracle.cpp b/src/share/vm/compiler/compilerOracle.cpp index 6ac45b41345fe672274fbde32a15308a0114d354..07bc969b8726acfec39a8c9fc2146198b564ddd1 100644 --- a/src/share/vm/compiler/compilerOracle.cpp +++ b/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/src/share/vm/compiler/compilerOracle.hpp b/src/share/vm/compiler/compilerOracle.hpp index 7a32967b9202e0bbd151fef450e0399cbdce2157..f736a4eebfc83512aca3af1e521e702cc817a673 100644 --- a/src/share/vm/compiler/compilerOracle.hpp +++ b/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/src/share/vm/opto/runtime.cpp b/src/share/vm/opto/runtime.cpp index b97f06a024fe60cae180cd1216ec54e9d37a12d3..d315f1010417bc4cea04e6d7636c0c74d81acecc 100644 --- a/src/share/vm/opto/runtime.cpp +++ b/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/src/share/vm/runtime/arguments.cpp b/src/share/vm/runtime/arguments.cpp index 1072daf6b04e11f03043b7b4e464ac96df6b9e15..a7195f2fc90e0cadec9f60d0b55ab2bffb531286 100644 --- a/src/share/vm/runtime/arguments.cpp +++ b/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/test/runtime/7110720/Test7110720.sh b/test/runtime/7110720/Test7110720.sh new file mode 100644 index 0000000000000000000000000000000000000000..c90c054fe4b3d167281cbd8c2aac3099bff6e6f7 --- /dev/null +++ b/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 +