Mercurial > hg > truffle
annotate src/share/vm/ci/ciEnv.hpp @ 17716:cdb71841f4bc
6498581: ThreadInterruptTest3 produces wrong output on Windows
Summary: There is race condition between os::interrupt and os::is_interrupted on Windows. In JVM_Sleep(Thread.sleep), check if thread gets interrupted, it may see interrupted but not really interrupted so cause spurious waking up (early return from sleep). Fix by checking if interrupt event really gets set thus prevent false return. For intrinsic of _isInterrupted, on Windows, go fastpath only on bit not set.
Reviewed-by: acorn, kvn
Contributed-by: david.holmes@oracle.com, yumin.qi@oracle.com
author | minqi |
---|---|
date | Wed, 26 Feb 2014 15:20:41 -0800 |
parents | 849eb7bfceac |
children | 96d2c94bbdd0 606acabe7b5c |
rev | line source |
---|---|
0 | 1 /* |
17467
55fb97c4c58d
8029233: Update copyright year to match last edit in jdk8 hotspot repository for 2013
mikael
parents:
12865
diff
changeset
|
2 * Copyright (c) 1999, 2013, 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 | |
1142 | 82 #define WK_KLASS_DECL(name, ignore_s, ignore_o) static ciInstanceKlass* _##name; |
83 WK_KLASSES_DO(WK_KLASS_DECL) | |
84 #undef WK_KLASS_DECL | |
0 | 85 |
86 static ciSymbol* _unloaded_cisymbol; | |
87 static ciInstanceKlass* _unloaded_ciinstance_klass; | |
88 static ciObjArrayKlass* _unloaded_ciobjarrayklass; | |
89 | |
90 static jobject _ArrayIndexOutOfBoundsException_handle; | |
91 static jobject _ArrayStoreException_handle; | |
92 static jobject _ClassCastException_handle; | |
93 | |
94 ciInstance* _NullPointerException_instance; | |
95 ciInstance* _ArithmeticException_instance; | |
96 ciInstance* _ArrayIndexOutOfBoundsException_instance; | |
97 ciInstance* _ArrayStoreException_instance; | |
98 ciInstance* _ClassCastException_instance; | |
99 | |
1080
7c57aead6d3e
6892658: C2 should optimize some stringbuilder patterns
never
parents:
989
diff
changeset
|
100 ciInstance* _the_null_string; // The Java string "null" |
7c57aead6d3e
6892658: C2 should optimize some stringbuilder patterns
never
parents:
989
diff
changeset
|
101 ciInstance* _the_min_jint_string; // The Java string "-2147483648" |
7c57aead6d3e
6892658: C2 should optimize some stringbuilder patterns
never
parents:
989
diff
changeset
|
102 |
0 | 103 // Look up a klass by name from a particular class loader (the accessor's). |
104 // If require_local, result must be defined in that class loader, or NULL. | |
105 // If !require_local, a result from remote class loader may be reported, | |
106 // if sufficient class loader constraints exist such that initiating | |
107 // a class loading request from the given loader is bound to return | |
108 // the class defined in the remote loader (or throw an error). | |
109 // | |
110 // Return an unloaded klass if !require_local and no class at all is found. | |
111 // | |
112 // The CI treats a klass as loaded if it is consistently defined in | |
113 // another loader, even if it hasn't yet been loaded in all loaders | |
114 // that could potentially see it via delegation. | |
115 ciKlass* get_klass_by_name(ciKlass* accessing_klass, | |
116 ciSymbol* klass_name, | |
117 bool require_local); | |
118 | |
119 // Constant pool access. | |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1137
diff
changeset
|
120 ciKlass* get_klass_by_index(constantPoolHandle cpool, |
0 | 121 int klass_index, |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1137
diff
changeset
|
122 bool& is_accessible, |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1137
diff
changeset
|
123 ciInstanceKlass* loading_klass); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1137
diff
changeset
|
124 ciConstant get_constant_by_index(constantPoolHandle cpool, |
1602 | 125 int pool_index, int cache_index, |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1137
diff
changeset
|
126 ciInstanceKlass* accessor); |
0 | 127 ciField* get_field_by_index(ciInstanceKlass* loading_klass, |
128 int field_index); | |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1137
diff
changeset
|
129 ciMethod* get_method_by_index(constantPoolHandle cpool, |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1137
diff
changeset
|
130 int method_index, Bytecodes::Code bc, |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1137
diff
changeset
|
131 ciInstanceKlass* loading_klass); |
0 | 132 |
133 // Implementation methods for loading and constant pool access. | |
134 ciKlass* get_klass_by_name_impl(ciKlass* accessing_klass, | |
3785
ddd894528dbc
7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents:
2426
diff
changeset
|
135 constantPoolHandle cpool, |
0 | 136 ciSymbol* klass_name, |
137 bool require_local); | |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1137
diff
changeset
|
138 ciKlass* get_klass_by_index_impl(constantPoolHandle cpool, |
0 | 139 int klass_index, |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1137
diff
changeset
|
140 bool& is_accessible, |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1137
diff
changeset
|
141 ciInstanceKlass* loading_klass); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1137
diff
changeset
|
142 ciConstant get_constant_by_index_impl(constantPoolHandle cpool, |
1602 | 143 int pool_index, int cache_index, |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1137
diff
changeset
|
144 ciInstanceKlass* loading_klass); |
0 | 145 ciField* get_field_by_index_impl(ciInstanceKlass* loading_klass, |
146 int field_index); | |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1137
diff
changeset
|
147 ciMethod* get_method_by_index_impl(constantPoolHandle cpool, |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1137
diff
changeset
|
148 int method_index, Bytecodes::Code bc, |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1137
diff
changeset
|
149 ciInstanceKlass* loading_klass); |
0 | 150 |
151 // Helper methods | |
152 bool check_klass_accessibility(ciKlass* accessing_klass, | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
153 Klass* resolved_klass); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
154 Method* lookup_method(InstanceKlass* accessor, |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
155 InstanceKlass* holder, |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1972
diff
changeset
|
156 Symbol* name, |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1972
diff
changeset
|
157 Symbol* sig, |
0 | 158 Bytecodes::Code bc); |
159 | |
160 // Get a ciObject from the object factory. Ensures uniqueness | |
161 // of ciObjects. | |
162 ciObject* get_object(oop o) { | |
163 if (o == NULL) { | |
164 return _null_object_instance; | |
165 } else { | |
166 return _factory->get(o); | |
167 } | |
168 } | |
169 | |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1972
diff
changeset
|
170 ciSymbol* get_symbol(Symbol* o) { |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1972
diff
changeset
|
171 if (o == NULL) { |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1972
diff
changeset
|
172 ShouldNotReachHere(); |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1972
diff
changeset
|
173 return NULL; |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1972
diff
changeset
|
174 } else { |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1972
diff
changeset
|
175 return _factory->get_symbol(o); |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1972
diff
changeset
|
176 } |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1972
diff
changeset
|
177 } |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1972
diff
changeset
|
178 |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
179 ciMetadata* get_metadata(Metadata* o) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
180 if (o == NULL) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
181 return NULL; |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
182 } else { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
183 return _factory->get_metadata(o); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
184 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
185 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
186 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
187 ciInstance* get_instance(oop o) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
188 if (o == NULL) return NULL; |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
189 return get_object(o)->as_instance(); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
190 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
191 ciObjArrayKlass* get_obj_array_klass(Klass* o) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
192 if (o == NULL) return NULL; |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
193 return get_metadata(o)->as_obj_array_klass(); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
194 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
195 ciTypeArrayKlass* get_type_array_klass(Klass* o) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
196 if (o == NULL) return NULL; |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
197 return get_metadata(o)->as_type_array_klass(); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
198 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
199 ciKlass* get_klass(Klass* o) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
200 if (o == NULL) return NULL; |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
201 return get_metadata(o)->as_klass(); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
202 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
203 ciInstanceKlass* get_instance_klass(Klass* o) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
204 if (o == NULL) return NULL; |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
205 return get_metadata(o)->as_instance_klass(); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
206 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
207 ciMethod* get_method(Method* o) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
208 if (o == NULL) return NULL; |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
209 return get_metadata(o)->as_method(); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
210 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
211 ciMethodData* get_method_data(MethodData* o) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
212 if (o == NULL) return NULL; |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
213 return get_metadata(o)->as_method_data(); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
214 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
215 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
216 ciMethod* get_method_from_handle(Method* method); |
0 | 217 |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1972
diff
changeset
|
218 ciInstance* get_or_create_exception(jobject& handle, Symbol* name); |
0 | 219 |
220 // Get a ciMethod representing either an unfound method or | |
221 // a method with an unloaded holder. Ensures uniqueness of | |
222 // the result. | |
223 ciMethod* get_unloaded_method(ciInstanceKlass* holder, | |
224 ciSymbol* name, | |
4001
5eb9169b1a14
7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents:
3899
diff
changeset
|
225 ciSymbol* signature, |
5eb9169b1a14
7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents:
3899
diff
changeset
|
226 ciInstanceKlass* accessor) { |
5eb9169b1a14
7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents:
3899
diff
changeset
|
227 return _factory->get_unloaded_method(holder, name, signature, accessor); |
0 | 228 } |
229 | |
230 // Get a ciKlass representing an unloaded klass. | |
231 // Ensures uniqueness of the result. | |
4001
5eb9169b1a14
7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents:
3899
diff
changeset
|
232 ciKlass* get_unloaded_klass(ciKlass* accessing_klass, |
0 | 233 ciSymbol* name) { |
234 return _factory->get_unloaded_klass(accessing_klass, name, true); | |
235 } | |
236 | |
1602 | 237 // Get a ciKlass representing an unloaded klass mirror. |
238 // Result is not necessarily unique, but will be unloaded. | |
239 ciInstance* get_unloaded_klass_mirror(ciKlass* type) { | |
240 return _factory->get_unloaded_klass_mirror(type); | |
241 } | |
242 | |
243 // Get a ciInstance representing an unresolved method handle constant. | |
244 ciInstance* get_unloaded_method_handle_constant(ciKlass* holder, | |
245 ciSymbol* name, | |
246 ciSymbol* signature, | |
247 int ref_kind) { | |
248 return _factory->get_unloaded_method_handle_constant(holder, name, signature, ref_kind); | |
249 } | |
250 | |
251 // Get a ciInstance representing an unresolved method type constant. | |
252 ciInstance* get_unloaded_method_type_constant(ciSymbol* signature) { | |
253 return _factory->get_unloaded_method_type_constant(signature); | |
254 } | |
255 | |
0 | 256 // See if we already have an unloaded klass for the given name |
257 // or return NULL if not. | |
4001
5eb9169b1a14
7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents:
3899
diff
changeset
|
258 ciKlass *check_get_unloaded_klass(ciKlass* accessing_klass, ciSymbol* name) { |
0 | 259 return _factory->get_unloaded_klass(accessing_klass, name, false); |
260 } | |
261 | |
262 // Get a ciReturnAddress corresponding to the given bci. | |
263 // Ensures uniqueness of the result. | |
264 ciReturnAddress* get_return_address(int bci) { | |
265 return _factory->get_return_address(bci); | |
266 } | |
267 | |
268 // Get a ciMethodData representing the methodData for a method | |
269 // with none. | |
270 ciMethodData* get_empty_methodData() { | |
271 return _factory->get_empty_methodData(); | |
272 } | |
273 | |
274 // General utility : get a buffer of some required length. | |
275 // Used in symbol creation. | |
276 char* name_buffer(int req_len); | |
277 | |
278 // Is this thread currently in the VM state? | |
279 static bool is_in_vm(); | |
280 | |
3894
b27c72d69fd1
7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents:
3785
diff
changeset
|
281 // Helper routine for determining the validity of a compilation with |
b27c72d69fd1
7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents:
3785
diff
changeset
|
282 // respect to method dependencies (e.g. concurrent class loading). |
b27c72d69fd1
7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents:
3785
diff
changeset
|
283 void validate_compile_task_dependencies(ciMethod* target); |
0 | 284 |
285 public: | |
286 enum { | |
287 MethodCompilable, | |
288 MethodCompilable_not_at_tier, | |
289 MethodCompilable_never | |
290 }; | |
291 | |
292 ciEnv(CompileTask* task, int system_dictionary_modification_counter); | |
293 // Used only during initialization of the ci | |
294 ciEnv(Arena* arena); | |
295 ~ciEnv(); | |
296 | |
297 OopRecorder* oop_recorder() { return _oop_recorder; } | |
298 void set_oop_recorder(OopRecorder* r) { _oop_recorder = r; } | |
299 | |
300 DebugInformationRecorder* debug_info() { return _debug_info; } | |
301 void set_debug_info(DebugInformationRecorder* i) { _debug_info = i; } | |
302 | |
303 Dependencies* dependencies() { return _dependencies; } | |
304 void set_dependencies(Dependencies* d) { _dependencies = d; } | |
305 | |
306 // This is true if the compilation is not going to produce code. | |
307 // (It is reasonable to retry failed compilations.) | |
308 bool failing() { return _failure_reason != NULL; } | |
309 | |
310 // Reason this compilation is failing, such as "too many basic blocks". | |
311 const char* failure_reason() { return _failure_reason; } | |
312 | |
313 // Return state of appropriate compilability | |
314 int compilable() { return _compilable; } | |
315 | |
4872
aa3d708d67c4
7141200: log some interesting information in ring buffers for crashes
never
parents:
4001
diff
changeset
|
316 const char* retry_message() const { |
aa3d708d67c4
7141200: log some interesting information in ring buffers for crashes
never
parents:
4001
diff
changeset
|
317 switch (_compilable) { |
aa3d708d67c4
7141200: log some interesting information in ring buffers for crashes
never
parents:
4001
diff
changeset
|
318 case ciEnv::MethodCompilable_not_at_tier: |
aa3d708d67c4
7141200: log some interesting information in ring buffers for crashes
never
parents:
4001
diff
changeset
|
319 return "retry at different tier"; |
aa3d708d67c4
7141200: log some interesting information in ring buffers for crashes
never
parents:
4001
diff
changeset
|
320 case ciEnv::MethodCompilable_never: |
aa3d708d67c4
7141200: log some interesting information in ring buffers for crashes
never
parents:
4001
diff
changeset
|
321 return "not retryable"; |
aa3d708d67c4
7141200: log some interesting information in ring buffers for crashes
never
parents:
4001
diff
changeset
|
322 case ciEnv::MethodCompilable: |
aa3d708d67c4
7141200: log some interesting information in ring buffers for crashes
never
parents:
4001
diff
changeset
|
323 return NULL; |
aa3d708d67c4
7141200: log some interesting information in ring buffers for crashes
never
parents:
4001
diff
changeset
|
324 default: |
aa3d708d67c4
7141200: log some interesting information in ring buffers for crashes
never
parents:
4001
diff
changeset
|
325 ShouldNotReachHere(); |
aa3d708d67c4
7141200: log some interesting information in ring buffers for crashes
never
parents:
4001
diff
changeset
|
326 return NULL; |
aa3d708d67c4
7141200: log some interesting information in ring buffers for crashes
never
parents:
4001
diff
changeset
|
327 } |
aa3d708d67c4
7141200: log some interesting information in ring buffers for crashes
never
parents:
4001
diff
changeset
|
328 } |
aa3d708d67c4
7141200: log some interesting information in ring buffers for crashes
never
parents:
4001
diff
changeset
|
329 |
0 | 330 bool break_at_compile() { return _break_at_compile; } |
331 void set_break_at_compile(bool z) { _break_at_compile = z; } | |
332 | |
780
c96bf21b756f
6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents:
0
diff
changeset
|
333 // 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
|
334 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
|
335 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
|
336 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
|
337 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
|
338 |
c96bf21b756f
6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents:
0
diff
changeset
|
339 // 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
|
340 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
|
341 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
|
342 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
|
343 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
|
344 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
|
345 |
0 | 346 // The compiler task which has created this env. |
347 // May be useful to find out compile_id, comp_level, etc. | |
348 CompileTask* task() { return _task; } | |
349 // Handy forwards to the task: | |
350 int comp_level(); // task()->comp_level() | |
351 uint compile_id(); // task()->compile_id() | |
352 | |
353 // Register the result of a compilation. | |
354 void register_method(ciMethod* target, | |
355 int entry_bci, | |
356 CodeOffsets* offsets, | |
357 int orig_pc_offset, | |
358 CodeBuffer* code_buffer, | |
359 int frame_words, | |
360 OopMapSet* oop_map_set, | |
361 ExceptionHandlerTable* handler_table, | |
362 ImplicitExceptionTable* inc_table, | |
363 AbstractCompiler* compiler, | |
364 int comp_level, | |
6792
137868b7aa6f
7196199: java/text/Bidi/Bug6665028.java failed: Bidi run count incorrect
kvn
parents:
6725
diff
changeset
|
365 bool has_unsafe_access, |
137868b7aa6f
7196199: java/text/Bidi/Bug6665028.java failed: Bidi run count incorrect
kvn
parents:
6725
diff
changeset
|
366 bool has_wide_vectors); |
0 | 367 |
368 | |
369 // Access to certain well known ciObjects. | |
1142 | 370 #define WK_KLASS_FUNC(name, ignore_s, ignore_o) \ |
371 ciInstanceKlass* name() { \ | |
372 return _##name;\ | |
0 | 373 } |
1142 | 374 WK_KLASSES_DO(WK_KLASS_FUNC) |
375 #undef WK_KLASS_FUNC | |
376 | |
0 | 377 ciInstance* NullPointerException_instance() { |
378 assert(_NullPointerException_instance != NULL, "initialization problem"); | |
379 return _NullPointerException_instance; | |
380 } | |
381 ciInstance* ArithmeticException_instance() { | |
382 assert(_ArithmeticException_instance != NULL, "initialization problem"); | |
383 return _ArithmeticException_instance; | |
384 } | |
385 | |
386 // Lazy constructors: | |
387 ciInstance* ArrayIndexOutOfBoundsException_instance(); | |
388 ciInstance* ArrayStoreException_instance(); | |
389 ciInstance* ClassCastException_instance(); | |
390 | |
1080
7c57aead6d3e
6892658: C2 should optimize some stringbuilder patterns
never
parents:
989
diff
changeset
|
391 ciInstance* the_null_string(); |
7c57aead6d3e
6892658: C2 should optimize some stringbuilder patterns
never
parents:
989
diff
changeset
|
392 ciInstance* the_min_jint_string(); |
7c57aead6d3e
6892658: C2 should optimize some stringbuilder patterns
never
parents:
989
diff
changeset
|
393 |
0 | 394 static ciSymbol* unloaded_cisymbol() { |
395 return _unloaded_cisymbol; | |
396 } | |
397 static ciObjArrayKlass* unloaded_ciobjarrayklass() { | |
398 return _unloaded_ciobjarrayklass; | |
399 } | |
400 static ciInstanceKlass* unloaded_ciinstance_klass() { | |
401 return _unloaded_ciinstance_klass; | |
402 } | |
12160
f98f5d48f511
7199175: JSR 292: C1 needs patching when invokedynamic/invokehandle call site is not linked
roland
parents:
10195
diff
changeset
|
403 ciInstance* unloaded_ciinstance(); |
0 | 404 |
405 ciKlass* find_system_klass(ciSymbol* klass_name); | |
406 // Note: To find a class from its name string, use ciSymbol::make, | |
407 // but consider adding to vmSymbols.hpp instead. | |
408 | |
409 // converts the ciKlass* representing the holder of a method into a | |
410 // ciInstanceKlass*. This is needed since the holder of a method in | |
411 // the bytecodes could be an array type. Basically this converts | |
412 // array types into java/lang/Object and other types stay as they are. | |
413 static ciInstanceKlass* get_instance_klass_for_declared_method_holder(ciKlass* klass); | |
414 | |
415 // Return the machine-level offset of o, which must be an element of a. | |
416 // This may be used to form constant-loading expressions in lieu of simpler encodings. | |
417 int array_element_offset_in_bytes(ciArray* a, ciObject* o); | |
418 | |
419 // Access to the compile-lifetime allocation arena. | |
420 Arena* arena() { return _arena; } | |
421 | |
422 // What is the current compilation environment? | |
423 static ciEnv* current() { return CompilerThread::current()->env(); } | |
424 | |
425 // Overload with current thread argument | |
426 static ciEnv* current(CompilerThread *thread) { return thread->env(); } | |
427 | |
428 // Per-compiler data. (Used by C2 to publish the Compile* pointer.) | |
429 void* compiler_data() { return _compiler_data; } | |
430 void set_compiler_data(void* x) { _compiler_data = x; } | |
431 | |
432 // Notice that a method has been inlined in the current compile; | |
433 // used only for statistics. | |
434 void notice_inlined_method(ciMethod* method); | |
435 | |
436 // Total number of bytecodes in inlined methods in this compile | |
437 int num_inlined_bytecodes() const; | |
438 | |
439 // Output stream for logging compilation info. | |
440 CompileLog* log() { return _log; } | |
441 void set_log(CompileLog* log) { _log = log; } | |
442 | |
443 // Check for changes to the system dictionary during compilation | |
444 bool system_dictionary_modification_counter_changed(); | |
445 | |
446 void record_failure(const char* reason); | |
447 void record_method_not_compilable(const char* reason, bool all_tiers = true); | |
448 void record_out_of_memory_failure(); | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
449 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
450 // RedefineClasses support |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
451 void metadata_do(void f(Metadata*)) { _factory->metadata_do(f); } |
6972
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6792
diff
changeset
|
452 |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6792
diff
changeset
|
453 // Dump the compilation replay data for the ciEnv to the stream. |
17622 | 454 void dump_replay_data(int compile_id); |
455 void dump_inline_data(int compile_id); | |
6972
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6792
diff
changeset
|
456 void dump_replay_data(outputStream* out); |
12865
5cc2d82aa82a
8024943: ciReplay: fails to dump replay data during safepointing
vlivanov
parents:
12160
diff
changeset
|
457 void dump_replay_data_unsafe(outputStream* out); |
17622 | 458 void dump_compile_data(outputStream* out); |
0 | 459 }; |
1972 | 460 |
461 #endif // SHARE_VM_CI_CIENV_HPP |