Mercurial > hg > truffle
annotate src/share/vm/interpreter/interpreter.cpp @ 14649:f6301b007a16
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 | bd3237e0e18d |
children | 096c224171c4 78bbf4d43a14 |
rev | line source |
---|---|
0 | 1 /* |
11080
b800986664f4
7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents:
8767
diff
changeset
|
2 * Copyright (c) 1997, 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:
1135
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1135
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:
1135
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
1972 | 25 #include "precompiled.hpp" |
7199
cd3d6a6b95d9
8003240: x86: move MacroAssembler into separate file
twisti
parents:
6926
diff
changeset
|
26 #include "asm/macroAssembler.hpp" |
cd3d6a6b95d9
8003240: x86: move MacroAssembler into separate file
twisti
parents:
6926
diff
changeset
|
27 #include "asm/macroAssembler.inline.hpp" |
cd3d6a6b95d9
8003240: x86: move MacroAssembler into separate file
twisti
parents:
6926
diff
changeset
|
28 #include "compiler/disassembler.hpp" |
1972 | 29 #include "interpreter/bytecodeHistogram.hpp" |
30 #include "interpreter/bytecodeInterpreter.hpp" | |
31 #include "interpreter/interpreter.hpp" | |
32 #include "interpreter/interpreterRuntime.hpp" | |
33 #include "interpreter/templateTable.hpp" | |
34 #include "memory/allocation.inline.hpp" | |
35 #include "memory/resourceArea.hpp" | |
36 #include "oops/arrayOop.hpp" | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
37 #include "oops/methodData.hpp" |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
38 #include "oops/method.hpp" |
1972 | 39 #include "oops/oop.inline.hpp" |
40 #include "prims/forte.hpp" | |
41 #include "prims/jvmtiExport.hpp" | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6084
diff
changeset
|
42 #include "prims/methodHandles.hpp" |
1972 | 43 #include "runtime/handles.inline.hpp" |
44 #include "runtime/sharedRuntime.hpp" | |
45 #include "runtime/stubRoutines.hpp" | |
46 #include "runtime/timer.hpp" | |
0 | 47 |
48 # define __ _masm-> | |
49 | |
50 | |
51 //------------------------------------------------------------------------------------------------------------------------ | |
52 // Implementation of InterpreterCodelet | |
53 | |
54 void InterpreterCodelet::initialize(const char* description, Bytecodes::Code bytecode) { | |
55 _description = description; | |
56 _bytecode = bytecode; | |
57 } | |
58 | |
59 | |
60 void InterpreterCodelet::verify() { | |
61 } | |
62 | |
63 | |
1681
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1644
diff
changeset
|
64 void InterpreterCodelet::print_on(outputStream* st) const { |
6796
b31471cdc53e
7200163: add CodeComments functionality to assember stubs
kvn
parents:
6725
diff
changeset
|
65 ttyLocker ttyl; |
b31471cdc53e
7200163: add CodeComments functionality to assember stubs
kvn
parents:
6725
diff
changeset
|
66 |
0 | 67 if (PrintInterpreter) { |
1681
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1644
diff
changeset
|
68 st->cr(); |
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1644
diff
changeset
|
69 st->print_cr("----------------------------------------------------------------------"); |
0 | 70 } |
71 | |
1681
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1644
diff
changeset
|
72 if (description() != NULL) st->print("%s ", description()); |
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1644
diff
changeset
|
73 if (bytecode() >= 0 ) st->print("%d %s ", bytecode(), Bytecodes::name(bytecode())); |
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1644
diff
changeset
|
74 st->print_cr("[" INTPTR_FORMAT ", " INTPTR_FORMAT "] %d bytes", |
0 | 75 code_begin(), code_end(), code_size()); |
76 | |
77 if (PrintInterpreter) { | |
1681
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1644
diff
changeset
|
78 st->cr(); |
8767
a5de0cc2f91c
8008555: Debugging code in compiled method sometimes leaks memory
roland
parents:
7199
diff
changeset
|
79 Disassembler::decode(code_begin(), code_end(), st, DEBUG_ONLY(_strings) NOT_DEBUG(CodeStrings())); |
0 | 80 } |
81 } | |
82 | |
83 | |
84 //------------------------------------------------------------------------------------------------------------------------ | |
85 // Implementation of platform independent aspects of Interpreter | |
86 | |
87 void AbstractInterpreter::initialize() { | |
88 if (_code != NULL) return; | |
89 | |
90 // make sure 'imported' classes are initialized | |
91 if (CountBytecodes || TraceBytecodes || StopInterpreterAt) BytecodeCounter::reset(); | |
92 if (PrintBytecodeHistogram) BytecodeHistogram::reset(); | |
93 if (PrintBytecodePairHistogram) BytecodePairHistogram::reset(); | |
94 | |
95 InvocationCounter::reinitialize(DelayCompilationDuringStartup); | |
96 | |
97 } | |
98 | |
99 void AbstractInterpreter::print() { | |
100 tty->cr(); | |
101 tty->print_cr("----------------------------------------------------------------------"); | |
102 tty->print_cr("Interpreter"); | |
103 tty->cr(); | |
104 tty->print_cr("code size = %6dK bytes", (int)_code->used_space()/1024); | |
105 tty->print_cr("total space = %6dK bytes", (int)_code->total_space()/1024); | |
106 tty->print_cr("wasted space = %6dK bytes", (int)_code->available_space()/1024); | |
107 tty->cr(); | |
108 tty->print_cr("# of codelets = %6d" , _code->number_of_stubs()); | |
109 tty->print_cr("avg codelet size = %6d bytes", _code->used_space() / _code->number_of_stubs()); | |
110 tty->cr(); | |
111 _code->print(); | |
112 tty->print_cr("----------------------------------------------------------------------"); | |
113 tty->cr(); | |
114 } | |
115 | |
116 | |
117 void interpreter_init() { | |
118 Interpreter::initialize(); | |
119 #ifndef PRODUCT | |
120 if (TraceBytecodes) BytecodeTracer::set_closure(BytecodeTracer::std_closure()); | |
121 #endif // PRODUCT | |
122 // need to hit every safepoint in order to call zapping routine | |
123 // register the interpreter | |
124 Forte::register_stub( | |
125 "Interpreter", | |
126 AbstractInterpreter::code()->code_start(), | |
127 AbstractInterpreter::code()->code_end() | |
128 ); | |
129 | |
130 // notify JVMTI profiler | |
131 if (JvmtiExport::should_post_dynamic_code_generated()) { | |
132 JvmtiExport::post_dynamic_code_generated("Interpreter", | |
133 AbstractInterpreter::code()->code_start(), | |
134 AbstractInterpreter::code()->code_end()); | |
135 } | |
136 } | |
137 | |
138 //------------------------------------------------------------------------------------------------------------------------ | |
139 // Implementation of interpreter | |
140 | |
141 StubQueue* AbstractInterpreter::_code = NULL; | |
142 bool AbstractInterpreter::_notice_safepoints = false; | |
143 address AbstractInterpreter::_rethrow_exception_entry = NULL; | |
144 | |
145 address AbstractInterpreter::_native_entry_begin = NULL; | |
146 address AbstractInterpreter::_native_entry_end = NULL; | |
147 address AbstractInterpreter::_slow_signature_handler; | |
148 address AbstractInterpreter::_entry_table [AbstractInterpreter::number_of_method_entries]; | |
149 address AbstractInterpreter::_native_abi_to_tosca [AbstractInterpreter::number_of_result_handlers]; | |
150 | |
151 //------------------------------------------------------------------------------------------------------------------------ | |
152 // Generation of complete interpreter | |
153 | |
154 AbstractInterpreterGenerator::AbstractInterpreterGenerator(StubQueue* _code) { | |
155 _masm = NULL; | |
156 } | |
157 | |
158 | |
159 static const BasicType types[Interpreter::number_of_result_handlers] = { | |
160 T_BOOLEAN, | |
161 T_CHAR , | |
162 T_BYTE , | |
163 T_SHORT , | |
164 T_INT , | |
165 T_LONG , | |
166 T_VOID , | |
167 T_FLOAT , | |
168 T_DOUBLE , | |
169 T_OBJECT | |
170 }; | |
171 | |
172 void AbstractInterpreterGenerator::generate_all() { | |
173 | |
174 | |
175 { CodeletMark cm(_masm, "slow signature handler"); | |
176 Interpreter::_slow_signature_handler = generate_slow_signature_handler(); | |
177 } | |
178 | |
179 } | |
180 | |
181 //------------------------------------------------------------------------------------------------------------------------ | |
182 // Entry points | |
183 | |
184 AbstractInterpreter::MethodKind AbstractInterpreter::method_kind(methodHandle m) { | |
185 // Abstract method? | |
186 if (m->is_abstract()) return abstract; | |
187 | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6084
diff
changeset
|
188 // Method handle primitive? |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6084
diff
changeset
|
189 if (m->is_method_handle_intrinsic()) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6084
diff
changeset
|
190 vmIntrinsics::ID id = m->intrinsic_id(); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6084
diff
changeset
|
191 assert(MethodHandles::is_signature_polymorphic(id), "must match an intrinsic"); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6084
diff
changeset
|
192 MethodKind kind = (MethodKind)( method_handle_invoke_FIRST + |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6084
diff
changeset
|
193 ((int)id - vmIntrinsics::FIRST_MH_SIG_POLY) ); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6084
diff
changeset
|
194 assert(kind <= method_handle_invoke_LAST, "parallel enum ranges"); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6084
diff
changeset
|
195 return kind; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6084
diff
changeset
|
196 } |
710 | 197 |
11080
b800986664f4
7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents:
8767
diff
changeset
|
198 #ifndef CC_INTERP |
b800986664f4
7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents:
8767
diff
changeset
|
199 if (UseCRC32Intrinsics && m->is_native()) { |
b800986664f4
7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents:
8767
diff
changeset
|
200 // Use optimized stub code for CRC32 native methods. |
b800986664f4
7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents:
8767
diff
changeset
|
201 switch (m->intrinsic_id()) { |
b800986664f4
7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents:
8767
diff
changeset
|
202 case vmIntrinsics::_updateCRC32 : return java_util_zip_CRC32_update; |
b800986664f4
7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents:
8767
diff
changeset
|
203 case vmIntrinsics::_updateBytesCRC32 : return java_util_zip_CRC32_updateBytes; |
b800986664f4
7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents:
8767
diff
changeset
|
204 case vmIntrinsics::_updateByteBufferCRC32 : return java_util_zip_CRC32_updateByteBuffer; |
b800986664f4
7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents:
8767
diff
changeset
|
205 } |
b800986664f4
7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents:
8767
diff
changeset
|
206 } |
b800986664f4
7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents:
8767
diff
changeset
|
207 #endif |
b800986664f4
7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents:
8767
diff
changeset
|
208 |
0 | 209 // Native method? |
210 // Note: This test must come _before_ the test for intrinsic | |
211 // methods. See also comments below. | |
212 if (m->is_native()) { | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6084
diff
changeset
|
213 assert(!m->is_method_handle_intrinsic(), "overlapping bits here, watch out"); |
0 | 214 return m->is_synchronized() ? native_synchronized : native; |
215 } | |
216 | |
217 // Synchronized? | |
218 if (m->is_synchronized()) { | |
219 return zerolocals_synchronized; | |
220 } | |
221 | |
222 if (RegisterFinalizersAtInit && m->code_size() == 1 && | |
223 m->intrinsic_id() == vmIntrinsics::_Object_init) { | |
224 // We need to execute the special return bytecode to check for | |
225 // finalizer registration so create a normal frame. | |
226 return zerolocals; | |
227 } | |
228 | |
229 // Empty method? | |
230 if (m->is_empty_method()) { | |
231 return empty; | |
232 } | |
233 | |
234 // Special intrinsic method? | |
235 // Note: This test must come _after_ the test for native methods, | |
236 // otherwise we will run into problems with JDK 1.2, see also | |
237 // AbstractInterpreterGenerator::generate_method_entry() for | |
238 // for details. | |
239 switch (m->intrinsic_id()) { | |
240 case vmIntrinsics::_dsin : return java_lang_math_sin ; | |
241 case vmIntrinsics::_dcos : return java_lang_math_cos ; | |
242 case vmIntrinsics::_dtan : return java_lang_math_tan ; | |
243 case vmIntrinsics::_dabs : return java_lang_math_abs ; | |
244 case vmIntrinsics::_dsqrt : return java_lang_math_sqrt ; | |
245 case vmIntrinsics::_dlog : return java_lang_math_log ; | |
246 case vmIntrinsics::_dlog10: return java_lang_math_log10; | |
6084
6759698e3140
7133857: exp() and pow() should use the x87 ISA on x86
roland
parents:
3249
diff
changeset
|
247 case vmIntrinsics::_dpow : return java_lang_math_pow ; |
6759698e3140
7133857: exp() and pow() should use the x87 ISA on x86
roland
parents:
3249
diff
changeset
|
248 case vmIntrinsics::_dexp : return java_lang_math_exp ; |
3249
e1162778c1c8
7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents:
2177
diff
changeset
|
249 |
e1162778c1c8
7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents:
2177
diff
changeset
|
250 case vmIntrinsics::_Reference_get: |
e1162778c1c8
7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents:
2177
diff
changeset
|
251 return java_lang_ref_reference_get; |
e1162778c1c8
7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents:
2177
diff
changeset
|
252 } |
e1162778c1c8
7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents:
2177
diff
changeset
|
253 |
e1162778c1c8
7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents:
2177
diff
changeset
|
254 // Accessor method? |
e1162778c1c8
7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents:
2177
diff
changeset
|
255 if (m->is_accessor()) { |
e1162778c1c8
7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents:
2177
diff
changeset
|
256 assert(m->size_of_parameters() == 1, "fast code for accessors assumes parameter size = 1"); |
e1162778c1c8
7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents:
2177
diff
changeset
|
257 return accessor; |
0 | 258 } |
259 | |
260 // Note: for now: zero locals for all non-empty methods | |
261 return zerolocals; | |
262 } | |
263 | |
264 | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6084
diff
changeset
|
265 void AbstractInterpreter::set_entry_for_kind(AbstractInterpreter::MethodKind kind, address entry) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6084
diff
changeset
|
266 assert(kind >= method_handle_invoke_FIRST && |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6084
diff
changeset
|
267 kind <= method_handle_invoke_LAST, "late initialization only for MH entry points"); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6084
diff
changeset
|
268 assert(_entry_table[kind] == _entry_table[abstract], "previous value must be AME entry"); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6084
diff
changeset
|
269 _entry_table[kind] = entry; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6084
diff
changeset
|
270 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6084
diff
changeset
|
271 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6084
diff
changeset
|
272 |
0 | 273 // Return true if the interpreter can prove that the given bytecode has |
274 // not yet been executed (in Java semantics, not in actual operation). | |
275 bool AbstractInterpreter::is_not_reached(methodHandle method, int bci) { | |
2142 | 276 Bytecodes::Code code = method()->code_at(bci); |
0 | 277 |
2142 | 278 if (!Bytecodes::must_rewrite(code)) { |
0 | 279 // might have been reached |
280 return false; | |
281 } | |
282 | |
283 // the bytecode might not be rewritten if the method is an accessor, etc. | |
284 address ientry = method->interpreter_entry(); | |
285 if (ientry != entry_for_kind(AbstractInterpreter::zerolocals) && | |
286 ientry != entry_for_kind(AbstractInterpreter::zerolocals_synchronized)) | |
287 return false; // interpreter does not run this method! | |
288 | |
289 // otherwise, we can be sure this bytecode has never been executed | |
290 return true; | |
291 } | |
292 | |
293 | |
294 #ifndef PRODUCT | |
295 void AbstractInterpreter::print_method_kind(MethodKind kind) { | |
296 switch (kind) { | |
297 case zerolocals : tty->print("zerolocals" ); break; | |
298 case zerolocals_synchronized: tty->print("zerolocals_synchronized"); break; | |
299 case native : tty->print("native" ); break; | |
300 case native_synchronized : tty->print("native_synchronized" ); break; | |
301 case empty : tty->print("empty" ); break; | |
302 case accessor : tty->print("accessor" ); break; | |
303 case abstract : tty->print("abstract" ); break; | |
304 case java_lang_math_sin : tty->print("java_lang_math_sin" ); break; | |
305 case java_lang_math_cos : tty->print("java_lang_math_cos" ); break; | |
306 case java_lang_math_tan : tty->print("java_lang_math_tan" ); break; | |
307 case java_lang_math_abs : tty->print("java_lang_math_abs" ); break; | |
308 case java_lang_math_sqrt : tty->print("java_lang_math_sqrt" ); break; | |
309 case java_lang_math_log : tty->print("java_lang_math_log" ); break; | |
310 case java_lang_math_log10 : tty->print("java_lang_math_log10" ); break; | |
11080
b800986664f4
7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents:
8767
diff
changeset
|
311 case java_util_zip_CRC32_update : tty->print("java_util_zip_CRC32_update"); break; |
b800986664f4
7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents:
8767
diff
changeset
|
312 case java_util_zip_CRC32_updateBytes : tty->print("java_util_zip_CRC32_updateBytes"); break; |
b800986664f4
7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents:
8767
diff
changeset
|
313 case java_util_zip_CRC32_updateByteBuffer : tty->print("java_util_zip_CRC32_updateByteBuffer"); break; |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6084
diff
changeset
|
314 default: |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6084
diff
changeset
|
315 if (kind >= method_handle_invoke_FIRST && |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6084
diff
changeset
|
316 kind <= method_handle_invoke_LAST) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6084
diff
changeset
|
317 const char* kind_name = vmIntrinsics::name_at(method_handle_intrinsic(kind)); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6084
diff
changeset
|
318 if (kind_name[0] == '_') kind_name = &kind_name[1]; // '_invokeExact' => 'invokeExact' |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6084
diff
changeset
|
319 tty->print("method_handle_%s", kind_name); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6084
diff
changeset
|
320 break; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6084
diff
changeset
|
321 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6084
diff
changeset
|
322 ShouldNotReachHere(); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6084
diff
changeset
|
323 break; |
0 | 324 } |
325 } | |
326 #endif // PRODUCT | |
327 | |
328 | |
329 //------------------------------------------------------------------------------------------------------------------------ | |
330 // Deoptimization support | |
331 | |
13010
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
332 /** |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
333 * If a deoptimization happens, this function returns the point of next bytecode to continue execution. |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
334 */ |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
335 address AbstractInterpreter::deopt_continue_after_entry(Method* method, address bcp, int callee_parameters, bool is_top_frame) { |
0 | 336 assert(method->contains(bcp), "just checkin'"); |
13010
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
337 |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
338 // Get the original and rewritten bytecode. |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
339 Bytecodes::Code code = Bytecodes::java_code_at(method, bcp); |
900
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
340 assert(!Interpreter::bytecode_should_reexecute(code), "should not reexecute"); |
13010
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
341 |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
342 const int bci = method->bci_from(bcp); |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
343 |
0 | 344 // compute continuation length |
13010
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
345 const int length = Bytecodes::length_at(method, bcp); |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
346 |
0 | 347 // compute result type |
348 BasicType type = T_ILLEGAL; | |
900
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
349 |
0 | 350 switch (code) { |
351 case Bytecodes::_invokevirtual : | |
352 case Bytecodes::_invokespecial : | |
353 case Bytecodes::_invokestatic : | |
354 case Bytecodes::_invokeinterface: { | |
355 Thread *thread = Thread::current(); | |
356 ResourceMark rm(thread); | |
357 methodHandle mh(thread, method); | |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2142
diff
changeset
|
358 type = Bytecode_invoke(mh, bci).result_type(); |
0 | 359 // since the cache entry might not be initialized: |
360 // (NOT needed for the old calling convension) | |
361 if (!is_top_frame) { | |
362 int index = Bytes::get_native_u2(bcp+1); | |
363 method->constants()->cache()->entry_at(index)->set_parameter_size(callee_parameters); | |
364 } | |
365 break; | |
366 } | |
367 | |
1059
389049f3f393
6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents:
900
diff
changeset
|
368 case Bytecodes::_invokedynamic: { |
389049f3f393
6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents:
900
diff
changeset
|
369 Thread *thread = Thread::current(); |
389049f3f393
6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents:
900
diff
changeset
|
370 ResourceMark rm(thread); |
389049f3f393
6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents:
900
diff
changeset
|
371 methodHandle mh(thread, method); |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2142
diff
changeset
|
372 type = Bytecode_invoke(mh, bci).result_type(); |
1059
389049f3f393
6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents:
900
diff
changeset
|
373 // since the cache entry might not be initialized: |
389049f3f393
6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents:
900
diff
changeset
|
374 // (NOT needed for the old calling convension) |
389049f3f393
6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents:
900
diff
changeset
|
375 if (!is_top_frame) { |
389049f3f393
6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents:
900
diff
changeset
|
376 int index = Bytes::get_native_u4(bcp+1); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
377 method->constants()->invokedynamic_cp_cache_entry_at(index)->set_parameter_size(callee_parameters); |
1059
389049f3f393
6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents:
900
diff
changeset
|
378 } |
389049f3f393
6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents:
900
diff
changeset
|
379 break; |
389049f3f393
6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents:
900
diff
changeset
|
380 } |
389049f3f393
6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents:
900
diff
changeset
|
381 |
0 | 382 case Bytecodes::_ldc : |
383 case Bytecodes::_ldc_w : // fall through | |
384 case Bytecodes::_ldc2_w: | |
1602 | 385 { |
386 Thread *thread = Thread::current(); | |
387 ResourceMark rm(thread); | |
388 methodHandle mh(thread, method); | |
2142 | 389 type = Bytecode_loadconstant(mh, bci).result_type(); |
1602 | 390 break; |
391 } | |
0 | 392 |
393 default: | |
394 type = Bytecodes::result_type(code); | |
395 break; | |
396 } | |
397 | |
398 // return entry point for computed continuation state & bytecode length | |
399 return | |
400 is_top_frame | |
401 ? Interpreter::deopt_entry (as_TosState(type), length) | |
13010
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
402 : Interpreter::return_entry(as_TosState(type), length, code); |
0 | 403 } |
404 | |
900
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
405 // If deoptimization happens, this function returns the point where the interpreter reexecutes |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
406 // the bytecode. |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
407 // Note: Bytecodes::_athrow is a special case in that it does not return |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
408 // Interpreter::deopt_entry(vtos, 0) like others |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
409 address AbstractInterpreter::deopt_reexecute_entry(Method* method, address bcp) { |
900
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
410 assert(method->contains(bcp), "just checkin'"); |
2142 | 411 Bytecodes::Code code = Bytecodes::java_code_at(method, bcp); |
900
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
412 #ifdef COMPILER1 |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
413 if(code == Bytecodes::_athrow ) { |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
414 return Interpreter::rethrow_exception_entry(); |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
415 } |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
416 #endif /* COMPILER1 */ |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
417 return Interpreter::deopt_entry(vtos, 0); |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
418 } |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
419 |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
420 // If deoptimization happens, the interpreter should reexecute these bytecodes. |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
421 // This function mainly helps the compilers to set up the reexecute bit. |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
422 bool AbstractInterpreter::bytecode_should_reexecute(Bytecodes::Code code) { |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
423 switch (code) { |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
424 case Bytecodes::_lookupswitch: |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
425 case Bytecodes::_tableswitch: |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
426 case Bytecodes::_fast_binaryswitch: |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
427 case Bytecodes::_fast_linearswitch: |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
428 // recompute condtional expression folded into _if<cond> |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
429 case Bytecodes::_lcmp : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
430 case Bytecodes::_fcmpl : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
431 case Bytecodes::_fcmpg : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
432 case Bytecodes::_dcmpl : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
433 case Bytecodes::_dcmpg : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
434 case Bytecodes::_ifnull : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
435 case Bytecodes::_ifnonnull : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
436 case Bytecodes::_goto : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
437 case Bytecodes::_goto_w : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
438 case Bytecodes::_ifeq : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
439 case Bytecodes::_ifne : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
440 case Bytecodes::_iflt : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
441 case Bytecodes::_ifge : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
442 case Bytecodes::_ifgt : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
443 case Bytecodes::_ifle : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
444 case Bytecodes::_if_icmpeq : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
445 case Bytecodes::_if_icmpne : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
446 case Bytecodes::_if_icmplt : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
447 case Bytecodes::_if_icmpge : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
448 case Bytecodes::_if_icmpgt : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
449 case Bytecodes::_if_icmple : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
450 case Bytecodes::_if_acmpeq : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
451 case Bytecodes::_if_acmpne : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
452 // special cases |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
453 case Bytecodes::_getfield : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
454 case Bytecodes::_putfield : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
455 case Bytecodes::_getstatic : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
456 case Bytecodes::_putstatic : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
457 case Bytecodes::_aastore : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
458 #ifdef COMPILER1 |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
459 //special case of reexecution |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
460 case Bytecodes::_athrow : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
461 #endif |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
462 return true; |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
463 |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
464 default: |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
465 return false; |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
466 } |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
467 } |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
468 |
0 | 469 void AbstractInterpreterGenerator::bang_stack_shadow_pages(bool native_call) { |
470 // Quick & dirty stack overflow checking: bang the stack & handle trap. | |
471 // Note that we do the banging after the frame is setup, since the exception | |
472 // handling code expects to find a valid interpreter frame on the stack. | |
473 // Doing the banging earlier fails if the caller frame is not an interpreter | |
474 // frame. | |
475 // (Also, the exception throwing code expects to unlock any synchronized | |
476 // method receiever, so do the banging after locking the receiver.) | |
477 | |
478 // Bang each page in the shadow zone. We can't assume it's been done for | |
479 // an interpreter frame with greater than a page of locals, so each page | |
480 // needs to be checked. Only true for non-native. | |
481 if (UseStackBanging) { | |
482 const int start_page = native_call ? StackShadowPages : 1; | |
483 const int page_size = os::vm_page_size(); | |
484 for (int pages = start_page; pages <= StackShadowPages ; pages++) { | |
485 __ bang_stack_with_offset(pages*page_size); | |
486 } | |
487 } | |
488 } | |
6926 | 489 |
490 void AbstractInterpreterGenerator::initialize_method_handle_entries() { | |
491 // method handle entry kinds are generated later in MethodHandlesAdapterGenerator::generate: | |
492 for (int i = Interpreter::method_handle_invoke_FIRST; i <= Interpreter::method_handle_invoke_LAST; i++) { | |
493 Interpreter::MethodKind kind = (Interpreter::MethodKind) i; | |
494 Interpreter::_entry_table[kind] = Interpreter::_entry_table[Interpreter::abstract]; | |
495 } | |
496 } |