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