hotspot/src/share/vm/jvmci/jvmci_globals.cpp
changeset 36313 e7eff81d7f1d
parent 33160 c59f1676d27e
child 38273 2634194d7555
equal deleted inserted replaced
36312:a18280a1534d 36313:e7eff81d7f1d
    22  *
    22  *
    23  */
    23  */
    24 
    24 
    25 #include "precompiled.hpp"
    25 #include "precompiled.hpp"
    26 #include "jvmci/jvmci_globals.hpp"
    26 #include "jvmci/jvmci_globals.hpp"
       
    27 #include "utilities/defaultStream.hpp"
       
    28 #include "runtime/globals_extension.hpp"
    27 
    29 
    28 JVMCI_FLAGS(MATERIALIZE_DEVELOPER_FLAG, \
    30 JVMCI_FLAGS(MATERIALIZE_DEVELOPER_FLAG, \
    29             MATERIALIZE_PD_DEVELOPER_FLAG, \
    31             MATERIALIZE_PD_DEVELOPER_FLAG, \
    30             MATERIALIZE_PRODUCT_FLAG, \
    32             MATERIALIZE_PRODUCT_FLAG, \
    31             MATERIALIZE_PD_PRODUCT_FLAG, \
    33             MATERIALIZE_PD_PRODUCT_FLAG, \
    32             MATERIALIZE_DIAGNOSTIC_FLAG, \
    34             MATERIALIZE_DIAGNOSTIC_FLAG, \
    33             MATERIALIZE_EXPERIMENTAL_FLAG, \
    35             MATERIALIZE_EXPERIMENTAL_FLAG, \
    34             MATERIALIZE_NOTPRODUCT_FLAG,
    36             MATERIALIZE_NOTPRODUCT_FLAG,
    35             IGNORE_RANGE, \
    37             IGNORE_RANGE, \
    36             IGNORE_CONSTRAINT)
    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