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