annotate src/share/vm/opto/runtime.cpp @ 1941:79d04223b8a5

Added caching for resolved types and resolved fields. This is crucial, because the local load elimination will lead to wrong results, if field equality (of two RiField objects with the same object and the same RiType) is not given. The caching makes sure that the default equals implementation is sufficient.
author Thomas Wuerthinger <wuerthinger@ssw.jku.at>
date Tue, 28 Dec 2010 18:33:26 +0100
parents 75588558f1bf
children f95d63e2154a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1368
diff changeset
2 * Copyright (c) 1998, 2010, 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: 1368
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1368
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: 1368
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
a61af66fc99e Initial load
duke
parents:
diff changeset
25 #include "incls/_precompiled.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
26 #include "incls/_runtime.cpp.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
27
a61af66fc99e Initial load
duke
parents:
diff changeset
28
a61af66fc99e Initial load
duke
parents:
diff changeset
29 // For debugging purposes:
a61af66fc99e Initial load
duke
parents:
diff changeset
30 // To force FullGCALot inside a runtime function, add the following two lines
a61af66fc99e Initial load
duke
parents:
diff changeset
31 //
a61af66fc99e Initial load
duke
parents:
diff changeset
32 // Universe::release_fullgc_alot_dummy();
a61af66fc99e Initial load
duke
parents:
diff changeset
33 // MarkSweep::invoke(0, "Debugging");
a61af66fc99e Initial load
duke
parents:
diff changeset
34 //
a61af66fc99e Initial load
duke
parents:
diff changeset
35 // At command line specify the parameters: -XX:+FullGCALot -XX:FullGCALotStart=100000000
a61af66fc99e Initial load
duke
parents:
diff changeset
36
a61af66fc99e Initial load
duke
parents:
diff changeset
37
a61af66fc99e Initial load
duke
parents:
diff changeset
38
a61af66fc99e Initial load
duke
parents:
diff changeset
39
a61af66fc99e Initial load
duke
parents:
diff changeset
40 // Compiled code entry points
a61af66fc99e Initial load
duke
parents:
diff changeset
41 address OptoRuntime::_new_instance_Java = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
42 address OptoRuntime::_new_array_Java = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
43 address OptoRuntime::_multianewarray2_Java = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
44 address OptoRuntime::_multianewarray3_Java = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
45 address OptoRuntime::_multianewarray4_Java = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
46 address OptoRuntime::_multianewarray5_Java = NULL;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
47 address OptoRuntime::_g1_wb_pre_Java = NULL;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
48 address OptoRuntime::_g1_wb_post_Java = NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
49 address OptoRuntime::_vtable_must_compile_Java = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
50 address OptoRuntime::_complete_monitor_locking_Java = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
51 address OptoRuntime::_rethrow_Java = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
52
a61af66fc99e Initial load
duke
parents:
diff changeset
53 address OptoRuntime::_slow_arraycopy_Java = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
54 address OptoRuntime::_register_finalizer_Java = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
55
a61af66fc99e Initial load
duke
parents:
diff changeset
56 # ifdef ENABLE_ZAP_DEAD_LOCALS
a61af66fc99e Initial load
duke
parents:
diff changeset
57 address OptoRuntime::_zap_dead_Java_locals_Java = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
58 address OptoRuntime::_zap_dead_native_locals_Java = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
59 # endif
a61af66fc99e Initial load
duke
parents:
diff changeset
60
a61af66fc99e Initial load
duke
parents:
diff changeset
61
a61af66fc99e Initial load
duke
parents:
diff changeset
62 // This should be called in an assertion at the start of OptoRuntime routines
a61af66fc99e Initial load
duke
parents:
diff changeset
63 // which are entered from compiled code (all of them)
a61af66fc99e Initial load
duke
parents:
diff changeset
64 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
65 static bool check_compiled_frame(JavaThread* thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
66 assert(thread->last_frame().is_runtime_frame(), "cannot call runtime directly from compiled code");
a61af66fc99e Initial load
duke
parents:
diff changeset
67 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
68 RegisterMap map(thread, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
69 frame caller = thread->last_frame().sender(&map);
a61af66fc99e Initial load
duke
parents:
diff changeset
70 assert(caller.is_compiled_frame(), "not being called from compiled like code");
a61af66fc99e Initial load
duke
parents:
diff changeset
71 #endif /* ASSERT */
a61af66fc99e Initial load
duke
parents:
diff changeset
72 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
73 }
a61af66fc99e Initial load
duke
parents:
diff changeset
74 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
75
a61af66fc99e Initial load
duke
parents:
diff changeset
76
a61af66fc99e Initial load
duke
parents:
diff changeset
77 #define gen(env, var, type_func_gen, c_func, fancy_jump, pass_tls, save_arg_regs, return_pc) \
a61af66fc99e Initial load
duke
parents:
diff changeset
78 var = generate_stub(env, type_func_gen, CAST_FROM_FN_PTR(address, c_func), #var, fancy_jump, pass_tls, save_arg_regs, return_pc)
a61af66fc99e Initial load
duke
parents:
diff changeset
79
a61af66fc99e Initial load
duke
parents:
diff changeset
80 void OptoRuntime::generate(ciEnv* env) {
a61af66fc99e Initial load
duke
parents:
diff changeset
81
a61af66fc99e Initial load
duke
parents:
diff changeset
82 generate_exception_blob();
a61af66fc99e Initial load
duke
parents:
diff changeset
83
a61af66fc99e Initial load
duke
parents:
diff changeset
84 // Note: tls: Means fetching the return oop out of the thread-local storage
a61af66fc99e Initial load
duke
parents:
diff changeset
85 //
a61af66fc99e Initial load
duke
parents:
diff changeset
86 // variable/name type-function-gen , runtime method ,fncy_jp, tls,save_args,retpc
a61af66fc99e Initial load
duke
parents:
diff changeset
87 // -------------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
88 gen(env, _new_instance_Java , new_instance_Type , new_instance_C , 0 , true , false, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
89 gen(env, _new_array_Java , new_array_Type , new_array_C , 0 , true , false, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
90 gen(env, _multianewarray2_Java , multianewarray2_Type , multianewarray2_C , 0 , true , false, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
91 gen(env, _multianewarray3_Java , multianewarray3_Type , multianewarray3_C , 0 , true , false, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
92 gen(env, _multianewarray4_Java , multianewarray4_Type , multianewarray4_C , 0 , true , false, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
93 gen(env, _multianewarray5_Java , multianewarray5_Type , multianewarray5_C , 0 , true , false, false);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
94 gen(env, _g1_wb_pre_Java , g1_wb_pre_Type , SharedRuntime::g1_wb_pre , 0 , false, false, false);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
95 gen(env, _g1_wb_post_Java , g1_wb_post_Type , SharedRuntime::g1_wb_post , 0 , false, false, false);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
96 gen(env, _complete_monitor_locking_Java , complete_monitor_enter_Type , SharedRuntime::complete_monitor_locking_C , 0 , false, false, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
97 gen(env, _rethrow_Java , rethrow_Type , rethrow_C , 2 , true , false, true );
a61af66fc99e Initial load
duke
parents:
diff changeset
98
a61af66fc99e Initial load
duke
parents:
diff changeset
99 gen(env, _slow_arraycopy_Java , slow_arraycopy_Type , SharedRuntime::slow_arraycopy_C , 0 , false, false, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
100 gen(env, _register_finalizer_Java , register_finalizer_Type , register_finalizer , 0 , false, false, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
101
a61af66fc99e Initial load
duke
parents:
diff changeset
102 # ifdef ENABLE_ZAP_DEAD_LOCALS
a61af66fc99e Initial load
duke
parents:
diff changeset
103 gen(env, _zap_dead_Java_locals_Java , zap_dead_locals_Type , zap_dead_Java_locals_C , 0 , false, true , false );
a61af66fc99e Initial load
duke
parents:
diff changeset
104 gen(env, _zap_dead_native_locals_Java , zap_dead_locals_Type , zap_dead_native_locals_C , 0 , false, true , false );
a61af66fc99e Initial load
duke
parents:
diff changeset
105 # endif
a61af66fc99e Initial load
duke
parents:
diff changeset
106
a61af66fc99e Initial load
duke
parents:
diff changeset
107 }
a61af66fc99e Initial load
duke
parents:
diff changeset
108
a61af66fc99e Initial load
duke
parents:
diff changeset
109 #undef gen
a61af66fc99e Initial load
duke
parents:
diff changeset
110
a61af66fc99e Initial load
duke
parents:
diff changeset
111
a61af66fc99e Initial load
duke
parents:
diff changeset
112 // Helper method to do generation of RunTimeStub's
a61af66fc99e Initial load
duke
parents:
diff changeset
113 address OptoRuntime::generate_stub( ciEnv* env,
a61af66fc99e Initial load
duke
parents:
diff changeset
114 TypeFunc_generator gen, address C_function,
a61af66fc99e Initial load
duke
parents:
diff changeset
115 const char *name, int is_fancy_jump,
a61af66fc99e Initial load
duke
parents:
diff changeset
116 bool pass_tls,
a61af66fc99e Initial load
duke
parents:
diff changeset
117 bool save_argument_registers,
a61af66fc99e Initial load
duke
parents:
diff changeset
118 bool return_pc ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
119 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
120 Compile C( env, gen, C_function, name, is_fancy_jump, pass_tls, save_argument_registers, return_pc );
a61af66fc99e Initial load
duke
parents:
diff changeset
121 return C.stub_entry_point();
a61af66fc99e Initial load
duke
parents:
diff changeset
122 }
a61af66fc99e Initial load
duke
parents:
diff changeset
123
a61af66fc99e Initial load
duke
parents:
diff changeset
124 const char* OptoRuntime::stub_name(address entry) {
a61af66fc99e Initial load
duke
parents:
diff changeset
125 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
126 CodeBlob* cb = CodeCache::find_blob(entry);
a61af66fc99e Initial load
duke
parents:
diff changeset
127 RuntimeStub* rs =(RuntimeStub *)cb;
a61af66fc99e Initial load
duke
parents:
diff changeset
128 assert(rs != NULL && rs->is_runtime_stub(), "not a runtime stub");
a61af66fc99e Initial load
duke
parents:
diff changeset
129 return rs->name();
a61af66fc99e Initial load
duke
parents:
diff changeset
130 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
131 // Fast implementation for product mode (maybe it should be inlined too)
a61af66fc99e Initial load
duke
parents:
diff changeset
132 return "runtime stub";
a61af66fc99e Initial load
duke
parents:
diff changeset
133 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
134 }
a61af66fc99e Initial load
duke
parents:
diff changeset
135
a61af66fc99e Initial load
duke
parents:
diff changeset
136
a61af66fc99e Initial load
duke
parents:
diff changeset
137 //=============================================================================
a61af66fc99e Initial load
duke
parents:
diff changeset
138 // Opto compiler runtime routines
a61af66fc99e Initial load
duke
parents:
diff changeset
139 //=============================================================================
a61af66fc99e Initial load
duke
parents:
diff changeset
140
a61af66fc99e Initial load
duke
parents:
diff changeset
141
a61af66fc99e Initial load
duke
parents:
diff changeset
142 //=============================allocation======================================
a61af66fc99e Initial load
duke
parents:
diff changeset
143 // We failed the fast-path allocation. Now we need to do a scavenge or GC
a61af66fc99e Initial load
duke
parents:
diff changeset
144 // and try allocation again.
a61af66fc99e Initial load
duke
parents:
diff changeset
145
1166
7b0e9cba0307 6896647: card marks can be deferred too long
ysr
parents: 1142
diff changeset
146 void OptoRuntime::new_store_pre_barrier(JavaThread* thread) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
147 // After any safepoint, just before going back to compiled code,
1027
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 605
diff changeset
148 // we inform the GC that we will be doing initializing writes to
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 605
diff changeset
149 // this object in the future without emitting card-marks, so
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 605
diff changeset
150 // GC may take any compensating steps.
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 605
diff changeset
151 // NOTE: Keep this code consistent with GraphKit::store_barrier.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
152
a61af66fc99e Initial load
duke
parents:
diff changeset
153 oop new_obj = thread->vm_result();
a61af66fc99e Initial load
duke
parents:
diff changeset
154 if (new_obj == NULL) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
155
a61af66fc99e Initial load
duke
parents:
diff changeset
156 assert(Universe::heap()->can_elide_tlab_store_barriers(),
a61af66fc99e Initial load
duke
parents:
diff changeset
157 "compiler must check this first");
1027
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 605
diff changeset
158 // GC may decide to give back a safer copy of new_obj.
1166
7b0e9cba0307 6896647: card marks can be deferred too long
ysr
parents: 1142
diff changeset
159 new_obj = Universe::heap()->new_store_pre_barrier(thread, new_obj);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
160 thread->set_vm_result(new_obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
161 }
a61af66fc99e Initial load
duke
parents:
diff changeset
162
a61af66fc99e Initial load
duke
parents:
diff changeset
163 // object allocation
a61af66fc99e Initial load
duke
parents:
diff changeset
164 JRT_BLOCK_ENTRY(void, OptoRuntime::new_instance_C(klassOopDesc* klass, JavaThread* thread))
a61af66fc99e Initial load
duke
parents:
diff changeset
165 JRT_BLOCK;
a61af66fc99e Initial load
duke
parents:
diff changeset
166 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
167 SharedRuntime::_new_instance_ctr++; // new instance requires GC
a61af66fc99e Initial load
duke
parents:
diff changeset
168 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
169 assert(check_compiled_frame(thread), "incorrect caller");
a61af66fc99e Initial load
duke
parents:
diff changeset
170
a61af66fc99e Initial load
duke
parents:
diff changeset
171 // These checks are cheap to make and support reflective allocation.
a61af66fc99e Initial load
duke
parents:
diff changeset
172 int lh = Klass::cast(klass)->layout_helper();
a61af66fc99e Initial load
duke
parents:
diff changeset
173 if (Klass::layout_helper_needs_slow_path(lh)
a61af66fc99e Initial load
duke
parents:
diff changeset
174 || !instanceKlass::cast(klass)->is_initialized()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
175 KlassHandle kh(THREAD, klass);
a61af66fc99e Initial load
duke
parents:
diff changeset
176 kh->check_valid_for_instantiation(false, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
177 if (!HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
178 instanceKlass::cast(kh())->initialize(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
179 }
a61af66fc99e Initial load
duke
parents:
diff changeset
180 if (!HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
181 klass = kh();
a61af66fc99e Initial load
duke
parents:
diff changeset
182 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
183 klass = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
184 }
a61af66fc99e Initial load
duke
parents:
diff changeset
185 }
a61af66fc99e Initial load
duke
parents:
diff changeset
186
a61af66fc99e Initial load
duke
parents:
diff changeset
187 if (klass != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
188 // Scavenge and allocate an instance.
a61af66fc99e Initial load
duke
parents:
diff changeset
189 oop result = instanceKlass::cast(klass)->allocate_instance(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
190 thread->set_vm_result(result);
a61af66fc99e Initial load
duke
parents:
diff changeset
191
a61af66fc99e Initial load
duke
parents:
diff changeset
192 // Pass oops back through thread local storage. Our apparent type to Java
a61af66fc99e Initial load
duke
parents:
diff changeset
193 // is that we return an oop, but we can block on exit from this routine and
a61af66fc99e Initial load
duke
parents:
diff changeset
194 // a GC can trash the oop in C's return register. The generated stub will
a61af66fc99e Initial load
duke
parents:
diff changeset
195 // fetch the oop from TLS after any possible GC.
a61af66fc99e Initial load
duke
parents:
diff changeset
196 }
a61af66fc99e Initial load
duke
parents:
diff changeset
197
a61af66fc99e Initial load
duke
parents:
diff changeset
198 deoptimize_caller_frame(thread, HAS_PENDING_EXCEPTION);
a61af66fc99e Initial load
duke
parents:
diff changeset
199 JRT_BLOCK_END;
a61af66fc99e Initial load
duke
parents:
diff changeset
200
a61af66fc99e Initial load
duke
parents:
diff changeset
201 if (GraphKit::use_ReduceInitialCardMarks()) {
1027
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 605
diff changeset
202 // inform GC that we won't do card marks for initializing writes.
1166
7b0e9cba0307 6896647: card marks can be deferred too long
ysr
parents: 1142
diff changeset
203 new_store_pre_barrier(thread);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
204 }
a61af66fc99e Initial load
duke
parents:
diff changeset
205 JRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
206
a61af66fc99e Initial load
duke
parents:
diff changeset
207
a61af66fc99e Initial load
duke
parents:
diff changeset
208 // array allocation
a61af66fc99e Initial load
duke
parents:
diff changeset
209 JRT_BLOCK_ENTRY(void, OptoRuntime::new_array_C(klassOopDesc* array_type, int len, JavaThread *thread))
a61af66fc99e Initial load
duke
parents:
diff changeset
210 JRT_BLOCK;
a61af66fc99e Initial load
duke
parents:
diff changeset
211 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
212 SharedRuntime::_new_array_ctr++; // new array requires GC
a61af66fc99e Initial load
duke
parents:
diff changeset
213 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
214 assert(check_compiled_frame(thread), "incorrect caller");
a61af66fc99e Initial load
duke
parents:
diff changeset
215
a61af66fc99e Initial load
duke
parents:
diff changeset
216 // Scavenge and allocate an instance.
a61af66fc99e Initial load
duke
parents:
diff changeset
217 oop result;
a61af66fc99e Initial load
duke
parents:
diff changeset
218
a61af66fc99e Initial load
duke
parents:
diff changeset
219 if (Klass::cast(array_type)->oop_is_typeArray()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
220 // The oopFactory likes to work with the element type.
a61af66fc99e Initial load
duke
parents:
diff changeset
221 // (We could bypass the oopFactory, since it doesn't add much value.)
a61af66fc99e Initial load
duke
parents:
diff changeset
222 BasicType elem_type = typeArrayKlass::cast(array_type)->element_type();
a61af66fc99e Initial load
duke
parents:
diff changeset
223 result = oopFactory::new_typeArray(elem_type, len, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
224 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
225 // Although the oopFactory likes to work with the elem_type,
a61af66fc99e Initial load
duke
parents:
diff changeset
226 // the compiler prefers the array_type, since it must already have
a61af66fc99e Initial load
duke
parents:
diff changeset
227 // that latter value in hand for the fast path.
a61af66fc99e Initial load
duke
parents:
diff changeset
228 klassOopDesc* elem_type = objArrayKlass::cast(array_type)->element_klass();
a61af66fc99e Initial load
duke
parents:
diff changeset
229 result = oopFactory::new_objArray(elem_type, len, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
230 }
a61af66fc99e Initial load
duke
parents:
diff changeset
231
a61af66fc99e Initial load
duke
parents:
diff changeset
232 // Pass oops back through thread local storage. Our apparent type to Java
a61af66fc99e Initial load
duke
parents:
diff changeset
233 // is that we return an oop, but we can block on exit from this routine and
a61af66fc99e Initial load
duke
parents:
diff changeset
234 // a GC can trash the oop in C's return register. The generated stub will
a61af66fc99e Initial load
duke
parents:
diff changeset
235 // fetch the oop from TLS after any possible GC.
a61af66fc99e Initial load
duke
parents:
diff changeset
236 deoptimize_caller_frame(thread, HAS_PENDING_EXCEPTION);
a61af66fc99e Initial load
duke
parents:
diff changeset
237 thread->set_vm_result(result);
a61af66fc99e Initial load
duke
parents:
diff changeset
238 JRT_BLOCK_END;
a61af66fc99e Initial load
duke
parents:
diff changeset
239
a61af66fc99e Initial load
duke
parents:
diff changeset
240 if (GraphKit::use_ReduceInitialCardMarks()) {
1027
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 605
diff changeset
241 // inform GC that we won't do card marks for initializing writes.
1166
7b0e9cba0307 6896647: card marks can be deferred too long
ysr
parents: 1142
diff changeset
242 new_store_pre_barrier(thread);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
243 }
a61af66fc99e Initial load
duke
parents:
diff changeset
244 JRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
245
a61af66fc99e Initial load
duke
parents:
diff changeset
246 // Note: multianewarray for one dimension is handled inline by GraphKit::new_array.
a61af66fc99e Initial load
duke
parents:
diff changeset
247
a61af66fc99e Initial load
duke
parents:
diff changeset
248 // multianewarray for 2 dimensions
a61af66fc99e Initial load
duke
parents:
diff changeset
249 JRT_ENTRY(void, OptoRuntime::multianewarray2_C(klassOopDesc* elem_type, int len1, int len2, JavaThread *thread))
a61af66fc99e Initial load
duke
parents:
diff changeset
250 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
251 SharedRuntime::_multi2_ctr++; // multianewarray for 1 dimension
a61af66fc99e Initial load
duke
parents:
diff changeset
252 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
253 assert(check_compiled_frame(thread), "incorrect caller");
a61af66fc99e Initial load
duke
parents:
diff changeset
254 assert(oop(elem_type)->is_klass(), "not a class");
a61af66fc99e Initial load
duke
parents:
diff changeset
255 jint dims[2];
a61af66fc99e Initial load
duke
parents:
diff changeset
256 dims[0] = len1;
a61af66fc99e Initial load
duke
parents:
diff changeset
257 dims[1] = len2;
a61af66fc99e Initial load
duke
parents:
diff changeset
258 oop obj = arrayKlass::cast(elem_type)->multi_allocate(2, dims, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
259 deoptimize_caller_frame(thread, HAS_PENDING_EXCEPTION);
a61af66fc99e Initial load
duke
parents:
diff changeset
260 thread->set_vm_result(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
261 JRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
262
a61af66fc99e Initial load
duke
parents:
diff changeset
263 // multianewarray for 3 dimensions
a61af66fc99e Initial load
duke
parents:
diff changeset
264 JRT_ENTRY(void, OptoRuntime::multianewarray3_C(klassOopDesc* elem_type, int len1, int len2, int len3, JavaThread *thread))
a61af66fc99e Initial load
duke
parents:
diff changeset
265 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
266 SharedRuntime::_multi3_ctr++; // multianewarray for 1 dimension
a61af66fc99e Initial load
duke
parents:
diff changeset
267 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
268 assert(check_compiled_frame(thread), "incorrect caller");
a61af66fc99e Initial load
duke
parents:
diff changeset
269 assert(oop(elem_type)->is_klass(), "not a class");
a61af66fc99e Initial load
duke
parents:
diff changeset
270 jint dims[3];
a61af66fc99e Initial load
duke
parents:
diff changeset
271 dims[0] = len1;
a61af66fc99e Initial load
duke
parents:
diff changeset
272 dims[1] = len2;
a61af66fc99e Initial load
duke
parents:
diff changeset
273 dims[2] = len3;
a61af66fc99e Initial load
duke
parents:
diff changeset
274 oop obj = arrayKlass::cast(elem_type)->multi_allocate(3, dims, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
275 deoptimize_caller_frame(thread, HAS_PENDING_EXCEPTION);
a61af66fc99e Initial load
duke
parents:
diff changeset
276 thread->set_vm_result(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
277 JRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
278
a61af66fc99e Initial load
duke
parents:
diff changeset
279 // multianewarray for 4 dimensions
a61af66fc99e Initial load
duke
parents:
diff changeset
280 JRT_ENTRY(void, OptoRuntime::multianewarray4_C(klassOopDesc* elem_type, int len1, int len2, int len3, int len4, JavaThread *thread))
a61af66fc99e Initial load
duke
parents:
diff changeset
281 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
282 SharedRuntime::_multi4_ctr++; // multianewarray for 1 dimension
a61af66fc99e Initial load
duke
parents:
diff changeset
283 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
284 assert(check_compiled_frame(thread), "incorrect caller");
a61af66fc99e Initial load
duke
parents:
diff changeset
285 assert(oop(elem_type)->is_klass(), "not a class");
a61af66fc99e Initial load
duke
parents:
diff changeset
286 jint dims[4];
a61af66fc99e Initial load
duke
parents:
diff changeset
287 dims[0] = len1;
a61af66fc99e Initial load
duke
parents:
diff changeset
288 dims[1] = len2;
a61af66fc99e Initial load
duke
parents:
diff changeset
289 dims[2] = len3;
a61af66fc99e Initial load
duke
parents:
diff changeset
290 dims[3] = len4;
a61af66fc99e Initial load
duke
parents:
diff changeset
291 oop obj = arrayKlass::cast(elem_type)->multi_allocate(4, dims, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
292 deoptimize_caller_frame(thread, HAS_PENDING_EXCEPTION);
a61af66fc99e Initial load
duke
parents:
diff changeset
293 thread->set_vm_result(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
294 JRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
295
a61af66fc99e Initial load
duke
parents:
diff changeset
296 // multianewarray for 5 dimensions
a61af66fc99e Initial load
duke
parents:
diff changeset
297 JRT_ENTRY(void, OptoRuntime::multianewarray5_C(klassOopDesc* elem_type, int len1, int len2, int len3, int len4, int len5, JavaThread *thread))
a61af66fc99e Initial load
duke
parents:
diff changeset
298 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
299 SharedRuntime::_multi5_ctr++; // multianewarray for 1 dimension
a61af66fc99e Initial load
duke
parents:
diff changeset
300 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
301 assert(check_compiled_frame(thread), "incorrect caller");
a61af66fc99e Initial load
duke
parents:
diff changeset
302 assert(oop(elem_type)->is_klass(), "not a class");
a61af66fc99e Initial load
duke
parents:
diff changeset
303 jint dims[5];
a61af66fc99e Initial load
duke
parents:
diff changeset
304 dims[0] = len1;
a61af66fc99e Initial load
duke
parents:
diff changeset
305 dims[1] = len2;
a61af66fc99e Initial load
duke
parents:
diff changeset
306 dims[2] = len3;
a61af66fc99e Initial load
duke
parents:
diff changeset
307 dims[3] = len4;
a61af66fc99e Initial load
duke
parents:
diff changeset
308 dims[4] = len5;
a61af66fc99e Initial load
duke
parents:
diff changeset
309 oop obj = arrayKlass::cast(elem_type)->multi_allocate(5, dims, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
310 deoptimize_caller_frame(thread, HAS_PENDING_EXCEPTION);
a61af66fc99e Initial load
duke
parents:
diff changeset
311 thread->set_vm_result(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
312 JRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
313
a61af66fc99e Initial load
duke
parents:
diff changeset
314 const TypeFunc *OptoRuntime::new_instance_Type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
315 // create input type (domain)
a61af66fc99e Initial load
duke
parents:
diff changeset
316 const Type **fields = TypeTuple::fields(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
317 fields[TypeFunc::Parms+0] = TypeInstPtr::NOTNULL; // Klass to be allocated
a61af66fc99e Initial load
duke
parents:
diff changeset
318 const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+1, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
319
a61af66fc99e Initial load
duke
parents:
diff changeset
320 // create result type (range)
a61af66fc99e Initial load
duke
parents:
diff changeset
321 fields = TypeTuple::fields(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
322 fields[TypeFunc::Parms+0] = TypeRawPtr::NOTNULL; // Returned oop
a61af66fc99e Initial load
duke
parents:
diff changeset
323
a61af66fc99e Initial load
duke
parents:
diff changeset
324 const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+1, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
325
a61af66fc99e Initial load
duke
parents:
diff changeset
326 return TypeFunc::make(domain, range);
a61af66fc99e Initial load
duke
parents:
diff changeset
327 }
a61af66fc99e Initial load
duke
parents:
diff changeset
328
a61af66fc99e Initial load
duke
parents:
diff changeset
329
a61af66fc99e Initial load
duke
parents:
diff changeset
330 const TypeFunc *OptoRuntime::athrow_Type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
331 // create input type (domain)
a61af66fc99e Initial load
duke
parents:
diff changeset
332 const Type **fields = TypeTuple::fields(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
333 fields[TypeFunc::Parms+0] = TypeInstPtr::NOTNULL; // Klass to be allocated
a61af66fc99e Initial load
duke
parents:
diff changeset
334 const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+1, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
335
a61af66fc99e Initial load
duke
parents:
diff changeset
336 // create result type (range)
a61af66fc99e Initial load
duke
parents:
diff changeset
337 fields = TypeTuple::fields(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
338
a61af66fc99e Initial load
duke
parents:
diff changeset
339 const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+0, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
340
a61af66fc99e Initial load
duke
parents:
diff changeset
341 return TypeFunc::make(domain, range);
a61af66fc99e Initial load
duke
parents:
diff changeset
342 }
a61af66fc99e Initial load
duke
parents:
diff changeset
343
a61af66fc99e Initial load
duke
parents:
diff changeset
344
a61af66fc99e Initial load
duke
parents:
diff changeset
345 const TypeFunc *OptoRuntime::new_array_Type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
346 // create input type (domain)
a61af66fc99e Initial load
duke
parents:
diff changeset
347 const Type **fields = TypeTuple::fields(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
348 fields[TypeFunc::Parms+0] = TypeInstPtr::NOTNULL; // element klass
a61af66fc99e Initial load
duke
parents:
diff changeset
349 fields[TypeFunc::Parms+1] = TypeInt::INT; // array size
a61af66fc99e Initial load
duke
parents:
diff changeset
350 const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+2, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
351
a61af66fc99e Initial load
duke
parents:
diff changeset
352 // create result type (range)
a61af66fc99e Initial load
duke
parents:
diff changeset
353 fields = TypeTuple::fields(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
354 fields[TypeFunc::Parms+0] = TypeRawPtr::NOTNULL; // Returned oop
a61af66fc99e Initial load
duke
parents:
diff changeset
355
a61af66fc99e Initial load
duke
parents:
diff changeset
356 const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+1, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
357
a61af66fc99e Initial load
duke
parents:
diff changeset
358 return TypeFunc::make(domain, range);
a61af66fc99e Initial load
duke
parents:
diff changeset
359 }
a61af66fc99e Initial load
duke
parents:
diff changeset
360
a61af66fc99e Initial load
duke
parents:
diff changeset
361 const TypeFunc *OptoRuntime::multianewarray_Type(int ndim) {
a61af66fc99e Initial load
duke
parents:
diff changeset
362 // create input type (domain)
a61af66fc99e Initial load
duke
parents:
diff changeset
363 const int nargs = ndim + 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
364 const Type **fields = TypeTuple::fields(nargs);
a61af66fc99e Initial load
duke
parents:
diff changeset
365 fields[TypeFunc::Parms+0] = TypeInstPtr::NOTNULL; // element klass
a61af66fc99e Initial load
duke
parents:
diff changeset
366 for( int i = 1; i < nargs; i++ )
a61af66fc99e Initial load
duke
parents:
diff changeset
367 fields[TypeFunc::Parms + i] = TypeInt::INT; // array size
a61af66fc99e Initial load
duke
parents:
diff changeset
368 const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+nargs, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
369
a61af66fc99e Initial load
duke
parents:
diff changeset
370 // create result type (range)
a61af66fc99e Initial load
duke
parents:
diff changeset
371 fields = TypeTuple::fields(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
372 fields[TypeFunc::Parms+0] = TypeRawPtr::NOTNULL; // Returned oop
a61af66fc99e Initial load
duke
parents:
diff changeset
373 const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+1, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
374
a61af66fc99e Initial load
duke
parents:
diff changeset
375 return TypeFunc::make(domain, range);
a61af66fc99e Initial load
duke
parents:
diff changeset
376 }
a61af66fc99e Initial load
duke
parents:
diff changeset
377
a61af66fc99e Initial load
duke
parents:
diff changeset
378 const TypeFunc *OptoRuntime::multianewarray2_Type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
379 return multianewarray_Type(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
380 }
a61af66fc99e Initial load
duke
parents:
diff changeset
381
a61af66fc99e Initial load
duke
parents:
diff changeset
382 const TypeFunc *OptoRuntime::multianewarray3_Type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
383 return multianewarray_Type(3);
a61af66fc99e Initial load
duke
parents:
diff changeset
384 }
a61af66fc99e Initial load
duke
parents:
diff changeset
385
a61af66fc99e Initial load
duke
parents:
diff changeset
386 const TypeFunc *OptoRuntime::multianewarray4_Type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
387 return multianewarray_Type(4);
a61af66fc99e Initial load
duke
parents:
diff changeset
388 }
a61af66fc99e Initial load
duke
parents:
diff changeset
389
a61af66fc99e Initial load
duke
parents:
diff changeset
390 const TypeFunc *OptoRuntime::multianewarray5_Type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
391 return multianewarray_Type(5);
a61af66fc99e Initial load
duke
parents:
diff changeset
392 }
a61af66fc99e Initial load
duke
parents:
diff changeset
393
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
394 const TypeFunc *OptoRuntime::g1_wb_pre_Type() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
395 const Type **fields = TypeTuple::fields(2);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
396 fields[TypeFunc::Parms+0] = TypeInstPtr::NOTNULL; // original field value
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
397 fields[TypeFunc::Parms+1] = TypeRawPtr::NOTNULL; // thread
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
398 const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+2, fields);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
399
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
400 // create result type (range)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
401 fields = TypeTuple::fields(0);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
402 const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+0, fields);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
403
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
404 return TypeFunc::make(domain, range);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
405 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
406
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
407 const TypeFunc *OptoRuntime::g1_wb_post_Type() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
408
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
409 const Type **fields = TypeTuple::fields(2);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
410 fields[TypeFunc::Parms+0] = TypeRawPtr::NOTNULL; // Card addr
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
411 fields[TypeFunc::Parms+1] = TypeRawPtr::NOTNULL; // thread
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
412 const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+2, fields);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
413
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
414 // create result type (range)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
415 fields = TypeTuple::fields(0);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
416 const TypeTuple *range = TypeTuple::make(TypeFunc::Parms, fields);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
417
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
418 return TypeFunc::make(domain, range);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
419 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
420
0
a61af66fc99e Initial load
duke
parents:
diff changeset
421 const TypeFunc *OptoRuntime::uncommon_trap_Type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
422 // create input type (domain)
a61af66fc99e Initial load
duke
parents:
diff changeset
423 const Type **fields = TypeTuple::fields(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
424 // symbolOop name of class to be loaded
a61af66fc99e Initial load
duke
parents:
diff changeset
425 fields[TypeFunc::Parms+0] = TypeInt::INT;
a61af66fc99e Initial load
duke
parents:
diff changeset
426 const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+1, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
427
a61af66fc99e Initial load
duke
parents:
diff changeset
428 // create result type (range)
a61af66fc99e Initial load
duke
parents:
diff changeset
429 fields = TypeTuple::fields(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
430 const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+0, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
431
a61af66fc99e Initial load
duke
parents:
diff changeset
432 return TypeFunc::make(domain, range);
a61af66fc99e Initial load
duke
parents:
diff changeset
433 }
a61af66fc99e Initial load
duke
parents:
diff changeset
434
a61af66fc99e Initial load
duke
parents:
diff changeset
435 # ifdef ENABLE_ZAP_DEAD_LOCALS
a61af66fc99e Initial load
duke
parents:
diff changeset
436 // Type used for stub generation for zap_dead_locals.
a61af66fc99e Initial load
duke
parents:
diff changeset
437 // No inputs or outputs
a61af66fc99e Initial load
duke
parents:
diff changeset
438 const TypeFunc *OptoRuntime::zap_dead_locals_Type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
439 // create input type (domain)
a61af66fc99e Initial load
duke
parents:
diff changeset
440 const Type **fields = TypeTuple::fields(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
441 const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms,fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
442
a61af66fc99e Initial load
duke
parents:
diff changeset
443 // create result type (range)
a61af66fc99e Initial load
duke
parents:
diff changeset
444 fields = TypeTuple::fields(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
445 const TypeTuple *range = TypeTuple::make(TypeFunc::Parms,fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
446
a61af66fc99e Initial load
duke
parents:
diff changeset
447 return TypeFunc::make(domain,range);
a61af66fc99e Initial load
duke
parents:
diff changeset
448 }
a61af66fc99e Initial load
duke
parents:
diff changeset
449 # endif
a61af66fc99e Initial load
duke
parents:
diff changeset
450
a61af66fc99e Initial load
duke
parents:
diff changeset
451
a61af66fc99e Initial load
duke
parents:
diff changeset
452 //-----------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
453 // Monitor Handling
a61af66fc99e Initial load
duke
parents:
diff changeset
454 const TypeFunc *OptoRuntime::complete_monitor_enter_Type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
455 // create input type (domain)
a61af66fc99e Initial load
duke
parents:
diff changeset
456 const Type **fields = TypeTuple::fields(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
457 fields[TypeFunc::Parms+0] = TypeInstPtr::NOTNULL; // Object to be Locked
a61af66fc99e Initial load
duke
parents:
diff changeset
458 fields[TypeFunc::Parms+1] = TypeRawPtr::BOTTOM; // Address of stack location for lock
a61af66fc99e Initial load
duke
parents:
diff changeset
459 const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+2,fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
460
a61af66fc99e Initial load
duke
parents:
diff changeset
461 // create result type (range)
a61af66fc99e Initial load
duke
parents:
diff changeset
462 fields = TypeTuple::fields(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
463
a61af66fc99e Initial load
duke
parents:
diff changeset
464 const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+0,fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
465
a61af66fc99e Initial load
duke
parents:
diff changeset
466 return TypeFunc::make(domain,range);
a61af66fc99e Initial load
duke
parents:
diff changeset
467 }
a61af66fc99e Initial load
duke
parents:
diff changeset
468
a61af66fc99e Initial load
duke
parents:
diff changeset
469
a61af66fc99e Initial load
duke
parents:
diff changeset
470 //-----------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
471 const TypeFunc *OptoRuntime::complete_monitor_exit_Type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
472 // create input type (domain)
a61af66fc99e Initial load
duke
parents:
diff changeset
473 const Type **fields = TypeTuple::fields(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
474 fields[TypeFunc::Parms+0] = TypeInstPtr::NOTNULL; // Object to be Locked
a61af66fc99e Initial load
duke
parents:
diff changeset
475 fields[TypeFunc::Parms+1] = TypeRawPtr::BOTTOM; // Address of stack location for lock
a61af66fc99e Initial load
duke
parents:
diff changeset
476 const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+2,fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
477
a61af66fc99e Initial load
duke
parents:
diff changeset
478 // create result type (range)
a61af66fc99e Initial load
duke
parents:
diff changeset
479 fields = TypeTuple::fields(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
480
a61af66fc99e Initial load
duke
parents:
diff changeset
481 const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+0,fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
482
a61af66fc99e Initial load
duke
parents:
diff changeset
483 return TypeFunc::make(domain,range);
a61af66fc99e Initial load
duke
parents:
diff changeset
484 }
a61af66fc99e Initial load
duke
parents:
diff changeset
485
a61af66fc99e Initial load
duke
parents:
diff changeset
486 const TypeFunc* OptoRuntime::flush_windows_Type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
487 // create input type (domain)
a61af66fc99e Initial load
duke
parents:
diff changeset
488 const Type** fields = TypeTuple::fields(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
489 fields[TypeFunc::Parms+0] = NULL; // void
a61af66fc99e Initial load
duke
parents:
diff changeset
490 const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
491
a61af66fc99e Initial load
duke
parents:
diff changeset
492 // create result type
a61af66fc99e Initial load
duke
parents:
diff changeset
493 fields = TypeTuple::fields(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
494 fields[TypeFunc::Parms+0] = NULL; // void
a61af66fc99e Initial load
duke
parents:
diff changeset
495 const TypeTuple *range = TypeTuple::make(TypeFunc::Parms, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
496
a61af66fc99e Initial load
duke
parents:
diff changeset
497 return TypeFunc::make(domain, range);
a61af66fc99e Initial load
duke
parents:
diff changeset
498 }
a61af66fc99e Initial load
duke
parents:
diff changeset
499
a61af66fc99e Initial load
duke
parents:
diff changeset
500 const TypeFunc* OptoRuntime::l2f_Type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
501 // create input type (domain)
a61af66fc99e Initial load
duke
parents:
diff changeset
502 const Type **fields = TypeTuple::fields(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
503 fields[TypeFunc::Parms+0] = TypeLong::LONG;
a61af66fc99e Initial load
duke
parents:
diff changeset
504 fields[TypeFunc::Parms+1] = Type::HALF;
a61af66fc99e Initial load
duke
parents:
diff changeset
505 const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+2, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
506
a61af66fc99e Initial load
duke
parents:
diff changeset
507 // create result type (range)
a61af66fc99e Initial load
duke
parents:
diff changeset
508 fields = TypeTuple::fields(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
509 fields[TypeFunc::Parms+0] = Type::FLOAT;
a61af66fc99e Initial load
duke
parents:
diff changeset
510 const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+1, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
511
a61af66fc99e Initial load
duke
parents:
diff changeset
512 return TypeFunc::make(domain, range);
a61af66fc99e Initial load
duke
parents:
diff changeset
513 }
a61af66fc99e Initial load
duke
parents:
diff changeset
514
a61af66fc99e Initial load
duke
parents:
diff changeset
515 const TypeFunc* OptoRuntime::modf_Type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
516 const Type **fields = TypeTuple::fields(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
517 fields[TypeFunc::Parms+0] = Type::FLOAT;
a61af66fc99e Initial load
duke
parents:
diff changeset
518 fields[TypeFunc::Parms+1] = Type::FLOAT;
a61af66fc99e Initial load
duke
parents:
diff changeset
519 const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+2, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
520
a61af66fc99e Initial load
duke
parents:
diff changeset
521 // create result type (range)
a61af66fc99e Initial load
duke
parents:
diff changeset
522 fields = TypeTuple::fields(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
523 fields[TypeFunc::Parms+0] = Type::FLOAT;
a61af66fc99e Initial load
duke
parents:
diff changeset
524
a61af66fc99e Initial load
duke
parents:
diff changeset
525 const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+1, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
526
a61af66fc99e Initial load
duke
parents:
diff changeset
527 return TypeFunc::make(domain, range);
a61af66fc99e Initial load
duke
parents:
diff changeset
528 }
a61af66fc99e Initial load
duke
parents:
diff changeset
529
a61af66fc99e Initial load
duke
parents:
diff changeset
530 const TypeFunc *OptoRuntime::Math_D_D_Type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
531 // create input type (domain)
a61af66fc99e Initial load
duke
parents:
diff changeset
532 const Type **fields = TypeTuple::fields(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
533 // symbolOop name of class to be loaded
a61af66fc99e Initial load
duke
parents:
diff changeset
534 fields[TypeFunc::Parms+0] = Type::DOUBLE;
a61af66fc99e Initial load
duke
parents:
diff changeset
535 fields[TypeFunc::Parms+1] = Type::HALF;
a61af66fc99e Initial load
duke
parents:
diff changeset
536 const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+2, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
537
a61af66fc99e Initial load
duke
parents:
diff changeset
538 // create result type (range)
a61af66fc99e Initial load
duke
parents:
diff changeset
539 fields = TypeTuple::fields(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
540 fields[TypeFunc::Parms+0] = Type::DOUBLE;
a61af66fc99e Initial load
duke
parents:
diff changeset
541 fields[TypeFunc::Parms+1] = Type::HALF;
a61af66fc99e Initial load
duke
parents:
diff changeset
542 const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+2, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
543
a61af66fc99e Initial load
duke
parents:
diff changeset
544 return TypeFunc::make(domain, range);
a61af66fc99e Initial load
duke
parents:
diff changeset
545 }
a61af66fc99e Initial load
duke
parents:
diff changeset
546
a61af66fc99e Initial load
duke
parents:
diff changeset
547 const TypeFunc* OptoRuntime::Math_DD_D_Type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
548 const Type **fields = TypeTuple::fields(4);
a61af66fc99e Initial load
duke
parents:
diff changeset
549 fields[TypeFunc::Parms+0] = Type::DOUBLE;
a61af66fc99e Initial load
duke
parents:
diff changeset
550 fields[TypeFunc::Parms+1] = Type::HALF;
a61af66fc99e Initial load
duke
parents:
diff changeset
551 fields[TypeFunc::Parms+2] = Type::DOUBLE;
a61af66fc99e Initial load
duke
parents:
diff changeset
552 fields[TypeFunc::Parms+3] = Type::HALF;
a61af66fc99e Initial load
duke
parents:
diff changeset
553 const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+4, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
554
a61af66fc99e Initial load
duke
parents:
diff changeset
555 // create result type (range)
a61af66fc99e Initial load
duke
parents:
diff changeset
556 fields = TypeTuple::fields(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
557 fields[TypeFunc::Parms+0] = Type::DOUBLE;
a61af66fc99e Initial load
duke
parents:
diff changeset
558 fields[TypeFunc::Parms+1] = Type::HALF;
a61af66fc99e Initial load
duke
parents:
diff changeset
559 const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+2, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
560
a61af66fc99e Initial load
duke
parents:
diff changeset
561 return TypeFunc::make(domain, range);
a61af66fc99e Initial load
duke
parents:
diff changeset
562 }
a61af66fc99e Initial load
duke
parents:
diff changeset
563
a61af66fc99e Initial load
duke
parents:
diff changeset
564 //-------------- currentTimeMillis
a61af66fc99e Initial load
duke
parents:
diff changeset
565
a61af66fc99e Initial load
duke
parents:
diff changeset
566 const TypeFunc* OptoRuntime::current_time_millis_Type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
567 // create input type (domain)
a61af66fc99e Initial load
duke
parents:
diff changeset
568 const Type **fields = TypeTuple::fields(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
569 const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+0, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
570
a61af66fc99e Initial load
duke
parents:
diff changeset
571 // create result type (range)
a61af66fc99e Initial load
duke
parents:
diff changeset
572 fields = TypeTuple::fields(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
573 fields[TypeFunc::Parms+0] = TypeLong::LONG;
a61af66fc99e Initial load
duke
parents:
diff changeset
574 fields[TypeFunc::Parms+1] = Type::HALF;
a61af66fc99e Initial load
duke
parents:
diff changeset
575 const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+2, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
576
a61af66fc99e Initial load
duke
parents:
diff changeset
577 return TypeFunc::make(domain, range);
a61af66fc99e Initial load
duke
parents:
diff changeset
578 }
a61af66fc99e Initial load
duke
parents:
diff changeset
579
a61af66fc99e Initial load
duke
parents:
diff changeset
580 // arraycopy stub variations:
a61af66fc99e Initial load
duke
parents:
diff changeset
581 enum ArrayCopyType {
a61af66fc99e Initial load
duke
parents:
diff changeset
582 ac_fast, // void(ptr, ptr, size_t)
a61af66fc99e Initial load
duke
parents:
diff changeset
583 ac_checkcast, // int(ptr, ptr, size_t, size_t, ptr)
a61af66fc99e Initial load
duke
parents:
diff changeset
584 ac_slow, // void(ptr, int, ptr, int, int)
a61af66fc99e Initial load
duke
parents:
diff changeset
585 ac_generic // int(ptr, int, ptr, int, int)
a61af66fc99e Initial load
duke
parents:
diff changeset
586 };
a61af66fc99e Initial load
duke
parents:
diff changeset
587
a61af66fc99e Initial load
duke
parents:
diff changeset
588 static const TypeFunc* make_arraycopy_Type(ArrayCopyType act) {
a61af66fc99e Initial load
duke
parents:
diff changeset
589 // create input type (domain)
a61af66fc99e Initial load
duke
parents:
diff changeset
590 int num_args = (act == ac_fast ? 3 : 5);
a61af66fc99e Initial load
duke
parents:
diff changeset
591 int num_size_args = (act == ac_fast ? 1 : act == ac_checkcast ? 2 : 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
592 int argcnt = num_args;
a61af66fc99e Initial load
duke
parents:
diff changeset
593 LP64_ONLY(argcnt += num_size_args); // halfwords for lengths
a61af66fc99e Initial load
duke
parents:
diff changeset
594 const Type** fields = TypeTuple::fields(argcnt);
a61af66fc99e Initial load
duke
parents:
diff changeset
595 int argp = TypeFunc::Parms;
a61af66fc99e Initial load
duke
parents:
diff changeset
596 fields[argp++] = TypePtr::NOTNULL; // src
a61af66fc99e Initial load
duke
parents:
diff changeset
597 if (num_size_args == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
598 fields[argp++] = TypeInt::INT; // src_pos
a61af66fc99e Initial load
duke
parents:
diff changeset
599 }
a61af66fc99e Initial load
duke
parents:
diff changeset
600 fields[argp++] = TypePtr::NOTNULL; // dest
a61af66fc99e Initial load
duke
parents:
diff changeset
601 if (num_size_args == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
602 fields[argp++] = TypeInt::INT; // dest_pos
a61af66fc99e Initial load
duke
parents:
diff changeset
603 fields[argp++] = TypeInt::INT; // length
a61af66fc99e Initial load
duke
parents:
diff changeset
604 }
a61af66fc99e Initial load
duke
parents:
diff changeset
605 while (num_size_args-- > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
606 fields[argp++] = TypeX_X; // size in whatevers (size_t)
a61af66fc99e Initial load
duke
parents:
diff changeset
607 LP64_ONLY(fields[argp++] = Type::HALF); // other half of long length
a61af66fc99e Initial load
duke
parents:
diff changeset
608 }
a61af66fc99e Initial load
duke
parents:
diff changeset
609 if (act == ac_checkcast) {
a61af66fc99e Initial load
duke
parents:
diff changeset
610 fields[argp++] = TypePtr::NOTNULL; // super_klass
a61af66fc99e Initial load
duke
parents:
diff changeset
611 }
a61af66fc99e Initial load
duke
parents:
diff changeset
612 assert(argp == TypeFunc::Parms+argcnt, "correct decoding of act");
a61af66fc99e Initial load
duke
parents:
diff changeset
613 const TypeTuple* domain = TypeTuple::make(TypeFunc::Parms+argcnt, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
614
a61af66fc99e Initial load
duke
parents:
diff changeset
615 // create result type if needed
a61af66fc99e Initial load
duke
parents:
diff changeset
616 int retcnt = (act == ac_checkcast || act == ac_generic ? 1 : 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
617 fields = TypeTuple::fields(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
618 if (retcnt == 0)
a61af66fc99e Initial load
duke
parents:
diff changeset
619 fields[TypeFunc::Parms+0] = NULL; // void
a61af66fc99e Initial load
duke
parents:
diff changeset
620 else
a61af66fc99e Initial load
duke
parents:
diff changeset
621 fields[TypeFunc::Parms+0] = TypeInt::INT; // status result, if needed
a61af66fc99e Initial load
duke
parents:
diff changeset
622 const TypeTuple* range = TypeTuple::make(TypeFunc::Parms+retcnt, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
623 return TypeFunc::make(domain, range);
a61af66fc99e Initial load
duke
parents:
diff changeset
624 }
a61af66fc99e Initial load
duke
parents:
diff changeset
625
a61af66fc99e Initial load
duke
parents:
diff changeset
626 const TypeFunc* OptoRuntime::fast_arraycopy_Type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
627 // This signature is simple: Two base pointers and a size_t.
a61af66fc99e Initial load
duke
parents:
diff changeset
628 return make_arraycopy_Type(ac_fast);
a61af66fc99e Initial load
duke
parents:
diff changeset
629 }
a61af66fc99e Initial load
duke
parents:
diff changeset
630
a61af66fc99e Initial load
duke
parents:
diff changeset
631 const TypeFunc* OptoRuntime::checkcast_arraycopy_Type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
632 // An extension of fast_arraycopy_Type which adds type checking.
a61af66fc99e Initial load
duke
parents:
diff changeset
633 return make_arraycopy_Type(ac_checkcast);
a61af66fc99e Initial load
duke
parents:
diff changeset
634 }
a61af66fc99e Initial load
duke
parents:
diff changeset
635
a61af66fc99e Initial load
duke
parents:
diff changeset
636 const TypeFunc* OptoRuntime::slow_arraycopy_Type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
637 // This signature is exactly the same as System.arraycopy.
a61af66fc99e Initial load
duke
parents:
diff changeset
638 // There are no intptr_t (int/long) arguments.
a61af66fc99e Initial load
duke
parents:
diff changeset
639 return make_arraycopy_Type(ac_slow);
a61af66fc99e Initial load
duke
parents:
diff changeset
640 }
a61af66fc99e Initial load
duke
parents:
diff changeset
641
a61af66fc99e Initial load
duke
parents:
diff changeset
642 const TypeFunc* OptoRuntime::generic_arraycopy_Type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
643 // This signature is like System.arraycopy, except that it returns status.
a61af66fc99e Initial load
duke
parents:
diff changeset
644 return make_arraycopy_Type(ac_generic);
a61af66fc99e Initial load
duke
parents:
diff changeset
645 }
a61af66fc99e Initial load
duke
parents:
diff changeset
646
a61af66fc99e Initial load
duke
parents:
diff changeset
647
1763
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1552
diff changeset
648 const TypeFunc* OptoRuntime::array_fill_Type() {
1844
75588558f1bf 6980792: Crash "exception happened outside interpreter, nmethods and vtable stubs (1)"
never
parents: 1763
diff changeset
649 // create input type (domain): pointer, int, size_t
75588558f1bf 6980792: Crash "exception happened outside interpreter, nmethods and vtable stubs (1)"
never
parents: 1763
diff changeset
650 const Type** fields = TypeTuple::fields(3 LP64_ONLY( + 1));
75588558f1bf 6980792: Crash "exception happened outside interpreter, nmethods and vtable stubs (1)"
never
parents: 1763
diff changeset
651 int argp = TypeFunc::Parms;
75588558f1bf 6980792: Crash "exception happened outside interpreter, nmethods and vtable stubs (1)"
never
parents: 1763
diff changeset
652 fields[argp++] = TypePtr::NOTNULL;
75588558f1bf 6980792: Crash "exception happened outside interpreter, nmethods and vtable stubs (1)"
never
parents: 1763
diff changeset
653 fields[argp++] = TypeInt::INT;
75588558f1bf 6980792: Crash "exception happened outside interpreter, nmethods and vtable stubs (1)"
never
parents: 1763
diff changeset
654 fields[argp++] = TypeX_X; // size in whatevers (size_t)
75588558f1bf 6980792: Crash "exception happened outside interpreter, nmethods and vtable stubs (1)"
never
parents: 1763
diff changeset
655 LP64_ONLY(fields[argp++] = Type::HALF); // other half of long length
75588558f1bf 6980792: Crash "exception happened outside interpreter, nmethods and vtable stubs (1)"
never
parents: 1763
diff changeset
656 const TypeTuple *domain = TypeTuple::make(argp, fields);
1763
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1552
diff changeset
657
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1552
diff changeset
658 // create result type
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1552
diff changeset
659 fields = TypeTuple::fields(1);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1552
diff changeset
660 fields[TypeFunc::Parms+0] = NULL; // void
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1552
diff changeset
661 const TypeTuple *range = TypeTuple::make(TypeFunc::Parms, fields);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1552
diff changeset
662
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1552
diff changeset
663 return TypeFunc::make(domain, range);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1552
diff changeset
664 }
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1552
diff changeset
665
0
a61af66fc99e Initial load
duke
parents:
diff changeset
666 //------------- Interpreter state access for on stack replacement
a61af66fc99e Initial load
duke
parents:
diff changeset
667 const TypeFunc* OptoRuntime::osr_end_Type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
668 // create input type (domain)
a61af66fc99e Initial load
duke
parents:
diff changeset
669 const Type **fields = TypeTuple::fields(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
670 fields[TypeFunc::Parms+0] = TypeRawPtr::BOTTOM; // OSR temp buf
a61af66fc99e Initial load
duke
parents:
diff changeset
671 const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+1, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
672
a61af66fc99e Initial load
duke
parents:
diff changeset
673 // create result type
a61af66fc99e Initial load
duke
parents:
diff changeset
674 fields = TypeTuple::fields(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
675 // fields[TypeFunc::Parms+0] = TypeInstPtr::NOTNULL; // locked oop
a61af66fc99e Initial load
duke
parents:
diff changeset
676 fields[TypeFunc::Parms+0] = NULL; // void
a61af66fc99e Initial load
duke
parents:
diff changeset
677 const TypeTuple *range = TypeTuple::make(TypeFunc::Parms, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
678 return TypeFunc::make(domain, range);
a61af66fc99e Initial load
duke
parents:
diff changeset
679 }
a61af66fc99e Initial load
duke
parents:
diff changeset
680
a61af66fc99e Initial load
duke
parents:
diff changeset
681 //-------------- methodData update helpers
a61af66fc99e Initial load
duke
parents:
diff changeset
682
a61af66fc99e Initial load
duke
parents:
diff changeset
683 const TypeFunc* OptoRuntime::profile_receiver_type_Type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
684 // create input type (domain)
a61af66fc99e Initial load
duke
parents:
diff changeset
685 const Type **fields = TypeTuple::fields(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
686 fields[TypeFunc::Parms+0] = TypeAryPtr::NOTNULL; // methodData pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
687 fields[TypeFunc::Parms+1] = TypeInstPtr::BOTTOM; // receiver oop
a61af66fc99e Initial load
duke
parents:
diff changeset
688 const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+2, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
689
a61af66fc99e Initial load
duke
parents:
diff changeset
690 // create result type
a61af66fc99e Initial load
duke
parents:
diff changeset
691 fields = TypeTuple::fields(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
692 fields[TypeFunc::Parms+0] = NULL; // void
a61af66fc99e Initial load
duke
parents:
diff changeset
693 const TypeTuple *range = TypeTuple::make(TypeFunc::Parms, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
694 return TypeFunc::make(domain,range);
a61af66fc99e Initial load
duke
parents:
diff changeset
695 }
a61af66fc99e Initial load
duke
parents:
diff changeset
696
a61af66fc99e Initial load
duke
parents:
diff changeset
697 JRT_LEAF(void, OptoRuntime::profile_receiver_type_C(DataLayout* data, oopDesc* receiver))
a61af66fc99e Initial load
duke
parents:
diff changeset
698 if (receiver == NULL) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
699 klassOop receiver_klass = receiver->klass();
a61af66fc99e Initial load
duke
parents:
diff changeset
700
a61af66fc99e Initial load
duke
parents:
diff changeset
701 intptr_t* mdp = ((intptr_t*)(data)) + DataLayout::header_size_in_cells();
a61af66fc99e Initial load
duke
parents:
diff changeset
702 int empty_row = -1; // free row, if any is encountered
a61af66fc99e Initial load
duke
parents:
diff changeset
703
a61af66fc99e Initial load
duke
parents:
diff changeset
704 // ReceiverTypeData* vc = new ReceiverTypeData(mdp);
a61af66fc99e Initial load
duke
parents:
diff changeset
705 for (uint row = 0; row < ReceiverTypeData::row_limit(); row++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
706 // if (vc->receiver(row) == receiver_klass)
a61af66fc99e Initial load
duke
parents:
diff changeset
707 int receiver_off = ReceiverTypeData::receiver_cell_index(row);
a61af66fc99e Initial load
duke
parents:
diff changeset
708 intptr_t row_recv = *(mdp + receiver_off);
a61af66fc99e Initial load
duke
parents:
diff changeset
709 if (row_recv == (intptr_t) receiver_klass) {
a61af66fc99e Initial load
duke
parents:
diff changeset
710 // vc->set_receiver_count(row, vc->receiver_count(row) + DataLayout::counter_increment);
a61af66fc99e Initial load
duke
parents:
diff changeset
711 int count_off = ReceiverTypeData::receiver_count_cell_index(row);
a61af66fc99e Initial load
duke
parents:
diff changeset
712 *(mdp + count_off) += DataLayout::counter_increment;
a61af66fc99e Initial load
duke
parents:
diff changeset
713 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
714 } else if (row_recv == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
715 // else if (vc->receiver(row) == NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
716 empty_row = (int) row;
a61af66fc99e Initial load
duke
parents:
diff changeset
717 }
a61af66fc99e Initial load
duke
parents:
diff changeset
718 }
a61af66fc99e Initial load
duke
parents:
diff changeset
719
a61af66fc99e Initial load
duke
parents:
diff changeset
720 if (empty_row != -1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
721 int receiver_off = ReceiverTypeData::receiver_cell_index(empty_row);
a61af66fc99e Initial load
duke
parents:
diff changeset
722 // vc->set_receiver(empty_row, receiver_klass);
a61af66fc99e Initial load
duke
parents:
diff changeset
723 *(mdp + receiver_off) = (intptr_t) receiver_klass;
a61af66fc99e Initial load
duke
parents:
diff changeset
724 // vc->set_receiver_count(empty_row, DataLayout::counter_increment);
a61af66fc99e Initial load
duke
parents:
diff changeset
725 int count_off = ReceiverTypeData::receiver_count_cell_index(empty_row);
a61af66fc99e Initial load
duke
parents:
diff changeset
726 *(mdp + count_off) = DataLayout::counter_increment;
1206
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1166
diff changeset
727 } else {
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1166
diff changeset
728 // Receiver did not match any saved receiver and there is no empty row for it.
1251
576e77447e3c 6923002: assert(false,"this call site should not be polymorphic")
kvn
parents: 1206
diff changeset
729 // Increment total counter to indicate polymorphic case.
1206
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1166
diff changeset
730 intptr_t* count_p = (intptr_t*)(((byte*)(data)) + in_bytes(CounterData::count_offset()));
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1166
diff changeset
731 *count_p += DataLayout::counter_increment;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
732 }
a61af66fc99e Initial load
duke
parents:
diff changeset
733 JRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
734
a61af66fc99e Initial load
duke
parents:
diff changeset
735 //-----------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
736 // implicit exception support.
a61af66fc99e Initial load
duke
parents:
diff changeset
737
a61af66fc99e Initial load
duke
parents:
diff changeset
738 static void report_null_exception_in_code_cache(address exception_pc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
739 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
740 CodeBlob* n = CodeCache::find_blob(exception_pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
741 if (n != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
742 tty->print_cr("#");
a61af66fc99e Initial load
duke
parents:
diff changeset
743 tty->print_cr("# HotSpot Runtime Error, null exception in generated code");
a61af66fc99e Initial load
duke
parents:
diff changeset
744 tty->print_cr("#");
a61af66fc99e Initial load
duke
parents:
diff changeset
745 tty->print_cr("# pc where exception happened = " INTPTR_FORMAT, exception_pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
746
a61af66fc99e Initial load
duke
parents:
diff changeset
747 if (n->is_nmethod()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
748 methodOop method = ((nmethod*)n)->method();
a61af66fc99e Initial load
duke
parents:
diff changeset
749 tty->print_cr("# Method where it happened %s.%s ", Klass::cast(method->method_holder())->name()->as_C_string(), method->name()->as_C_string());
a61af66fc99e Initial load
duke
parents:
diff changeset
750 tty->print_cr("#");
a61af66fc99e Initial load
duke
parents:
diff changeset
751 if (ShowMessageBoxOnError && UpdateHotSpotCompilerFileOnError) {
a61af66fc99e Initial load
duke
parents:
diff changeset
752 const char* title = "HotSpot Runtime Error";
a61af66fc99e Initial load
duke
parents:
diff changeset
753 const char* question = "Do you want to exclude compilation of this method in future runs?";
a61af66fc99e Initial load
duke
parents:
diff changeset
754 if (os::message_box(title, question)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
755 CompilerOracle::append_comment_to_file("");
a61af66fc99e Initial load
duke
parents:
diff changeset
756 CompilerOracle::append_comment_to_file("Null exception in compiled code resulted in the following exclude");
a61af66fc99e Initial load
duke
parents:
diff changeset
757 CompilerOracle::append_comment_to_file("");
a61af66fc99e Initial load
duke
parents:
diff changeset
758 CompilerOracle::append_exclude_to_file(method);
a61af66fc99e Initial load
duke
parents:
diff changeset
759 tty->print_cr("#");
a61af66fc99e Initial load
duke
parents:
diff changeset
760 tty->print_cr("# %s has been updated to exclude the specified method", CompileCommandFile);
a61af66fc99e Initial load
duke
parents:
diff changeset
761 tty->print_cr("#");
a61af66fc99e Initial load
duke
parents:
diff changeset
762 }
a61af66fc99e Initial load
duke
parents:
diff changeset
763 }
a61af66fc99e Initial load
duke
parents:
diff changeset
764 fatal("Implicit null exception happened in compiled method");
a61af66fc99e Initial load
duke
parents:
diff changeset
765 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
766 n->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
767 fatal("Implicit null exception happened in generated stub");
a61af66fc99e Initial load
duke
parents:
diff changeset
768 }
a61af66fc99e Initial load
duke
parents:
diff changeset
769 }
a61af66fc99e Initial load
duke
parents:
diff changeset
770 fatal("Implicit null exception at wrong place");
a61af66fc99e Initial load
duke
parents:
diff changeset
771 }
a61af66fc99e Initial load
duke
parents:
diff changeset
772
a61af66fc99e Initial load
duke
parents:
diff changeset
773
a61af66fc99e Initial load
duke
parents:
diff changeset
774 //-------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
775 // register policy
a61af66fc99e Initial load
duke
parents:
diff changeset
776
a61af66fc99e Initial load
duke
parents:
diff changeset
777 bool OptoRuntime::is_callee_saved_register(MachRegisterNumbers reg) {
a61af66fc99e Initial load
duke
parents:
diff changeset
778 assert(reg >= 0 && reg < _last_Mach_Reg, "must be a machine register");
a61af66fc99e Initial load
duke
parents:
diff changeset
779 switch (register_save_policy[reg]) {
a61af66fc99e Initial load
duke
parents:
diff changeset
780 case 'C': return false; //SOC
a61af66fc99e Initial load
duke
parents:
diff changeset
781 case 'E': return true ; //SOE
a61af66fc99e Initial load
duke
parents:
diff changeset
782 case 'N': return false; //NS
a61af66fc99e Initial load
duke
parents:
diff changeset
783 case 'A': return false; //AS
a61af66fc99e Initial load
duke
parents:
diff changeset
784 }
a61af66fc99e Initial load
duke
parents:
diff changeset
785 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
786 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
787 }
a61af66fc99e Initial load
duke
parents:
diff changeset
788
a61af66fc99e Initial load
duke
parents:
diff changeset
789 //-----------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
790 // Exceptions
a61af66fc99e Initial load
duke
parents:
diff changeset
791 //
a61af66fc99e Initial load
duke
parents:
diff changeset
792
a61af66fc99e Initial load
duke
parents:
diff changeset
793 static void trace_exception(oop exception_oop, address exception_pc, const char* msg) PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
794
a61af66fc99e Initial load
duke
parents:
diff changeset
795 // The method is an entry that is always called by a C++ method not
a61af66fc99e Initial load
duke
parents:
diff changeset
796 // directly from compiled code. Compiled code will call the C++ method following.
a61af66fc99e Initial load
duke
parents:
diff changeset
797 // We can't allow async exception to be installed during exception processing.
a61af66fc99e Initial load
duke
parents:
diff changeset
798 JRT_ENTRY_NO_ASYNC(address, OptoRuntime::handle_exception_C_helper(JavaThread* thread, nmethod* &nm))
a61af66fc99e Initial load
duke
parents:
diff changeset
799
a61af66fc99e Initial load
duke
parents:
diff changeset
800 // Do not confuse exception_oop with pending_exception. The exception_oop
a61af66fc99e Initial load
duke
parents:
diff changeset
801 // is only used to pass arguments into the method. Not for general
a61af66fc99e Initial load
duke
parents:
diff changeset
802 // exception handling. DO NOT CHANGE IT to use pending_exception, since
a61af66fc99e Initial load
duke
parents:
diff changeset
803 // the runtime stubs checks this on exit.
a61af66fc99e Initial load
duke
parents:
diff changeset
804 assert(thread->exception_oop() != NULL, "exception oop is found");
a61af66fc99e Initial load
duke
parents:
diff changeset
805 address handler_address = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
806
a61af66fc99e Initial load
duke
parents:
diff changeset
807 Handle exception(thread, thread->exception_oop());
a61af66fc99e Initial load
duke
parents:
diff changeset
808
a61af66fc99e Initial load
duke
parents:
diff changeset
809 if (TraceExceptions) {
a61af66fc99e Initial load
duke
parents:
diff changeset
810 trace_exception(exception(), thread->exception_pc(), "");
a61af66fc99e Initial load
duke
parents:
diff changeset
811 }
a61af66fc99e Initial load
duke
parents:
diff changeset
812 // for AbortVMOnException flag
a61af66fc99e Initial load
duke
parents:
diff changeset
813 NOT_PRODUCT(Exceptions::debug_check_abort(exception));
a61af66fc99e Initial load
duke
parents:
diff changeset
814
a61af66fc99e Initial load
duke
parents:
diff changeset
815 #ifdef ASSERT
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1135
diff changeset
816 if (!(exception->is_a(SystemDictionary::Throwable_klass()))) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
817 // should throw an exception here
a61af66fc99e Initial load
duke
parents:
diff changeset
818 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
819 }
a61af66fc99e Initial load
duke
parents:
diff changeset
820 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
821
a61af66fc99e Initial load
duke
parents:
diff changeset
822
a61af66fc99e Initial load
duke
parents:
diff changeset
823 // new exception handling: this method is entered only from adapters
a61af66fc99e Initial load
duke
parents:
diff changeset
824 // exceptions from compiled java methods are handled in compiled code
a61af66fc99e Initial load
duke
parents:
diff changeset
825 // using rethrow node
a61af66fc99e Initial load
duke
parents:
diff changeset
826
a61af66fc99e Initial load
duke
parents:
diff changeset
827 address pc = thread->exception_pc();
a61af66fc99e Initial load
duke
parents:
diff changeset
828 nm = CodeCache::find_nmethod(pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
829 assert(nm != NULL, "No NMethod found");
a61af66fc99e Initial load
duke
parents:
diff changeset
830 if (nm->is_native_method()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
831 fatal("Native mathod should not have path to exception handling");
a61af66fc99e Initial load
duke
parents:
diff changeset
832 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
833 // we are switching to old paradigm: search for exception handler in caller_frame
a61af66fc99e Initial load
duke
parents:
diff changeset
834 // instead in exception handler of caller_frame.sender()
a61af66fc99e Initial load
duke
parents:
diff changeset
835
1213
6deeaebad47a 6902182: 4/4 Starting with jdwp agent should not incur performance penalty
dcubed
parents: 1166
diff changeset
836 if (JvmtiExport::can_post_on_exceptions()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
837 // "Full-speed catching" is not necessary here,
a61af66fc99e Initial load
duke
parents:
diff changeset
838 // since we're notifying the VM on every catch.
a61af66fc99e Initial load
duke
parents:
diff changeset
839 // Force deoptimization and the rest of the lookup
a61af66fc99e Initial load
duke
parents:
diff changeset
840 // will be fine.
a61af66fc99e Initial load
duke
parents:
diff changeset
841 deoptimize_caller_frame(thread, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
842 }
a61af66fc99e Initial load
duke
parents:
diff changeset
843
a61af66fc99e Initial load
duke
parents:
diff changeset
844 // Check the stack guard pages. If enabled, look for handler in this frame;
a61af66fc99e Initial load
duke
parents:
diff changeset
845 // otherwise, forcibly unwind the frame.
a61af66fc99e Initial load
duke
parents:
diff changeset
846 //
a61af66fc99e Initial load
duke
parents:
diff changeset
847 // 4826555: use default current sp for reguard_stack instead of &nm: it's more accurate.
a61af66fc99e Initial load
duke
parents:
diff changeset
848 bool force_unwind = !thread->reguard_stack();
a61af66fc99e Initial load
duke
parents:
diff changeset
849 bool deopting = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
850 if (nm->is_deopt_pc(pc)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
851 deopting = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
852 RegisterMap map(thread, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
853 frame deoptee = thread->last_frame().sender(&map);
a61af66fc99e Initial load
duke
parents:
diff changeset
854 assert(deoptee.is_deoptimized_frame(), "must be deopted");
a61af66fc99e Initial load
duke
parents:
diff changeset
855 // Adjust the pc back to the original throwing pc
a61af66fc99e Initial load
duke
parents:
diff changeset
856 pc = deoptee.pc();
a61af66fc99e Initial load
duke
parents:
diff changeset
857 }
a61af66fc99e Initial load
duke
parents:
diff changeset
858
a61af66fc99e Initial load
duke
parents:
diff changeset
859 // If we are forcing an unwind because of stack overflow then deopt is
a61af66fc99e Initial load
duke
parents:
diff changeset
860 // irrelevant sice we are throwing the frame away anyway.
a61af66fc99e Initial load
duke
parents:
diff changeset
861
a61af66fc99e Initial load
duke
parents:
diff changeset
862 if (deopting && !force_unwind) {
a61af66fc99e Initial load
duke
parents:
diff changeset
863 handler_address = SharedRuntime::deopt_blob()->unpack_with_exception();
a61af66fc99e Initial load
duke
parents:
diff changeset
864 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
865
a61af66fc99e Initial load
duke
parents:
diff changeset
866 handler_address =
a61af66fc99e Initial load
duke
parents:
diff changeset
867 force_unwind ? NULL : nm->handler_for_exception_and_pc(exception, pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
868
a61af66fc99e Initial load
duke
parents:
diff changeset
869 if (handler_address == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
870 handler_address = SharedRuntime::compute_compiled_exc_handler(nm, pc, exception, force_unwind, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
871 assert (handler_address != NULL, "must have compiled handler");
a61af66fc99e Initial load
duke
parents:
diff changeset
872 // Update the exception cache only when the unwind was not forced.
a61af66fc99e Initial load
duke
parents:
diff changeset
873 if (!force_unwind) {
a61af66fc99e Initial load
duke
parents:
diff changeset
874 nm->add_handler_for_exception_and_pc(exception,pc,handler_address);
a61af66fc99e Initial load
duke
parents:
diff changeset
875 }
a61af66fc99e Initial load
duke
parents:
diff changeset
876 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
877 assert(handler_address == SharedRuntime::compute_compiled_exc_handler(nm, pc, exception, force_unwind, true), "Must be the same");
a61af66fc99e Initial load
duke
parents:
diff changeset
878 }
a61af66fc99e Initial load
duke
parents:
diff changeset
879 }
a61af66fc99e Initial load
duke
parents:
diff changeset
880
a61af66fc99e Initial load
duke
parents:
diff changeset
881 thread->set_exception_pc(pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
882 thread->set_exception_handler_pc(handler_address);
a61af66fc99e Initial load
duke
parents:
diff changeset
883 thread->set_exception_stack_size(0);
1135
e66fd840cb6b 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 1027
diff changeset
884
1295
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 1257
diff changeset
885 // Check if the exception PC is a MethodHandle call site.
1368
93767e6a2dfd 6941529: SharedRuntime::raw_exception_handler_for_return_address must reset thread MethodHandle flag
twisti
parents: 1295
diff changeset
886 thread->set_is_method_handle_return(nm->is_method_handle_return(pc));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
887 }
a61af66fc99e Initial load
duke
parents:
diff changeset
888
a61af66fc99e Initial load
duke
parents:
diff changeset
889 // Restore correct return pc. Was saved above.
a61af66fc99e Initial load
duke
parents:
diff changeset
890 thread->set_exception_oop(exception());
a61af66fc99e Initial load
duke
parents:
diff changeset
891 return handler_address;
a61af66fc99e Initial load
duke
parents:
diff changeset
892
a61af66fc99e Initial load
duke
parents:
diff changeset
893 JRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
894
a61af66fc99e Initial load
duke
parents:
diff changeset
895 // We are entering here from exception_blob
a61af66fc99e Initial load
duke
parents:
diff changeset
896 // If there is a compiled exception handler in this method, we will continue there;
a61af66fc99e Initial load
duke
parents:
diff changeset
897 // otherwise we will unwind the stack and continue at the caller of top frame method
a61af66fc99e Initial load
duke
parents:
diff changeset
898 // Note we enter without the usual JRT wrapper. We will call a helper routine that
a61af66fc99e Initial load
duke
parents:
diff changeset
899 // will do the normal VM entry. We do it this way so that we can see if the nmethod
a61af66fc99e Initial load
duke
parents:
diff changeset
900 // we looked up the handler for has been deoptimized in the meantime. If it has been
a61af66fc99e Initial load
duke
parents:
diff changeset
901 // we must not use the handler and instread return the deopt blob.
a61af66fc99e Initial load
duke
parents:
diff changeset
902 address OptoRuntime::handle_exception_C(JavaThread* thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
903 //
a61af66fc99e Initial load
duke
parents:
diff changeset
904 // We are in Java not VM and in debug mode we have a NoHandleMark
a61af66fc99e Initial load
duke
parents:
diff changeset
905 //
a61af66fc99e Initial load
duke
parents:
diff changeset
906 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
907 SharedRuntime::_find_handler_ctr++; // find exception handler
a61af66fc99e Initial load
duke
parents:
diff changeset
908 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
909 debug_only(NoHandleMark __hm;)
a61af66fc99e Initial load
duke
parents:
diff changeset
910 nmethod* nm = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
911 address handler_address = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
912 {
a61af66fc99e Initial load
duke
parents:
diff changeset
913 // Enter the VM
a61af66fc99e Initial load
duke
parents:
diff changeset
914
a61af66fc99e Initial load
duke
parents:
diff changeset
915 ResetNoHandleMark rnhm;
a61af66fc99e Initial load
duke
parents:
diff changeset
916 handler_address = handle_exception_C_helper(thread, nm);
a61af66fc99e Initial load
duke
parents:
diff changeset
917 }
a61af66fc99e Initial load
duke
parents:
diff changeset
918
a61af66fc99e Initial load
duke
parents:
diff changeset
919 // Back in java: Use no oops, DON'T safepoint
a61af66fc99e Initial load
duke
parents:
diff changeset
920
a61af66fc99e Initial load
duke
parents:
diff changeset
921 // Now check to see if the handler we are returning is in a now
a61af66fc99e Initial load
duke
parents:
diff changeset
922 // deoptimized frame
a61af66fc99e Initial load
duke
parents:
diff changeset
923
a61af66fc99e Initial load
duke
parents:
diff changeset
924 if (nm != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
925 RegisterMap map(thread, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
926 frame caller = thread->last_frame().sender(&map);
a61af66fc99e Initial load
duke
parents:
diff changeset
927 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
928 assert(caller.is_compiled_frame(), "must be");
a61af66fc99e Initial load
duke
parents:
diff changeset
929 #endif // ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
930 if (caller.is_deoptimized_frame()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
931 handler_address = SharedRuntime::deopt_blob()->unpack_with_exception();
a61af66fc99e Initial load
duke
parents:
diff changeset
932 }
a61af66fc99e Initial load
duke
parents:
diff changeset
933 }
a61af66fc99e Initial load
duke
parents:
diff changeset
934 return handler_address;
a61af66fc99e Initial load
duke
parents:
diff changeset
935 }
a61af66fc99e Initial load
duke
parents:
diff changeset
936
a61af66fc99e Initial load
duke
parents:
diff changeset
937 //------------------------------rethrow----------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
938 // We get here after compiled code has executed a 'RethrowNode'. The callee
a61af66fc99e Initial load
duke
parents:
diff changeset
939 // is either throwing or rethrowing an exception. The callee-save registers
a61af66fc99e Initial load
duke
parents:
diff changeset
940 // have been restored, synchronized objects have been unlocked and the callee
a61af66fc99e Initial load
duke
parents:
diff changeset
941 // stack frame has been removed. The return address was passed in.
a61af66fc99e Initial load
duke
parents:
diff changeset
942 // Exception oop is passed as the 1st argument. This routine is then called
a61af66fc99e Initial load
duke
parents:
diff changeset
943 // from the stub. On exit, we know where to jump in the caller's code.
a61af66fc99e Initial load
duke
parents:
diff changeset
944 // After this C code exits, the stub will pop his frame and end in a jump
a61af66fc99e Initial load
duke
parents:
diff changeset
945 // (instead of a return). We enter the caller's default handler.
a61af66fc99e Initial load
duke
parents:
diff changeset
946 //
a61af66fc99e Initial load
duke
parents:
diff changeset
947 // This must be JRT_LEAF:
a61af66fc99e Initial load
duke
parents:
diff changeset
948 // - caller will not change its state as we cannot block on exit,
a61af66fc99e Initial load
duke
parents:
diff changeset
949 // therefore raw_exception_handler_for_return_address is all it takes
a61af66fc99e Initial load
duke
parents:
diff changeset
950 // to handle deoptimized blobs
a61af66fc99e Initial load
duke
parents:
diff changeset
951 //
a61af66fc99e Initial load
duke
parents:
diff changeset
952 // However, there needs to be a safepoint check in the middle! So compiled
a61af66fc99e Initial load
duke
parents:
diff changeset
953 // safepoints are completely watertight.
a61af66fc99e Initial load
duke
parents:
diff changeset
954 //
a61af66fc99e Initial load
duke
parents:
diff changeset
955 // Thus, it cannot be a leaf since it contains the No_GC_Verifier.
a61af66fc99e Initial load
duke
parents:
diff changeset
956 //
a61af66fc99e Initial load
duke
parents:
diff changeset
957 // *THIS IS NOT RECOMMENDED PROGRAMMING STYLE*
a61af66fc99e Initial load
duke
parents:
diff changeset
958 //
a61af66fc99e Initial load
duke
parents:
diff changeset
959 address OptoRuntime::rethrow_C(oopDesc* exception, JavaThread* thread, address ret_pc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
960 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
961 SharedRuntime::_rethrow_ctr++; // count rethrows
a61af66fc99e Initial load
duke
parents:
diff changeset
962 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
963 assert (exception != NULL, "should have thrown a NULLPointerException");
a61af66fc99e Initial load
duke
parents:
diff changeset
964 #ifdef ASSERT
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1135
diff changeset
965 if (!(exception->is_a(SystemDictionary::Throwable_klass()))) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
966 // should throw an exception here
a61af66fc99e Initial load
duke
parents:
diff changeset
967 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
968 }
a61af66fc99e Initial load
duke
parents:
diff changeset
969 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
970
a61af66fc99e Initial load
duke
parents:
diff changeset
971 thread->set_vm_result(exception);
a61af66fc99e Initial load
duke
parents:
diff changeset
972 // Frame not compiled (handles deoptimization blob)
1295
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 1257
diff changeset
973 return SharedRuntime::raw_exception_handler_for_return_address(thread, ret_pc);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
974 }
a61af66fc99e Initial load
duke
parents:
diff changeset
975
a61af66fc99e Initial load
duke
parents:
diff changeset
976
a61af66fc99e Initial load
duke
parents:
diff changeset
977 const TypeFunc *OptoRuntime::rethrow_Type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
978 // create input type (domain)
a61af66fc99e Initial load
duke
parents:
diff changeset
979 const Type **fields = TypeTuple::fields(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
980 fields[TypeFunc::Parms+0] = TypeInstPtr::NOTNULL; // Exception oop
a61af66fc99e Initial load
duke
parents:
diff changeset
981 const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+1,fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
982
a61af66fc99e Initial load
duke
parents:
diff changeset
983 // create result type (range)
a61af66fc99e Initial load
duke
parents:
diff changeset
984 fields = TypeTuple::fields(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
985 fields[TypeFunc::Parms+0] = TypeInstPtr::NOTNULL; // Exception oop
a61af66fc99e Initial load
duke
parents:
diff changeset
986 const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+1, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
987
a61af66fc99e Initial load
duke
parents:
diff changeset
988 return TypeFunc::make(domain, range);
a61af66fc99e Initial load
duke
parents:
diff changeset
989 }
a61af66fc99e Initial load
duke
parents:
diff changeset
990
a61af66fc99e Initial load
duke
parents:
diff changeset
991
a61af66fc99e Initial load
duke
parents:
diff changeset
992 void OptoRuntime::deoptimize_caller_frame(JavaThread *thread, bool doit) {
a61af66fc99e Initial load
duke
parents:
diff changeset
993 // Deoptimize frame
a61af66fc99e Initial load
duke
parents:
diff changeset
994 if (doit) {
a61af66fc99e Initial load
duke
parents:
diff changeset
995 // Called from within the owner thread, so no need for safepoint
a61af66fc99e Initial load
duke
parents:
diff changeset
996 RegisterMap reg_map(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
997 frame stub_frame = thread->last_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
998 assert(stub_frame.is_runtime_frame() || exception_blob()->contains(stub_frame.pc()), "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
999 frame caller_frame = stub_frame.sender(&reg_map);
a61af66fc99e Initial load
duke
parents:
diff changeset
1000
1213
6deeaebad47a 6902182: 4/4 Starting with jdwp agent should not incur performance penalty
dcubed
parents: 1166
diff changeset
1001 // bypass VM_DeoptimizeFrame and deoptimize the frame directly
6deeaebad47a 6902182: 4/4 Starting with jdwp agent should not incur performance penalty
dcubed
parents: 1166
diff changeset
1002 Deoptimization::deoptimize_frame(thread, caller_frame.id());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1003 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1004 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1005
a61af66fc99e Initial load
duke
parents:
diff changeset
1006
a61af66fc99e Initial load
duke
parents:
diff changeset
1007 const TypeFunc *OptoRuntime::register_finalizer_Type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1008 // create input type (domain)
a61af66fc99e Initial load
duke
parents:
diff changeset
1009 const Type **fields = TypeTuple::fields(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1010 fields[TypeFunc::Parms+0] = TypeInstPtr::NOTNULL; // oop; Receiver
a61af66fc99e Initial load
duke
parents:
diff changeset
1011 // // The JavaThread* is passed to each routine as the last argument
a61af66fc99e Initial load
duke
parents:
diff changeset
1012 // fields[TypeFunc::Parms+1] = TypeRawPtr::NOTNULL; // JavaThread *; Executing thread
a61af66fc99e Initial load
duke
parents:
diff changeset
1013 const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+1,fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
1014
a61af66fc99e Initial load
duke
parents:
diff changeset
1015 // create result type (range)
a61af66fc99e Initial load
duke
parents:
diff changeset
1016 fields = TypeTuple::fields(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1017
a61af66fc99e Initial load
duke
parents:
diff changeset
1018 const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+0,fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
1019
a61af66fc99e Initial load
duke
parents:
diff changeset
1020 return TypeFunc::make(domain,range);
a61af66fc99e Initial load
duke
parents:
diff changeset
1021 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1022
a61af66fc99e Initial load
duke
parents:
diff changeset
1023
a61af66fc99e Initial load
duke
parents:
diff changeset
1024 //-----------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1025 // Dtrace support. entry and exit probes have the same signature
a61af66fc99e Initial load
duke
parents:
diff changeset
1026 const TypeFunc *OptoRuntime::dtrace_method_entry_exit_Type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1027 // create input type (domain)
a61af66fc99e Initial load
duke
parents:
diff changeset
1028 const Type **fields = TypeTuple::fields(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
1029 fields[TypeFunc::Parms+0] = TypeRawPtr::BOTTOM; // Thread-local storage
a61af66fc99e Initial load
duke
parents:
diff changeset
1030 fields[TypeFunc::Parms+1] = TypeInstPtr::NOTNULL; // methodOop; Method we are entering
a61af66fc99e Initial load
duke
parents:
diff changeset
1031 const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+2,fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
1032
a61af66fc99e Initial load
duke
parents:
diff changeset
1033 // create result type (range)
a61af66fc99e Initial load
duke
parents:
diff changeset
1034 fields = TypeTuple::fields(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1035
a61af66fc99e Initial load
duke
parents:
diff changeset
1036 const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+0,fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
1037
a61af66fc99e Initial load
duke
parents:
diff changeset
1038 return TypeFunc::make(domain,range);
a61af66fc99e Initial load
duke
parents:
diff changeset
1039 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1040
a61af66fc99e Initial load
duke
parents:
diff changeset
1041 const TypeFunc *OptoRuntime::dtrace_object_alloc_Type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1042 // create input type (domain)
a61af66fc99e Initial load
duke
parents:
diff changeset
1043 const Type **fields = TypeTuple::fields(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
1044 fields[TypeFunc::Parms+0] = TypeRawPtr::BOTTOM; // Thread-local storage
a61af66fc99e Initial load
duke
parents:
diff changeset
1045 fields[TypeFunc::Parms+1] = TypeInstPtr::NOTNULL; // oop; newly allocated object
a61af66fc99e Initial load
duke
parents:
diff changeset
1046
a61af66fc99e Initial load
duke
parents:
diff changeset
1047 const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+2,fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
1048
a61af66fc99e Initial load
duke
parents:
diff changeset
1049 // create result type (range)
a61af66fc99e Initial load
duke
parents:
diff changeset
1050 fields = TypeTuple::fields(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1051
a61af66fc99e Initial load
duke
parents:
diff changeset
1052 const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+0,fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
1053
a61af66fc99e Initial load
duke
parents:
diff changeset
1054 return TypeFunc::make(domain,range);
a61af66fc99e Initial load
duke
parents:
diff changeset
1055 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1056
a61af66fc99e Initial load
duke
parents:
diff changeset
1057
a61af66fc99e Initial load
duke
parents:
diff changeset
1058 JRT_ENTRY_NO_ASYNC(void, OptoRuntime::register_finalizer(oopDesc* obj, JavaThread* thread))
a61af66fc99e Initial load
duke
parents:
diff changeset
1059 assert(obj->is_oop(), "must be a valid oop");
a61af66fc99e Initial load
duke
parents:
diff changeset
1060 assert(obj->klass()->klass_part()->has_finalizer(), "shouldn't be here otherwise");
a61af66fc99e Initial load
duke
parents:
diff changeset
1061 instanceKlass::register_finalizer(instanceOop(obj), CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1062 JRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1063
a61af66fc99e Initial load
duke
parents:
diff changeset
1064 //-----------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1065
a61af66fc99e Initial load
duke
parents:
diff changeset
1066 NamedCounter * volatile OptoRuntime::_named_counters = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1067
a61af66fc99e Initial load
duke
parents:
diff changeset
1068 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1069 // dump the collected NamedCounters.
a61af66fc99e Initial load
duke
parents:
diff changeset
1070 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1071 void OptoRuntime::print_named_counters() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1072 int total_lock_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1073 int eliminated_lock_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1074
a61af66fc99e Initial load
duke
parents:
diff changeset
1075 NamedCounter* c = _named_counters;
a61af66fc99e Initial load
duke
parents:
diff changeset
1076 while (c) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1077 if (c->tag() == NamedCounter::LockCounter || c->tag() == NamedCounter::EliminatedLockCounter) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1078 int count = c->count();
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 if (count > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 bool eliminated = c->tag() == NamedCounter::EliminatedLockCounter;
a61af66fc99e Initial load
duke
parents:
diff changeset
1081 if (Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1082 tty->print_cr("%d %s%s", count, c->name(), eliminated ? " (eliminated)" : "");
a61af66fc99e Initial load
duke
parents:
diff changeset
1083 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1084 total_lock_count += count;
a61af66fc99e Initial load
duke
parents:
diff changeset
1085 if (eliminated) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1086 eliminated_lock_count += count;
a61af66fc99e Initial load
duke
parents:
diff changeset
1087 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1088 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1089 } else if (c->tag() == NamedCounter::BiasedLockingCounter) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1090 BiasedLockingCounters* blc = ((BiasedLockingNamedCounter*)c)->counters();
a61af66fc99e Initial load
duke
parents:
diff changeset
1091 if (blc->nonzero()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1092 tty->print_cr("%s", c->name());
a61af66fc99e Initial load
duke
parents:
diff changeset
1093 blc->print_on(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
1094 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1095 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1096 c = c->next();
a61af66fc99e Initial load
duke
parents:
diff changeset
1097 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1098 if (total_lock_count > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1099 tty->print_cr("dynamic locks: %d", total_lock_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
1100 if (eliminated_lock_count) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1101 tty->print_cr("eliminated locks: %d (%d%%)", eliminated_lock_count,
a61af66fc99e Initial load
duke
parents:
diff changeset
1102 (int)(eliminated_lock_count * 100.0 / total_lock_count));
a61af66fc99e Initial load
duke
parents:
diff changeset
1103 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1104 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1105 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1106
a61af66fc99e Initial load
duke
parents:
diff changeset
1107 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1108 // Allocate a new NamedCounter. The JVMState is used to generate the
a61af66fc99e Initial load
duke
parents:
diff changeset
1109 // name which consists of method@line for the inlining tree.
a61af66fc99e Initial load
duke
parents:
diff changeset
1110 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1111
a61af66fc99e Initial load
duke
parents:
diff changeset
1112 NamedCounter* OptoRuntime::new_named_counter(JVMState* youngest_jvms, NamedCounter::CounterTag tag) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1113 int max_depth = youngest_jvms->depth();
a61af66fc99e Initial load
duke
parents:
diff changeset
1114
a61af66fc99e Initial load
duke
parents:
diff changeset
1115 // Visit scopes from youngest to oldest.
a61af66fc99e Initial load
duke
parents:
diff changeset
1116 bool first = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1117 stringStream st;
a61af66fc99e Initial load
duke
parents:
diff changeset
1118 for (int depth = max_depth; depth >= 1; depth--) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1119 JVMState* jvms = youngest_jvms->of_depth(depth);
a61af66fc99e Initial load
duke
parents:
diff changeset
1120 ciMethod* m = jvms->has_method() ? jvms->method() : NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1121 if (!first) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1122 st.print(" ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1123 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1124 first = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1125 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1126 int bci = jvms->bci();
a61af66fc99e Initial load
duke
parents:
diff changeset
1127 if (bci < 0) bci = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1128 st.print("%s.%s@%d", m->holder()->name()->as_utf8(), m->name()->as_utf8(), bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
1129 // To print linenumbers instead of bci use: m->line_number_from_bci(bci)
a61af66fc99e Initial load
duke
parents:
diff changeset
1130 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1131 NamedCounter* c;
a61af66fc99e Initial load
duke
parents:
diff changeset
1132 if (tag == NamedCounter::BiasedLockingCounter) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1133 c = new BiasedLockingNamedCounter(strdup(st.as_string()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1134 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1135 c = new NamedCounter(strdup(st.as_string()), tag);
a61af66fc99e Initial load
duke
parents:
diff changeset
1136 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1137
a61af66fc99e Initial load
duke
parents:
diff changeset
1138 // atomically add the new counter to the head of the list. We only
a61af66fc99e Initial load
duke
parents:
diff changeset
1139 // add counters so this is safe.
a61af66fc99e Initial load
duke
parents:
diff changeset
1140 NamedCounter* head;
a61af66fc99e Initial load
duke
parents:
diff changeset
1141 do {
a61af66fc99e Initial load
duke
parents:
diff changeset
1142 head = _named_counters;
a61af66fc99e Initial load
duke
parents:
diff changeset
1143 c->set_next(head);
a61af66fc99e Initial load
duke
parents:
diff changeset
1144 } while (Atomic::cmpxchg_ptr(c, &_named_counters, head) != head);
a61af66fc99e Initial load
duke
parents:
diff changeset
1145 return c;
a61af66fc99e Initial load
duke
parents:
diff changeset
1146 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1147
a61af66fc99e Initial load
duke
parents:
diff changeset
1148 //-----------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1149 // Non-product code
a61af66fc99e Initial load
duke
parents:
diff changeset
1150 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1151
a61af66fc99e Initial load
duke
parents:
diff changeset
1152 int trace_exception_counter = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1153 static void trace_exception(oop exception_oop, address exception_pc, const char* msg) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1154 ttyLocker ttyl;
a61af66fc99e Initial load
duke
parents:
diff changeset
1155 trace_exception_counter++;
a61af66fc99e Initial load
duke
parents:
diff changeset
1156 tty->print("%d [Exception (%s): ", trace_exception_counter, msg);
a61af66fc99e Initial load
duke
parents:
diff changeset
1157 exception_oop->print_value();
a61af66fc99e Initial load
duke
parents:
diff changeset
1158 tty->print(" in ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1159 CodeBlob* blob = CodeCache::find_blob(exception_pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
1160 if (blob->is_nmethod()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1161 ((nmethod*)blob)->method()->print_value();
a61af66fc99e Initial load
duke
parents:
diff changeset
1162 } else if (blob->is_runtime_stub()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1163 tty->print("<runtime-stub>");
a61af66fc99e Initial load
duke
parents:
diff changeset
1164 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1165 tty->print("<unknown>");
a61af66fc99e Initial load
duke
parents:
diff changeset
1166 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1167 tty->print(" at " INTPTR_FORMAT, exception_pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
1168 tty->print_cr("]");
a61af66fc99e Initial load
duke
parents:
diff changeset
1169 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1170
a61af66fc99e Initial load
duke
parents:
diff changeset
1171 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1172
a61af66fc99e Initial load
duke
parents:
diff changeset
1173
a61af66fc99e Initial load
duke
parents:
diff changeset
1174 # ifdef ENABLE_ZAP_DEAD_LOCALS
a61af66fc99e Initial load
duke
parents:
diff changeset
1175 // Called from call sites in compiled code with oop maps (actually safepoints)
a61af66fc99e Initial load
duke
parents:
diff changeset
1176 // Zaps dead locals in first java frame.
a61af66fc99e Initial load
duke
parents:
diff changeset
1177 // Is entry because may need to lock to generate oop maps
a61af66fc99e Initial load
duke
parents:
diff changeset
1178 // Currently, only used for compiler frames, but someday may be used
a61af66fc99e Initial load
duke
parents:
diff changeset
1179 // for interpreter frames, too.
a61af66fc99e Initial load
duke
parents:
diff changeset
1180
a61af66fc99e Initial load
duke
parents:
diff changeset
1181 int OptoRuntime::ZapDeadCompiledLocals_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1182
a61af66fc99e Initial load
duke
parents:
diff changeset
1183 // avoid pointers to member funcs with these helpers
a61af66fc99e Initial load
duke
parents:
diff changeset
1184 static bool is_java_frame( frame* f) { return f->is_java_frame(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1185 static bool is_native_frame(frame* f) { return f->is_native_frame(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1186
a61af66fc99e Initial load
duke
parents:
diff changeset
1187
a61af66fc99e Initial load
duke
parents:
diff changeset
1188 void OptoRuntime::zap_dead_java_or_native_locals(JavaThread* thread,
a61af66fc99e Initial load
duke
parents:
diff changeset
1189 bool (*is_this_the_right_frame_to_zap)(frame*)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1190 assert(JavaThread::current() == thread, "is this needed?");
a61af66fc99e Initial load
duke
parents:
diff changeset
1191
a61af66fc99e Initial load
duke
parents:
diff changeset
1192 if ( !ZapDeadCompiledLocals ) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1193
a61af66fc99e Initial load
duke
parents:
diff changeset
1194 bool skip = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1195
a61af66fc99e Initial load
duke
parents:
diff changeset
1196 if ( ZapDeadCompiledLocalsFirst == 0 ) ; // nothing special
a61af66fc99e Initial load
duke
parents:
diff changeset
1197 else if ( ZapDeadCompiledLocalsFirst > ZapDeadCompiledLocals_count ) skip = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1198 else if ( ZapDeadCompiledLocalsFirst == ZapDeadCompiledLocals_count )
a61af66fc99e Initial load
duke
parents:
diff changeset
1199 warning("starting zapping after skipping");
a61af66fc99e Initial load
duke
parents:
diff changeset
1200
a61af66fc99e Initial load
duke
parents:
diff changeset
1201 if ( ZapDeadCompiledLocalsLast == -1 ) ; // nothing special
a61af66fc99e Initial load
duke
parents:
diff changeset
1202 else if ( ZapDeadCompiledLocalsLast < ZapDeadCompiledLocals_count ) skip = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1203 else if ( ZapDeadCompiledLocalsLast == ZapDeadCompiledLocals_count )
a61af66fc99e Initial load
duke
parents:
diff changeset
1204 warning("about to zap last zap");
a61af66fc99e Initial load
duke
parents:
diff changeset
1205
a61af66fc99e Initial load
duke
parents:
diff changeset
1206 ++ZapDeadCompiledLocals_count; // counts skipped zaps, too
a61af66fc99e Initial load
duke
parents:
diff changeset
1207
a61af66fc99e Initial load
duke
parents:
diff changeset
1208 if ( skip ) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1209
a61af66fc99e Initial load
duke
parents:
diff changeset
1210 // find java frame and zap it
a61af66fc99e Initial load
duke
parents:
diff changeset
1211
a61af66fc99e Initial load
duke
parents:
diff changeset
1212 for (StackFrameStream sfs(thread); !sfs.is_done(); sfs.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1213 if (is_this_the_right_frame_to_zap(sfs.current()) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1214 sfs.current()->zap_dead_locals(thread, sfs.register_map());
a61af66fc99e Initial load
duke
parents:
diff changeset
1215 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1216 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1217 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1218 warning("no frame found to zap in zap_dead_Java_locals_C");
a61af66fc99e Initial load
duke
parents:
diff changeset
1219 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1220
a61af66fc99e Initial load
duke
parents:
diff changeset
1221 JRT_LEAF(void, OptoRuntime::zap_dead_Java_locals_C(JavaThread* thread))
a61af66fc99e Initial load
duke
parents:
diff changeset
1222 zap_dead_java_or_native_locals(thread, is_java_frame);
a61af66fc99e Initial load
duke
parents:
diff changeset
1223 JRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1224
a61af66fc99e Initial load
duke
parents:
diff changeset
1225 // The following does not work because for one thing, the
a61af66fc99e Initial load
duke
parents:
diff changeset
1226 // thread state is wrong; it expects java, but it is native.
605
98cb887364d3 6810672: Comment typos
twisti
parents: 342
diff changeset
1227 // Also, the invariants in a native stub are different and
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1228 // I'm not sure it is safe to have a MachCalRuntimeDirectNode
a61af66fc99e Initial load
duke
parents:
diff changeset
1229 // in there.
a61af66fc99e Initial load
duke
parents:
diff changeset
1230 // So for now, we do not zap in native stubs.
a61af66fc99e Initial load
duke
parents:
diff changeset
1231
a61af66fc99e Initial load
duke
parents:
diff changeset
1232 JRT_LEAF(void, OptoRuntime::zap_dead_native_locals_C(JavaThread* thread))
a61af66fc99e Initial load
duke
parents:
diff changeset
1233 zap_dead_java_or_native_locals(thread, is_native_frame);
a61af66fc99e Initial load
duke
parents:
diff changeset
1234 JRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1235
a61af66fc99e Initial load
duke
parents:
diff changeset
1236 # endif