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 |