annotate src/share/vm/interpreter/interpreter.cpp @ 7066:7d815d842ee0

Merge.
author Christian Haeubl <haeubl@ssw.jku.at>
date Fri, 23 Nov 2012 11:50:27 +0100
parents 8c5333c80cfd e522a00b91aa
children 1baf7f1e3f23
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2 * Copyright (c) 1997, 2012, 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"
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
35 #include "oops/methodData.hpp"
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
36 #include "oops/method.hpp"
1972
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"
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
40 #include "prims/methodHandles.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
41 #include "runtime/handles.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
42 #include "runtime/sharedRuntime.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
43 #include "runtime/stubRoutines.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
44 #include "runtime/timer.hpp"
0
a61af66fc99e Initial load
duke
parents:
diff changeset
45
a61af66fc99e Initial load
duke
parents:
diff changeset
46 # define __ _masm->
a61af66fc99e Initial load
duke
parents:
diff changeset
47
a61af66fc99e Initial load
duke
parents:
diff changeset
48
a61af66fc99e Initial load
duke
parents:
diff changeset
49 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
50 // Implementation of InterpreterCodelet
a61af66fc99e Initial load
duke
parents:
diff changeset
51
a61af66fc99e Initial load
duke
parents:
diff changeset
52 void InterpreterCodelet::initialize(const char* description, Bytecodes::Code bytecode) {
a61af66fc99e Initial load
duke
parents:
diff changeset
53 _description = description;
a61af66fc99e Initial load
duke
parents:
diff changeset
54 _bytecode = bytecode;
a61af66fc99e Initial load
duke
parents:
diff changeset
55 }
a61af66fc99e Initial load
duke
parents:
diff changeset
56
a61af66fc99e Initial load
duke
parents:
diff changeset
57
a61af66fc99e Initial load
duke
parents:
diff changeset
58 void InterpreterCodelet::verify() {
a61af66fc99e Initial load
duke
parents:
diff changeset
59 }
a61af66fc99e Initial load
duke
parents:
diff changeset
60
a61af66fc99e Initial load
duke
parents:
diff changeset
61
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1644
diff changeset
62 void InterpreterCodelet::print_on(outputStream* st) const {
6796
b31471cdc53e 7200163: add CodeComments functionality to assember stubs
kvn
parents: 6725
diff changeset
63 ttyLocker ttyl;
7062
8c5333c80cfd increased CompileThreshold to increase reliability of profiling information
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6275
diff changeset
64 if (PrintInterpreter || PrintMachineCodeToFile) {
6796
b31471cdc53e 7200163: add CodeComments functionality to assember stubs
kvn
parents: 6725
diff changeset
65
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1644
diff changeset
66 st->print_cr("----------------------------------------------------------------------");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
67 }
a61af66fc99e Initial load
duke
parents:
diff changeset
68
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1644
diff changeset
69 if (description() != NULL) st->print("%s ", description());
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1644
diff changeset
70 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
71 st->print_cr("[" INTPTR_FORMAT ", " INTPTR_FORMAT "] %d bytes",
0
a61af66fc99e Initial load
duke
parents:
diff changeset
72 code_begin(), code_end(), code_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
73
7062
8c5333c80cfd increased CompileThreshold to increase reliability of profiling information
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6275
diff changeset
74 if (PrintInterpreter || PrintMachineCodeToFile) {
6796
b31471cdc53e 7200163: add CodeComments functionality to assember stubs
kvn
parents: 6725
diff changeset
75 Disassembler::decode(code_begin(), code_end(), st, DEBUG_ONLY(_comments) NOT_DEBUG(CodeComments()));
0
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 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
81 // Implementation of platform independent aspects of Interpreter
a61af66fc99e Initial load
duke
parents:
diff changeset
82
a61af66fc99e Initial load
duke
parents:
diff changeset
83 void AbstractInterpreter::initialize() {
a61af66fc99e Initial load
duke
parents:
diff changeset
84 if (_code != NULL) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
85
a61af66fc99e Initial load
duke
parents:
diff changeset
86 // make sure 'imported' classes are initialized
a61af66fc99e Initial load
duke
parents:
diff changeset
87 if (CountBytecodes || TraceBytecodes || StopInterpreterAt) BytecodeCounter::reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
88 if (PrintBytecodeHistogram) BytecodeHistogram::reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
89 if (PrintBytecodePairHistogram) BytecodePairHistogram::reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
90
a61af66fc99e Initial load
duke
parents:
diff changeset
91 InvocationCounter::reinitialize(DelayCompilationDuringStartup);
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 AbstractInterpreter::print() {
a61af66fc99e Initial load
duke
parents:
diff changeset
96 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
97 tty->print_cr("----------------------------------------------------------------------");
a61af66fc99e Initial load
duke
parents:
diff changeset
98 tty->print_cr("Interpreter");
a61af66fc99e Initial load
duke
parents:
diff changeset
99 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
100 tty->print_cr("code size = %6dK bytes", (int)_code->used_space()/1024);
a61af66fc99e Initial load
duke
parents:
diff changeset
101 tty->print_cr("total space = %6dK bytes", (int)_code->total_space()/1024);
a61af66fc99e Initial load
duke
parents:
diff changeset
102 tty->print_cr("wasted space = %6dK bytes", (int)_code->available_space()/1024);
a61af66fc99e Initial load
duke
parents:
diff changeset
103 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
104 tty->print_cr("# of codelets = %6d" , _code->number_of_stubs());
a61af66fc99e Initial load
duke
parents:
diff changeset
105 tty->print_cr("avg codelet size = %6d bytes", _code->used_space() / _code->number_of_stubs());
a61af66fc99e Initial load
duke
parents:
diff changeset
106 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
107 _code->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
108 tty->print_cr("----------------------------------------------------------------------");
a61af66fc99e Initial load
duke
parents:
diff changeset
109 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
110 }
a61af66fc99e Initial load
duke
parents:
diff changeset
111
a61af66fc99e Initial load
duke
parents:
diff changeset
112
a61af66fc99e Initial load
duke
parents:
diff changeset
113 void interpreter_init() {
a61af66fc99e Initial load
duke
parents:
diff changeset
114 Interpreter::initialize();
a61af66fc99e Initial load
duke
parents:
diff changeset
115 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
116 if (TraceBytecodes) BytecodeTracer::set_closure(BytecodeTracer::std_closure());
a61af66fc99e Initial load
duke
parents:
diff changeset
117 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
118 // need to hit every safepoint in order to call zapping routine
a61af66fc99e Initial load
duke
parents:
diff changeset
119 // register the interpreter
a61af66fc99e Initial load
duke
parents:
diff changeset
120 Forte::register_stub(
a61af66fc99e Initial load
duke
parents:
diff changeset
121 "Interpreter",
a61af66fc99e Initial load
duke
parents:
diff changeset
122 AbstractInterpreter::code()->code_start(),
a61af66fc99e Initial load
duke
parents:
diff changeset
123 AbstractInterpreter::code()->code_end()
a61af66fc99e Initial load
duke
parents:
diff changeset
124 );
a61af66fc99e Initial load
duke
parents:
diff changeset
125
a61af66fc99e Initial load
duke
parents:
diff changeset
126 // notify JVMTI profiler
a61af66fc99e Initial load
duke
parents:
diff changeset
127 if (JvmtiExport::should_post_dynamic_code_generated()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
128 JvmtiExport::post_dynamic_code_generated("Interpreter",
a61af66fc99e Initial load
duke
parents:
diff changeset
129 AbstractInterpreter::code()->code_start(),
a61af66fc99e Initial load
duke
parents:
diff changeset
130 AbstractInterpreter::code()->code_end());
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 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
135 // Implementation of interpreter
a61af66fc99e Initial load
duke
parents:
diff changeset
136
a61af66fc99e Initial load
duke
parents:
diff changeset
137 StubQueue* AbstractInterpreter::_code = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
138 bool AbstractInterpreter::_notice_safepoints = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
139 address AbstractInterpreter::_rethrow_exception_entry = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
140
a61af66fc99e Initial load
duke
parents:
diff changeset
141 address AbstractInterpreter::_native_entry_begin = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
142 address AbstractInterpreter::_native_entry_end = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
143 address AbstractInterpreter::_slow_signature_handler;
a61af66fc99e Initial load
duke
parents:
diff changeset
144 address AbstractInterpreter::_entry_table [AbstractInterpreter::number_of_method_entries];
a61af66fc99e Initial load
duke
parents:
diff changeset
145 address AbstractInterpreter::_native_abi_to_tosca [AbstractInterpreter::number_of_result_handlers];
a61af66fc99e Initial load
duke
parents:
diff changeset
146
a61af66fc99e Initial load
duke
parents:
diff changeset
147 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
148 // Generation of complete interpreter
a61af66fc99e Initial load
duke
parents:
diff changeset
149
a61af66fc99e Initial load
duke
parents:
diff changeset
150 AbstractInterpreterGenerator::AbstractInterpreterGenerator(StubQueue* _code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
151 _masm = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
152 }
a61af66fc99e Initial load
duke
parents:
diff changeset
153
a61af66fc99e Initial load
duke
parents:
diff changeset
154
a61af66fc99e Initial load
duke
parents:
diff changeset
155 static const BasicType types[Interpreter::number_of_result_handlers] = {
a61af66fc99e Initial load
duke
parents:
diff changeset
156 T_BOOLEAN,
a61af66fc99e Initial load
duke
parents:
diff changeset
157 T_CHAR ,
a61af66fc99e Initial load
duke
parents:
diff changeset
158 T_BYTE ,
a61af66fc99e Initial load
duke
parents:
diff changeset
159 T_SHORT ,
a61af66fc99e Initial load
duke
parents:
diff changeset
160 T_INT ,
a61af66fc99e Initial load
duke
parents:
diff changeset
161 T_LONG ,
a61af66fc99e Initial load
duke
parents:
diff changeset
162 T_VOID ,
a61af66fc99e Initial load
duke
parents:
diff changeset
163 T_FLOAT ,
a61af66fc99e Initial load
duke
parents:
diff changeset
164 T_DOUBLE ,
a61af66fc99e Initial load
duke
parents:
diff changeset
165 T_OBJECT
a61af66fc99e Initial load
duke
parents:
diff changeset
166 };
a61af66fc99e Initial load
duke
parents:
diff changeset
167
a61af66fc99e Initial load
duke
parents:
diff changeset
168 void AbstractInterpreterGenerator::generate_all() {
a61af66fc99e Initial load
duke
parents:
diff changeset
169
a61af66fc99e Initial load
duke
parents:
diff changeset
170
a61af66fc99e Initial load
duke
parents:
diff changeset
171 { CodeletMark cm(_masm, "slow signature handler");
a61af66fc99e Initial load
duke
parents:
diff changeset
172 Interpreter::_slow_signature_handler = generate_slow_signature_handler();
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 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
178 // Entry points
a61af66fc99e Initial load
duke
parents:
diff changeset
179
a61af66fc99e Initial load
duke
parents:
diff changeset
180 AbstractInterpreter::MethodKind AbstractInterpreter::method_kind(methodHandle m) {
a61af66fc99e Initial load
duke
parents:
diff changeset
181 // Abstract method?
a61af66fc99e Initial load
duke
parents:
diff changeset
182 if (m->is_abstract()) return abstract;
a61af66fc99e Initial load
duke
parents:
diff changeset
183
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
184 // Method handle primitive?
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
185 if (m->is_method_handle_intrinsic()) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
186 vmIntrinsics::ID id = m->intrinsic_id();
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
187 assert(MethodHandles::is_signature_polymorphic(id), "must match an intrinsic");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
188 MethodKind kind = (MethodKind)( method_handle_invoke_FIRST +
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
189 ((int)id - vmIntrinsics::FIRST_MH_SIG_POLY) );
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
190 assert(kind <= method_handle_invoke_LAST, "parallel enum ranges");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
191 return kind;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
192 }
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 0
diff changeset
193
0
a61af66fc99e Initial load
duke
parents:
diff changeset
194 // Native method?
a61af66fc99e Initial load
duke
parents:
diff changeset
195 // Note: This test must come _before_ the test for intrinsic
a61af66fc99e Initial load
duke
parents:
diff changeset
196 // methods. See also comments below.
a61af66fc99e Initial load
duke
parents:
diff changeset
197 if (m->is_native()) {
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
198 assert(!m->is_method_handle_intrinsic(), "overlapping bits here, watch out");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
199 return m->is_synchronized() ? native_synchronized : native;
a61af66fc99e Initial load
duke
parents:
diff changeset
200 }
a61af66fc99e Initial load
duke
parents:
diff changeset
201
a61af66fc99e Initial load
duke
parents:
diff changeset
202 // Synchronized?
a61af66fc99e Initial load
duke
parents:
diff changeset
203 if (m->is_synchronized()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
204 return zerolocals_synchronized;
a61af66fc99e Initial load
duke
parents:
diff changeset
205 }
a61af66fc99e Initial load
duke
parents:
diff changeset
206
a61af66fc99e Initial load
duke
parents:
diff changeset
207 if (RegisterFinalizersAtInit && m->code_size() == 1 &&
a61af66fc99e Initial load
duke
parents:
diff changeset
208 m->intrinsic_id() == vmIntrinsics::_Object_init) {
a61af66fc99e Initial load
duke
parents:
diff changeset
209 // We need to execute the special return bytecode to check for
a61af66fc99e Initial load
duke
parents:
diff changeset
210 // finalizer registration so create a normal frame.
a61af66fc99e Initial load
duke
parents:
diff changeset
211 return zerolocals;
a61af66fc99e Initial load
duke
parents:
diff changeset
212 }
a61af66fc99e Initial load
duke
parents:
diff changeset
213
a61af66fc99e Initial load
duke
parents:
diff changeset
214 // Empty method?
a61af66fc99e Initial load
duke
parents:
diff changeset
215 if (m->is_empty_method()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
216 return empty;
a61af66fc99e Initial load
duke
parents:
diff changeset
217 }
a61af66fc99e Initial load
duke
parents:
diff changeset
218
a61af66fc99e Initial load
duke
parents:
diff changeset
219 // Special intrinsic method?
a61af66fc99e Initial load
duke
parents:
diff changeset
220 // Note: This test must come _after_ the test for native methods,
a61af66fc99e Initial load
duke
parents:
diff changeset
221 // otherwise we will run into problems with JDK 1.2, see also
a61af66fc99e Initial load
duke
parents:
diff changeset
222 // AbstractInterpreterGenerator::generate_method_entry() for
a61af66fc99e Initial load
duke
parents:
diff changeset
223 // for details.
a61af66fc99e Initial load
duke
parents:
diff changeset
224 switch (m->intrinsic_id()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
225 case vmIntrinsics::_dsin : return java_lang_math_sin ;
a61af66fc99e Initial load
duke
parents:
diff changeset
226 case vmIntrinsics::_dcos : return java_lang_math_cos ;
a61af66fc99e Initial load
duke
parents:
diff changeset
227 case vmIntrinsics::_dtan : return java_lang_math_tan ;
a61af66fc99e Initial load
duke
parents:
diff changeset
228 case vmIntrinsics::_dabs : return java_lang_math_abs ;
a61af66fc99e Initial load
duke
parents:
diff changeset
229 case vmIntrinsics::_dsqrt : return java_lang_math_sqrt ;
a61af66fc99e Initial load
duke
parents:
diff changeset
230 case vmIntrinsics::_dlog : return java_lang_math_log ;
a61af66fc99e Initial load
duke
parents:
diff changeset
231 case vmIntrinsics::_dlog10: return java_lang_math_log10;
6084
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 3249
diff changeset
232 case vmIntrinsics::_dpow : return java_lang_math_pow ;
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 3249
diff changeset
233 case vmIntrinsics::_dexp : return java_lang_math_exp ;
3249
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2177
diff changeset
234
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2177
diff changeset
235 case vmIntrinsics::_Reference_get:
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2177
diff changeset
236 return java_lang_ref_reference_get;
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2177
diff changeset
237 }
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2177
diff changeset
238
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2177
diff changeset
239 // Accessor method?
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2177
diff changeset
240 if (m->is_accessor()) {
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2177
diff changeset
241 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
242 return accessor;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
243 }
a61af66fc99e Initial load
duke
parents:
diff changeset
244
a61af66fc99e Initial load
duke
parents:
diff changeset
245 // Note: for now: zero locals for all non-empty methods
a61af66fc99e Initial load
duke
parents:
diff changeset
246 return zerolocals;
a61af66fc99e Initial load
duke
parents:
diff changeset
247 }
a61af66fc99e Initial load
duke
parents:
diff changeset
248
a61af66fc99e Initial load
duke
parents:
diff changeset
249
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
250 void AbstractInterpreter::set_entry_for_kind(AbstractInterpreter::MethodKind kind, address entry) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
251 assert(kind >= method_handle_invoke_FIRST &&
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
252 kind <= method_handle_invoke_LAST, "late initialization only for MH entry points");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
253 assert(_entry_table[kind] == _entry_table[abstract], "previous value must be AME entry");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
254 _entry_table[kind] = entry;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
255 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
256
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
257
0
a61af66fc99e Initial load
duke
parents:
diff changeset
258 // Return true if the interpreter can prove that the given bytecode has
a61af66fc99e Initial load
duke
parents:
diff changeset
259 // not yet been executed (in Java semantics, not in actual operation).
a61af66fc99e Initial load
duke
parents:
diff changeset
260 bool AbstractInterpreter::is_not_reached(methodHandle method, int bci) {
2142
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1972
diff changeset
261 Bytecodes::Code code = method()->code_at(bci);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
262
2142
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1972
diff changeset
263 if (!Bytecodes::must_rewrite(code)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
264 // might have been reached
a61af66fc99e Initial load
duke
parents:
diff changeset
265 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
266 }
a61af66fc99e Initial load
duke
parents:
diff changeset
267
a61af66fc99e Initial load
duke
parents:
diff changeset
268 // the bytecode might not be rewritten if the method is an accessor, etc.
a61af66fc99e Initial load
duke
parents:
diff changeset
269 address ientry = method->interpreter_entry();
a61af66fc99e Initial load
duke
parents:
diff changeset
270 if (ientry != entry_for_kind(AbstractInterpreter::zerolocals) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
271 ientry != entry_for_kind(AbstractInterpreter::zerolocals_synchronized))
a61af66fc99e Initial load
duke
parents:
diff changeset
272 return false; // interpreter does not run this method!
a61af66fc99e Initial load
duke
parents:
diff changeset
273
a61af66fc99e Initial load
duke
parents:
diff changeset
274 // otherwise, we can be sure this bytecode has never been executed
a61af66fc99e Initial load
duke
parents:
diff changeset
275 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
276 }
a61af66fc99e Initial load
duke
parents:
diff changeset
277
a61af66fc99e Initial load
duke
parents:
diff changeset
278
a61af66fc99e Initial load
duke
parents:
diff changeset
279 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
280 void AbstractInterpreter::print_method_kind(MethodKind kind) {
a61af66fc99e Initial load
duke
parents:
diff changeset
281 switch (kind) {
a61af66fc99e Initial load
duke
parents:
diff changeset
282 case zerolocals : tty->print("zerolocals" ); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
283 case zerolocals_synchronized: tty->print("zerolocals_synchronized"); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
284 case native : tty->print("native" ); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
285 case native_synchronized : tty->print("native_synchronized" ); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
286 case empty : tty->print("empty" ); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
287 case accessor : tty->print("accessor" ); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
288 case abstract : tty->print("abstract" ); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
289 case java_lang_math_sin : tty->print("java_lang_math_sin" ); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
290 case java_lang_math_cos : tty->print("java_lang_math_cos" ); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
291 case java_lang_math_tan : tty->print("java_lang_math_tan" ); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
292 case java_lang_math_abs : tty->print("java_lang_math_abs" ); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
293 case java_lang_math_sqrt : tty->print("java_lang_math_sqrt" ); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
294 case java_lang_math_log : tty->print("java_lang_math_log" ); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
295 case java_lang_math_log10 : tty->print("java_lang_math_log10" ); break;
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
296 default:
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
297 if (kind >= method_handle_invoke_FIRST &&
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
298 kind <= method_handle_invoke_LAST) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
299 const char* kind_name = vmIntrinsics::name_at(method_handle_intrinsic(kind));
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
300 if (kind_name[0] == '_') kind_name = &kind_name[1]; // '_invokeExact' => 'invokeExact'
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
301 tty->print("method_handle_%s", kind_name);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
302 break;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
303 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
304 ShouldNotReachHere();
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
305 break;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
306 }
a61af66fc99e Initial load
duke
parents:
diff changeset
307 }
a61af66fc99e Initial load
duke
parents:
diff changeset
308 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
309
a61af66fc99e Initial load
duke
parents:
diff changeset
310
a61af66fc99e Initial load
duke
parents:
diff changeset
311 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
312 // Deoptimization support
a61af66fc99e Initial load
duke
parents:
diff changeset
313
900
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
314 // If deoptimization happens, this function returns the point of next bytecode to continue execution
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
315 address AbstractInterpreter::deopt_continue_after_entry(Method* method, address bcp, int callee_parameters, bool is_top_frame) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
316 assert(method->contains(bcp), "just checkin'");
2142
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1972
diff changeset
317 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
318 assert(!Interpreter::bytecode_should_reexecute(code), "should not reexecute");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
319 int bci = method->bci_from(bcp);
a61af66fc99e Initial load
duke
parents:
diff changeset
320 int length = -1; // initial value for debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
321 // compute continuation length
2142
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1972
diff changeset
322 length = Bytecodes::length_at(method, bcp);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
323 // compute result type
a61af66fc99e Initial load
duke
parents:
diff changeset
324 BasicType type = T_ILLEGAL;
900
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
325
0
a61af66fc99e Initial load
duke
parents:
diff changeset
326 switch (code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
327 case Bytecodes::_invokevirtual :
a61af66fc99e Initial load
duke
parents:
diff changeset
328 case Bytecodes::_invokespecial :
a61af66fc99e Initial load
duke
parents:
diff changeset
329 case Bytecodes::_invokestatic :
a61af66fc99e Initial load
duke
parents:
diff changeset
330 case Bytecodes::_invokeinterface: {
a61af66fc99e Initial load
duke
parents:
diff changeset
331 Thread *thread = Thread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
332 ResourceMark rm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
333 methodHandle mh(thread, method);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
334 type = Bytecode_invoke(mh, bci).result_type();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
335 // since the cache entry might not be initialized:
a61af66fc99e Initial load
duke
parents:
diff changeset
336 // (NOT needed for the old calling convension)
a61af66fc99e Initial load
duke
parents:
diff changeset
337 if (!is_top_frame) {
a61af66fc99e Initial load
duke
parents:
diff changeset
338 int index = Bytes::get_native_u2(bcp+1);
a61af66fc99e Initial load
duke
parents:
diff changeset
339 method->constants()->cache()->entry_at(index)->set_parameter_size(callee_parameters);
a61af66fc99e Initial load
duke
parents:
diff changeset
340 }
a61af66fc99e Initial load
duke
parents:
diff changeset
341 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
342 }
a61af66fc99e Initial load
duke
parents:
diff changeset
343
1059
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 900
diff changeset
344 case Bytecodes::_invokedynamic: {
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 900
diff changeset
345 Thread *thread = Thread::current();
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 900
diff changeset
346 ResourceMark rm(thread);
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 900
diff changeset
347 methodHandle mh(thread, method);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
348 type = Bytecode_invoke(mh, bci).result_type();
1059
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 900
diff changeset
349 // since the cache entry might not be initialized:
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 900
diff changeset
350 // (NOT needed for the old calling convension)
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 900
diff changeset
351 if (!is_top_frame) {
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 900
diff changeset
352 int index = Bytes::get_native_u4(bcp+1);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
353 method->constants()->invokedynamic_cp_cache_entry_at(index)->set_parameter_size(callee_parameters);
1059
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 900
diff changeset
354 }
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 900
diff changeset
355 break;
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 900
diff changeset
356 }
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 900
diff changeset
357
0
a61af66fc99e Initial load
duke
parents:
diff changeset
358 case Bytecodes::_ldc :
a61af66fc99e Initial load
duke
parents:
diff changeset
359 case Bytecodes::_ldc_w : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
360 case Bytecodes::_ldc2_w:
1602
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
361 {
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
362 Thread *thread = Thread::current();
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
363 ResourceMark rm(thread);
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
364 methodHandle mh(thread, method);
2142
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1972
diff changeset
365 type = Bytecode_loadconstant(mh, bci).result_type();
1602
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
366 break;
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
367 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
368
a61af66fc99e Initial load
duke
parents:
diff changeset
369 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
370 type = Bytecodes::result_type(code);
a61af66fc99e Initial load
duke
parents:
diff changeset
371 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
372 }
a61af66fc99e Initial load
duke
parents:
diff changeset
373
a61af66fc99e Initial load
duke
parents:
diff changeset
374 // return entry point for computed continuation state & bytecode length
a61af66fc99e Initial load
duke
parents:
diff changeset
375 return
a61af66fc99e Initial load
duke
parents:
diff changeset
376 is_top_frame
a61af66fc99e Initial load
duke
parents:
diff changeset
377 ? Interpreter::deopt_entry (as_TosState(type), length)
a61af66fc99e Initial load
duke
parents:
diff changeset
378 : Interpreter::return_entry(as_TosState(type), length);
a61af66fc99e Initial load
duke
parents:
diff changeset
379 }
a61af66fc99e Initial load
duke
parents:
diff changeset
380
900
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
381 // 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
382 // the bytecode.
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
383 // 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
384 // Interpreter::deopt_entry(vtos, 0) like others
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
385 address AbstractInterpreter::deopt_reexecute_entry(Method* method, address bcp) {
900
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
386 assert(method->contains(bcp), "just checkin'");
2142
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1972
diff changeset
387 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
388 #ifdef COMPILER1
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
389 if(code == Bytecodes::_athrow ) {
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
390 return Interpreter::rethrow_exception_entry();
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
391 }
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
392 #endif /* COMPILER1 */
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
393 return Interpreter::deopt_entry(vtos, 0);
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
394 }
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
395
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
396 #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
397
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
398
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
399 // 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
400 // 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
401 bool AbstractInterpreter::bytecode_should_reexecute(Bytecodes::Code code) {
6275
957c266d8bc5 Merge with http://hg.openjdk.java.net/hsx/hsx24/hotspot/
Doug Simon <doug.simon@oracle.com>
parents: 4678 6266
diff changeset
402 switch (code) {
957c266d8bc5 Merge with http://hg.openjdk.java.net/hsx/hsx24/hotspot/
Doug Simon <doug.simon@oracle.com>
parents: 4678 6266
diff changeset
403 case Bytecodes::_invokedynamic:
957c266d8bc5 Merge with http://hg.openjdk.java.net/hsx/hsx24/hotspot/
Doug Simon <doug.simon@oracle.com>
parents: 4678 6266
diff changeset
404 case Bytecodes::_invokevirtual:
957c266d8bc5 Merge with http://hg.openjdk.java.net/hsx/hsx24/hotspot/
Doug Simon <doug.simon@oracle.com>
parents: 4678 6266
diff changeset
405 case Bytecodes::_invokeinterface:
957c266d8bc5 Merge with http://hg.openjdk.java.net/hsx/hsx24/hotspot/
Doug Simon <doug.simon@oracle.com>
parents: 4678 6266
diff changeset
406 case Bytecodes::_invokespecial:
957c266d8bc5 Merge with http://hg.openjdk.java.net/hsx/hsx24/hotspot/
Doug Simon <doug.simon@oracle.com>
parents: 4678 6266
diff changeset
407 case Bytecodes::_invokestatic:
957c266d8bc5 Merge with http://hg.openjdk.java.net/hsx/hsx24/hotspot/
Doug Simon <doug.simon@oracle.com>
parents: 4678 6266
diff changeset
408 return false;
957c266d8bc5 Merge with http://hg.openjdk.java.net/hsx/hsx24/hotspot/
Doug Simon <doug.simon@oracle.com>
parents: 4678 6266
diff changeset
409 default:
957c266d8bc5 Merge with http://hg.openjdk.java.net/hsx/hsx24/hotspot/
Doug Simon <doug.simon@oracle.com>
parents: 4678 6266
diff changeset
410 return true;
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
411 }
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
412 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
413 }
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
414 #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
415
900
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
416 // 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
417 // 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
418 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
419 switch (code) {
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
420 case Bytecodes::_lookupswitch:
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
421 case Bytecodes::_tableswitch:
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
422 case Bytecodes::_fast_binaryswitch:
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
423 case Bytecodes::_fast_linearswitch:
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
424 // recompute condtional expression folded into _if<cond>
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
425 case Bytecodes::_lcmp :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
426 case Bytecodes::_fcmpl :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
427 case Bytecodes::_fcmpg :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
428 case Bytecodes::_dcmpl :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
429 case Bytecodes::_dcmpg :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
430 case Bytecodes::_ifnull :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
431 case Bytecodes::_ifnonnull :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
432 case Bytecodes::_goto :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
433 case Bytecodes::_goto_w :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
434 case Bytecodes::_ifeq :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
435 case Bytecodes::_ifne :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
436 case Bytecodes::_iflt :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
437 case Bytecodes::_ifge :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
438 case Bytecodes::_ifgt :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
439 case Bytecodes::_ifle :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
440 case Bytecodes::_if_icmpeq :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
441 case Bytecodes::_if_icmpne :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
442 case Bytecodes::_if_icmplt :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
443 case Bytecodes::_if_icmpge :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
444 case Bytecodes::_if_icmpgt :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
445 case Bytecodes::_if_icmple :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
446 case Bytecodes::_if_acmpeq :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
447 case Bytecodes::_if_acmpne :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
448 // special cases
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
449 case Bytecodes::_getfield :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
450 case Bytecodes::_putfield :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
451 case Bytecodes::_getstatic :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
452 case Bytecodes::_putstatic :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
453 case Bytecodes::_aastore :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
454 #ifdef COMPILER1
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
455 //special case of reexecution
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
456 case Bytecodes::_athrow :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
457 #endif
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
458 return true;
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
459
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
460 default:
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
461 return false;
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
462 }
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
463 }
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
464 #endif
900
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
465
0
a61af66fc99e Initial load
duke
parents:
diff changeset
466 void AbstractInterpreterGenerator::bang_stack_shadow_pages(bool native_call) {
a61af66fc99e Initial load
duke
parents:
diff changeset
467 // Quick & dirty stack overflow checking: bang the stack & handle trap.
a61af66fc99e Initial load
duke
parents:
diff changeset
468 // Note that we do the banging after the frame is setup, since the exception
a61af66fc99e Initial load
duke
parents:
diff changeset
469 // handling code expects to find a valid interpreter frame on the stack.
a61af66fc99e Initial load
duke
parents:
diff changeset
470 // Doing the banging earlier fails if the caller frame is not an interpreter
a61af66fc99e Initial load
duke
parents:
diff changeset
471 // frame.
a61af66fc99e Initial load
duke
parents:
diff changeset
472 // (Also, the exception throwing code expects to unlock any synchronized
a61af66fc99e Initial load
duke
parents:
diff changeset
473 // method receiever, so do the banging after locking the receiver.)
a61af66fc99e Initial load
duke
parents:
diff changeset
474
a61af66fc99e Initial load
duke
parents:
diff changeset
475 // Bang each page in the shadow zone. We can't assume it's been done for
a61af66fc99e Initial load
duke
parents:
diff changeset
476 // an interpreter frame with greater than a page of locals, so each page
a61af66fc99e Initial load
duke
parents:
diff changeset
477 // needs to be checked. Only true for non-native.
a61af66fc99e Initial load
duke
parents:
diff changeset
478 if (UseStackBanging) {
a61af66fc99e Initial load
duke
parents:
diff changeset
479 const int start_page = native_call ? StackShadowPages : 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
480 const int page_size = os::vm_page_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
481 for (int pages = start_page; pages <= StackShadowPages ; pages++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
482 __ bang_stack_with_offset(pages*page_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
483 }
a61af66fc99e Initial load
duke
parents:
diff changeset
484 }
a61af66fc99e Initial load
duke
parents:
diff changeset
485 }
6926
a3e2f723f2a5 8000780: make Zero build and run with JDK8
twisti
parents: 6796
diff changeset
486
a3e2f723f2a5 8000780: make Zero build and run with JDK8
twisti
parents: 6796
diff changeset
487 void AbstractInterpreterGenerator::initialize_method_handle_entries() {
a3e2f723f2a5 8000780: make Zero build and run with JDK8
twisti
parents: 6796
diff changeset
488 // method handle entry kinds are generated later in MethodHandlesAdapterGenerator::generate:
a3e2f723f2a5 8000780: make Zero build and run with JDK8
twisti
parents: 6796
diff changeset
489 for (int i = Interpreter::method_handle_invoke_FIRST; i <= Interpreter::method_handle_invoke_LAST; i++) {
a3e2f723f2a5 8000780: make Zero build and run with JDK8
twisti
parents: 6796
diff changeset
490 Interpreter::MethodKind kind = (Interpreter::MethodKind) i;
a3e2f723f2a5 8000780: make Zero build and run with JDK8
twisti
parents: 6796
diff changeset
491 Interpreter::_entry_table[kind] = Interpreter::_entry_table[Interpreter::abstract];
a3e2f723f2a5 8000780: make Zero build and run with JDK8
twisti
parents: 6796
diff changeset
492 }
a3e2f723f2a5 8000780: make Zero build and run with JDK8
twisti
parents: 6796
diff changeset
493 }