Mercurial > hg > graal-compiler
annotate src/share/vm/interpreter/interpreter.cpp @ 3992:d1bdeef3e3e2
7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
Summary: There is a race between one thread successfully forwarding and copying the klass mirror for the SoftReference class (including the static master clock) and another thread attempting to use the master clock while attempting to discover a soft reference object. Maintain a shadow copy of the soft reference master clock and use the shadow during reference discovery and reference processing.
Reviewed-by: tonyp, brutisso, ysr
author | johnc |
---|---|
date | Wed, 12 Oct 2011 10:25:51 -0700 |
parents | e1162778c1c8 |
children | a03f3fd16b22 6759698e3140 |
rev | line source |
---|---|
0 | 1 /* |
2142 | 2 * Copyright (c) 1997, 2011, 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" |
26 #include "asm/assembler.hpp" | |
27 #include "interpreter/bytecodeHistogram.hpp" | |
28 #include "interpreter/bytecodeInterpreter.hpp" | |
29 #include "interpreter/interpreter.hpp" | |
30 #include "interpreter/interpreterRuntime.hpp" | |
31 #include "interpreter/templateTable.hpp" | |
32 #include "memory/allocation.inline.hpp" | |
33 #include "memory/resourceArea.hpp" | |
34 #include "oops/arrayOop.hpp" | |
35 #include "oops/methodDataOop.hpp" | |
36 #include "oops/methodOop.hpp" | |
37 #include "oops/oop.inline.hpp" | |
38 #include "prims/forte.hpp" | |
39 #include "prims/jvmtiExport.hpp" | |
40 #include "runtime/handles.inline.hpp" | |
41 #include "runtime/sharedRuntime.hpp" | |
42 #include "runtime/stubRoutines.hpp" | |
43 #include "runtime/timer.hpp" | |
0 | 44 |
45 # define __ _masm-> | |
46 | |
47 | |
48 //------------------------------------------------------------------------------------------------------------------------ | |
49 // Implementation of InterpreterCodelet | |
50 | |
51 void InterpreterCodelet::initialize(const char* description, Bytecodes::Code bytecode) { | |
52 _description = description; | |
53 _bytecode = bytecode; | |
54 } | |
55 | |
56 | |
57 void InterpreterCodelet::verify() { | |
58 } | |
59 | |
60 | |
1681
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1644
diff
changeset
|
61 void InterpreterCodelet::print_on(outputStream* st) const { |
0 | 62 if (PrintInterpreter) { |
1681
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1644
diff
changeset
|
63 st->cr(); |
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1644
diff
changeset
|
64 st->print_cr("----------------------------------------------------------------------"); |
0 | 65 } |
66 | |
1681
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1644
diff
changeset
|
67 if (description() != NULL) st->print("%s ", description()); |
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1644
diff
changeset
|
68 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
|
69 st->print_cr("[" INTPTR_FORMAT ", " INTPTR_FORMAT "] %d bytes", |
0 | 70 code_begin(), code_end(), code_size()); |
71 | |
72 if (PrintInterpreter) { | |
1681
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1644
diff
changeset
|
73 st->cr(); |
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1644
diff
changeset
|
74 Disassembler::decode(code_begin(), code_end(), st); |
0 | 75 } |
76 } | |
77 | |
78 | |
79 //------------------------------------------------------------------------------------------------------------------------ | |
80 // Implementation of platform independent aspects of Interpreter | |
81 | |
82 void AbstractInterpreter::initialize() { | |
83 if (_code != NULL) return; | |
84 | |
85 // make sure 'imported' classes are initialized | |
86 if (CountBytecodes || TraceBytecodes || StopInterpreterAt) BytecodeCounter::reset(); | |
87 if (PrintBytecodeHistogram) BytecodeHistogram::reset(); | |
88 if (PrintBytecodePairHistogram) BytecodePairHistogram::reset(); | |
89 | |
90 InvocationCounter::reinitialize(DelayCompilationDuringStartup); | |
91 | |
92 } | |
93 | |
94 void AbstractInterpreter::print() { | |
95 tty->cr(); | |
96 tty->print_cr("----------------------------------------------------------------------"); | |
97 tty->print_cr("Interpreter"); | |
98 tty->cr(); | |
99 tty->print_cr("code size = %6dK bytes", (int)_code->used_space()/1024); | |
100 tty->print_cr("total space = %6dK bytes", (int)_code->total_space()/1024); | |
101 tty->print_cr("wasted space = %6dK bytes", (int)_code->available_space()/1024); | |
102 tty->cr(); | |
103 tty->print_cr("# of codelets = %6d" , _code->number_of_stubs()); | |
104 tty->print_cr("avg codelet size = %6d bytes", _code->used_space() / _code->number_of_stubs()); | |
105 tty->cr(); | |
106 _code->print(); | |
107 tty->print_cr("----------------------------------------------------------------------"); | |
108 tty->cr(); | |
109 } | |
110 | |
111 | |
112 void interpreter_init() { | |
113 Interpreter::initialize(); | |
114 #ifndef PRODUCT | |
115 if (TraceBytecodes) BytecodeTracer::set_closure(BytecodeTracer::std_closure()); | |
116 #endif // PRODUCT | |
117 // need to hit every safepoint in order to call zapping routine | |
118 // register the interpreter | |
119 Forte::register_stub( | |
120 "Interpreter", | |
121 AbstractInterpreter::code()->code_start(), | |
122 AbstractInterpreter::code()->code_end() | |
123 ); | |
124 | |
125 // notify JVMTI profiler | |
126 if (JvmtiExport::should_post_dynamic_code_generated()) { | |
127 JvmtiExport::post_dynamic_code_generated("Interpreter", | |
128 AbstractInterpreter::code()->code_start(), | |
129 AbstractInterpreter::code()->code_end()); | |
130 } | |
131 } | |
132 | |
133 //------------------------------------------------------------------------------------------------------------------------ | |
134 // Implementation of interpreter | |
135 | |
136 StubQueue* AbstractInterpreter::_code = NULL; | |
137 bool AbstractInterpreter::_notice_safepoints = false; | |
138 address AbstractInterpreter::_rethrow_exception_entry = NULL; | |
139 | |
140 address AbstractInterpreter::_native_entry_begin = NULL; | |
141 address AbstractInterpreter::_native_entry_end = NULL; | |
142 address AbstractInterpreter::_slow_signature_handler; | |
143 address AbstractInterpreter::_entry_table [AbstractInterpreter::number_of_method_entries]; | |
144 address AbstractInterpreter::_native_abi_to_tosca [AbstractInterpreter::number_of_result_handlers]; | |
145 | |
146 //------------------------------------------------------------------------------------------------------------------------ | |
147 // Generation of complete interpreter | |
148 | |
149 AbstractInterpreterGenerator::AbstractInterpreterGenerator(StubQueue* _code) { | |
150 _masm = NULL; | |
151 } | |
152 | |
153 | |
154 static const BasicType types[Interpreter::number_of_result_handlers] = { | |
155 T_BOOLEAN, | |
156 T_CHAR , | |
157 T_BYTE , | |
158 T_SHORT , | |
159 T_INT , | |
160 T_LONG , | |
161 T_VOID , | |
162 T_FLOAT , | |
163 T_DOUBLE , | |
164 T_OBJECT | |
165 }; | |
166 | |
167 void AbstractInterpreterGenerator::generate_all() { | |
168 | |
169 | |
170 { CodeletMark cm(_masm, "slow signature handler"); | |
171 Interpreter::_slow_signature_handler = generate_slow_signature_handler(); | |
172 } | |
173 | |
174 } | |
175 | |
176 //------------------------------------------------------------------------------------------------------------------------ | |
177 // Entry points | |
178 | |
179 AbstractInterpreter::MethodKind AbstractInterpreter::method_kind(methodHandle m) { | |
180 // Abstract method? | |
181 if (m->is_abstract()) return abstract; | |
182 | |
710 | 183 // Invoker for method handles? |
184 if (m->is_method_handle_invoke()) return method_handle; | |
185 | |
0 | 186 // Native method? |
187 // Note: This test must come _before_ the test for intrinsic | |
188 // methods. See also comments below. | |
189 if (m->is_native()) { | |
710 | 190 assert(!m->is_method_handle_invoke(), "overlapping bits here, watch out"); |
0 | 191 return m->is_synchronized() ? native_synchronized : native; |
192 } | |
193 | |
194 // Synchronized? | |
195 if (m->is_synchronized()) { | |
196 return zerolocals_synchronized; | |
197 } | |
198 | |
199 if (RegisterFinalizersAtInit && m->code_size() == 1 && | |
200 m->intrinsic_id() == vmIntrinsics::_Object_init) { | |
201 // We need to execute the special return bytecode to check for | |
202 // finalizer registration so create a normal frame. | |
203 return zerolocals; | |
204 } | |
205 | |
206 // Empty method? | |
207 if (m->is_empty_method()) { | |
208 return empty; | |
209 } | |
210 | |
211 // Special intrinsic method? | |
212 // Note: This test must come _after_ the test for native methods, | |
213 // otherwise we will run into problems with JDK 1.2, see also | |
214 // AbstractInterpreterGenerator::generate_method_entry() for | |
215 // for details. | |
216 switch (m->intrinsic_id()) { | |
217 case vmIntrinsics::_dsin : return java_lang_math_sin ; | |
218 case vmIntrinsics::_dcos : return java_lang_math_cos ; | |
219 case vmIntrinsics::_dtan : return java_lang_math_tan ; | |
220 case vmIntrinsics::_dabs : return java_lang_math_abs ; | |
221 case vmIntrinsics::_dsqrt : return java_lang_math_sqrt ; | |
222 case vmIntrinsics::_dlog : return java_lang_math_log ; | |
223 case vmIntrinsics::_dlog10: return java_lang_math_log10; | |
3249
e1162778c1c8
7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents:
2177
diff
changeset
|
224 |
e1162778c1c8
7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents:
2177
diff
changeset
|
225 case vmIntrinsics::_Reference_get: |
e1162778c1c8
7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents:
2177
diff
changeset
|
226 return java_lang_ref_reference_get; |
e1162778c1c8
7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents:
2177
diff
changeset
|
227 } |
e1162778c1c8
7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents:
2177
diff
changeset
|
228 |
e1162778c1c8
7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents:
2177
diff
changeset
|
229 // Accessor method? |
e1162778c1c8
7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents:
2177
diff
changeset
|
230 if (m->is_accessor()) { |
e1162778c1c8
7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents:
2177
diff
changeset
|
231 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
|
232 return accessor; |
0 | 233 } |
234 | |
235 // Note: for now: zero locals for all non-empty methods | |
236 return zerolocals; | |
237 } | |
238 | |
239 | |
240 // Return true if the interpreter can prove that the given bytecode has | |
241 // not yet been executed (in Java semantics, not in actual operation). | |
242 bool AbstractInterpreter::is_not_reached(methodHandle method, int bci) { | |
2142 | 243 Bytecodes::Code code = method()->code_at(bci); |
0 | 244 |
2142 | 245 if (!Bytecodes::must_rewrite(code)) { |
0 | 246 // might have been reached |
247 return false; | |
248 } | |
249 | |
250 // the bytecode might not be rewritten if the method is an accessor, etc. | |
251 address ientry = method->interpreter_entry(); | |
252 if (ientry != entry_for_kind(AbstractInterpreter::zerolocals) && | |
253 ientry != entry_for_kind(AbstractInterpreter::zerolocals_synchronized)) | |
254 return false; // interpreter does not run this method! | |
255 | |
256 // otherwise, we can be sure this bytecode has never been executed | |
257 return true; | |
258 } | |
259 | |
260 | |
261 #ifndef PRODUCT | |
262 void AbstractInterpreter::print_method_kind(MethodKind kind) { | |
263 switch (kind) { | |
264 case zerolocals : tty->print("zerolocals" ); break; | |
265 case zerolocals_synchronized: tty->print("zerolocals_synchronized"); break; | |
266 case native : tty->print("native" ); break; | |
267 case native_synchronized : tty->print("native_synchronized" ); break; | |
268 case empty : tty->print("empty" ); break; | |
269 case accessor : tty->print("accessor" ); break; | |
270 case abstract : tty->print("abstract" ); break; | |
710 | 271 case method_handle : tty->print("method_handle" ); break; |
0 | 272 case java_lang_math_sin : tty->print("java_lang_math_sin" ); break; |
273 case java_lang_math_cos : tty->print("java_lang_math_cos" ); break; | |
274 case java_lang_math_tan : tty->print("java_lang_math_tan" ); break; | |
275 case java_lang_math_abs : tty->print("java_lang_math_abs" ); break; | |
276 case java_lang_math_sqrt : tty->print("java_lang_math_sqrt" ); break; | |
277 case java_lang_math_log : tty->print("java_lang_math_log" ); break; | |
278 case java_lang_math_log10 : tty->print("java_lang_math_log10" ); break; | |
279 default : ShouldNotReachHere(); | |
280 } | |
281 } | |
282 #endif // PRODUCT | |
283 | |
284 | |
285 //------------------------------------------------------------------------------------------------------------------------ | |
286 // Deoptimization support | |
287 | |
900
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
288 // If deoptimization happens, this function returns the point of next bytecode to continue execution |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
289 address AbstractInterpreter::deopt_continue_after_entry(methodOop method, address bcp, int callee_parameters, bool is_top_frame) { |
0 | 290 assert(method->contains(bcp), "just checkin'"); |
2142 | 291 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
|
292 assert(!Interpreter::bytecode_should_reexecute(code), "should not reexecute"); |
0 | 293 int bci = method->bci_from(bcp); |
294 int length = -1; // initial value for debugging | |
295 // compute continuation length | |
2142 | 296 length = Bytecodes::length_at(method, bcp); |
0 | 297 // compute result type |
298 BasicType type = T_ILLEGAL; | |
900
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
299 |
0 | 300 switch (code) { |
301 case Bytecodes::_invokevirtual : | |
302 case Bytecodes::_invokespecial : | |
303 case Bytecodes::_invokestatic : | |
304 case Bytecodes::_invokeinterface: { | |
305 Thread *thread = Thread::current(); | |
306 ResourceMark rm(thread); | |
307 methodHandle mh(thread, method); | |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2142
diff
changeset
|
308 type = Bytecode_invoke(mh, bci).result_type(); |
0 | 309 // since the cache entry might not be initialized: |
310 // (NOT needed for the old calling convension) | |
311 if (!is_top_frame) { | |
312 int index = Bytes::get_native_u2(bcp+1); | |
313 method->constants()->cache()->entry_at(index)->set_parameter_size(callee_parameters); | |
314 } | |
315 break; | |
316 } | |
317 | |
1059
389049f3f393
6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents:
900
diff
changeset
|
318 case Bytecodes::_invokedynamic: { |
389049f3f393
6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents:
900
diff
changeset
|
319 Thread *thread = Thread::current(); |
389049f3f393
6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents:
900
diff
changeset
|
320 ResourceMark rm(thread); |
389049f3f393
6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents:
900
diff
changeset
|
321 methodHandle mh(thread, method); |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2142
diff
changeset
|
322 type = Bytecode_invoke(mh, bci).result_type(); |
1059
389049f3f393
6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents:
900
diff
changeset
|
323 // since the cache entry might not be initialized: |
389049f3f393
6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents:
900
diff
changeset
|
324 // (NOT needed for the old calling convension) |
389049f3f393
6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents:
900
diff
changeset
|
325 if (!is_top_frame) { |
389049f3f393
6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents:
900
diff
changeset
|
326 int index = Bytes::get_native_u4(bcp+1); |
1135
e66fd840cb6b
6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents:
1059
diff
changeset
|
327 method->constants()->cache()->secondary_entry_at(index)->set_parameter_size(callee_parameters); |
1059
389049f3f393
6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents:
900
diff
changeset
|
328 } |
389049f3f393
6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents:
900
diff
changeset
|
329 break; |
389049f3f393
6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents:
900
diff
changeset
|
330 } |
389049f3f393
6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents:
900
diff
changeset
|
331 |
0 | 332 case Bytecodes::_ldc : |
333 case Bytecodes::_ldc_w : // fall through | |
334 case Bytecodes::_ldc2_w: | |
1602 | 335 { |
336 Thread *thread = Thread::current(); | |
337 ResourceMark rm(thread); | |
338 methodHandle mh(thread, method); | |
2142 | 339 type = Bytecode_loadconstant(mh, bci).result_type(); |
1602 | 340 break; |
341 } | |
0 | 342 |
343 default: | |
344 type = Bytecodes::result_type(code); | |
345 break; | |
346 } | |
347 | |
348 // return entry point for computed continuation state & bytecode length | |
349 return | |
350 is_top_frame | |
351 ? Interpreter::deopt_entry (as_TosState(type), length) | |
352 : Interpreter::return_entry(as_TosState(type), length); | |
353 } | |
354 | |
900
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
355 // 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
|
356 // the bytecode. |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
357 // 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
|
358 // Interpreter::deopt_entry(vtos, 0) like others |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
359 address AbstractInterpreter::deopt_reexecute_entry(methodOop method, address bcp) { |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
360 assert(method->contains(bcp), "just checkin'"); |
2142 | 361 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
|
362 #ifdef COMPILER1 |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
363 if(code == Bytecodes::_athrow ) { |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
364 return Interpreter::rethrow_exception_entry(); |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
365 } |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
366 #endif /* COMPILER1 */ |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
367 return Interpreter::deopt_entry(vtos, 0); |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
368 } |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
369 |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
370 // 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
|
371 // 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
|
372 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
|
373 switch (code) { |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
374 case Bytecodes::_lookupswitch: |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
375 case Bytecodes::_tableswitch: |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
376 case Bytecodes::_fast_binaryswitch: |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
377 case Bytecodes::_fast_linearswitch: |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
378 // recompute condtional expression folded into _if<cond> |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
379 case Bytecodes::_lcmp : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
380 case Bytecodes::_fcmpl : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
381 case Bytecodes::_fcmpg : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
382 case Bytecodes::_dcmpl : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
383 case Bytecodes::_dcmpg : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
384 case Bytecodes::_ifnull : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
385 case Bytecodes::_ifnonnull : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
386 case Bytecodes::_goto : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
387 case Bytecodes::_goto_w : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
388 case Bytecodes::_ifeq : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
389 case Bytecodes::_ifne : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
390 case Bytecodes::_iflt : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
391 case Bytecodes::_ifge : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
392 case Bytecodes::_ifgt : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
393 case Bytecodes::_ifle : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
394 case Bytecodes::_if_icmpeq : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
395 case Bytecodes::_if_icmpne : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
396 case Bytecodes::_if_icmplt : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
397 case Bytecodes::_if_icmpge : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
398 case Bytecodes::_if_icmpgt : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
399 case Bytecodes::_if_icmple : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
400 case Bytecodes::_if_acmpeq : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
401 case Bytecodes::_if_acmpne : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
402 // special cases |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
403 case Bytecodes::_getfield : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
404 case Bytecodes::_putfield : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
405 case Bytecodes::_getstatic : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
406 case Bytecodes::_putstatic : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
407 case Bytecodes::_aastore : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
408 #ifdef COMPILER1 |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
409 //special case of reexecution |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
410 case Bytecodes::_athrow : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
411 #endif |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
412 return true; |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
413 |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
414 default: |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
415 return false; |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
416 } |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
417 } |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
418 |
0 | 419 void AbstractInterpreterGenerator::bang_stack_shadow_pages(bool native_call) { |
420 // Quick & dirty stack overflow checking: bang the stack & handle trap. | |
421 // Note that we do the banging after the frame is setup, since the exception | |
422 // handling code expects to find a valid interpreter frame on the stack. | |
423 // Doing the banging earlier fails if the caller frame is not an interpreter | |
424 // frame. | |
425 // (Also, the exception throwing code expects to unlock any synchronized | |
426 // method receiever, so do the banging after locking the receiver.) | |
427 | |
428 // Bang each page in the shadow zone. We can't assume it's been done for | |
429 // an interpreter frame with greater than a page of locals, so each page | |
430 // needs to be checked. Only true for non-native. | |
431 if (UseStackBanging) { | |
432 const int start_page = native_call ? StackShadowPages : 1; | |
433 const int page_size = os::vm_page_size(); | |
434 for (int pages = start_page; pages <= StackShadowPages ; pages++) { | |
435 __ bang_stack_with_offset(pages*page_size); | |
436 } | |
437 } | |
438 } |