8027314: Java should recognize Diagnostic options if -XX:+UnlockDiagnosticVMOptions is not specified and print an informative message
Summary: clarifying the error messages associated with vm options of type diagnostic, experimental, develop, and notproduct
Reviewed-by: kvn, twisti, ctornqvi
--- a/hotspot/src/share/vm/runtime/arguments.cpp Wed Jan 15 19:12:45 2014 -0500
+++ b/hotspot/src/share/vm/runtime/arguments.cpp Thu Jan 16 10:51:16 2014 -0800
@@ -878,7 +878,7 @@
arg_len = equal_sign - argname;
}
- Flag* found_flag = Flag::find_flag((const char*)argname, arg_len, true);
+ Flag* found_flag = Flag::find_flag((const char*)argname, arg_len, true, true);
if (found_flag != NULL) {
char locked_message_buf[BUFLEN];
found_flag->get_locked_message(locked_message_buf, BUFLEN);
--- a/hotspot/src/share/vm/runtime/globals.cpp Wed Jan 15 19:12:45 2014 -0500
+++ b/hotspot/src/share/vm/runtime/globals.cpp Thu Jan 16 10:51:16 2014 -0800
@@ -62,6 +62,14 @@
MATERIALIZE_FLAGS_EXT
+static bool is_product_build() {
+#ifdef PRODUCT
+ return true;
+#else
+ return false;
+#endif
+}
+
void Flag::check_writable() {
if (is_constant_in_binary()) {
fatal(err_msg("flag is constant: %s", _name));
@@ -235,6 +243,27 @@
// Get custom message for this locked flag, or return NULL if
// none is available.
void Flag::get_locked_message(char* buf, int buflen) const {
+ buf[0] = '\0';
+ if (is_diagnostic() && !is_unlocked()) {
+ jio_snprintf(buf, buflen, "Error: VM option '%s' is diagnostic and must be enabled via -XX:+UnlockDiagnosticVMOptions.\n",
+ _name);
+ return;
+ }
+ if (is_experimental() && !is_unlocked()) {
+ jio_snprintf(buf, buflen, "Error: VM option '%s' is experimental and must be enabled via -XX:+UnlockExperimentalVMOptions.\n",
+ _name);
+ return;
+ }
+ if (is_develop() && is_product_build()) {
+ jio_snprintf(buf, buflen, "Error: VM option '%s' is develop and is available only in debug version of VM.\n",
+ _name);
+ return;
+ }
+ if (is_notproduct() && is_product_build()) {
+ jio_snprintf(buf, buflen, "Error: VM option '%s' is notproduct and is available only in debug version of VM.\n",
+ _name);
+ return;
+ }
get_locked_message_ext(buf, buflen);
}
@@ -464,13 +493,13 @@
}
// Search the flag table for a named flag
-Flag* Flag::find_flag(const char* name, size_t length, bool allow_locked) {
+Flag* Flag::find_flag(const char* name, size_t length, bool allow_locked, bool return_flag) {
for (Flag* current = &flagTable[0]; current->_name != NULL; current++) {
if (str_equal(current->_name, name, length)) {
// Found a matching entry.
// Don't report notproduct and develop flags in product builds.
if (current->is_constant_in_binary()) {
- return NULL;
+ return (return_flag == true ? current : NULL);
}
// Report locked flags only if allowed.
if (!(current->is_unlocked() || current->is_unlocker())) {
--- a/hotspot/src/share/vm/runtime/globals.hpp Wed Jan 15 19:12:45 2014 -0500
+++ b/hotspot/src/share/vm/runtime/globals.hpp Thu Jan 16 10:51:16 2014 -0800
@@ -241,7 +241,7 @@
// number of flags
static size_t numFlags;
- static Flag* find_flag(const char* name, size_t length, bool allow_locked = false);
+ static Flag* find_flag(const char* name, size_t length, bool allow_locked = false, bool return_flag = false);
static Flag* fuzzy_match(const char* name, size_t length, bool allow_locked = false);
void check_writable();
--- a/hotspot/test/runtime/CommandLine/CompilerConfigFileWarning.java Wed Jan 15 19:12:45 2014 -0500
+++ b/hotspot/test/runtime/CommandLine/CompilerConfigFileWarning.java Thu Jan 16 10:51:16 2014 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2014, 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
@@ -33,8 +33,7 @@
public class CompilerConfigFileWarning {
public static void main(String[] args) throws Exception {
- String vmVersion = System.getProperty("java.vm.version");
- if (vmVersion.toLowerCase().contains("debug") || vmVersion.toLowerCase().contains("jvmg")) {
+ if (Platform.isDebugBuild()) {
System.out.println("Skip on debug builds since we'll always read the file there");
return;
}
--- a/hotspot/test/runtime/CommandLine/ConfigFileWarning.java Wed Jan 15 19:12:45 2014 -0500
+++ b/hotspot/test/runtime/CommandLine/ConfigFileWarning.java Thu Jan 16 10:51:16 2014 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2014, 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
@@ -33,8 +33,7 @@
public class ConfigFileWarning {
public static void main(String[] args) throws Exception {
- String vmVersion = System.getProperty("java.vm.version");
- if (vmVersion.toLowerCase().contains("debug") || vmVersion.toLowerCase().contains("jvmg")) {
+ if (Platform.isDebugBuild()) {
System.out.println("Skip on debug builds since we'll always read the file there");
return;
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/CommandLine/VMOptionWarning.java Thu Jan 16 10:51:16 2014 -0800
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2014, 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
+ * @bug 8027314
+ * @summary Warn if diagnostic or experimental vm option is used and -XX:+UnlockDiagnosticVMOptions or -XX:+UnlockExperimentalVMOptions, respectively, isn't specified. Warn if develop or notproduct vm option is used with product version of VM.
+ * @library /testlibrary
+ */
+
+import com.oracle.java.testlibrary.*;
+
+public class VMOptionWarning {
+ public static void main(String[] args) throws Exception {
+ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+PredictedLoadedClassCount", "-version");
+ OutputAnalyzer output = new OutputAnalyzer(pb.start());
+ output.shouldContain("Error: VM option 'PredictedLoadedClassCount' is experimental and must be enabled via -XX:+UnlockExperimentalVMOptions.");
+
+ if (Platform.isDebugBuild()) {
+ System.out.println("Skip the rest of the tests on debug builds since diagnostic, develop, and notproduct options are available on debug builds.");
+ return;
+ }
+
+ pb = ProcessTools.createJavaProcessBuilder("-XX:+PrintInlining", "-version");
+ output = new OutputAnalyzer(pb.start());
+ output.shouldContain("Error: VM option 'PrintInlining' is diagnostic and must be enabled via -XX:+UnlockDiagnosticVMOptions.");
+
+ pb = ProcessTools.createJavaProcessBuilder("-XX:+TraceJNICalls", "-version");
+ output = new OutputAnalyzer(pb.start());
+ output.shouldContain("Error: VM option 'TraceJNICalls' is develop and is available only in debug version of VM.");
+
+ pb = ProcessTools.createJavaProcessBuilder("-XX:+TraceJVMCalls", "-version");
+ output = new OutputAnalyzer(pb.start());
+ output.shouldContain("Error: VM option 'TraceJVMCalls' is notproduct and is available only in debug version of VM.");
+ }
+}