1 /* 2 * Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 * 23 */ 24 25 #include "precompiled.hpp" 26 #include "jvmci/jvmci_globals.hpp" 27 #include "utilities/defaultStream.hpp" 28 #include "runtime/globals_extension.hpp" 29 30 JVMCI_FLAGS(MATERIALIZE_DEVELOPER_FLAG, \ 31 MATERIALIZE_PD_DEVELOPER_FLAG, \ 32 MATERIALIZE_PRODUCT_FLAG, \ 33 MATERIALIZE_PD_PRODUCT_FLAG, \ 34 MATERIALIZE_DIAGNOSTIC_FLAG, \ 35 MATERIALIZE_EXPERIMENTAL_FLAG, \ 36 MATERIALIZE_NOTPRODUCT_FLAG, 37 IGNORE_RANGE, \ 38 IGNORE_CONSTRAINT) 39 40 41 42 #define IGNORE_FLAG_FOUR_PARAM(type, name, value, doc) 43 #define IGNORE_FLAG_THREE_PARAM(type, name, doc) 44 45 // Check if any jvmci global defaults changed. 46 bool is_any_jvmci_arg_values_changed() { 47 48 int check_count = 0, fail_count = 0; 49 50 if (!FLAG_IS_DEFAULT(EnableJVMCI)) { 51 check_count++; 52 } 53 54 #define EMIT_FLAG_VALUE_CHANGED_CHECK_CODE(FLAG) \ 55 if (!FLAG_IS_DEFAULT(FLAG)) { \ 56 fail_count++; \ 57 if (fail_count > check_count) \ 58 return true; \ 59 } 60 61 #define JVMCI_DIAGNOSTIC_FLAG_VALUE_CHANGED_CHECKCODE(type, name, value, doc) EMIT_FLAG_VALUE_CHANGED_CHECK_CODE(name) 62 #define JVMCI_EXPERIMENTAL_FLAG_VALUE_CHANGED_CHECKCODE(type, name, value, doc) EMIT_FLAG_VALUE_CHANGED_CHECK_CODE(name) 63 64 if (UnlockDiagnosticVMOptions) { 65 66 JVMCI_FLAGS(IGNORE_FLAG_FOUR_PARAM, \ 67 IGNORE_FLAG_THREE_PARAM, \ 68 IGNORE_FLAG_FOUR_PARAM, \ 69 IGNORE_FLAG_THREE_PARAM, \ 70 JVMCI_DIAGNOSTIC_FLAG_VALUE_CHANGED_CHECKCODE, \ 71 IGNORE_FLAG_FOUR_PARAM, \ 72 IGNORE_FLAG_FOUR_PARAM, \ 73 IGNORE_RANGE, \ 74 IGNORE_CONSTRAINT) 75 76 } 77 78 if (UnlockExperimentalVMOptions) { 79 80 JVMCI_FLAGS(IGNORE_FLAG_FOUR_PARAM, \ 81 IGNORE_FLAG_THREE_PARAM, \ 82 IGNORE_FLAG_FOUR_PARAM, \ 83 IGNORE_FLAG_THREE_PARAM, \ 84 IGNORE_FLAG_FOUR_PARAM, \ 85 JVMCI_EXPERIMENTAL_FLAG_VALUE_CHANGED_CHECKCODE, \ 86 IGNORE_FLAG_FOUR_PARAM, \ 87 IGNORE_RANGE, \ 88 IGNORE_CONSTRAINT) 89 90 } 91 92 #ifndef PRODUCT 93 #define JVMCI_DEVELOP_FLAG_VALUE_CHANGED_CHECKCODE(type, name, value, doc) EMIT_FLAG_VALUE_CHANGED_CHECK_CODE(name) 94 #define JVMCI_PD_DEVELOP_FLAG_VALUE_CHANGED_CHECKCODE(type, name, doc) EMIT_FLAG_VALUE_CHANGED_CHECK_CODE(name) 95 #define JVMCI_NOTPRODUCT_FLAG_VALUE_CHANGED_CHECKCODE(type, name, value, doc) EMIT_FLAG_VALUE_CHANGED_CHECK_CODE(name) 96 #else 97 #define JVMCI_DEVELOP_FLAG_VALUE_CHANGED_CHECKCODE(type, name, value, doc) 98 #define JVMCI_PD_DEVELOP_FLAG_VALUE_CHANGED_CHECKCODE(type, name, doc) 99 #define JVMCI_NOTPRODUCT_FLAG_VALUE_CHANGED_CHECKCODE(type, name, value, doc) 100 #endif 101 102 #define JVMCI_PD_PRODUCT_FLAG_VALUE_CHANGED_CHECKCODE(type, name, doc) EMIT_FLAG_VALUE_CHANGED_CHECK_CODE(name) 103 #define JVMCI_PRODUCT_FLAG_VALUE_CHANGED_CHECKCODE(type, name, value, doc) EMIT_FLAG_VALUE_CHANGED_CHECK_CODE(name) 104 105 JVMCI_FLAGS(JVMCI_DEVELOP_FLAG_VALUE_CHANGED_CHECKCODE, \ 106 JVMCI_PD_DEVELOP_FLAG_VALUE_CHANGED_CHECKCODE, \ 107 JVMCI_PRODUCT_FLAG_VALUE_CHANGED_CHECKCODE, \ 108 JVMCI_PD_PRODUCT_FLAG_VALUE_CHANGED_CHECKCODE, \ 109 IGNORE_FLAG_FOUR_PARAM, \ 110 IGNORE_FLAG_FOUR_PARAM, \ 111 JVMCI_NOTPRODUCT_FLAG_VALUE_CHANGED_CHECKCODE, \ 112 IGNORE_RANGE, \ 113 IGNORE_CONSTRAINT) 114 115 #undef EMIT_FLAG_VALUE_CHANGED_CHECK_CODE 116 #undef JVMCI_DEVELOP_FLAG_VALUE_CHANGED_CHECKCODE 117 #undef JVMCI_PD_DEVELOP_FLAG_VALUE_CHANGED_CHECKCODE 118 #undef JVMCI_NOTPRODUCT_FLAG_VALUE_CHANGED_CHECKCODE 119 #undef JVMCI_DIAGNOSTIC_FLAG_VALUE_CHANGED_CHECKCODE 120 #undef JVMCI_PD_PRODUCT_FLAG_VALUE_CHANGED_CHECKCODE 121 #undef JVMCI_PRODUCT_FLAG_VALUE_CHANGED_CHECKCODE 122 #undef JVMCI_EXPERIMENTAL_FLAG_VALUE_CHANGED_CHECKCODE 123 124 return false; 125 } 126 127 // Print jvmci args inconsistency error message. 128 void print_jvmci_arg_inconsistency_error_message() { 129 const char* error_msg = "Improperly specified VM option '%s'\n"; 130 131 jio_fprintf(defaultStream::error_stream(), "EnableJVMCI must be enabled\n"); 132 133 #define EMIT_CHECK_PRINT_ERROR_MSG(FLAG) \ 134 if (!FLAG_IS_DEFAULT(FLAG)) { \ 135 if (strcmp(#FLAG, "EnableJVMCI")) \ 136 jio_fprintf(defaultStream::error_stream(), error_msg, #FLAG); \ 137 } 138 139 #define JVMCI_DIAGNOSTIC_FLAG_CHECK_PRINT_ERROR_MSG(type, name, value, doc) EMIT_CHECK_PRINT_ERROR_MSG(name) 140 #define JVMCI_EXPERIMENTAL_FLAG_CHECK_PRINT_ERROR_MSG(type, name, value, doc) EMIT_CHECK_PRINT_ERROR_MSG(name) 141 142 if (UnlockDiagnosticVMOptions) { 143 144 JVMCI_FLAGS(IGNORE_FLAG_FOUR_PARAM, \ 145 IGNORE_FLAG_THREE_PARAM, \ 146 IGNORE_FLAG_FOUR_PARAM, \ 147 IGNORE_FLAG_THREE_PARAM, \ 148 JVMCI_DIAGNOSTIC_FLAG_CHECK_PRINT_ERROR_MSG, \ 149 IGNORE_FLAG_FOUR_PARAM, \ 150 IGNORE_FLAG_FOUR_PARAM, \ 151 IGNORE_RANGE, \ 152 IGNORE_CONSTRAINT) 153 154 } 155 156 if (UnlockExperimentalVMOptions) { 157 158 JVMCI_FLAGS(IGNORE_FLAG_FOUR_PARAM, \ 159 IGNORE_FLAG_THREE_PARAM, \ 160 IGNORE_FLAG_FOUR_PARAM, \ 161 IGNORE_FLAG_THREE_PARAM, \ 162 IGNORE_FLAG_FOUR_PARAM, \ 163 JVMCI_EXPERIMENTAL_FLAG_CHECK_PRINT_ERROR_MSG, \ 164 IGNORE_FLAG_FOUR_PARAM, \ 165 IGNORE_RANGE, \ 166 IGNORE_CONSTRAINT) 167 168 } 169 170 #ifndef PRODUCT 171 #define JVMCI_DEVELOP_FLAG_CHECK_PRINT_ERROR_MSG(type, name, value, doc) EMIT_CHECK_PRINT_ERROR_MSG(name) 172 #define JVMCI_PD_DEVELOP_FLAG_CHECK_PRINT_ERROR_MSG(type, name, doc) EMIT_CHECK_PRINT_ERROR_MSG(name) 173 #define JVMCI_NOTPRODUCT_FLAG_CHECK_PRINT_ERROR_MSG(type, name, value, doc) EMIT_CHECK_PRINT_ERROR_MSG(name) 174 #else 175 #define JVMCI_DEVELOP_FLAG_CHECK_PRINT_ERROR_MSG(type, name, value, doc) 176 #define JVMCI_PD_DEVELOP_FLAG_CHECK_PRINT_ERROR_MSG(type, name, doc) 177 #define JVMCI_NOTPRODUCT_FLAG_CHECK_PRINT_ERROR_MSG(type, name, value, doc) 178 #endif 179 180 #define JVMCI_PD_PRODUCT_FLAG_CHECK_PRINT_ERROR_MSG(type, name, doc) EMIT_CHECK_PRINT_ERROR_MSG(name) 181 #define JVMCI_PRODUCT_FLAG_CHECK_PRINT_ERROR_MSG(type, name, value, doc) EMIT_CHECK_PRINT_ERROR_MSG(name) 182 183 JVMCI_FLAGS(JVMCI_DEVELOP_FLAG_CHECK_PRINT_ERROR_MSG, \ 184 JVMCI_PD_DEVELOP_FLAG_CHECK_PRINT_ERROR_MSG, \ 185 JVMCI_PRODUCT_FLAG_CHECK_PRINT_ERROR_MSG, \ 186 JVMCI_PD_PRODUCT_FLAG_CHECK_PRINT_ERROR_MSG, \ 187 IGNORE_FLAG_FOUR_PARAM, \ 188 IGNORE_FLAG_FOUR_PARAM, \ 189 JVMCI_NOTPRODUCT_FLAG_CHECK_PRINT_ERROR_MSG, \ 190 IGNORE_RANGE, \ 191 IGNORE_CONSTRAINT) 192 193 #undef EMIT_CHECK_PRINT_ERROR_MSG 194 #undef JVMCI_DEVELOP_FLAG_CHECK_PRINT_ERROR_MSG 195 #undef JVMCI_PD_DEVELOP_FLAG_CHECK_PRINT_ERROR_MSG 196 #undef JVMCI_NOTPRODUCT_FLAG_CHECK_PRINT_ERROR_MSG 197 #undef JVMCI_PD_PRODUCT_FLAG_CHECK_PRINT_ERROR_MSG 198 #undef JVMCI_PRODUCT_FLAG_CHECK_PRINT_ERROR_MSG 199 #undef JVMCI_DIAGNOSTIC_FLAG_CHECK_PRINT_ERROR_MSG 200 #undef JVMCI_EXPERIMENTAL_FLAG_CHECK_PRINT_ERROR_MSG 201 202 } 203 204 #undef IGNORE_FLAG_FOUR_PARAM 205 #undef IGNORE_FLAG_THREE_PARAM