Mercurial > hg > graal-compiler
annotate src/share/vm/interpreter/interpreter.cpp @ 1091:6aa7255741f3
6906727: UseCompressedOops: some card-marking fixes related to object arrays
Summary: Introduced a new write_ref_array(HeapWords* start, size_t count) method that does the requisite MemRegion range calculation so (some of the) clients of the erstwhile write_ref_array(MemRegion mr) do not need to worry. This removed all external uses of array_size(), which was also simplified and made private. Asserts were added to catch other possible issues. Further, less essential, fixes stemming from this investigation are deferred to CR 6904516 (to follow shortly in hs17).
Reviewed-by: kvn, coleenp, jmasa
author | ysr |
---|---|
date | Thu, 03 Dec 2009 15:01:57 -0800 |
parents | 9987d9d5eb0e |
children | 389049f3f393 |
rev | line source |
---|---|
0 | 1 /* |
710 | 2 * Copyright 1997-2009 Sun Microsystems, Inc. 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 * | |
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, | |
20 * CA 95054 USA or visit www.sun.com if you need additional information or | |
21 * have any questions. | |
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 | |
44 void InterpreterCodelet::print() { | |
45 if (PrintInterpreter) { | |
46 tty->cr(); | |
47 tty->print_cr("----------------------------------------------------------------------"); | |
48 } | |
49 | |
50 if (description() != NULL) tty->print("%s ", description()); | |
51 if (bytecode() >= 0 ) tty->print("%d %s ", bytecode(), Bytecodes::name(bytecode())); | |
52 tty->print_cr("[" INTPTR_FORMAT ", " INTPTR_FORMAT "] %d bytes", | |
53 code_begin(), code_end(), code_size()); | |
54 | |
55 if (PrintInterpreter) { | |
56 tty->cr(); | |
57 Disassembler::decode(code_begin(), code_end(), tty); | |
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 VTune::register_stub( | |
103 "Interpreter", | |
104 AbstractInterpreter::code()->code_start(), | |
105 AbstractInterpreter::code()->code_end() | |
106 ); | |
107 Forte::register_stub( | |
108 "Interpreter", | |
109 AbstractInterpreter::code()->code_start(), | |
110 AbstractInterpreter::code()->code_end() | |
111 ); | |
112 | |
113 // notify JVMTI profiler | |
114 if (JvmtiExport::should_post_dynamic_code_generated()) { | |
115 JvmtiExport::post_dynamic_code_generated("Interpreter", | |
116 AbstractInterpreter::code()->code_start(), | |
117 AbstractInterpreter::code()->code_end()); | |
118 } | |
119 } | |
120 | |
121 //------------------------------------------------------------------------------------------------------------------------ | |
122 // Implementation of interpreter | |
123 | |
124 StubQueue* AbstractInterpreter::_code = NULL; | |
125 bool AbstractInterpreter::_notice_safepoints = false; | |
126 address AbstractInterpreter::_rethrow_exception_entry = NULL; | |
127 | |
128 address AbstractInterpreter::_native_entry_begin = NULL; | |
129 address AbstractInterpreter::_native_entry_end = NULL; | |
130 address AbstractInterpreter::_slow_signature_handler; | |
131 address AbstractInterpreter::_entry_table [AbstractInterpreter::number_of_method_entries]; | |
132 address AbstractInterpreter::_native_abi_to_tosca [AbstractInterpreter::number_of_result_handlers]; | |
133 | |
134 //------------------------------------------------------------------------------------------------------------------------ | |
135 // Generation of complete interpreter | |
136 | |
137 AbstractInterpreterGenerator::AbstractInterpreterGenerator(StubQueue* _code) { | |
138 _masm = NULL; | |
139 } | |
140 | |
141 | |
142 static const BasicType types[Interpreter::number_of_result_handlers] = { | |
143 T_BOOLEAN, | |
144 T_CHAR , | |
145 T_BYTE , | |
146 T_SHORT , | |
147 T_INT , | |
148 T_LONG , | |
149 T_VOID , | |
150 T_FLOAT , | |
151 T_DOUBLE , | |
152 T_OBJECT | |
153 }; | |
154 | |
155 void AbstractInterpreterGenerator::generate_all() { | |
156 | |
157 | |
158 { CodeletMark cm(_masm, "slow signature handler"); | |
159 Interpreter::_slow_signature_handler = generate_slow_signature_handler(); | |
160 } | |
161 | |
162 } | |
163 | |
164 //------------------------------------------------------------------------------------------------------------------------ | |
165 // Entry points | |
166 | |
167 AbstractInterpreter::MethodKind AbstractInterpreter::method_kind(methodHandle m) { | |
168 // Abstract method? | |
169 if (m->is_abstract()) return abstract; | |
170 | |
710 | 171 // Invoker for method handles? |
172 if (m->is_method_handle_invoke()) return method_handle; | |
173 | |
0 | 174 // Native method? |
175 // Note: This test must come _before_ the test for intrinsic | |
176 // methods. See also comments below. | |
177 if (m->is_native()) { | |
710 | 178 assert(!m->is_method_handle_invoke(), "overlapping bits here, watch out"); |
0 | 179 return m->is_synchronized() ? native_synchronized : native; |
180 } | |
181 | |
182 // Synchronized? | |
183 if (m->is_synchronized()) { | |
184 return zerolocals_synchronized; | |
185 } | |
186 | |
187 if (RegisterFinalizersAtInit && m->code_size() == 1 && | |
188 m->intrinsic_id() == vmIntrinsics::_Object_init) { | |
189 // We need to execute the special return bytecode to check for | |
190 // finalizer registration so create a normal frame. | |
191 return zerolocals; | |
192 } | |
193 | |
194 // Empty method? | |
195 if (m->is_empty_method()) { | |
196 return empty; | |
197 } | |
198 | |
199 // Accessor method? | |
200 if (m->is_accessor()) { | |
201 assert(m->size_of_parameters() == 1, "fast code for accessors assumes parameter size = 1"); | |
202 return accessor; | |
203 } | |
204 | |
205 // Special intrinsic method? | |
206 // Note: This test must come _after_ the test for native methods, | |
207 // otherwise we will run into problems with JDK 1.2, see also | |
208 // AbstractInterpreterGenerator::generate_method_entry() for | |
209 // for details. | |
210 switch (m->intrinsic_id()) { | |
211 case vmIntrinsics::_dsin : return java_lang_math_sin ; | |
212 case vmIntrinsics::_dcos : return java_lang_math_cos ; | |
213 case vmIntrinsics::_dtan : return java_lang_math_tan ; | |
214 case vmIntrinsics::_dabs : return java_lang_math_abs ; | |
215 case vmIntrinsics::_dsqrt : return java_lang_math_sqrt ; | |
216 case vmIntrinsics::_dlog : return java_lang_math_log ; | |
217 case vmIntrinsics::_dlog10: return java_lang_math_log10; | |
218 } | |
219 | |
220 // Note: for now: zero locals for all non-empty methods | |
221 return zerolocals; | |
222 } | |
223 | |
224 | |
225 // Return true if the interpreter can prove that the given bytecode has | |
226 // not yet been executed (in Java semantics, not in actual operation). | |
227 bool AbstractInterpreter::is_not_reached(methodHandle method, int bci) { | |
228 address bcp = method->bcp_from(bci); | |
229 | |
230 if (!Bytecode_at(bcp)->must_rewrite()) { | |
231 // might have been reached | |
232 return false; | |
233 } | |
234 | |
235 // the bytecode might not be rewritten if the method is an accessor, etc. | |
236 address ientry = method->interpreter_entry(); | |
237 if (ientry != entry_for_kind(AbstractInterpreter::zerolocals) && | |
238 ientry != entry_for_kind(AbstractInterpreter::zerolocals_synchronized)) | |
239 return false; // interpreter does not run this method! | |
240 | |
241 // otherwise, we can be sure this bytecode has never been executed | |
242 return true; | |
243 } | |
244 | |
245 | |
246 #ifndef PRODUCT | |
247 void AbstractInterpreter::print_method_kind(MethodKind kind) { | |
248 switch (kind) { | |
249 case zerolocals : tty->print("zerolocals" ); break; | |
250 case zerolocals_synchronized: tty->print("zerolocals_synchronized"); break; | |
251 case native : tty->print("native" ); break; | |
252 case native_synchronized : tty->print("native_synchronized" ); break; | |
253 case empty : tty->print("empty" ); break; | |
254 case accessor : tty->print("accessor" ); break; | |
255 case abstract : tty->print("abstract" ); break; | |
710 | 256 case method_handle : tty->print("method_handle" ); break; |
0 | 257 case java_lang_math_sin : tty->print("java_lang_math_sin" ); break; |
258 case java_lang_math_cos : tty->print("java_lang_math_cos" ); break; | |
259 case java_lang_math_tan : tty->print("java_lang_math_tan" ); break; | |
260 case java_lang_math_abs : tty->print("java_lang_math_abs" ); break; | |
261 case java_lang_math_sqrt : tty->print("java_lang_math_sqrt" ); break; | |
262 case java_lang_math_log : tty->print("java_lang_math_log" ); break; | |
263 case java_lang_math_log10 : tty->print("java_lang_math_log10" ); break; | |
264 default : ShouldNotReachHere(); | |
265 } | |
266 } | |
267 #endif // PRODUCT | |
268 | |
269 static BasicType constant_pool_type(methodOop method, int index) { | |
270 constantTag tag = method->constants()->tag_at(index); | |
271 if (tag.is_int ()) return T_INT; | |
272 else if (tag.is_float ()) return T_FLOAT; | |
273 else if (tag.is_long ()) return T_LONG; | |
274 else if (tag.is_double ()) return T_DOUBLE; | |
275 else if (tag.is_string ()) return T_OBJECT; | |
276 else if (tag.is_unresolved_string()) return T_OBJECT; | |
277 else if (tag.is_klass ()) return T_OBJECT; | |
278 else if (tag.is_unresolved_klass ()) return T_OBJECT; | |
279 ShouldNotReachHere(); | |
280 return T_ILLEGAL; | |
281 } | |
282 | |
283 | |
284 //------------------------------------------------------------------------------------------------------------------------ | |
285 // Deoptimization support | |
286 | |
900
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
287 // 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
|
288 address AbstractInterpreter::deopt_continue_after_entry(methodOop method, address bcp, int callee_parameters, bool is_top_frame) { |
0 | 289 assert(method->contains(bcp), "just checkin'"); |
290 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
|
291 assert(!Interpreter::bytecode_should_reexecute(code), "should not reexecute"); |
0 | 292 int bci = method->bci_from(bcp); |
293 int length = -1; // initial value for debugging | |
294 // compute continuation length | |
295 length = Bytecodes::length_at(bcp); | |
296 // compute result type | |
297 BasicType type = T_ILLEGAL; | |
900
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
298 |
0 | 299 switch (code) { |
300 case Bytecodes::_invokevirtual : | |
301 case Bytecodes::_invokespecial : | |
302 case Bytecodes::_invokestatic : | |
303 case Bytecodes::_invokeinterface: { | |
304 Thread *thread = Thread::current(); | |
305 ResourceMark rm(thread); | |
306 methodHandle mh(thread, method); | |
307 type = Bytecode_invoke_at(mh, bci)->result_type(thread); | |
308 // since the cache entry might not be initialized: | |
309 // (NOT needed for the old calling convension) | |
310 if (!is_top_frame) { | |
311 int index = Bytes::get_native_u2(bcp+1); | |
312 method->constants()->cache()->entry_at(index)->set_parameter_size(callee_parameters); | |
313 } | |
314 break; | |
315 } | |
316 | |
317 case Bytecodes::_ldc : | |
318 type = constant_pool_type( method, *(bcp+1) ); | |
319 break; | |
320 | |
321 case Bytecodes::_ldc_w : // fall through | |
322 case Bytecodes::_ldc2_w: | |
323 type = constant_pool_type( method, Bytes::get_Java_u2(bcp+1) ); | |
324 break; | |
325 | |
326 default: | |
327 type = Bytecodes::result_type(code); | |
328 break; | |
329 } | |
330 | |
331 // return entry point for computed continuation state & bytecode length | |
332 return | |
333 is_top_frame | |
334 ? Interpreter::deopt_entry (as_TosState(type), length) | |
335 : Interpreter::return_entry(as_TosState(type), length); | |
336 } | |
337 | |
900
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
338 // 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
|
339 // the bytecode. |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
340 // 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
|
341 // Interpreter::deopt_entry(vtos, 0) like others |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
342 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
|
343 assert(method->contains(bcp), "just checkin'"); |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
344 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
|
345 #ifdef COMPILER1 |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
346 if(code == Bytecodes::_athrow ) { |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
347 return Interpreter::rethrow_exception_entry(); |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
348 } |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
349 #endif /* COMPILER1 */ |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
350 return Interpreter::deopt_entry(vtos, 0); |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
351 } |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
352 |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
353 // 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
|
354 // 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
|
355 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
|
356 switch (code) { |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
357 case Bytecodes::_lookupswitch: |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
358 case Bytecodes::_tableswitch: |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
359 case Bytecodes::_fast_binaryswitch: |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
360 case Bytecodes::_fast_linearswitch: |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
361 // recompute condtional expression folded into _if<cond> |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
362 case Bytecodes::_lcmp : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
363 case Bytecodes::_fcmpl : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
364 case Bytecodes::_fcmpg : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
365 case Bytecodes::_dcmpl : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
366 case Bytecodes::_dcmpg : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
367 case Bytecodes::_ifnull : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
368 case Bytecodes::_ifnonnull : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
369 case Bytecodes::_goto : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
370 case Bytecodes::_goto_w : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
371 case Bytecodes::_ifeq : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
372 case Bytecodes::_ifne : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
373 case Bytecodes::_iflt : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
374 case Bytecodes::_ifge : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
375 case Bytecodes::_ifgt : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
376 case Bytecodes::_ifle : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
377 case Bytecodes::_if_icmpeq : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
378 case Bytecodes::_if_icmpne : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
379 case Bytecodes::_if_icmplt : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
380 case Bytecodes::_if_icmpge : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
381 case Bytecodes::_if_icmpgt : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
382 case Bytecodes::_if_icmple : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
383 case Bytecodes::_if_acmpeq : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
384 case Bytecodes::_if_acmpne : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
385 // special cases |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
386 case Bytecodes::_getfield : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
387 case Bytecodes::_putfield : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
388 case Bytecodes::_getstatic : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
389 case Bytecodes::_putstatic : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
390 case Bytecodes::_aastore : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
391 #ifdef COMPILER1 |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
392 //special case of reexecution |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
393 case Bytecodes::_athrow : |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
394 #endif |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
395 return true; |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
396 |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
397 default: |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
398 return false; |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
399 } |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
400 } |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
710
diff
changeset
|
401 |
0 | 402 void AbstractInterpreterGenerator::bang_stack_shadow_pages(bool native_call) { |
403 // Quick & dirty stack overflow checking: bang the stack & handle trap. | |
404 // Note that we do the banging after the frame is setup, since the exception | |
405 // handling code expects to find a valid interpreter frame on the stack. | |
406 // Doing the banging earlier fails if the caller frame is not an interpreter | |
407 // frame. | |
408 // (Also, the exception throwing code expects to unlock any synchronized | |
409 // method receiever, so do the banging after locking the receiver.) | |
410 | |
411 // Bang each page in the shadow zone. We can't assume it's been done for | |
412 // an interpreter frame with greater than a page of locals, so each page | |
413 // needs to be checked. Only true for non-native. | |
414 if (UseStackBanging) { | |
415 const int start_page = native_call ? StackShadowPages : 1; | |
416 const int page_size = os::vm_page_size(); | |
417 for (int pages = start_page; pages <= StackShadowPages ; pages++) { | |
418 __ bang_stack_with_offset(pages*page_size); | |
419 } | |
420 } | |
421 } |