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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 0
diff changeset
2 * Copyright 1997-2009 Sun Microsystems, Inc. All Rights Reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
a61af66fc99e Initial load
duke
parents:
diff changeset
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
a61af66fc99e Initial load
duke
parents:
diff changeset
20 * CA 95054 USA or visit www.sun.com if you need additional information or
a61af66fc99e Initial load
duke
parents:
diff changeset
21 * have any questions.
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
a61af66fc99e Initial load
duke
parents:
diff changeset
25 #include "incls/_precompiled.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
26 #include "incls/_interpreter.cpp.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
27
a61af66fc99e Initial load
duke
parents:
diff changeset
28 # define __ _masm->
a61af66fc99e Initial load
duke
parents:
diff changeset
29
a61af66fc99e Initial load
duke
parents:
diff changeset
30
a61af66fc99e Initial load
duke
parents:
diff changeset
31 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
32 // Implementation of InterpreterCodelet
a61af66fc99e Initial load
duke
parents:
diff changeset
33
a61af66fc99e Initial load
duke
parents:
diff changeset
34 void InterpreterCodelet::initialize(const char* description, Bytecodes::Code bytecode) {
a61af66fc99e Initial load
duke
parents:
diff changeset
35 _description = description;
a61af66fc99e Initial load
duke
parents:
diff changeset
36 _bytecode = bytecode;
a61af66fc99e Initial load
duke
parents:
diff changeset
37 }
a61af66fc99e Initial load
duke
parents:
diff changeset
38
a61af66fc99e Initial load
duke
parents:
diff changeset
39
a61af66fc99e Initial load
duke
parents:
diff changeset
40 void InterpreterCodelet::verify() {
a61af66fc99e Initial load
duke
parents:
diff changeset
41 }
a61af66fc99e Initial load
duke
parents:
diff changeset
42
a61af66fc99e Initial load
duke
parents:
diff changeset
43
a61af66fc99e Initial load
duke
parents:
diff changeset
44 void InterpreterCodelet::print() {
a61af66fc99e Initial load
duke
parents:
diff changeset
45 if (PrintInterpreter) {
a61af66fc99e Initial load
duke
parents:
diff changeset
46 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
47 tty->print_cr("----------------------------------------------------------------------");
a61af66fc99e Initial load
duke
parents:
diff changeset
48 }
a61af66fc99e Initial load
duke
parents:
diff changeset
49
a61af66fc99e Initial load
duke
parents:
diff changeset
50 if (description() != NULL) tty->print("%s ", description());
a61af66fc99e Initial load
duke
parents:
diff changeset
51 if (bytecode() >= 0 ) tty->print("%d %s ", bytecode(), Bytecodes::name(bytecode()));
a61af66fc99e Initial load
duke
parents:
diff changeset
52 tty->print_cr("[" INTPTR_FORMAT ", " INTPTR_FORMAT "] %d bytes",
a61af66fc99e Initial load
duke
parents:
diff changeset
53 code_begin(), code_end(), code_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
54
a61af66fc99e Initial load
duke
parents:
diff changeset
55 if (PrintInterpreter) {
a61af66fc99e Initial load
duke
parents:
diff changeset
56 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
57 Disassembler::decode(code_begin(), code_end(), tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
58 }
a61af66fc99e Initial load
duke
parents:
diff changeset
59 }
a61af66fc99e Initial load
duke
parents:
diff changeset
60
a61af66fc99e Initial load
duke
parents:
diff changeset
61
a61af66fc99e Initial load
duke
parents:
diff changeset
62 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
63 // Implementation of platform independent aspects of Interpreter
a61af66fc99e Initial load
duke
parents:
diff changeset
64
a61af66fc99e Initial load
duke
parents:
diff changeset
65 void AbstractInterpreter::initialize() {
a61af66fc99e Initial load
duke
parents:
diff changeset
66 if (_code != NULL) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
67
a61af66fc99e Initial load
duke
parents:
diff changeset
68 // make sure 'imported' classes are initialized
a61af66fc99e Initial load
duke
parents:
diff changeset
69 if (CountBytecodes || TraceBytecodes || StopInterpreterAt) BytecodeCounter::reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
70 if (PrintBytecodeHistogram) BytecodeHistogram::reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
71 if (PrintBytecodePairHistogram) BytecodePairHistogram::reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
72
a61af66fc99e Initial load
duke
parents:
diff changeset
73 InvocationCounter::reinitialize(DelayCompilationDuringStartup);
a61af66fc99e Initial load
duke
parents:
diff changeset
74
a61af66fc99e Initial load
duke
parents:
diff changeset
75 }
a61af66fc99e Initial load
duke
parents:
diff changeset
76
a61af66fc99e Initial load
duke
parents:
diff changeset
77 void AbstractInterpreter::print() {
a61af66fc99e Initial load
duke
parents:
diff changeset
78 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
79 tty->print_cr("----------------------------------------------------------------------");
a61af66fc99e Initial load
duke
parents:
diff changeset
80 tty->print_cr("Interpreter");
a61af66fc99e Initial load
duke
parents:
diff changeset
81 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
82 tty->print_cr("code size = %6dK bytes", (int)_code->used_space()/1024);
a61af66fc99e Initial load
duke
parents:
diff changeset
83 tty->print_cr("total space = %6dK bytes", (int)_code->total_space()/1024);
a61af66fc99e Initial load
duke
parents:
diff changeset
84 tty->print_cr("wasted space = %6dK bytes", (int)_code->available_space()/1024);
a61af66fc99e Initial load
duke
parents:
diff changeset
85 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
86 tty->print_cr("# of codelets = %6d" , _code->number_of_stubs());
a61af66fc99e Initial load
duke
parents:
diff changeset
87 tty->print_cr("avg codelet size = %6d bytes", _code->used_space() / _code->number_of_stubs());
a61af66fc99e Initial load
duke
parents:
diff changeset
88 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
89 _code->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
90 tty->print_cr("----------------------------------------------------------------------");
a61af66fc99e Initial load
duke
parents:
diff changeset
91 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
92 }
a61af66fc99e Initial load
duke
parents:
diff changeset
93
a61af66fc99e Initial load
duke
parents:
diff changeset
94
a61af66fc99e Initial load
duke
parents:
diff changeset
95 void interpreter_init() {
a61af66fc99e Initial load
duke
parents:
diff changeset
96 Interpreter::initialize();
a61af66fc99e Initial load
duke
parents:
diff changeset
97 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
98 if (TraceBytecodes) BytecodeTracer::set_closure(BytecodeTracer::std_closure());
a61af66fc99e Initial load
duke
parents:
diff changeset
99 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
100 // need to hit every safepoint in order to call zapping routine
a61af66fc99e Initial load
duke
parents:
diff changeset
101 // register the interpreter
a61af66fc99e Initial load
duke
parents:
diff changeset
102 VTune::register_stub(
a61af66fc99e Initial load
duke
parents:
diff changeset
103 "Interpreter",
a61af66fc99e Initial load
duke
parents:
diff changeset
104 AbstractInterpreter::code()->code_start(),
a61af66fc99e Initial load
duke
parents:
diff changeset
105 AbstractInterpreter::code()->code_end()
a61af66fc99e Initial load
duke
parents:
diff changeset
106 );
a61af66fc99e Initial load
duke
parents:
diff changeset
107 Forte::register_stub(
a61af66fc99e Initial load
duke
parents:
diff changeset
108 "Interpreter",
a61af66fc99e Initial load
duke
parents:
diff changeset
109 AbstractInterpreter::code()->code_start(),
a61af66fc99e Initial load
duke
parents:
diff changeset
110 AbstractInterpreter::code()->code_end()
a61af66fc99e Initial load
duke
parents:
diff changeset
111 );
a61af66fc99e Initial load
duke
parents:
diff changeset
112
a61af66fc99e Initial load
duke
parents:
diff changeset
113 // notify JVMTI profiler
a61af66fc99e Initial load
duke
parents:
diff changeset
114 if (JvmtiExport::should_post_dynamic_code_generated()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
115 JvmtiExport::post_dynamic_code_generated("Interpreter",
a61af66fc99e Initial load
duke
parents:
diff changeset
116 AbstractInterpreter::code()->code_start(),
a61af66fc99e Initial load
duke
parents:
diff changeset
117 AbstractInterpreter::code()->code_end());
a61af66fc99e Initial load
duke
parents:
diff changeset
118 }
a61af66fc99e Initial load
duke
parents:
diff changeset
119 }
a61af66fc99e Initial load
duke
parents:
diff changeset
120
a61af66fc99e Initial load
duke
parents:
diff changeset
121 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
122 // Implementation of interpreter
a61af66fc99e Initial load
duke
parents:
diff changeset
123
a61af66fc99e Initial load
duke
parents:
diff changeset
124 StubQueue* AbstractInterpreter::_code = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
125 bool AbstractInterpreter::_notice_safepoints = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
126 address AbstractInterpreter::_rethrow_exception_entry = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
127
a61af66fc99e Initial load
duke
parents:
diff changeset
128 address AbstractInterpreter::_native_entry_begin = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
129 address AbstractInterpreter::_native_entry_end = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
130 address AbstractInterpreter::_slow_signature_handler;
a61af66fc99e Initial load
duke
parents:
diff changeset
131 address AbstractInterpreter::_entry_table [AbstractInterpreter::number_of_method_entries];
a61af66fc99e Initial load
duke
parents:
diff changeset
132 address AbstractInterpreter::_native_abi_to_tosca [AbstractInterpreter::number_of_result_handlers];
a61af66fc99e Initial load
duke
parents:
diff changeset
133
a61af66fc99e Initial load
duke
parents:
diff changeset
134 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
135 // Generation of complete interpreter
a61af66fc99e Initial load
duke
parents:
diff changeset
136
a61af66fc99e Initial load
duke
parents:
diff changeset
137 AbstractInterpreterGenerator::AbstractInterpreterGenerator(StubQueue* _code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
138 _masm = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
139 }
a61af66fc99e Initial load
duke
parents:
diff changeset
140
a61af66fc99e Initial load
duke
parents:
diff changeset
141
a61af66fc99e Initial load
duke
parents:
diff changeset
142 static const BasicType types[Interpreter::number_of_result_handlers] = {
a61af66fc99e Initial load
duke
parents:
diff changeset
143 T_BOOLEAN,
a61af66fc99e Initial load
duke
parents:
diff changeset
144 T_CHAR ,
a61af66fc99e Initial load
duke
parents:
diff changeset
145 T_BYTE ,
a61af66fc99e Initial load
duke
parents:
diff changeset
146 T_SHORT ,
a61af66fc99e Initial load
duke
parents:
diff changeset
147 T_INT ,
a61af66fc99e Initial load
duke
parents:
diff changeset
148 T_LONG ,
a61af66fc99e Initial load
duke
parents:
diff changeset
149 T_VOID ,
a61af66fc99e Initial load
duke
parents:
diff changeset
150 T_FLOAT ,
a61af66fc99e Initial load
duke
parents:
diff changeset
151 T_DOUBLE ,
a61af66fc99e Initial load
duke
parents:
diff changeset
152 T_OBJECT
a61af66fc99e Initial load
duke
parents:
diff changeset
153 };
a61af66fc99e Initial load
duke
parents:
diff changeset
154
a61af66fc99e Initial load
duke
parents:
diff changeset
155 void AbstractInterpreterGenerator::generate_all() {
a61af66fc99e Initial load
duke
parents:
diff changeset
156
a61af66fc99e Initial load
duke
parents:
diff changeset
157
a61af66fc99e Initial load
duke
parents:
diff changeset
158 { CodeletMark cm(_masm, "slow signature handler");
a61af66fc99e Initial load
duke
parents:
diff changeset
159 Interpreter::_slow_signature_handler = generate_slow_signature_handler();
a61af66fc99e Initial load
duke
parents:
diff changeset
160 }
a61af66fc99e Initial load
duke
parents:
diff changeset
161
a61af66fc99e Initial load
duke
parents:
diff changeset
162 }
a61af66fc99e Initial load
duke
parents:
diff changeset
163
a61af66fc99e Initial load
duke
parents:
diff changeset
164 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
165 // Entry points
a61af66fc99e Initial load
duke
parents:
diff changeset
166
a61af66fc99e Initial load
duke
parents:
diff changeset
167 AbstractInterpreter::MethodKind AbstractInterpreter::method_kind(methodHandle m) {
a61af66fc99e Initial load
duke
parents:
diff changeset
168 // Abstract method?
a61af66fc99e Initial load
duke
parents:
diff changeset
169 if (m->is_abstract()) return abstract;
a61af66fc99e Initial load
duke
parents:
diff changeset
170
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 0
diff changeset
171 // Invoker for method handles?
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 0
diff changeset
172 if (m->is_method_handle_invoke()) return method_handle;
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 0
diff changeset
173
0
a61af66fc99e Initial load
duke
parents:
diff changeset
174 // Native method?
a61af66fc99e Initial load
duke
parents:
diff changeset
175 // Note: This test must come _before_ the test for intrinsic
a61af66fc99e Initial load
duke
parents:
diff changeset
176 // methods. See also comments below.
a61af66fc99e Initial load
duke
parents:
diff changeset
177 if (m->is_native()) {
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 0
diff changeset
178 assert(!m->is_method_handle_invoke(), "overlapping bits here, watch out");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
179 return m->is_synchronized() ? native_synchronized : native;
a61af66fc99e Initial load
duke
parents:
diff changeset
180 }
a61af66fc99e Initial load
duke
parents:
diff changeset
181
a61af66fc99e Initial load
duke
parents:
diff changeset
182 // Synchronized?
a61af66fc99e Initial load
duke
parents:
diff changeset
183 if (m->is_synchronized()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
184 return zerolocals_synchronized;
a61af66fc99e Initial load
duke
parents:
diff changeset
185 }
a61af66fc99e Initial load
duke
parents:
diff changeset
186
a61af66fc99e Initial load
duke
parents:
diff changeset
187 if (RegisterFinalizersAtInit && m->code_size() == 1 &&
a61af66fc99e Initial load
duke
parents:
diff changeset
188 m->intrinsic_id() == vmIntrinsics::_Object_init) {
a61af66fc99e Initial load
duke
parents:
diff changeset
189 // We need to execute the special return bytecode to check for
a61af66fc99e Initial load
duke
parents:
diff changeset
190 // finalizer registration so create a normal frame.
a61af66fc99e Initial load
duke
parents:
diff changeset
191 return zerolocals;
a61af66fc99e Initial load
duke
parents:
diff changeset
192 }
a61af66fc99e Initial load
duke
parents:
diff changeset
193
a61af66fc99e Initial load
duke
parents:
diff changeset
194 // Empty method?
a61af66fc99e Initial load
duke
parents:
diff changeset
195 if (m->is_empty_method()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
196 return empty;
a61af66fc99e Initial load
duke
parents:
diff changeset
197 }
a61af66fc99e Initial load
duke
parents:
diff changeset
198
a61af66fc99e Initial load
duke
parents:
diff changeset
199 // Accessor method?
a61af66fc99e Initial load
duke
parents:
diff changeset
200 if (m->is_accessor()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
201 assert(m->size_of_parameters() == 1, "fast code for accessors assumes parameter size = 1");
a61af66fc99e Initial load
duke
parents:
diff changeset
202 return accessor;
a61af66fc99e Initial load
duke
parents:
diff changeset
203 }
a61af66fc99e Initial load
duke
parents:
diff changeset
204
a61af66fc99e Initial load
duke
parents:
diff changeset
205 // Special intrinsic method?
a61af66fc99e Initial load
duke
parents:
diff changeset
206 // Note: This test must come _after_ the test for native methods,
a61af66fc99e Initial load
duke
parents:
diff changeset
207 // otherwise we will run into problems with JDK 1.2, see also
a61af66fc99e Initial load
duke
parents:
diff changeset
208 // AbstractInterpreterGenerator::generate_method_entry() for
a61af66fc99e Initial load
duke
parents:
diff changeset
209 // for details.
a61af66fc99e Initial load
duke
parents:
diff changeset
210 switch (m->intrinsic_id()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
211 case vmIntrinsics::_dsin : return java_lang_math_sin ;
a61af66fc99e Initial load
duke
parents:
diff changeset
212 case vmIntrinsics::_dcos : return java_lang_math_cos ;
a61af66fc99e Initial load
duke
parents:
diff changeset
213 case vmIntrinsics::_dtan : return java_lang_math_tan ;
a61af66fc99e Initial load
duke
parents:
diff changeset
214 case vmIntrinsics::_dabs : return java_lang_math_abs ;
a61af66fc99e Initial load
duke
parents:
diff changeset
215 case vmIntrinsics::_dsqrt : return java_lang_math_sqrt ;
a61af66fc99e Initial load
duke
parents:
diff changeset
216 case vmIntrinsics::_dlog : return java_lang_math_log ;
a61af66fc99e Initial load
duke
parents:
diff changeset
217 case vmIntrinsics::_dlog10: return java_lang_math_log10;
a61af66fc99e Initial load
duke
parents:
diff changeset
218 }
a61af66fc99e Initial load
duke
parents:
diff changeset
219
a61af66fc99e Initial load
duke
parents:
diff changeset
220 // Note: for now: zero locals for all non-empty methods
a61af66fc99e Initial load
duke
parents:
diff changeset
221 return zerolocals;
a61af66fc99e Initial load
duke
parents:
diff changeset
222 }
a61af66fc99e Initial load
duke
parents:
diff changeset
223
a61af66fc99e Initial load
duke
parents:
diff changeset
224
a61af66fc99e Initial load
duke
parents:
diff changeset
225 // Return true if the interpreter can prove that the given bytecode has
a61af66fc99e Initial load
duke
parents:
diff changeset
226 // not yet been executed (in Java semantics, not in actual operation).
a61af66fc99e Initial load
duke
parents:
diff changeset
227 bool AbstractInterpreter::is_not_reached(methodHandle method, int bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
228 address bcp = method->bcp_from(bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
229
a61af66fc99e Initial load
duke
parents:
diff changeset
230 if (!Bytecode_at(bcp)->must_rewrite()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
231 // might have been reached
a61af66fc99e Initial load
duke
parents:
diff changeset
232 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
233 }
a61af66fc99e Initial load
duke
parents:
diff changeset
234
a61af66fc99e Initial load
duke
parents:
diff changeset
235 // the bytecode might not be rewritten if the method is an accessor, etc.
a61af66fc99e Initial load
duke
parents:
diff changeset
236 address ientry = method->interpreter_entry();
a61af66fc99e Initial load
duke
parents:
diff changeset
237 if (ientry != entry_for_kind(AbstractInterpreter::zerolocals) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
238 ientry != entry_for_kind(AbstractInterpreter::zerolocals_synchronized))
a61af66fc99e Initial load
duke
parents:
diff changeset
239 return false; // interpreter does not run this method!
a61af66fc99e Initial load
duke
parents:
diff changeset
240
a61af66fc99e Initial load
duke
parents:
diff changeset
241 // otherwise, we can be sure this bytecode has never been executed
a61af66fc99e Initial load
duke
parents:
diff changeset
242 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
243 }
a61af66fc99e Initial load
duke
parents:
diff changeset
244
a61af66fc99e Initial load
duke
parents:
diff changeset
245
a61af66fc99e Initial load
duke
parents:
diff changeset
246 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
247 void AbstractInterpreter::print_method_kind(MethodKind kind) {
a61af66fc99e Initial load
duke
parents:
diff changeset
248 switch (kind) {
a61af66fc99e Initial load
duke
parents:
diff changeset
249 case zerolocals : tty->print("zerolocals" ); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
250 case zerolocals_synchronized: tty->print("zerolocals_synchronized"); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
251 case native : tty->print("native" ); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
252 case native_synchronized : tty->print("native_synchronized" ); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
253 case empty : tty->print("empty" ); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
254 case accessor : tty->print("accessor" ); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
255 case abstract : tty->print("abstract" ); break;
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 0
diff changeset
256 case method_handle : tty->print("method_handle" ); break;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
257 case java_lang_math_sin : tty->print("java_lang_math_sin" ); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
258 case java_lang_math_cos : tty->print("java_lang_math_cos" ); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
259 case java_lang_math_tan : tty->print("java_lang_math_tan" ); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
260 case java_lang_math_abs : tty->print("java_lang_math_abs" ); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
261 case java_lang_math_sqrt : tty->print("java_lang_math_sqrt" ); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
262 case java_lang_math_log : tty->print("java_lang_math_log" ); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
263 case java_lang_math_log10 : tty->print("java_lang_math_log10" ); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
264 default : ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
265 }
a61af66fc99e Initial load
duke
parents:
diff changeset
266 }
a61af66fc99e Initial load
duke
parents:
diff changeset
267 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
268
a61af66fc99e Initial load
duke
parents:
diff changeset
269 static BasicType constant_pool_type(methodOop method, int index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
270 constantTag tag = method->constants()->tag_at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
271 if (tag.is_int ()) return T_INT;
a61af66fc99e Initial load
duke
parents:
diff changeset
272 else if (tag.is_float ()) return T_FLOAT;
a61af66fc99e Initial load
duke
parents:
diff changeset
273 else if (tag.is_long ()) return T_LONG;
a61af66fc99e Initial load
duke
parents:
diff changeset
274 else if (tag.is_double ()) return T_DOUBLE;
a61af66fc99e Initial load
duke
parents:
diff changeset
275 else if (tag.is_string ()) return T_OBJECT;
a61af66fc99e Initial load
duke
parents:
diff changeset
276 else if (tag.is_unresolved_string()) return T_OBJECT;
a61af66fc99e Initial load
duke
parents:
diff changeset
277 else if (tag.is_klass ()) return T_OBJECT;
a61af66fc99e Initial load
duke
parents:
diff changeset
278 else if (tag.is_unresolved_klass ()) return T_OBJECT;
a61af66fc99e Initial load
duke
parents:
diff changeset
279 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
280 return T_ILLEGAL;
a61af66fc99e Initial load
duke
parents:
diff changeset
281 }
a61af66fc99e Initial load
duke
parents:
diff changeset
282
a61af66fc99e Initial load
duke
parents:
diff changeset
283
a61af66fc99e Initial load
duke
parents:
diff changeset
284 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
285 // Deoptimization support
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
289 assert(method->contains(bcp), "just checkin'");
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
292 int bci = method->bci_from(bcp);
a61af66fc99e Initial load
duke
parents:
diff changeset
293 int length = -1; // initial value for debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
294 // compute continuation length
a61af66fc99e Initial load
duke
parents:
diff changeset
295 length = Bytecodes::length_at(bcp);
a61af66fc99e Initial load
duke
parents:
diff changeset
296 // compute result type
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
299 switch (code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
300 case Bytecodes::_invokevirtual :
a61af66fc99e Initial load
duke
parents:
diff changeset
301 case Bytecodes::_invokespecial :
a61af66fc99e Initial load
duke
parents:
diff changeset
302 case Bytecodes::_invokestatic :
a61af66fc99e Initial load
duke
parents:
diff changeset
303 case Bytecodes::_invokeinterface: {
a61af66fc99e Initial load
duke
parents:
diff changeset
304 Thread *thread = Thread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
305 ResourceMark rm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
306 methodHandle mh(thread, method);
a61af66fc99e Initial load
duke
parents:
diff changeset
307 type = Bytecode_invoke_at(mh, bci)->result_type(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
308 // since the cache entry might not be initialized:
a61af66fc99e Initial load
duke
parents:
diff changeset
309 // (NOT needed for the old calling convension)
a61af66fc99e Initial load
duke
parents:
diff changeset
310 if (!is_top_frame) {
a61af66fc99e Initial load
duke
parents:
diff changeset
311 int index = Bytes::get_native_u2(bcp+1);
a61af66fc99e Initial load
duke
parents:
diff changeset
312 method->constants()->cache()->entry_at(index)->set_parameter_size(callee_parameters);
a61af66fc99e Initial load
duke
parents:
diff changeset
313 }
a61af66fc99e Initial load
duke
parents:
diff changeset
314 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
315 }
a61af66fc99e Initial load
duke
parents:
diff changeset
316
a61af66fc99e Initial load
duke
parents:
diff changeset
317 case Bytecodes::_ldc :
a61af66fc99e Initial load
duke
parents:
diff changeset
318 type = constant_pool_type( method, *(bcp+1) );
a61af66fc99e Initial load
duke
parents:
diff changeset
319 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
320
a61af66fc99e Initial load
duke
parents:
diff changeset
321 case Bytecodes::_ldc_w : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
322 case Bytecodes::_ldc2_w:
a61af66fc99e Initial load
duke
parents:
diff changeset
323 type = constant_pool_type( method, Bytes::get_Java_u2(bcp+1) );
a61af66fc99e Initial load
duke
parents:
diff changeset
324 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
325
a61af66fc99e Initial load
duke
parents:
diff changeset
326 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
327 type = Bytecodes::result_type(code);
a61af66fc99e Initial load
duke
parents:
diff changeset
328 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
329 }
a61af66fc99e Initial load
duke
parents:
diff changeset
330
a61af66fc99e Initial load
duke
parents:
diff changeset
331 // return entry point for computed continuation state & bytecode length
a61af66fc99e Initial load
duke
parents:
diff changeset
332 return
a61af66fc99e Initial load
duke
parents:
diff changeset
333 is_top_frame
a61af66fc99e Initial load
duke
parents:
diff changeset
334 ? Interpreter::deopt_entry (as_TosState(type), length)
a61af66fc99e Initial load
duke
parents:
diff changeset
335 : Interpreter::return_entry(as_TosState(type), length);
a61af66fc99e Initial load
duke
parents:
diff changeset
336 }
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
402 void AbstractInterpreterGenerator::bang_stack_shadow_pages(bool native_call) {
a61af66fc99e Initial load
duke
parents:
diff changeset
403 // Quick & dirty stack overflow checking: bang the stack & handle trap.
a61af66fc99e Initial load
duke
parents:
diff changeset
404 // Note that we do the banging after the frame is setup, since the exception
a61af66fc99e Initial load
duke
parents:
diff changeset
405 // handling code expects to find a valid interpreter frame on the stack.
a61af66fc99e Initial load
duke
parents:
diff changeset
406 // Doing the banging earlier fails if the caller frame is not an interpreter
a61af66fc99e Initial load
duke
parents:
diff changeset
407 // frame.
a61af66fc99e Initial load
duke
parents:
diff changeset
408 // (Also, the exception throwing code expects to unlock any synchronized
a61af66fc99e Initial load
duke
parents:
diff changeset
409 // method receiever, so do the banging after locking the receiver.)
a61af66fc99e Initial load
duke
parents:
diff changeset
410
a61af66fc99e Initial load
duke
parents:
diff changeset
411 // Bang each page in the shadow zone. We can't assume it's been done for
a61af66fc99e Initial load
duke
parents:
diff changeset
412 // an interpreter frame with greater than a page of locals, so each page
a61af66fc99e Initial load
duke
parents:
diff changeset
413 // needs to be checked. Only true for non-native.
a61af66fc99e Initial load
duke
parents:
diff changeset
414 if (UseStackBanging) {
a61af66fc99e Initial load
duke
parents:
diff changeset
415 const int start_page = native_call ? StackShadowPages : 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
416 const int page_size = os::vm_page_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
417 for (int pages = start_page; pages <= StackShadowPages ; pages++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
418 __ bang_stack_with_offset(pages*page_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
419 }
a61af66fc99e Initial load
duke
parents:
diff changeset
420 }
a61af66fc99e Initial load
duke
parents:
diff changeset
421 }