1 /*
   2  * Copyright (c) 2000, 2016, 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_PD_DIAGNOSTIC_FLAG, \
  36             MATERIALIZE_EXPERIMENTAL_FLAG, \
  37             MATERIALIZE_NOTPRODUCT_FLAG,
  38             IGNORE_RANGE, \
  39             IGNORE_CONSTRAINT, \
  40             IGNORE_WRITEABLE)
  41 
  42 #define JVMCI_IGNORE_FLAG_FOUR_PARAM(type, name, value, doc)
  43 #define JVMCI_IGNORE_FLAG_THREE_PARAM(type, name, doc)
  44 
  45 // Return true if jvmci flags are consistent.
  46 bool JVMCIGlobals::check_jvmci_flags_are_consistent() {
  47   if (EnableJVMCI) {
  48     return true;
  49   }
  50 
  51   // "FLAG_IS_DEFAULT" fail count.
  52   int fail_count = 0;
  53   // Number of "FLAG_IS_DEFAULT" fails that should be skipped before code
  54   // detect real consistency failure.
  55   int skip_fail_count;
  56 
  57   // EnableJVMCI flag is false here.
  58   // If any other flag is changed, consistency check should fail.
  59   // JVMCI_FLAGS macros added below can handle all JVMCI flags automatically.
  60   // But it contains check for EnableJVMCI flag too, which is required to be
  61   // skipped. This can't be handled easily!
  62   // So the code looks for at-least two flag changes to detect consistency
  63   // failure when EnableJVMCI flag is changed.
  64   // Otherwise one flag change is sufficient to detect consistency failure.
  65   // Set skip_fail_count to 0 if EnableJVMCI flag is default.
  66   // Set skip_fail_count to 1 if EnableJVMCI flag is changed.
  67   // This value will be used to skip fails in macro expanded code later.
  68   if (!FLAG_IS_DEFAULT(EnableJVMCI)) {
  69     skip_fail_count = 1;
  70   } else {
  71     skip_fail_count = 0;
  72   }
  73 
  74 #define EMIT_FLAG_VALUE_CHANGED_CHECK_CODE(FLAG)  \
  75   if (!FLAG_IS_DEFAULT(FLAG)) {                   \
  76     fail_count++;                                 \
  77     if (fail_count > skip_fail_count) {           \
  78       return false;                               \
  79     }                                             \
  80   }
  81 
  82 #define JVMCI_DIAGNOSTIC_FLAG_VALUE_CHANGED_CHECK_CODE(type, name, value, doc)     EMIT_FLAG_VALUE_CHANGED_CHECK_CODE(name)
  83 #define JVMCI_EXPERIMENTAL_FLAG_VALUE_CHANGED_CHECK_CODE(type, name, value, doc)   EMIT_FLAG_VALUE_CHANGED_CHECK_CODE(name)
  84 
  85   // Check consistency of diagnostic flags if UnlockDiagnosticVMOptions is true
  86   // or not default. UnlockDiagnosticVMOptions is default true in debug builds.
  87   if (UnlockDiagnosticVMOptions || !FLAG_IS_DEFAULT(UnlockDiagnosticVMOptions)) {
  88     JVMCI_FLAGS(JVMCI_IGNORE_FLAG_FOUR_PARAM, \
  89                 JVMCI_IGNORE_FLAG_THREE_PARAM, \
  90                 JVMCI_IGNORE_FLAG_FOUR_PARAM, \
  91                 JVMCI_IGNORE_FLAG_THREE_PARAM, \
  92                 JVMCI_DIAGNOSTIC_FLAG_VALUE_CHANGED_CHECK_CODE, \
  93                 JVMCI_IGNORE_FLAG_THREE_PARAM, \
  94                 JVMCI_IGNORE_FLAG_FOUR_PARAM, \
  95                 JVMCI_IGNORE_FLAG_FOUR_PARAM, \
  96                 IGNORE_RANGE, \
  97                 IGNORE_CONSTRAINT, \
  98                 IGNORE_WRITEABLE)
  99   }
 100 
 101   // Check consistency of experimental flags if UnlockExperimentalVMOptions is
 102   // true or not default.
 103   if (UnlockExperimentalVMOptions || !FLAG_IS_DEFAULT(UnlockExperimentalVMOptions)) {
 104     JVMCI_FLAGS(JVMCI_IGNORE_FLAG_FOUR_PARAM, \
 105                 JVMCI_IGNORE_FLAG_THREE_PARAM, \
 106                 JVMCI_IGNORE_FLAG_FOUR_PARAM, \
 107                 JVMCI_IGNORE_FLAG_THREE_PARAM, \
 108                 JVMCI_IGNORE_FLAG_FOUR_PARAM, \
 109                 JVMCI_IGNORE_FLAG_THREE_PARAM, \
 110                 JVMCI_EXPERIMENTAL_FLAG_VALUE_CHANGED_CHECK_CODE, \
 111                 JVMCI_IGNORE_FLAG_FOUR_PARAM, \
 112                 IGNORE_RANGE, \
 113                 IGNORE_CONSTRAINT, \
 114                 IGNORE_WRITEABLE)
 115   }
 116 
 117 #ifndef PRODUCT
 118 #define JVMCI_DEVELOP_FLAG_VALUE_CHANGED_CHECK_CODE(type, name, value, doc)        EMIT_FLAG_VALUE_CHANGED_CHECK_CODE(name)
 119 #define JVMCI_PD_DEVELOP_FLAG_VALUE_CHANGED_CHECK_CODE(type, name, doc)            EMIT_FLAG_VALUE_CHANGED_CHECK_CODE(name)
 120 #define JVMCI_NOTPRODUCT_FLAG_VALUE_CHANGED_CHECK_CODE(type, name, value, doc)     EMIT_FLAG_VALUE_CHANGED_CHECK_CODE(name)
 121 #else
 122 #define JVMCI_DEVELOP_FLAG_VALUE_CHANGED_CHECK_CODE(type, name, value, doc)
 123 #define JVMCI_PD_DEVELOP_FLAG_VALUE_CHANGED_CHECK_CODE(type, name, doc)
 124 #define JVMCI_NOTPRODUCT_FLAG_VALUE_CHANGED_CHECK_CODE(type, name, value, doc)
 125 #endif
 126 
 127 #define JVMCI_PD_PRODUCT_FLAG_VALUE_CHANGED_CHECK_CODE(type, name, doc)            EMIT_FLAG_VALUE_CHANGED_CHECK_CODE(name)
 128 #define JVMCI_PRODUCT_FLAG_VALUE_CHANGED_CHECK_CODE(type, name, value, doc)        EMIT_FLAG_VALUE_CHANGED_CHECK_CODE(name)
 129 
 130   JVMCI_FLAGS(JVMCI_DEVELOP_FLAG_VALUE_CHANGED_CHECK_CODE, \
 131               JVMCI_PD_DEVELOP_FLAG_VALUE_CHANGED_CHECK_CODE, \
 132               JVMCI_PRODUCT_FLAG_VALUE_CHANGED_CHECK_CODE, \
 133               JVMCI_PD_PRODUCT_FLAG_VALUE_CHANGED_CHECK_CODE, \
 134               JVMCI_IGNORE_FLAG_FOUR_PARAM, \
 135               JVMCI_IGNORE_FLAG_THREE_PARAM, \
 136               JVMCI_IGNORE_FLAG_FOUR_PARAM, \
 137               JVMCI_NOTPRODUCT_FLAG_VALUE_CHANGED_CHECK_CODE, \
 138               IGNORE_RANGE, \
 139               IGNORE_CONSTRAINT, \
 140               IGNORE_WRITEABLE)
 141 
 142 #undef EMIT_FLAG_VALUE_CHANGED_CHECK_CODE
 143 #undef JVMCI_DEVELOP_FLAG_VALUE_CHANGED_CHECK_CODE
 144 #undef JVMCI_PD_DEVELOP_FLAG_VALUE_CHANGED_CHECK_CODE
 145 #undef JVMCI_NOTPRODUCT_FLAG_VALUE_CHANGED_CHECK_CODE
 146 #undef JVMCI_DIAGNOSTIC_FLAG_VALUE_CHANGED_CHECK_CODE
 147 #undef JVMCI_PD_PRODUCT_FLAG_VALUE_CHANGED_CHECK_CODE
 148 #undef JVMCI_PRODUCT_FLAG_VALUE_CHANGED_CHECK_CODE
 149 #undef JVMCI_EXPERIMENTAL_FLAG_VALUE_CHANGED_CHECK_CODE
 150 
 151   return true;
 152 }
 153 
 154 // Print jvmci arguments inconsistency error message.
 155 void JVMCIGlobals::print_jvmci_args_inconsistency_error_message() {
 156   const char* error_msg = "Improperly specified VM option '%s'\n";
 157   jio_fprintf(defaultStream::error_stream(), "EnableJVMCI must be enabled\n");
 158 
 159 #define EMIT_CHECK_PRINT_ERR_MSG_CODE(FLAG)                         \
 160   if (!FLAG_IS_DEFAULT(FLAG)) {                                     \
 161     if (strcmp(#FLAG, "EnableJVMCI")) {                             \
 162       jio_fprintf(defaultStream::error_stream(), error_msg, #FLAG); \
 163     }                                                               \
 164   }
 165 
 166 #define JVMCI_DIAGNOSTIC_FLAG_CHECK_PRINT_ERR_MSG_CODE(type, name, value, doc)     EMIT_CHECK_PRINT_ERR_MSG_CODE(name)
 167 #define JVMCI_EXPERIMENTAL_FLAG_CHECK_PRINT_ERR_MSG_CODE(type, name, value, doc)   EMIT_CHECK_PRINT_ERR_MSG_CODE(name)
 168 
 169   if (UnlockDiagnosticVMOptions || !FLAG_IS_DEFAULT(UnlockDiagnosticVMOptions)) {
 170     JVMCI_FLAGS(JVMCI_IGNORE_FLAG_FOUR_PARAM, \
 171                 JVMCI_IGNORE_FLAG_THREE_PARAM, \
 172                 JVMCI_IGNORE_FLAG_FOUR_PARAM, \
 173                 JVMCI_IGNORE_FLAG_THREE_PARAM, \
 174                 JVMCI_DIAGNOSTIC_FLAG_CHECK_PRINT_ERR_MSG_CODE, \
 175                 JVMCI_IGNORE_FLAG_THREE_PARAM, \
 176                 JVMCI_IGNORE_FLAG_FOUR_PARAM, \
 177                 JVMCI_IGNORE_FLAG_FOUR_PARAM, \
 178                 IGNORE_RANGE, \
 179                 IGNORE_CONSTRAINT, \
 180                 IGNORE_WRITEABLE)
 181   }
 182 
 183   if (UnlockExperimentalVMOptions || !FLAG_IS_DEFAULT(UnlockExperimentalVMOptions)) {
 184     JVMCI_FLAGS(JVMCI_IGNORE_FLAG_FOUR_PARAM, \
 185                 JVMCI_IGNORE_FLAG_THREE_PARAM, \
 186                 JVMCI_IGNORE_FLAG_FOUR_PARAM, \
 187                 JVMCI_IGNORE_FLAG_THREE_PARAM, \
 188                 JVMCI_IGNORE_FLAG_FOUR_PARAM, \
 189                 JVMCI_IGNORE_FLAG_THREE_PARAM, \
 190                 JVMCI_EXPERIMENTAL_FLAG_CHECK_PRINT_ERR_MSG_CODE, \
 191                 JVMCI_IGNORE_FLAG_FOUR_PARAM, \
 192                 IGNORE_RANGE, \
 193                 IGNORE_CONSTRAINT, \
 194                 IGNORE_WRITEABLE)
 195   }
 196 
 197 #ifndef PRODUCT
 198 #define JVMCI_DEVELOP_FLAG_CHECK_PRINT_ERR_MSG_CODE(type, name, value, doc)        EMIT_CHECK_PRINT_ERR_MSG_CODE(name)
 199 #define JVMCI_PD_DEVELOP_FLAG_CHECK_PRINT_ERR_MSG_CODE(type, name, doc)            EMIT_CHECK_PRINT_ERR_MSG_CODE(name)
 200 #define JVMCI_NOTPRODUCT_FLAG_CHECK_PRINT_ERR_MSG_CODE(type, name, value, doc)     EMIT_CHECK_PRINT_ERR_MSG_CODE(name)
 201 #else
 202 #define JVMCI_DEVELOP_FLAG_CHECK_PRINT_ERR_MSG_CODE(type, name, value, doc)
 203 #define JVMCI_PD_DEVELOP_FLAG_CHECK_PRINT_ERR_MSG_CODE(type, name, doc)
 204 #define JVMCI_NOTPRODUCT_FLAG_CHECK_PRINT_ERR_MSG_CODE(type, name, value, doc)
 205 #endif
 206 
 207 #define JVMCI_PD_PRODUCT_FLAG_CHECK_PRINT_ERR_MSG_CODE(type, name, doc)            EMIT_CHECK_PRINT_ERR_MSG_CODE(name)
 208 #define JVMCI_PRODUCT_FLAG_CHECK_PRINT_ERR_MSG_CODE(type, name, value, doc)        EMIT_CHECK_PRINT_ERR_MSG_CODE(name)
 209 
 210   JVMCI_FLAGS(JVMCI_DEVELOP_FLAG_CHECK_PRINT_ERR_MSG_CODE, \
 211               JVMCI_PD_DEVELOP_FLAG_CHECK_PRINT_ERR_MSG_CODE, \
 212               JVMCI_PRODUCT_FLAG_CHECK_PRINT_ERR_MSG_CODE, \
 213               JVMCI_PD_PRODUCT_FLAG_CHECK_PRINT_ERR_MSG_CODE, \
 214               JVMCI_IGNORE_FLAG_FOUR_PARAM, \
 215               JVMCI_IGNORE_FLAG_THREE_PARAM, \
 216               JVMCI_IGNORE_FLAG_FOUR_PARAM, \
 217               JVMCI_NOTPRODUCT_FLAG_CHECK_PRINT_ERR_MSG_CODE, \
 218               IGNORE_RANGE, \
 219               IGNORE_CONSTRAINT, \
 220               IGNORE_WRITEABLE)
 221 
 222 #undef EMIT_CHECK_PRINT_ERR_MSG_CODE
 223 #undef JVMCI_DEVELOP_FLAG_CHECK_PRINT_ERR_MSG_CODE
 224 #undef JVMCI_PD_DEVELOP_FLAG_CHECK_PRINT_ERR_MSG_CODE
 225 #undef JVMCI_NOTPRODUCT_FLAG_CHECK_PRINT_ERR_MSG_CODE
 226 #undef JVMCI_PD_PRODUCT_FLAG_CHECK_PRINT_ERR_MSG_CODE
 227 #undef JVMCI_PRODUCT_FLAG_CHECK_PRINT_ERR_MSG_CODE
 228 #undef JVMCI_DIAGNOSTIC_FLAG_CHECK_PRINT_ERR_MSG_CODE
 229 #undef JVMCI_EXPERIMENTAL_FLAG_CHECK_PRINT_ERR_MSG_CODE
 230 
 231 }
 232 
 233 #undef JVMCI_IGNORE_FLAG_FOUR_PARAM
 234 #undef JVMCI_IGNORE_FLAG_THREE_PARAM