Mercurial > hg > truffle
annotate src/share/vm/interpreter/interpreterRuntime.hpp @ 20543:e7d0505c8a30
8059758: Footprint regressions with JDK-8038423
Summary: Changes in JDK-8038423 always initialize (zero out) virtual memory used for auxiliary data structures. This causes a footprint regression for G1 in startup benchmarks. This is because they do not touch that memory at all, so the operating system does not actually commit these pages. The fix is to, if the initialization value of the data structures matches the default value of just committed memory (=0), do not do anything.
Reviewed-by: jwilhelm, brutisso
author | tschatzl |
---|---|
date | Fri, 10 Oct 2014 15:51:58 +0200 |
parents | abe03600372a |
children | d8041d695d19 |
rev | line source |
---|---|
0 | 1 /* |
10105
aeaca88565e6
8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
7180
diff
changeset
|
2 * Copyright (c) 1997, 2013, 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)); } |
14420
abe03600372a
8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents:
12010
diff
changeset
|
69 static void note_trap_inner(JavaThread* thread, int reason, |
abe03600372a
8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents:
12010
diff
changeset
|
70 methodHandle trap_method, int trap_bci, TRAPS); |
0 | 71 static void note_trap(JavaThread *thread, int reason, TRAPS); |
14420
abe03600372a
8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents:
12010
diff
changeset
|
72 #ifdef CC_INTERP |
abe03600372a
8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents:
12010
diff
changeset
|
73 // Profile traps in C++ interpreter. |
abe03600372a
8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents:
12010
diff
changeset
|
74 static void note_trap(JavaThread* thread, int reason, Method *method, int trap_bci); |
abe03600372a
8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents:
12010
diff
changeset
|
75 #endif // CC_INTERP |
0 | 76 |
14420
abe03600372a
8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents:
12010
diff
changeset
|
77 // Inner work method for Interpreter's frequency counter overflow. |
941 | 78 static nmethod* frequency_counter_overflow_inner(JavaThread* thread, address branch_bcp); |
79 | |
0 | 80 public: |
81 // Constants | |
82 static void ldc (JavaThread* thread, bool wide); | |
1602 | 83 static void resolve_ldc (JavaThread* thread, Bytecodes::Code bytecode); |
0 | 84 |
85 // Allocation | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
86 static void _new (JavaThread* thread, ConstantPool* pool, int index); |
0 | 87 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
|
88 static void anewarray (JavaThread* thread, ConstantPool* pool, int index, jint size); |
0 | 89 static void multianewarray(JavaThread* thread, jint* first_size_address); |
90 static void register_finalizer(JavaThread* thread, oopDesc* obj); | |
91 | |
92 // Quicken instance-of and check-cast bytecodes | |
93 static void quicken_io_cc(JavaThread* thread); | |
94 | |
95 // Exceptions thrown by the interpreter | |
96 static void throw_AbstractMethodError(JavaThread* thread); | |
97 static void throw_IncompatibleClassChangeError(JavaThread* thread); | |
98 static void throw_StackOverflowError(JavaThread* thread); | |
99 static void throw_ArrayIndexOutOfBoundsException(JavaThread* thread, char* name, jint index); | |
100 static void throw_ClassCastException(JavaThread* thread, oopDesc* obj); | |
101 static void create_exception(JavaThread* thread, char* name, char* message); | |
102 static void create_klass_exception(JavaThread* thread, char* name, oopDesc* obj); | |
103 static address exception_handler_for_exception(JavaThread* thread, oopDesc* exception); | |
12010
ca0165daa6ec
7187554: JSR 292: JVMTI PopFrame needs to handle appendix arguments
sspitsyn
parents:
10105
diff
changeset
|
104 #if INCLUDE_JVMTI |
ca0165daa6ec
7187554: JSR 292: JVMTI PopFrame needs to handle appendix arguments
sspitsyn
parents:
10105
diff
changeset
|
105 static void member_name_arg_or_null(JavaThread* thread, address dmh, Method* m, address bcp); |
ca0165daa6ec
7187554: JSR 292: JVMTI PopFrame needs to handle appendix arguments
sspitsyn
parents:
10105
diff
changeset
|
106 #endif |
0 | 107 static void throw_pending_exception(JavaThread* thread); |
108 | |
14420
abe03600372a
8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents:
12010
diff
changeset
|
109 #ifdef CC_INTERP |
abe03600372a
8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents:
12010
diff
changeset
|
110 // Profile traps in C++ interpreter. |
abe03600372a
8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents:
12010
diff
changeset
|
111 static void note_nullCheck_trap (JavaThread* thread, Method *method, int trap_bci); |
abe03600372a
8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents:
12010
diff
changeset
|
112 static void note_div0Check_trap (JavaThread* thread, Method *method, int trap_bci); |
abe03600372a
8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents:
12010
diff
changeset
|
113 static void note_rangeCheck_trap(JavaThread* thread, Method *method, int trap_bci); |
abe03600372a
8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents:
12010
diff
changeset
|
114 static void note_classCheck_trap(JavaThread* thread, Method *method, int trap_bci); |
abe03600372a
8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents:
12010
diff
changeset
|
115 static void note_arrayCheck_trap(JavaThread* thread, Method *method, int trap_bci); |
abe03600372a
8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents:
12010
diff
changeset
|
116 // A dummy for makros that shall not profile traps. |
abe03600372a
8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents:
12010
diff
changeset
|
117 static void note_no_trap(JavaThread* thread, Method *method, int trap_bci) {} |
abe03600372a
8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents:
12010
diff
changeset
|
118 #endif // CC_INTERP |
abe03600372a
8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents:
12010
diff
changeset
|
119 |
0 | 120 // Statics & fields |
121 static void resolve_get_put(JavaThread* thread, Bytecodes::Code bytecode); | |
122 | |
123 // Synchronization | |
124 static void monitorenter(JavaThread* thread, BasicObjectLock* elem); | |
125 static void monitorexit (JavaThread* thread, BasicObjectLock* elem); | |
126 | |
127 static void throw_illegal_monitor_state_exception(JavaThread* thread); | |
128 static void new_illegal_monitor_state_exception(JavaThread* thread); | |
129 | |
130 // Calls | |
726
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
131 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
|
132 static void resolve_invokehandle (JavaThread* thread); |
726
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
133 static void resolve_invokedynamic(JavaThread* thread); |
0 | 134 |
135 // Breakpoints | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
136 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
|
137 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
|
138 static void set_original_bytecode_at(JavaThread* thread, Method* method, address bcp, Bytecodes::Code new_code); |
0 | 139 static bool is_breakpoint(JavaThread *thread) { return Bytecodes::code_or_bp_at(bcp(thread)) == Bytecodes::_breakpoint; } |
140 | |
141 // Safepoints | |
142 static void at_safepoint(JavaThread* thread); | |
143 | |
144 // Debugger support | |
145 static void post_field_access(JavaThread *thread, oopDesc* obj, | |
146 ConstantPoolCacheEntry *cp_entry); | |
147 static void post_field_modification(JavaThread *thread, oopDesc* obj, | |
148 ConstantPoolCacheEntry *cp_entry, jvalue *value); | |
149 static void post_method_entry(JavaThread *thread); | |
150 static void post_method_exit (JavaThread *thread); | |
151 static int interpreter_contains(address pc); | |
152 | |
153 // Native signature handlers | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
154 static void prepare_native_call(JavaThread* thread, Method* method); |
0 | 155 static address slow_signature_handler(JavaThread* thread, |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
156 Method* method, |
0 | 157 intptr_t* from, intptr_t* to); |
158 | |
3911
2fecca53a2c6
7085012: ARM: com/sun/jdi/PopSynchronousTest.java still fails
roland
parents:
3781
diff
changeset
|
159 #if defined(IA32) || defined(AMD64) || defined(ARM) |
2fecca53a2c6
7085012: ARM: com/sun/jdi/PopSynchronousTest.java still fails
roland
parents:
3781
diff
changeset
|
160 // Popframe support (only needed on x86, AMD64 and ARM) |
0 | 161 static void popframe_move_outgoing_args(JavaThread* thread, void* src_address, void* dest_address); |
162 #endif | |
163 | |
164 // Platform dependent stuff | |
1972 | 165 #ifdef TARGET_ARCH_x86 |
166 # include "interpreterRT_x86.hpp" | |
167 #endif | |
168 #ifdef TARGET_ARCH_sparc | |
169 # include "interpreterRT_sparc.hpp" | |
170 #endif | |
171 #ifdef TARGET_ARCH_zero | |
172 # include "interpreterRT_zero.hpp" | |
173 #endif | |
2192
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
2144
diff
changeset
|
174 #ifdef TARGET_ARCH_arm |
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
2144
diff
changeset
|
175 # include "interpreterRT_arm.hpp" |
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
2144
diff
changeset
|
176 #endif |
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
2144
diff
changeset
|
177 #ifdef TARGET_ARCH_ppc |
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
2144
diff
changeset
|
178 # include "interpreterRT_ppc.hpp" |
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
2144
diff
changeset
|
179 #endif |
1972 | 180 |
0 | 181 |
182 // Interpreter's frequency counter overflow | |
183 static nmethod* frequency_counter_overflow(JavaThread* thread, address branch_bcp); | |
184 | |
185 // Interpreter profiling support | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
186 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
|
187 static void profile_method(JavaThread* thread); |
0 | 188 static void update_mdp_for_ret(JavaThread* thread, int bci); |
189 #ifdef ASSERT | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
190 static void verify_mdp(Method* method, address bcp, address mdp); |
0 | 191 #endif // ASSERT |
10105
aeaca88565e6
8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
7180
diff
changeset
|
192 static MethodCounters* build_method_counters(JavaThread* thread, Method* m); |
0 | 193 }; |
194 | |
195 | |
196 class SignatureHandlerLibrary: public AllStatic { | |
197 public: | |
198 enum { buffer_size = 1*K }; // the size of the temporary code buffer | |
199 enum { blob_size = 32*K }; // the size of a handler code blob. | |
200 | |
201 private: | |
202 static BufferBlob* _handler_blob; // the current buffer blob containing the generated handlers | |
203 static address _handler; // next available address within _handler_blob; | |
204 static GrowableArray<uint64_t>* _fingerprints; // the fingerprint collection | |
205 static GrowableArray<address>* _handlers; // the corresponding handlers | |
206 static address _buffer; // the temporary code buffer | |
207 | |
208 static address set_handler_blob(); | |
209 static void initialize(); | |
210 static address set_handler(CodeBuffer* buffer); | |
211 static void pd_set_handler(address handler); | |
212 | |
213 public: | |
214 static void add(methodHandle method); | |
215 }; | |
1972 | 216 |
217 #endif // SHARE_VM_INTERPRETER_INTERPRETERRUNTIME_HPP |