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 #ifndef TIERED
 152   // JVMCI is only usable as a jit compiler if the VM supports tiered compilation.
 153 #define JVMCI_CHECK_TIERED_ONLY_FLAG(FLAG)                         \
 154   if (!FLAG_IS_DEFAULT(FLAG)) {                                   \
 155     jio_fprintf(defaultStream::error_stream(), "VM option '%s' cannot be set in non-tiered VM\n", #FLAG); \
 156     return false; \
 157   }
 158   JVMCI_CHECK_TIERED_ONLY_FLAG(UseJVMCICompiler)
 159   JVMCI_CHECK_TIERED_ONLY_FLAG(BootstrapJVMCI)
 160   JVMCI_CHECK_TIERED_ONLY_FLAG(PrintBootstrap)
 161   JVMCI_CHECK_TIERED_ONLY_FLAG(JVMCIThreads)
 162   JVMCI_CHECK_TIERED_ONLY_FLAG(JVMCIHostThreads)
 163   JVMCI_CHECK_TIERED_ONLY_FLAG(JVMCICountersExcludeCompiler)
 164 #undef JVMCI_CHECK_TIERED_ONLY_FLAG
 165 #endif
 166 
 167   return true;
 168 }
 169 
 170 // Print jvmci arguments inconsistency error message.
 171 void JVMCIGlobals::print_jvmci_args_inconsistency_error_message() {
 172   const char* error_msg = "Improperly specified VM option '%s'\n";
 173   jio_fprintf(defaultStream::error_stream(), "EnableJVMCI must be enabled\n");
 174 
 175 #define EMIT_CHECK_PRINT_ERR_MSG_CODE(FLAG)                         \
 176   if (!FLAG_IS_DEFAULT(FLAG)) {                                     \
 177     if (strcmp(#FLAG, "EnableJVMCI")) {                             \
 178       jio_fprintf(defaultStream::error_stream(), error_msg, #FLAG); \
 179     }                                                               \
 180   }
 181 
 182 #define JVMCI_DIAGNOSTIC_FLAG_CHECK_PRINT_ERR_MSG_CODE(type, name, value, doc)     EMIT_CHECK_PRINT_ERR_MSG_CODE(name)
 183 #define JVMCI_EXPERIMENTAL_FLAG_CHECK_PRINT_ERR_MSG_CODE(type, name, value, doc)   EMIT_CHECK_PRINT_ERR_MSG_CODE(name)
 184 
 185   if (UnlockDiagnosticVMOptions || !FLAG_IS_DEFAULT(UnlockDiagnosticVMOptions)) {
 186     JVMCI_FLAGS(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_DIAGNOSTIC_FLAG_CHECK_PRINT_ERR_MSG_CODE, \
 191                 JVMCI_IGNORE_FLAG_THREE_PARAM, \
 192                 JVMCI_IGNORE_FLAG_FOUR_PARAM, \
 193                 JVMCI_IGNORE_FLAG_FOUR_PARAM, \
 194                 IGNORE_RANGE, \
 195                 IGNORE_CONSTRAINT, \
 196                 IGNORE_WRITEABLE)
 197   }
 198 
 199   if (UnlockExperimentalVMOptions || !FLAG_IS_DEFAULT(UnlockExperimentalVMOptions)) {
 200     JVMCI_FLAGS(JVMCI_IGNORE_FLAG_FOUR_PARAM, \
 201                 JVMCI_IGNORE_FLAG_THREE_PARAM, \
 202                 JVMCI_IGNORE_FLAG_FOUR_PARAM, \
 203                 JVMCI_IGNORE_FLAG_THREE_PARAM, \
 204                 JVMCI_IGNORE_FLAG_FOUR_PARAM, \
 205                 JVMCI_IGNORE_FLAG_THREE_PARAM, \
 206                 JVMCI_EXPERIMENTAL_FLAG_CHECK_PRINT_ERR_MSG_CODE, \
 207                 JVMCI_IGNORE_FLAG_FOUR_PARAM, \
 208                 IGNORE_RANGE, \
 209                 IGNORE_CONSTRAINT, \
 210                 IGNORE_WRITEABLE)
 211   }
 212 
 213 #ifndef PRODUCT
 214 #define JVMCI_DEVELOP_FLAG_CHECK_PRINT_ERR_MSG_CODE(type, name, value, doc)        EMIT_CHECK_PRINT_ERR_MSG_CODE(name)
 215 #define JVMCI_PD_DEVELOP_FLAG_CHECK_PRINT_ERR_MSG_CODE(type, name, doc)            EMIT_CHECK_PRINT_ERR_MSG_CODE(name)
 216 #define JVMCI_NOTPRODUCT_FLAG_CHECK_PRINT_ERR_MSG_CODE(type, name, value, doc)     EMIT_CHECK_PRINT_ERR_MSG_CODE(name)
 217 #else
 218 #define JVMCI_DEVELOP_FLAG_CHECK_PRINT_ERR_MSG_CODE(type, name, value, doc)
 219 #define JVMCI_PD_DEVELOP_FLAG_CHECK_PRINT_ERR_MSG_CODE(type, name, doc)
 220 #define JVMCI_NOTPRODUCT_FLAG_CHECK_PRINT_ERR_MSG_CODE(type, name, value, doc)
 221 #endif
 222 
 223 #define JVMCI_PD_PRODUCT_FLAG_CHECK_PRINT_ERR_MSG_CODE(type, name, doc)            EMIT_CHECK_PRINT_ERR_MSG_CODE(name)
 224 #define JVMCI_PRODUCT_FLAG_CHECK_PRINT_ERR_MSG_CODE(type, name, value, doc)        EMIT_CHECK_PRINT_ERR_MSG_CODE(name)
 225 
 226   JVMCI_FLAGS(JVMCI_DEVELOP_FLAG_CHECK_PRINT_ERR_MSG_CODE, \
 227               JVMCI_PD_DEVELOP_FLAG_CHECK_PRINT_ERR_MSG_CODE, \
 228               JVMCI_PRODUCT_FLAG_CHECK_PRINT_ERR_MSG_CODE, \
 229               JVMCI_PD_PRODUCT_FLAG_CHECK_PRINT_ERR_MSG_CODE, \
 230               JVMCI_IGNORE_FLAG_FOUR_PARAM, \
 231               JVMCI_IGNORE_FLAG_THREE_PARAM, \
 232               JVMCI_IGNORE_FLAG_FOUR_PARAM, \
 233               JVMCI_NOTPRODUCT_FLAG_CHECK_PRINT_ERR_MSG_CODE, \
 234               IGNORE_RANGE, \
 235               IGNORE_CONSTRAINT, \
 236               IGNORE_WRITEABLE)
 237 
 238 #undef EMIT_CHECK_PRINT_ERR_MSG_CODE
 239 #undef JVMCI_DEVELOP_FLAG_CHECK_PRINT_ERR_MSG_CODE
 240 #undef JVMCI_PD_DEVELOP_FLAG_CHECK_PRINT_ERR_MSG_CODE
 241 #undef JVMCI_NOTPRODUCT_FLAG_CHECK_PRINT_ERR_MSG_CODE
 242 #undef JVMCI_PD_PRODUCT_FLAG_CHECK_PRINT_ERR_MSG_CODE
 243 #undef JVMCI_PRODUCT_FLAG_CHECK_PRINT_ERR_MSG_CODE
 244 #undef JVMCI_DIAGNOSTIC_FLAG_CHECK_PRINT_ERR_MSG_CODE
 245 #undef JVMCI_EXPERIMENTAL_FLAG_CHECK_PRINT_ERR_MSG_CODE
 246 
 247 }
 248 
 249 #undef JVMCI_IGNORE_FLAG_FOUR_PARAM
 250 #undef JVMCI_IGNORE_FLAG_THREE_PARAM