Mercurial > hg > truffle
annotate src/share/vm/interpreter/interpreterRuntime.hpp @ 9126:bc26f978b0ce
HotSpotResolvedObjectType: implement hasFinalizeSubclass() correctly
don't use the (wrong) cached value, but ask the runtime on each request.
Fixes regression on xml.* benchmarks @ specjvm2008. The problem was:
After the constructor of Object was deoptimized due to an assumption violation,
it was recompiled again after some time. However, on recompilation, the value
of hasFinalizeSubclass for the class was not updated and it was compiled again
with a, now wrong, assumption, which then triggers deoptimization again.
This was repeated until it hit the recompilation limit (defined by
PerMethodRecompilationCutoff), and therefore only executed by the interpreter
from now on, causing the performance regression.
author | Bernhard Urban <bernhard.urban@jku.at> |
---|---|
date | Mon, 15 Apr 2013 19:54:58 +0200 |
parents | f34d701e952e |
children | aeaca88565e6 |
rev | line source |
---|---|
0 | 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 | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | |
5 * This code is free software; you can redistribute it and/or modify it | |
6 * under the terms of the GNU General Public License version 2 only, as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 * | |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1059
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1059
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:
1059
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
1972 | 25 #ifndef SHARE_VM_INTERPRETER_INTERPRETERRUNTIME_HPP |
26 #define SHARE_VM_INTERPRETER_INTERPRETERRUNTIME_HPP | |
27 | |
28 #include "interpreter/bytecode.hpp" | |
29 #include "interpreter/linkResolver.hpp" | |
30 #include "memory/universe.hpp" | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
31 #include "oops/method.hpp" |
1972 | 32 #include "runtime/frame.inline.hpp" |
33 #include "runtime/signature.hpp" | |
7180
f34d701e952e
8003935: Simplify the needed includes for using Thread::current()
stefank
parents:
6725
diff
changeset
|
34 #include "runtime/thread.inline.hpp" |
1972 | 35 #include "utilities/top.hpp" |
36 | |
0 | 37 // The InterpreterRuntime is called by the interpreter for everything |
38 // that cannot/should not be dealt with in assembly and needs C support. | |
39 | |
40 class InterpreterRuntime: AllStatic { | |
41 friend class BytecodeClosure; // for method and bcp | |
42 friend class PrintingClosure; // for method and bcp | |
43 | |
44 private: | |
45 // Helper functions to access current interpreter state | |
46 static frame last_frame(JavaThread *thread) { return thread->last_frame(); } | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
47 static Method* method(JavaThread *thread) { return last_frame(thread).interpreter_frame_method(); } |
0 | 48 static address bcp(JavaThread *thread) { return last_frame(thread).interpreter_frame_bcp(); } |
1602 | 49 static int bci(JavaThread *thread) { return last_frame(thread).interpreter_frame_bci(); } |
0 | 50 static void set_bcp_and_mdp(address bcp, JavaThread*thread); |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
51 static Bytecodes::Code code(JavaThread *thread) { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
52 // pass method to avoid calling unsafe bcp_to_method (partial fix 4926272) |
2142 | 53 return Bytecodes::code_at(method(thread), bcp(thread)); |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
54 } |
0 | 55 static bool already_resolved(JavaThread *thread) { return cache_entry(thread)->is_resolved(code(thread)); } |
2142 | 56 static Bytecode bytecode(JavaThread *thread) { return Bytecode(method(thread), bcp(thread)); } |
1565 | 57 static int get_index_u1(JavaThread *thread, Bytecodes::Code bc) |
2142 | 58 { return bytecode(thread).get_index_u1(bc); } |
1565 | 59 static int get_index_u2(JavaThread *thread, Bytecodes::Code bc) |
2142 | 60 { return bytecode(thread).get_index_u2(bc); } |
1565 | 61 static int get_index_u2_cpcache(JavaThread *thread, Bytecodes::Code bc) |
2142 | 62 { return bytecode(thread).get_index_u2_cpcache(bc); } |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
3960
diff
changeset
|
63 static int get_index_u4(JavaThread *thread, Bytecodes::Code bc) |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
3960
diff
changeset
|
64 { return bytecode(thread).get_index_u4(bc); } |
0 | 65 static int number_of_dimensions(JavaThread *thread) { return bcp(thread)[3]; } |
726
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
66 |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
67 static ConstantPoolCacheEntry* cache_entry_at(JavaThread *thread, int i) { return method(thread)->constants()->cache()->entry_at(i); } |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
68 static ConstantPoolCacheEntry* cache_entry(JavaThread *thread) { return cache_entry_at(thread, Bytes::get_native_u2(bcp(thread) + 1)); } |
0 | 69 static void note_trap(JavaThread *thread, int reason, TRAPS); |
70 | |
941 | 71 // Inner work method for Interpreter's frequency counter overflow |
72 static nmethod* frequency_counter_overflow_inner(JavaThread* thread, address branch_bcp); | |
73 | |
0 | 74 public: |
75 // Constants | |
76 static void ldc (JavaThread* thread, bool wide); | |
1602 | 77 static void resolve_ldc (JavaThread* thread, Bytecodes::Code bytecode); |
0 | 78 |
79 // Allocation | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
80 static void _new (JavaThread* thread, ConstantPool* pool, int index); |
0 | 81 static void newarray (JavaThread* thread, BasicType type, jint size); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
82 static void anewarray (JavaThread* thread, ConstantPool* pool, int index, jint size); |
0 | 83 static void multianewarray(JavaThread* thread, jint* first_size_address); |
84 static void register_finalizer(JavaThread* thread, oopDesc* obj); | |
85 | |
86 // Quicken instance-of and check-cast bytecodes | |
87 static void quicken_io_cc(JavaThread* thread); | |
88 | |
89 // Exceptions thrown by the interpreter | |
90 static void throw_AbstractMethodError(JavaThread* thread); | |
91 static void throw_IncompatibleClassChangeError(JavaThread* thread); | |
92 static void throw_StackOverflowError(JavaThread* thread); | |
93 static void throw_ArrayIndexOutOfBoundsException(JavaThread* thread, char* name, jint index); | |
94 static void throw_ClassCastException(JavaThread* thread, oopDesc* obj); | |
95 static void create_exception(JavaThread* thread, char* name, char* message); | |
96 static void create_klass_exception(JavaThread* thread, char* name, oopDesc* obj); | |
97 static address exception_handler_for_exception(JavaThread* thread, oopDesc* exception); | |
98 static void throw_pending_exception(JavaThread* thread); | |
99 | |
100 // Statics & fields | |
101 static void resolve_get_put(JavaThread* thread, Bytecodes::Code bytecode); | |
102 | |
103 // Synchronization | |
104 static void monitorenter(JavaThread* thread, BasicObjectLock* elem); | |
105 static void monitorexit (JavaThread* thread, BasicObjectLock* elem); | |
106 | |
107 static void throw_illegal_monitor_state_exception(JavaThread* thread); | |
108 static void new_illegal_monitor_state_exception(JavaThread* thread); | |
109 | |
110 // Calls | |
726
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
111 static void resolve_invoke (JavaThread* thread, Bytecodes::Code bytecode); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
3960
diff
changeset
|
112 static void resolve_invokehandle (JavaThread* thread); |
726
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
113 static void resolve_invokedynamic(JavaThread* thread); |
0 | 114 |
115 // Breakpoints | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
116 static void _breakpoint(JavaThread* thread, Method* method, address bcp); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
117 static Bytecodes::Code get_original_bytecode_at(JavaThread* thread, Method* method, address bcp); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
118 static void set_original_bytecode_at(JavaThread* thread, Method* method, address bcp, Bytecodes::Code new_code); |
0 | 119 static bool is_breakpoint(JavaThread *thread) { return Bytecodes::code_or_bp_at(bcp(thread)) == Bytecodes::_breakpoint; } |
120 | |
121 // Safepoints | |
122 static void at_safepoint(JavaThread* thread); | |
123 | |
124 // Debugger support | |
125 static void post_field_access(JavaThread *thread, oopDesc* obj, | |
126 ConstantPoolCacheEntry *cp_entry); | |
127 static void post_field_modification(JavaThread *thread, oopDesc* obj, | |
128 ConstantPoolCacheEntry *cp_entry, jvalue *value); | |
129 static void post_method_entry(JavaThread *thread); | |
130 static void post_method_exit (JavaThread *thread); | |
131 static int interpreter_contains(address pc); | |
132 | |
133 // Native signature handlers | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
134 static void prepare_native_call(JavaThread* thread, Method* method); |
0 | 135 static address slow_signature_handler(JavaThread* thread, |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
136 Method* method, |
0 | 137 intptr_t* from, intptr_t* to); |
138 | |
3911
2fecca53a2c6
7085012: ARM: com/sun/jdi/PopSynchronousTest.java still fails
roland
parents:
3781
diff
changeset
|
139 #if defined(IA32) || defined(AMD64) || defined(ARM) |
2fecca53a2c6
7085012: ARM: com/sun/jdi/PopSynchronousTest.java still fails
roland
parents:
3781
diff
changeset
|
140 // Popframe support (only needed on x86, AMD64 and ARM) |
0 | 141 static void popframe_move_outgoing_args(JavaThread* thread, void* src_address, void* dest_address); |
142 #endif | |
143 | |
144 // Platform dependent stuff | |
1972 | 145 #ifdef TARGET_ARCH_x86 |
146 # include "interpreterRT_x86.hpp" | |
147 #endif | |
148 #ifdef TARGET_ARCH_sparc | |
149 # include "interpreterRT_sparc.hpp" | |
150 #endif | |
151 #ifdef TARGET_ARCH_zero | |
152 # include "interpreterRT_zero.hpp" | |
153 #endif | |
2192
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
2144
diff
changeset
|
154 #ifdef TARGET_ARCH_arm |
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
2144
diff
changeset
|
155 # include "interpreterRT_arm.hpp" |
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
2144
diff
changeset
|
156 #endif |
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
2144
diff
changeset
|
157 #ifdef TARGET_ARCH_ppc |
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
2144
diff
changeset
|
158 # include "interpreterRT_ppc.hpp" |
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
2144
diff
changeset
|
159 #endif |
1972 | 160 |
0 | 161 |
162 // Interpreter's frequency counter overflow | |
163 static nmethod* frequency_counter_overflow(JavaThread* thread, address branch_bcp); | |
164 | |
165 // Interpreter profiling support | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
166 static jint bcp_to_di(Method* method, address cur_bcp); |
2118
dd031b2226de
4930919: race condition in MDO creation at back branch locations
iveresov
parents:
1972
diff
changeset
|
167 static void profile_method(JavaThread* thread); |
0 | 168 static void update_mdp_for_ret(JavaThread* thread, int bci); |
169 #ifdef ASSERT | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
170 static void verify_mdp(Method* method, address bcp, address mdp); |
0 | 171 #endif // ASSERT |
172 }; | |
173 | |
174 | |
175 class SignatureHandlerLibrary: public AllStatic { | |
176 public: | |
177 enum { buffer_size = 1*K }; // the size of the temporary code buffer | |
178 enum { blob_size = 32*K }; // the size of a handler code blob. | |
179 | |
180 private: | |
181 static BufferBlob* _handler_blob; // the current buffer blob containing the generated handlers | |
182 static address _handler; // next available address within _handler_blob; | |
183 static GrowableArray<uint64_t>* _fingerprints; // the fingerprint collection | |
184 static GrowableArray<address>* _handlers; // the corresponding handlers | |
185 static address _buffer; // the temporary code buffer | |
186 | |
187 static address set_handler_blob(); | |
188 static void initialize(); | |
189 static address set_handler(CodeBuffer* buffer); | |
190 static void pd_set_handler(address handler); | |
191 | |
192 public: | |
193 static void add(methodHandle method); | |
194 }; | |
1972 | 195 |
196 #endif // SHARE_VM_INTERPRETER_INTERPRETERRUNTIME_HPP |