Mercurial > hg > truffle
annotate src/share/vm/ci/ciEnv.hpp @ 2007:5ddfcf4b079e
7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
Summary: C1 with profiling doesn't check whether the MDO has been really allocated, which can silently fail if the perm gen is full. The solution is to check if the allocation failed and bailout out of inlining or compilation.
Reviewed-by: kvn, never
author | iveresov |
---|---|
date | Thu, 02 Dec 2010 17:21:12 -0800 |
parents | f95d63e2154a |
children | 06f017f7daa7 3582bf76420e |
rev | line source |
---|---|
0 | 1 /* |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1397
diff
changeset
|
2 * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved. |
0 | 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 * | |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1397
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1397
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1397
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
1972 | 25 #ifndef SHARE_VM_CI_CIENV_HPP |
26 #define SHARE_VM_CI_CIENV_HPP | |
27 | |
28 #include "ci/ciClassList.hpp" | |
29 #include "ci/ciObjectFactory.hpp" | |
30 #include "classfile/systemDictionary.hpp" | |
31 #include "code/debugInfoRec.hpp" | |
32 #include "code/dependencies.hpp" | |
33 #include "code/exceptionHandlerTable.hpp" | |
34 #include "compiler/oopMap.hpp" | |
35 #include "runtime/thread.hpp" | |
36 | |
0 | 37 class CompileTask; |
38 | |
39 // ciEnv | |
40 // | |
41 // This class is the top level broker for requests from the compiler | |
42 // to the VM. | |
43 class ciEnv : StackObj { | |
44 CI_PACKAGE_ACCESS_TO | |
45 | |
46 friend class CompileBroker; | |
47 friend class Dependencies; // for get_object, during logging | |
48 | |
49 private: | |
50 Arena* _arena; // Alias for _ciEnv_arena except in init_shared_objects() | |
51 Arena _ciEnv_arena; | |
52 int _system_dictionary_modification_counter; | |
53 ciObjectFactory* _factory; | |
54 OopRecorder* _oop_recorder; | |
55 DebugInformationRecorder* _debug_info; | |
56 Dependencies* _dependencies; | |
57 const char* _failure_reason; | |
58 int _compilable; | |
59 bool _break_at_compile; | |
60 int _num_inlined_bytecodes; | |
61 CompileTask* _task; // faster access to CompilerThread::task | |
62 CompileLog* _log; // faster access to CompilerThread::log | |
63 void* _compiler_data; // compiler-specific stuff, if any | |
64 | |
65 char* _name_buffer; | |
66 int _name_buffer_len; | |
67 | |
780
c96bf21b756f
6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents:
0
diff
changeset
|
68 // Cache Jvmti state |
c96bf21b756f
6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents:
0
diff
changeset
|
69 bool _jvmti_can_hotswap_or_post_breakpoint; |
c96bf21b756f
6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents:
0
diff
changeset
|
70 bool _jvmti_can_access_local_variables; |
1213
6deeaebad47a
6902182: 4/4 Starting with jdwp agent should not incur performance penalty
dcubed
parents:
1142
diff
changeset
|
71 bool _jvmti_can_post_on_exceptions; |
780
c96bf21b756f
6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents:
0
diff
changeset
|
72 |
c96bf21b756f
6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents:
0
diff
changeset
|
73 // Cache DTrace flags |
c96bf21b756f
6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents:
0
diff
changeset
|
74 bool _dtrace_extended_probes; |
c96bf21b756f
6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents:
0
diff
changeset
|
75 bool _dtrace_monitor_probes; |
c96bf21b756f
6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents:
0
diff
changeset
|
76 bool _dtrace_method_probes; |
c96bf21b756f
6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents:
0
diff
changeset
|
77 bool _dtrace_alloc_probes; |
c96bf21b756f
6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents:
0
diff
changeset
|
78 |
0 | 79 // Distinguished instances of certain ciObjects.. |
80 static ciObject* _null_object_instance; | |
81 static ciMethodKlass* _method_klass_instance; | |
82 static ciSymbolKlass* _symbol_klass_instance; | |
83 static ciKlassKlass* _klass_klass_instance; | |
84 static ciInstanceKlassKlass* _instance_klass_klass_instance; | |
85 static ciTypeArrayKlassKlass* _type_array_klass_klass_instance; | |
86 static ciObjArrayKlassKlass* _obj_array_klass_klass_instance; | |
87 | |
1142 | 88 #define WK_KLASS_DECL(name, ignore_s, ignore_o) static ciInstanceKlass* _##name; |
89 WK_KLASSES_DO(WK_KLASS_DECL) | |
90 #undef WK_KLASS_DECL | |
0 | 91 |
92 static ciSymbol* _unloaded_cisymbol; | |
93 static ciInstanceKlass* _unloaded_ciinstance_klass; | |
94 static ciObjArrayKlass* _unloaded_ciobjarrayklass; | |
95 | |
96 static jobject _ArrayIndexOutOfBoundsException_handle; | |
97 static jobject _ArrayStoreException_handle; | |
98 static jobject _ClassCastException_handle; | |
99 | |
100 ciInstance* _NullPointerException_instance; | |
101 ciInstance* _ArithmeticException_instance; | |
102 ciInstance* _ArrayIndexOutOfBoundsException_instance; | |
103 ciInstance* _ArrayStoreException_instance; | |
104 ciInstance* _ClassCastException_instance; | |
105 | |
1080
7c57aead6d3e
6892658: C2 should optimize some stringbuilder patterns
never
parents:
989
diff
changeset
|
106 ciInstance* _the_null_string; // The Java string "null" |
7c57aead6d3e
6892658: C2 should optimize some stringbuilder patterns
never
parents:
989
diff
changeset
|
107 ciInstance* _the_min_jint_string; // The Java string "-2147483648" |
7c57aead6d3e
6892658: C2 should optimize some stringbuilder patterns
never
parents:
989
diff
changeset
|
108 |
0 | 109 // Look up a klass by name from a particular class loader (the accessor's). |
110 // If require_local, result must be defined in that class loader, or NULL. | |
111 // If !require_local, a result from remote class loader may be reported, | |
112 // if sufficient class loader constraints exist such that initiating | |
113 // a class loading request from the given loader is bound to return | |
114 // the class defined in the remote loader (or throw an error). | |
115 // | |
116 // Return an unloaded klass if !require_local and no class at all is found. | |
117 // | |
118 // The CI treats a klass as loaded if it is consistently defined in | |
119 // another loader, even if it hasn't yet been loaded in all loaders | |
120 // that could potentially see it via delegation. | |
121 ciKlass* get_klass_by_name(ciKlass* accessing_klass, | |
122 ciSymbol* klass_name, | |
123 bool require_local); | |
124 | |
125 // Constant pool access. | |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1137
diff
changeset
|
126 ciKlass* get_klass_by_index(constantPoolHandle cpool, |
0 | 127 int klass_index, |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1137
diff
changeset
|
128 bool& is_accessible, |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1137
diff
changeset
|
129 ciInstanceKlass* loading_klass); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1137
diff
changeset
|
130 ciConstant get_constant_by_index(constantPoolHandle cpool, |
1602 | 131 int pool_index, int cache_index, |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1137
diff
changeset
|
132 ciInstanceKlass* accessor); |
0 | 133 ciField* get_field_by_index(ciInstanceKlass* loading_klass, |
134 int field_index); | |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1137
diff
changeset
|
135 ciMethod* get_method_by_index(constantPoolHandle cpool, |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1137
diff
changeset
|
136 int method_index, Bytecodes::Code bc, |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1137
diff
changeset
|
137 ciInstanceKlass* loading_klass); |
0 | 138 |
139 // Implementation methods for loading and constant pool access. | |
140 ciKlass* get_klass_by_name_impl(ciKlass* accessing_klass, | |
141 ciSymbol* klass_name, | |
142 bool require_local); | |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1137
diff
changeset
|
143 ciKlass* get_klass_by_index_impl(constantPoolHandle cpool, |
0 | 144 int klass_index, |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1137
diff
changeset
|
145 bool& is_accessible, |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1137
diff
changeset
|
146 ciInstanceKlass* loading_klass); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1137
diff
changeset
|
147 ciConstant get_constant_by_index_impl(constantPoolHandle cpool, |
1602 | 148 int pool_index, int cache_index, |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1137
diff
changeset
|
149 ciInstanceKlass* loading_klass); |
0 | 150 ciField* get_field_by_index_impl(ciInstanceKlass* loading_klass, |
151 int field_index); | |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1137
diff
changeset
|
152 ciMethod* get_method_by_index_impl(constantPoolHandle cpool, |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1137
diff
changeset
|
153 int method_index, Bytecodes::Code bc, |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1137
diff
changeset
|
154 ciInstanceKlass* loading_klass); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1137
diff
changeset
|
155 ciMethod* get_fake_invokedynamic_method_impl(constantPoolHandle cpool, |
1137
97125851f396
6829187: compiler optimizations required for JSR 292
twisti
parents:
1080
diff
changeset
|
156 int index, Bytecodes::Code bc); |
0 | 157 |
158 // Helper methods | |
159 bool check_klass_accessibility(ciKlass* accessing_klass, | |
160 klassOop resolved_klassOop); | |
161 methodOop lookup_method(instanceKlass* accessor, | |
162 instanceKlass* holder, | |
163 symbolOop name, | |
164 symbolOop sig, | |
165 Bytecodes::Code bc); | |
166 | |
167 // Get a ciObject from the object factory. Ensures uniqueness | |
168 // of ciObjects. | |
169 ciObject* get_object(oop o) { | |
170 if (o == NULL) { | |
171 return _null_object_instance; | |
172 } else { | |
173 return _factory->get(o); | |
174 } | |
175 } | |
176 | |
177 ciMethod* get_method_from_handle(jobject method); | |
178 | |
179 ciInstance* get_or_create_exception(jobject& handle, symbolHandle name); | |
180 | |
181 // Get a ciMethod representing either an unfound method or | |
182 // a method with an unloaded holder. Ensures uniqueness of | |
183 // the result. | |
184 ciMethod* get_unloaded_method(ciInstanceKlass* holder, | |
185 ciSymbol* name, | |
186 ciSymbol* signature) { | |
187 return _factory->get_unloaded_method(holder, name, signature); | |
188 } | |
189 | |
190 // Get a ciKlass representing an unloaded klass. | |
191 // Ensures uniqueness of the result. | |
192 ciKlass* get_unloaded_klass(ciKlass* accessing_klass, | |
193 ciSymbol* name) { | |
194 return _factory->get_unloaded_klass(accessing_klass, name, true); | |
195 } | |
196 | |
1602 | 197 // Get a ciKlass representing an unloaded klass mirror. |
198 // Result is not necessarily unique, but will be unloaded. | |
199 ciInstance* get_unloaded_klass_mirror(ciKlass* type) { | |
200 return _factory->get_unloaded_klass_mirror(type); | |
201 } | |
202 | |
203 // Get a ciInstance representing an unresolved method handle constant. | |
204 ciInstance* get_unloaded_method_handle_constant(ciKlass* holder, | |
205 ciSymbol* name, | |
206 ciSymbol* signature, | |
207 int ref_kind) { | |
208 return _factory->get_unloaded_method_handle_constant(holder, name, signature, ref_kind); | |
209 } | |
210 | |
211 // Get a ciInstance representing an unresolved method type constant. | |
212 ciInstance* get_unloaded_method_type_constant(ciSymbol* signature) { | |
213 return _factory->get_unloaded_method_type_constant(signature); | |
214 } | |
215 | |
0 | 216 // See if we already have an unloaded klass for the given name |
217 // or return NULL if not. | |
218 ciKlass *check_get_unloaded_klass(ciKlass* accessing_klass, ciSymbol* name) { | |
219 return _factory->get_unloaded_klass(accessing_klass, name, false); | |
220 } | |
221 | |
222 // Get a ciReturnAddress corresponding to the given bci. | |
223 // Ensures uniqueness of the result. | |
224 ciReturnAddress* get_return_address(int bci) { | |
225 return _factory->get_return_address(bci); | |
226 } | |
227 | |
228 // Get a ciMethodData representing the methodData for a method | |
229 // with none. | |
230 ciMethodData* get_empty_methodData() { | |
231 return _factory->get_empty_methodData(); | |
232 } | |
233 | |
234 // General utility : get a buffer of some required length. | |
235 // Used in symbol creation. | |
236 char* name_buffer(int req_len); | |
237 | |
238 // Is this thread currently in the VM state? | |
239 static bool is_in_vm(); | |
240 | |
241 // Helper routine for determining the validity of a compilation | |
242 // with respect to concurrent class loading. | |
243 void check_for_system_dictionary_modification(ciMethod* target); | |
244 | |
245 public: | |
246 enum { | |
247 MethodCompilable, | |
248 MethodCompilable_not_at_tier, | |
249 MethodCompilable_never | |
250 }; | |
251 | |
252 ciEnv(CompileTask* task, int system_dictionary_modification_counter); | |
253 // Used only during initialization of the ci | |
254 ciEnv(Arena* arena); | |
255 ~ciEnv(); | |
256 | |
257 OopRecorder* oop_recorder() { return _oop_recorder; } | |
258 void set_oop_recorder(OopRecorder* r) { _oop_recorder = r; } | |
259 | |
260 DebugInformationRecorder* debug_info() { return _debug_info; } | |
261 void set_debug_info(DebugInformationRecorder* i) { _debug_info = i; } | |
262 | |
263 Dependencies* dependencies() { return _dependencies; } | |
264 void set_dependencies(Dependencies* d) { _dependencies = d; } | |
265 | |
266 // This is true if the compilation is not going to produce code. | |
267 // (It is reasonable to retry failed compilations.) | |
268 bool failing() { return _failure_reason != NULL; } | |
269 | |
270 // Reason this compilation is failing, such as "too many basic blocks". | |
271 const char* failure_reason() { return _failure_reason; } | |
272 | |
273 // Return state of appropriate compilability | |
274 int compilable() { return _compilable; } | |
275 | |
276 bool break_at_compile() { return _break_at_compile; } | |
277 void set_break_at_compile(bool z) { _break_at_compile = z; } | |
278 | |
780
c96bf21b756f
6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents:
0
diff
changeset
|
279 // Cache Jvmti state |
c96bf21b756f
6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents:
0
diff
changeset
|
280 void cache_jvmti_state(); |
c96bf21b756f
6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents:
0
diff
changeset
|
281 bool jvmti_can_hotswap_or_post_breakpoint() const { return _jvmti_can_hotswap_or_post_breakpoint; } |
c96bf21b756f
6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents:
0
diff
changeset
|
282 bool jvmti_can_access_local_variables() const { return _jvmti_can_access_local_variables; } |
1213
6deeaebad47a
6902182: 4/4 Starting with jdwp agent should not incur performance penalty
dcubed
parents:
1142
diff
changeset
|
283 bool jvmti_can_post_on_exceptions() const { return _jvmti_can_post_on_exceptions; } |
780
c96bf21b756f
6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents:
0
diff
changeset
|
284 |
c96bf21b756f
6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents:
0
diff
changeset
|
285 // Cache DTrace flags |
c96bf21b756f
6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents:
0
diff
changeset
|
286 void cache_dtrace_flags(); |
c96bf21b756f
6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents:
0
diff
changeset
|
287 bool dtrace_extended_probes() const { return _dtrace_extended_probes; } |
c96bf21b756f
6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents:
0
diff
changeset
|
288 bool dtrace_monitor_probes() const { return _dtrace_monitor_probes; } |
c96bf21b756f
6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents:
0
diff
changeset
|
289 bool dtrace_method_probes() const { return _dtrace_method_probes; } |
c96bf21b756f
6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents:
0
diff
changeset
|
290 bool dtrace_alloc_probes() const { return _dtrace_alloc_probes; } |
c96bf21b756f
6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents:
0
diff
changeset
|
291 |
0 | 292 // The compiler task which has created this env. |
293 // May be useful to find out compile_id, comp_level, etc. | |
294 CompileTask* task() { return _task; } | |
295 // Handy forwards to the task: | |
296 int comp_level(); // task()->comp_level() | |
297 uint compile_id(); // task()->compile_id() | |
298 | |
299 // Register the result of a compilation. | |
300 void register_method(ciMethod* target, | |
301 int entry_bci, | |
302 CodeOffsets* offsets, | |
303 int orig_pc_offset, | |
304 CodeBuffer* code_buffer, | |
305 int frame_words, | |
306 OopMapSet* oop_map_set, | |
307 ExceptionHandlerTable* handler_table, | |
308 ImplicitExceptionTable* inc_table, | |
309 AbstractCompiler* compiler, | |
310 int comp_level, | |
311 bool has_debug_info = true, | |
312 bool has_unsafe_access = false); | |
313 | |
314 | |
315 // Access to certain well known ciObjects. | |
1142 | 316 #define WK_KLASS_FUNC(name, ignore_s, ignore_o) \ |
317 ciInstanceKlass* name() { \ | |
318 return _##name;\ | |
0 | 319 } |
1142 | 320 WK_KLASSES_DO(WK_KLASS_FUNC) |
321 #undef WK_KLASS_FUNC | |
322 | |
0 | 323 ciInstance* NullPointerException_instance() { |
324 assert(_NullPointerException_instance != NULL, "initialization problem"); | |
325 return _NullPointerException_instance; | |
326 } | |
327 ciInstance* ArithmeticException_instance() { | |
328 assert(_ArithmeticException_instance != NULL, "initialization problem"); | |
329 return _ArithmeticException_instance; | |
330 } | |
331 | |
332 // Lazy constructors: | |
333 ciInstance* ArrayIndexOutOfBoundsException_instance(); | |
334 ciInstance* ArrayStoreException_instance(); | |
335 ciInstance* ClassCastException_instance(); | |
336 | |
1080
7c57aead6d3e
6892658: C2 should optimize some stringbuilder patterns
never
parents:
989
diff
changeset
|
337 ciInstance* the_null_string(); |
7c57aead6d3e
6892658: C2 should optimize some stringbuilder patterns
never
parents:
989
diff
changeset
|
338 ciInstance* the_min_jint_string(); |
7c57aead6d3e
6892658: C2 should optimize some stringbuilder patterns
never
parents:
989
diff
changeset
|
339 |
0 | 340 static ciSymbol* unloaded_cisymbol() { |
341 return _unloaded_cisymbol; | |
342 } | |
343 static ciObjArrayKlass* unloaded_ciobjarrayklass() { | |
344 return _unloaded_ciobjarrayklass; | |
345 } | |
346 static ciInstanceKlass* unloaded_ciinstance_klass() { | |
347 return _unloaded_ciinstance_klass; | |
348 } | |
349 | |
350 ciKlass* find_system_klass(ciSymbol* klass_name); | |
351 // Note: To find a class from its name string, use ciSymbol::make, | |
352 // but consider adding to vmSymbols.hpp instead. | |
353 | |
354 // Use this to make a holder for non-perm compile time constants. | |
989
148e5441d916
6863023: need non-perm oops in code cache for JSR 292
jrose
parents:
844
diff
changeset
|
355 // The resulting array is guaranteed to satisfy "can_be_constant". |
148e5441d916
6863023: need non-perm oops in code cache for JSR 292
jrose
parents:
844
diff
changeset
|
356 ciArray* make_system_array(GrowableArray<ciObject*>* objects); |
0 | 357 |
358 // converts the ciKlass* representing the holder of a method into a | |
359 // ciInstanceKlass*. This is needed since the holder of a method in | |
360 // the bytecodes could be an array type. Basically this converts | |
361 // array types into java/lang/Object and other types stay as they are. | |
362 static ciInstanceKlass* get_instance_klass_for_declared_method_holder(ciKlass* klass); | |
363 | |
364 // Return the machine-level offset of o, which must be an element of a. | |
365 // This may be used to form constant-loading expressions in lieu of simpler encodings. | |
366 int array_element_offset_in_bytes(ciArray* a, ciObject* o); | |
367 | |
368 // Access to the compile-lifetime allocation arena. | |
369 Arena* arena() { return _arena; } | |
370 | |
371 // What is the current compilation environment? | |
372 static ciEnv* current() { return CompilerThread::current()->env(); } | |
373 | |
374 // Overload with current thread argument | |
375 static ciEnv* current(CompilerThread *thread) { return thread->env(); } | |
376 | |
377 // Per-compiler data. (Used by C2 to publish the Compile* pointer.) | |
378 void* compiler_data() { return _compiler_data; } | |
379 void set_compiler_data(void* x) { _compiler_data = x; } | |
380 | |
381 // Notice that a method has been inlined in the current compile; | |
382 // used only for statistics. | |
383 void notice_inlined_method(ciMethod* method); | |
384 | |
385 // Total number of bytecodes in inlined methods in this compile | |
386 int num_inlined_bytecodes() const; | |
387 | |
388 // Output stream for logging compilation info. | |
389 CompileLog* log() { return _log; } | |
390 void set_log(CompileLog* log) { _log = log; } | |
391 | |
392 // Check for changes to the system dictionary during compilation | |
393 bool system_dictionary_modification_counter_changed(); | |
394 | |
395 void record_failure(const char* reason); | |
396 void record_method_not_compilable(const char* reason, bool all_tiers = true); | |
397 void record_out_of_memory_failure(); | |
398 }; | |
1972 | 399 |
400 #endif // SHARE_VM_CI_CIENV_HPP |