Mercurial > hg > truffle
annotate src/share/vm/interpreter/interpreter.cpp @ 1716:be3f9c242c9d
6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
Summary: GC workers now recognize an intermediate transient state of blocks which are allocated but have not yet completed initialization. blk_start() calls do not attempt to determine the size of a block in the transient state, rather waiting for the block to become initialized so that it is safe to query its size. Audited and ensured the order of initialization of object fields (klass, free bit and size) to respect block state transition protocol. Also included some new assertion checking code enabled in debug mode.
Reviewed-by: chrisphi, johnc, poonam
author | ysr |
---|---|
date | Mon, 16 Aug 2010 15:58:42 -0700 |
parents | 126ea7725993 |
children | f95d63e2154a |
rev | line source |
---|---|
0 | 1 /* |
1579 | 2 * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. |
0 | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | |
5 * This code is free software; you can redistribute it and/or modify it | |
6 * under the terms of the GNU General Public License version 2 only, as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 * | |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
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 | |
25 #include "incls/_precompiled.incl" | |
26 #include "incls/_interpreter.cpp.incl" | |
27 | |
28 # define __ _masm-> | |
29 | |
30 | |
31 //------------------------------------------------------------------------------------------------------------------------ | |
32 // Implementation of InterpreterCodelet | |
33 | |
34 void InterpreterCodelet::initialize(const char* description, Bytecodes::Code bytecode) { | |
35 _description = description; | |
36 _bytecode = bytecode; | |
37 } | |
38 | |
39 | |
40 void InterpreterCodelet::verify() { | |
41 } | |
42 | |
43 | |
1681
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1644
diff
changeset
|
44 void InterpreterCodelet::print_on(outputStream* st) const { |
0 | 45 if (PrintInterpreter) { |
1681
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1644
diff
changeset
|
46 st->cr(); |
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1644
diff
changeset
|
47 st->print_cr("----------------------------------------------------------------------"); |
0 | 48 } |
49 | |
1681
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1644
diff
changeset
|
50 if (description() != NULL) st->print("%s ", description()); |
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1644
diff
changeset
|
51 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
|
52 st->print_cr("[" INTPTR_FORMAT ", " INTPTR_FORMAT "] %d bytes", |
0 | 53 code_begin(), code_end(), code_size()); |
54 | |
55 if (PrintInterpreter) { | |
1681
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1644
diff
changeset
|
56 st->cr(); |
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1644
diff
changeset
|
57 Disassembler::decode(code_begin(), code_end(), st); |
0 | 58 } |
59 } | |
60 | |
61 | |
62 //------------------------------------------------------------------------------------------------------------------------ | |
63 // Implementation of platform independent aspects of Interpreter | |
64 | |
65 void AbstractInterpreter::initialize() { | |
66 if (_code != NULL) return; | |
67 | |
68 // make sure 'imported' classes are initialized | |
69 if (CountBytecodes || TraceBytecodes || StopInterpreterAt) BytecodeCounter::reset(); | |
70 if (PrintBytecodeHistogram) BytecodeHistogram::reset(); | |
71 if (PrintBytecodePairHistogram) BytecodePairHistogram::reset(); | |
72 | |
73 InvocationCounter::reinitialize(DelayCompilationDuringStartup); | |
74 | |
75 } | |
76 | |
77 void AbstractInterpreter::print() { | |
78 tty->cr(); | |
79 tty->print_cr("----------------------------------------------------------------------"); | |
80 tty->print_cr("Interpreter"); | |
81 tty->cr(); | |
82 tty->print_cr("code size = %6dK bytes", (int)_code->used_space()/1024); | |
83 tty->print_cr("total space = %6dK bytes", (int)_code->total_space()/1024); | |
84 tty->print_cr("wasted space = %6dK bytes", (int)_code->available_space()/1024); | |
85 tty->cr(); | |
86 tty->print_cr("# of codelets = %6d" , _code->number_of_stubs()); | |
87 tty->print_cr("avg codelet size = %6d bytes", _code->used_space() / _code->number_of_stubs()); | |
88 tty->cr(); | |
89 _code->print(); | |
90 tty->print_cr("----------------------------------------------------------------------"); | |
91 tty->cr(); | |
92 } | |
93 | |
94 | |
95 void interpreter_init() { | |
96 Interpreter::initialize(); | |
97 #ifndef PRODUCT | |
98 if (TraceBytecodes) BytecodeTracer::set_closure(BytecodeTracer::std_closure()); | |
99 #endif // PRODUCT | |
100 // need to hit every safepoint in order to call zapping routine | |
101 // register the interpreter | |
102 Forte::register_stub( | |
103 "Interpreter", | |
104 AbstractInterpreter::code()->code_start(), | |
105 AbstractInterpreter::code()->code_end() | |
106 ); | |
107 | |
108 // notify JVMTI profiler | |
109 if (JvmtiExport::should_post_dynamic_code_generated()) { | |
110 JvmtiExport::post_dynamic_code_generated("Interpreter", | |
111 AbstractInterpreter::code()->code_start(), | |
112 AbstractInterpreter::code()->code_end()); | |
113 } | |
114 } | |
115 | |
116 //------------------------------------------------------------------------------------------------------------------------ | |
117 // Implementation of interpreter | |
118 | |
119 StubQueue* AbstractInterpreter::_code = NULL; | |
120 bool AbstractInterpreter::_notice_safepoints = false; | |
121 address AbstractInterpreter::_rethrow_exception_entry = NULL; | |
122 | |
123 address AbstractInterpreter::_native_entry_begin = NULL; | |
124 address AbstractInterpreter::_native_entry_end = NULL; | |
125 address AbstractInterpreter::_slow_signature_handler; | |
126 address AbstractInterpreter::_entry_table [AbstractInterpreter::number_of_method_entries]; | |
127 address AbstractInterpreter::_native_abi_to_tosca [AbstractInterpreter::number_of_result_handlers]; | |
128 | |
129 //------------------------------------------------------------------------------------------------------------------------ | |
130 // Generation of complete interpreter | |
131 | |
132 AbstractInterpreterGenerator::AbstractInterpreterGenerator(StubQueue* _code) { | |
133 _masm = NULL; | |
134 } | |
135 | |
136 | |
137 static const BasicType types[Interpreter::number_of_result_handlers] = { | |
138 T_BOOLEAN, | |
139 T_CHAR , | |
140 T_BYTE , | |
141 T_SHORT , | |
142 T_INT , | |
143 T_LONG , | |
144 T_VOID , | |
145 T_FLOAT , | |
146 T_DOUBLE , | |
147 T_OBJECT | |
148 }; | |
149 | |
150 void AbstractInterpreterGenerator::generate_all() { | |
151 | |
152 | |
153 { CodeletMark cm(_masm, "slow signature handler"); | |
154 Interpreter::_slow_signature_handler = generate_slow_signature_handler(); | |
155 } | |
156 | |
157 } | |
158 | |
159 //------------------------------------------------------------------------------------------------------------------------ | |
160 // Entry points | |
161 | |
162 AbstractInterpreter::MethodKind AbstractInterpreter::method_kind(methodHandle m) { | |
163 // Abstract method? | |
164 if (m->is_abstract()) return abstract; | |
165 | |
710 | 166 // Invoker for method handles? |
167 if (m->is_method_handle_invoke()) return method_handle; | |
168 | |
0 | 169 // Native method? |
170 // Note: This test must come _before_ the test for intrinsic | |
171 // methods. See also comments below. | |
172 if (m->is_native()) { | |
710 | 173 assert(!m->is_method_handle_invoke(), "overlapping bits here, watch out"); |
0 | 174 return m->is_synchronized() ? native_synchronized : native; |
175 } | |
176 | |
177 // Synchronized? | |
178 if (m->is_synchronized()) { | |
179 return zerolocals_synchronized; | |
180 } | |
181 | |
182 if (RegisterFinalizersAtInit && m->code_size() == 1 && | |
183 m->intrinsic_id() == vmIntrinsics::_Object_init) { | |
184 // We need to execute the special return bytecode to check for | |
185 // finalizer registration so create a normal frame. | |
186 return zerolocals; | |
187 } | |
188 | |
189 // Empty method? | |
190 if (m->is_empty_method()) { | |
191 return empty; | |
192 } | |
193 | |
194 // Accessor method? | |
195 if (m->is_accessor()) { | |
196 assert(m->size_of_parameters() == 1, "fast code for accessors assumes parameter size = 1"); | |
197 return accessor; | |
198 } | |
199 | |
200 // Special intrinsic method? | |
201 // Note: This test must come _after_ the test for native methods, | |
202 // otherwise we will run into problems with JDK 1.2, see also | |
203 // AbstractInterpreterGenerator::generate_method_entry() for | |
204 // for details. | |
205 switch (m->intrinsic_id()) { | |
206 case vmIntrinsics::_dsin : return java_lang_math_sin ; | |
207 case vmIntrinsics::_dcos : return java_lang_math_cos ; | |
208 case vmIntrinsics::_dtan : return java_lang_math_tan ; | |
209 case vmIntrinsics::_dabs : return java_lang_math_abs ; | |
210 case vmIntrinsics::_dsqrt : return java_lang_math_sqrt ; | |
211 case vmIntrinsics::_dlog : return java_lang_math_log ; | |
212 case vmIntrinsics::_dlog10: return java_lang_math_log10; | |
213 } | |
214 | |
215 // Note: for now: zero locals for all non-empty methods | |
216 return zerolocals; | |
217 } | |
218 | |
219 | |
220 // Return true if the interpreter can prove that the given bytecode has | |
221 // not yet been executed (in Java semantics, not in actual operation). | |
222 bool AbstractInterpreter::is_not_reached(methodHandle method, int bci) { | |
223 address bcp = method->bcp_from(bci); | |
1565 | 224 Bytecodes::Code code = Bytecodes::code_at(bcp, method()); |
0 | 225 |
1565 | 226 if (!Bytecode_at(bcp)->must_rewrite(code)) { |
0 | 227 // might have been reached |
228 return false; | |
229 } | |
230 | |
231 // the bytecode might not be rewritten if the method is an accessor, etc. | |
232 address ientry = method->interpreter_entry(); | |
233 if (ientry != entry_for_kind(AbstractInterpreter::zerolocals) && | |
234 ientry != entry_for_kind(AbstractInterpreter::zerolocals_synchronized)) | |
235 return false; // interpreter does not run this method! | |
236 | |
237 // otherwise, we can be sure this bytecode has never been executed | |
238 return true; | |
239 } | |
240 | |
241 | |
242 #ifndef PRODUCT | |
243 void AbstractInterpreter::print_method_kind(MethodKind kind) { | |
244 switch (kind) { | |
245 case zerolocals : tty->print("zerolocals" ); break; | |
246 case zerolocals_synchronized: tty->print("zerolocals_synchronized"); break; | |
247 case native : tty->print("native" ); break; | |
248 case native_synchronized : tty->print("native_synchronized" ); break; | |
249 case empty : tty->print("empty" ); break; | |
250 case accessor : tty->print("accessor" ); break; | |
251 case abstract : tty->print("abstract" ); break; | |
710 | 252 case method_handle : tty->print("method_handle" ); break; |
0 | 253 case java_lang_math_sin : tty->print("java_lang_math_sin" ); break; |
254 case java_lang_math_cos : tty->print("java_lang_math_cos" ); break; | |
255 case java_lang_math_tan : tty->print("java_lang_math_tan" ); break; | |
256 case java_lang_math_abs : tty->print("java_lang_math_abs" ); break; | |
257 case java_lang_math_sqrt : tty->print("java_lang_math_sqrt" ); break; | |
258 case java_lang_math_log : tty->print("java_lang_math_log" ); break; | |
259 case java_lang_math_log10 : tty->print("java_lang_math_log10" ); break; | |
260 default : ShouldNotReachHere(); | |
261 } | |
262 } | |
263 #endif // PRODUCT | |
264 | |
265 | |
266 //------------------------------------------------------------------------------------------------------------------------ | |
267 // Deoptimization support | |
268 | |
900
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
269 // 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
|
270 address AbstractInterpreter::deopt_continue_after_entry(methodOop method, address bcp, int callee_parameters, bool is_top_frame) { |
0 | 271 assert(method->contains(bcp), "just checkin'"); |
272 Bytecodes::Code code = Bytecodes::java_code_at(bcp); | |
900
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
273 assert(!Interpreter::bytecode_should_reexecute(code), "should not reexecute"); |
0 | 274 int bci = method->bci_from(bcp); |
275 int length = -1; // initial value for debugging | |
276 // compute continuation length | |
277 length = Bytecodes::length_at(bcp); | |
278 // compute result type | |
279 BasicType type = T_ILLEGAL; | |
900
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
280 |
0 | 281 switch (code) { |
282 case Bytecodes::_invokevirtual : | |
283 case Bytecodes::_invokespecial : | |
284 case Bytecodes::_invokestatic : | |
285 case Bytecodes::_invokeinterface: { | |
286 Thread *thread = Thread::current(); | |
287 ResourceMark rm(thread); | |
288 methodHandle mh(thread, method); | |
289 type = Bytecode_invoke_at(mh, bci)->result_type(thread); | |
290 // since the cache entry might not be initialized: | |
291 // (NOT needed for the old calling convension) | |
292 if (!is_top_frame) { | |
293 int index = Bytes::get_native_u2(bcp+1); | |
294 method->constants()->cache()->entry_at(index)->set_parameter_size(callee_parameters); | |
295 } | |
296 break; | |
297 } | |
298 | |
1059
389049f3f393
6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents:
900
diff
changeset
|
299 case Bytecodes::_invokedynamic: { |
389049f3f393
6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents:
900
diff
changeset
|
300 Thread *thread = Thread::current(); |
389049f3f393
6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents:
900
diff
changeset
|
301 ResourceMark rm(thread); |
389049f3f393
6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents:
900
diff
changeset
|
302 methodHandle mh(thread, method); |
389049f3f393
6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents:
900
diff
changeset
|
303 type = Bytecode_invoke_at(mh, bci)->result_type(thread); |
389049f3f393
6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents:
900
diff
changeset
|
304 // since the cache entry might not be initialized: |
389049f3f393
6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents:
900
diff
changeset
|
305 // (NOT needed for the old calling convension) |
389049f3f393
6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents:
900
diff
changeset
|
306 if (!is_top_frame) { |
389049f3f393
6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents:
900
diff
changeset
|
307 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
|
308 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
|
309 } |
389049f3f393
6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents:
900
diff
changeset
|
310 break; |
389049f3f393
6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents:
900
diff
changeset
|
311 } |
389049f3f393
6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents:
900
diff
changeset
|
312 |
0 | 313 case Bytecodes::_ldc : |
314 case Bytecodes::_ldc_w : // fall through | |
315 case Bytecodes::_ldc2_w: | |
1602 | 316 { |
317 Thread *thread = Thread::current(); | |
318 ResourceMark rm(thread); | |
319 methodHandle mh(thread, method); | |
320 type = Bytecode_loadconstant_at(mh, bci)->result_type(); | |
321 break; | |
322 } | |
0 | 323 |
324 default: | |
325 type = Bytecodes::result_type(code); | |
326 break; | |
327 } | |
328 | |
329 // return entry point for computed continuation state & bytecode length | |
330 return | |
331 is_top_frame | |
332 ? Interpreter::deopt_entry (as_TosState(type), length) | |
333 : Interpreter::return_entry(as_TosState(type), length); | |
334 } | |
335 | |
900
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
336 // 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
|
337 // the bytecode. |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
338 // 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
|
339 // Interpreter::deopt_entry(vtos, 0) like others |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
340 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
|
341 assert(method->contains(bcp), "just checkin'"); |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
342 Bytecodes::Code code = Bytecodes::java_code_at(bcp); |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
343 #ifdef COMPILER1 |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
344 if(code == Bytecodes::_athrow ) { |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
345 return Interpreter::rethrow_exception_entry(); |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
346 } |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
347 #endif /* COMPILER1 */ |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
348 return Interpreter::deopt_entry(vtos, 0); |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
349 } |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
350 |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
351 // 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
|
352 // 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
|
353 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
|
354 switch (code) { |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
355 case Bytecodes::_lookupswitch: |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
356 case Bytecodes::_tableswitch: |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
357 case Bytecodes::_fast_binaryswitch: |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
358 case Bytecodes::_fast_linearswitch: |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
359 // recompute condtional expression folded into _if<cond> |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
360 case Bytecodes::_lcmp : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
361 case Bytecodes::_fcmpl : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
362 case Bytecodes::_fcmpg : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
363 case Bytecodes::_dcmpl : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
364 case Bytecodes::_dcmpg : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
365 case Bytecodes::_ifnull : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
366 case Bytecodes::_ifnonnull : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
367 case Bytecodes::_goto : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
368 case Bytecodes::_goto_w : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
369 case Bytecodes::_ifeq : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
370 case Bytecodes::_ifne : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
371 case Bytecodes::_iflt : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
372 case Bytecodes::_ifge : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
373 case Bytecodes::_ifgt : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
374 case Bytecodes::_ifle : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
375 case Bytecodes::_if_icmpeq : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
376 case Bytecodes::_if_icmpne : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
377 case Bytecodes::_if_icmplt : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
378 case Bytecodes::_if_icmpge : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
379 case Bytecodes::_if_icmpgt : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
380 case Bytecodes::_if_icmple : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
381 case Bytecodes::_if_acmpeq : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
382 case Bytecodes::_if_acmpne : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
383 // special cases |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
384 case Bytecodes::_getfield : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
385 case Bytecodes::_putfield : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
386 case Bytecodes::_getstatic : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
387 case Bytecodes::_putstatic : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
388 case Bytecodes::_aastore : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
389 #ifdef COMPILER1 |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
390 //special case of reexecution |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
391 case Bytecodes::_athrow : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
392 #endif |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
393 return true; |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
394 |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
395 default: |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
396 return false; |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
397 } |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
398 } |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
399 |
0 | 400 void AbstractInterpreterGenerator::bang_stack_shadow_pages(bool native_call) { |
401 // Quick & dirty stack overflow checking: bang the stack & handle trap. | |
402 // Note that we do the banging after the frame is setup, since the exception | |
403 // handling code expects to find a valid interpreter frame on the stack. | |
404 // Doing the banging earlier fails if the caller frame is not an interpreter | |
405 // frame. | |
406 // (Also, the exception throwing code expects to unlock any synchronized | |
407 // method receiever, so do the banging after locking the receiver.) | |
408 | |
409 // Bang each page in the shadow zone. We can't assume it's been done for | |
410 // an interpreter frame with greater than a page of locals, so each page | |
411 // needs to be checked. Only true for non-native. | |
412 if (UseStackBanging) { | |
413 const int start_page = native_call ? StackShadowPages : 1; | |
414 const int page_size = os::vm_page_size(); | |
415 for (int pages = start_page; pages <= StackShadowPages ; pages++) { | |
416 __ bang_stack_with_offset(pages*page_size); | |
417 } | |
418 } | |
419 } |