annotate src/share/vm/interpreter/interpreter.cpp @ 4678:a03f3fd16b22

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