7110720: Issue with vm config file loadingIssue with vm config file loading
Summary: disabling default config files if -XX:-ReadDefaultConfigFiles
Reviewed-by: phh, jrose, dcubed, dholmes
--- a/hotspot/src/share/vm/compiler/compilerOracle.cpp Wed Jul 05 18:00:52 2017 +0200
+++ b/hotspot/src/share/vm/compiler/compilerOracle.cpp Thu Mar 29 18:55:32 2012 -0400
@@ -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 Wed Jul 05 18:00:52 2017 +0200
+++ b/hotspot/src/share/vm/compiler/compilerOracle.hpp Thu Mar 29 18:55:32 2012 -0400
@@ -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 Wed Jul 05 18:00:52 2017 +0200
+++ b/hotspot/src/share/vm/opto/runtime.cpp Thu Mar 29 18:55:32 2012 -0400
@@ -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 @@
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 Wed Jul 05 18:00:52 2017 +0200
+++ b/hotspot/src/share/vm/runtime/arguments.cpp Thu Mar 29 18:55:32 2012 -0400
@@ -3002,12 +3002,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 Thu Mar 29 18:55:32 2012 -0400
@@ -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
+