annotate src/share/vm/interpreter/interpreter.cpp @ 7062:8c5333c80cfd

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