annotate src/share/vm/opto/runtime.cpp @ 9126:bc26f978b0ce

HotSpotResolvedObjectType: implement hasFinalizeSubclass() correctly don't use the (wrong) cached value, but ask the runtime on each request. Fixes regression on xml.* benchmarks @ specjvm2008. The problem was: After the constructor of Object was deoptimized due to an assumption violation, it was recompiled again after some time. However, on recompilation, the value of hasFinalizeSubclass for the class was not updated and it was compiled again with a, now wrong, assumption, which then triggers deoptimization again. This was repeated until it hit the recompilation limit (defined by PerMethodRecompilationCutoff), and therefore only executed by the interpreter from now on, causing the performance regression.
author Bernhard Urban <bernhard.urban@jku.at>
date Mon, 15 Apr 2013 19:54:58 +0200
parents 4fc2763e670e
children f2aebc22372a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
6006
0105f367a14c 7160570: Intrinsification support for tracing framework
rbackman
parents: 4063
diff changeset
2 * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 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
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
25 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
26 #include "classfile/systemDictionary.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
27 #include "classfile/vmSymbols.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
28 #include "code/compiledIC.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
29 #include "code/icBuffer.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
30 #include "code/nmethod.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
31 #include "code/pcDesc.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
32 #include "code/scopeDesc.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
33 #include "code/vtableStubs.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
34 #include "compiler/compileBroker.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
35 #include "compiler/compilerOracle.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
36 #include "compiler/oopMap.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
37 #include "gc_implementation/g1/g1SATBCardTableModRefBS.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
38 #include "gc_implementation/g1/heapRegion.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
39 #include "gc_interface/collectedHeap.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
40 #include "interpreter/bytecode.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
41 #include "interpreter/interpreter.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
42 #include "interpreter/linkResolver.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
43 #include "memory/barrierSet.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
44 #include "memory/gcLocker.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
45 #include "memory/oopFactory.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
46 #include "oops/objArrayKlass.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
47 #include "oops/oop.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
48 #include "opto/addnode.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
49 #include "opto/callnode.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
50 #include "opto/cfgnode.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
51 #include "opto/connode.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
52 #include "opto/graphKit.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
53 #include "opto/machnode.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
54 #include "opto/matcher.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
55 #include "opto/memnode.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
56 #include "opto/mulnode.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
57 #include "opto/runtime.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
58 #include "opto/subnode.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
59 #include "runtime/fprofiler.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
60 #include "runtime/handles.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
61 #include "runtime/interfaceSupport.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
62 #include "runtime/javaCalls.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
63 #include "runtime/sharedRuntime.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
64 #include "runtime/signature.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
65 #include "runtime/threadCritical.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
66 #include "runtime/vframe.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
67 #include "runtime/vframeArray.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
68 #include "runtime/vframe_hp.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
69 #include "utilities/copy.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
70 #include "utilities/preserveException.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
71 #ifdef TARGET_ARCH_MODEL_x86_32
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
72 # include "adfiles/ad_x86_32.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
73 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
74 #ifdef TARGET_ARCH_MODEL_x86_64
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
75 # include "adfiles/ad_x86_64.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
76 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
77 #ifdef TARGET_ARCH_MODEL_sparc
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
78 # include "adfiles/ad_sparc.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
79 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
80 #ifdef TARGET_ARCH_MODEL_zero
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
81 # include "adfiles/ad_zero.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1844
diff changeset
82 #endif
2192
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
83 #ifdef TARGET_ARCH_MODEL_arm
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
84 # include "adfiles/ad_arm.hpp"
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
85 #endif
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
86 #ifdef TARGET_ARCH_MODEL_ppc
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
87 # include "adfiles/ad_ppc.hpp"
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
88 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
89
a61af66fc99e Initial load
duke
parents:
diff changeset
90
a61af66fc99e Initial load
duke
parents:
diff changeset
91 // For debugging purposes:
a61af66fc99e Initial load
duke
parents:
diff changeset
92 // To force FullGCALot inside a runtime function, add the following two lines
a61af66fc99e Initial load
duke
parents:
diff changeset
93 //
a61af66fc99e Initial load
duke
parents:
diff changeset
94 // Universe::release_fullgc_alot_dummy();
a61af66fc99e Initial load
duke
parents:
diff changeset
95 // MarkSweep::invoke(0, "Debugging");
a61af66fc99e Initial load
duke
parents:
diff changeset
96 //
a61af66fc99e Initial load
duke
parents:
diff changeset
97 // At command line specify the parameters: -XX:+FullGCALot -XX:FullGCALotStart=100000000
a61af66fc99e Initial load
duke
parents:
diff changeset
98
a61af66fc99e Initial load
duke
parents:
diff changeset
99
a61af66fc99e Initial load
duke
parents:
diff changeset
100
a61af66fc99e Initial load
duke
parents:
diff changeset
101
a61af66fc99e Initial load
duke
parents:
diff changeset
102 // Compiled code entry points
a61af66fc99e Initial load
duke
parents:
diff changeset
103 address OptoRuntime::_new_instance_Java = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
104 address OptoRuntime::_new_array_Java = NULL;
3961
a92cdbac8b9e 7081933: Use zeroing elimination optimization for large array
kvn
parents: 3899
diff changeset
105 address OptoRuntime::_new_array_nozero_Java = NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
106 address OptoRuntime::_multianewarray2_Java = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
107 address OptoRuntime::_multianewarray3_Java = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
108 address OptoRuntime::_multianewarray4_Java = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
109 address OptoRuntime::_multianewarray5_Java = NULL;
3805
263247c478c5 7058510: multinewarray with 6 dimensions uncommon traps in server compiler
iveresov
parents: 3442
diff changeset
110 address OptoRuntime::_multianewarrayN_Java = NULL;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
111 address OptoRuntime::_g1_wb_pre_Java = NULL;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
112 address OptoRuntime::_g1_wb_post_Java = NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
113 address OptoRuntime::_vtable_must_compile_Java = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
114 address OptoRuntime::_complete_monitor_locking_Java = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
115 address OptoRuntime::_rethrow_Java = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
116
a61af66fc99e Initial load
duke
parents:
diff changeset
117 address OptoRuntime::_slow_arraycopy_Java = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
118 address OptoRuntime::_register_finalizer_Java = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
119
a61af66fc99e Initial load
duke
parents:
diff changeset
120 # ifdef ENABLE_ZAP_DEAD_LOCALS
a61af66fc99e Initial load
duke
parents:
diff changeset
121 address OptoRuntime::_zap_dead_Java_locals_Java = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
122 address OptoRuntime::_zap_dead_native_locals_Java = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
123 # endif
a61af66fc99e Initial load
duke
parents:
diff changeset
124
3442
f7d55ea6ee56 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 2426
diff changeset
125 ExceptionBlob* OptoRuntime::_exception_blob;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
126
a61af66fc99e Initial load
duke
parents:
diff changeset
127 // This should be called in an assertion at the start of OptoRuntime routines
a61af66fc99e Initial load
duke
parents:
diff changeset
128 // which are entered from compiled code (all of them)
a61af66fc99e Initial load
duke
parents:
diff changeset
129 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
130 static bool check_compiled_frame(JavaThread* thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
131 assert(thread->last_frame().is_runtime_frame(), "cannot call runtime directly from compiled code");
a61af66fc99e Initial load
duke
parents:
diff changeset
132 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
133 RegisterMap map(thread, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
134 frame caller = thread->last_frame().sender(&map);
a61af66fc99e Initial load
duke
parents:
diff changeset
135 assert(caller.is_compiled_frame(), "not being called from compiled like code");
a61af66fc99e Initial load
duke
parents:
diff changeset
136 #endif /* ASSERT */
a61af66fc99e Initial load
duke
parents:
diff changeset
137 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
138 }
a61af66fc99e Initial load
duke
parents:
diff changeset
139 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
140
a61af66fc99e Initial load
duke
parents:
diff changeset
141
a61af66fc99e Initial load
duke
parents:
diff changeset
142 #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
143 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
144
a61af66fc99e Initial load
duke
parents:
diff changeset
145 void OptoRuntime::generate(ciEnv* env) {
a61af66fc99e Initial load
duke
parents:
diff changeset
146
a61af66fc99e Initial load
duke
parents:
diff changeset
147 generate_exception_blob();
a61af66fc99e Initial load
duke
parents:
diff changeset
148
a61af66fc99e Initial load
duke
parents:
diff changeset
149 // Note: tls: Means fetching the return oop out of the thread-local storage
a61af66fc99e Initial load
duke
parents:
diff changeset
150 //
a61af66fc99e Initial load
duke
parents:
diff changeset
151 // variable/name type-function-gen , runtime method ,fncy_jp, tls,save_args,retpc
a61af66fc99e Initial load
duke
parents:
diff changeset
152 // -------------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
153 gen(env, _new_instance_Java , new_instance_Type , new_instance_C , 0 , true , false, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
154 gen(env, _new_array_Java , new_array_Type , new_array_C , 0 , true , false, false);
3961
a92cdbac8b9e 7081933: Use zeroing elimination optimization for large array
kvn
parents: 3899
diff changeset
155 gen(env, _new_array_nozero_Java , new_array_Type , new_array_nozero_C , 0 , true , false, false);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
156 gen(env, _multianewarray2_Java , multianewarray2_Type , multianewarray2_C , 0 , true , false, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
157 gen(env, _multianewarray3_Java , multianewarray3_Type , multianewarray3_C , 0 , true , false, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
158 gen(env, _multianewarray4_Java , multianewarray4_Type , multianewarray4_C , 0 , true , false, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
159 gen(env, _multianewarray5_Java , multianewarray5_Type , multianewarray5_C , 0 , true , false, false);
3805
263247c478c5 7058510: multinewarray with 6 dimensions uncommon traps in server compiler
iveresov
parents: 3442
diff changeset
160 gen(env, _multianewarrayN_Java , multianewarrayN_Type , multianewarrayN_C , 0 , true , false, false);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
161 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
162 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
163 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
164 gen(env, _rethrow_Java , rethrow_Type , rethrow_C , 2 , true , false, true );
a61af66fc99e Initial load
duke
parents:
diff changeset
165
a61af66fc99e Initial load
duke
parents:
diff changeset
166 gen(env, _slow_arraycopy_Java , slow_arraycopy_Type , SharedRuntime::slow_arraycopy_C , 0 , false, false, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
167 gen(env, _register_finalizer_Java , register_finalizer_Type , register_finalizer , 0 , false, false, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
168
a61af66fc99e Initial load
duke
parents:
diff changeset
169 # ifdef ENABLE_ZAP_DEAD_LOCALS
a61af66fc99e Initial load
duke
parents:
diff changeset
170 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
171 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
172 # endif
a61af66fc99e Initial load
duke
parents:
diff changeset
173
a61af66fc99e Initial load
duke
parents:
diff changeset
174 }
a61af66fc99e Initial load
duke
parents:
diff changeset
175
a61af66fc99e Initial load
duke
parents:
diff changeset
176 #undef gen
a61af66fc99e Initial load
duke
parents:
diff changeset
177
a61af66fc99e Initial load
duke
parents:
diff changeset
178
a61af66fc99e Initial load
duke
parents:
diff changeset
179 // Helper method to do generation of RunTimeStub's
a61af66fc99e Initial load
duke
parents:
diff changeset
180 address OptoRuntime::generate_stub( ciEnv* env,
a61af66fc99e Initial load
duke
parents:
diff changeset
181 TypeFunc_generator gen, address C_function,
a61af66fc99e Initial load
duke
parents:
diff changeset
182 const char *name, int is_fancy_jump,
a61af66fc99e Initial load
duke
parents:
diff changeset
183 bool pass_tls,
a61af66fc99e Initial load
duke
parents:
diff changeset
184 bool save_argument_registers,
a61af66fc99e Initial load
duke
parents:
diff changeset
185 bool return_pc ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
186 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
187 Compile C( env, gen, C_function, name, is_fancy_jump, pass_tls, save_argument_registers, return_pc );
a61af66fc99e Initial load
duke
parents:
diff changeset
188 return C.stub_entry_point();
a61af66fc99e Initial load
duke
parents:
diff changeset
189 }
a61af66fc99e Initial load
duke
parents:
diff changeset
190
a61af66fc99e Initial load
duke
parents:
diff changeset
191 const char* OptoRuntime::stub_name(address entry) {
a61af66fc99e Initial load
duke
parents:
diff changeset
192 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
193 CodeBlob* cb = CodeCache::find_blob(entry);
a61af66fc99e Initial load
duke
parents:
diff changeset
194 RuntimeStub* rs =(RuntimeStub *)cb;
a61af66fc99e Initial load
duke
parents:
diff changeset
195 assert(rs != NULL && rs->is_runtime_stub(), "not a runtime stub");
a61af66fc99e Initial load
duke
parents:
diff changeset
196 return rs->name();
a61af66fc99e Initial load
duke
parents:
diff changeset
197 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
198 // Fast implementation for product mode (maybe it should be inlined too)
a61af66fc99e Initial load
duke
parents:
diff changeset
199 return "runtime stub";
a61af66fc99e Initial load
duke
parents:
diff changeset
200 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
201 }
a61af66fc99e Initial load
duke
parents:
diff changeset
202
a61af66fc99e Initial load
duke
parents:
diff changeset
203
a61af66fc99e Initial load
duke
parents:
diff changeset
204 //=============================================================================
a61af66fc99e Initial load
duke
parents:
diff changeset
205 // Opto compiler runtime routines
a61af66fc99e Initial load
duke
parents:
diff changeset
206 //=============================================================================
a61af66fc99e Initial load
duke
parents:
diff changeset
207
a61af66fc99e Initial load
duke
parents:
diff changeset
208
a61af66fc99e Initial load
duke
parents:
diff changeset
209 //=============================allocation======================================
a61af66fc99e Initial load
duke
parents:
diff changeset
210 // We failed the fast-path allocation. Now we need to do a scavenge or GC
a61af66fc99e Initial load
duke
parents:
diff changeset
211 // and try allocation again.
a61af66fc99e Initial load
duke
parents:
diff changeset
212
1166
7b0e9cba0307 6896647: card marks can be deferred too long
ysr
parents: 1142
diff changeset
213 void OptoRuntime::new_store_pre_barrier(JavaThread* thread) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
214 // 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
215 // 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
216 // 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
217 // GC may take any compensating steps.
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 605
diff changeset
218 // NOTE: Keep this code consistent with GraphKit::store_barrier.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
219
a61af66fc99e Initial load
duke
parents:
diff changeset
220 oop new_obj = thread->vm_result();
a61af66fc99e Initial load
duke
parents:
diff changeset
221 if (new_obj == NULL) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
222
a61af66fc99e Initial load
duke
parents:
diff changeset
223 assert(Universe::heap()->can_elide_tlab_store_barriers(),
a61af66fc99e Initial load
duke
parents:
diff changeset
224 "compiler must check this first");
1027
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 605
diff changeset
225 // 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
226 new_obj = Universe::heap()->new_store_pre_barrier(thread, new_obj);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
227 thread->set_vm_result(new_obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
228 }
a61af66fc99e Initial load
duke
parents:
diff changeset
229
a61af66fc99e Initial load
duke
parents:
diff changeset
230 // object allocation
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6633
diff changeset
231 JRT_BLOCK_ENTRY(void, OptoRuntime::new_instance_C(Klass* klass, JavaThread* thread))
0
a61af66fc99e Initial load
duke
parents:
diff changeset
232 JRT_BLOCK;
a61af66fc99e Initial load
duke
parents:
diff changeset
233 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
234 SharedRuntime::_new_instance_ctr++; // new instance requires GC
a61af66fc99e Initial load
duke
parents:
diff changeset
235 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
236 assert(check_compiled_frame(thread), "incorrect caller");
a61af66fc99e Initial load
duke
parents:
diff changeset
237
a61af66fc99e Initial load
duke
parents:
diff changeset
238 // These checks are cheap to make and support reflective allocation.
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6894
diff changeset
239 int lh = klass->layout_helper();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
240 if (Klass::layout_helper_needs_slow_path(lh)
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6633
diff changeset
241 || !InstanceKlass::cast(klass)->is_initialized()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
242 KlassHandle kh(THREAD, klass);
a61af66fc99e Initial load
duke
parents:
diff changeset
243 kh->check_valid_for_instantiation(false, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
244 if (!HAS_PENDING_EXCEPTION) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6633
diff changeset
245 InstanceKlass::cast(kh())->initialize(THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
246 }
a61af66fc99e Initial load
duke
parents:
diff changeset
247 if (!HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
248 klass = kh();
a61af66fc99e Initial load
duke
parents:
diff changeset
249 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
250 klass = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
251 }
a61af66fc99e Initial load
duke
parents:
diff changeset
252 }
a61af66fc99e Initial load
duke
parents:
diff changeset
253
a61af66fc99e Initial load
duke
parents:
diff changeset
254 if (klass != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
255 // Scavenge and allocate an instance.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6633
diff changeset
256 oop result = InstanceKlass::cast(klass)->allocate_instance(THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
257 thread->set_vm_result(result);
a61af66fc99e Initial load
duke
parents:
diff changeset
258
a61af66fc99e Initial load
duke
parents:
diff changeset
259 // Pass oops back through thread local storage. Our apparent type to Java
a61af66fc99e Initial load
duke
parents:
diff changeset
260 // is that we return an oop, but we can block on exit from this routine and
a61af66fc99e Initial load
duke
parents:
diff changeset
261 // a GC can trash the oop in C's return register. The generated stub will
a61af66fc99e Initial load
duke
parents:
diff changeset
262 // fetch the oop from TLS after any possible GC.
a61af66fc99e Initial load
duke
parents:
diff changeset
263 }
a61af66fc99e Initial load
duke
parents:
diff changeset
264
a61af66fc99e Initial load
duke
parents:
diff changeset
265 deoptimize_caller_frame(thread, HAS_PENDING_EXCEPTION);
a61af66fc99e Initial load
duke
parents:
diff changeset
266 JRT_BLOCK_END;
a61af66fc99e Initial load
duke
parents:
diff changeset
267
a61af66fc99e Initial load
duke
parents:
diff changeset
268 if (GraphKit::use_ReduceInitialCardMarks()) {
1027
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 605
diff changeset
269 // 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
270 new_store_pre_barrier(thread);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
271 }
a61af66fc99e Initial load
duke
parents:
diff changeset
272 JRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
273
a61af66fc99e Initial load
duke
parents:
diff changeset
274
a61af66fc99e Initial load
duke
parents:
diff changeset
275 // array allocation
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6633
diff changeset
276 JRT_BLOCK_ENTRY(void, OptoRuntime::new_array_C(Klass* array_type, int len, JavaThread *thread))
0
a61af66fc99e Initial load
duke
parents:
diff changeset
277 JRT_BLOCK;
a61af66fc99e Initial load
duke
parents:
diff changeset
278 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
279 SharedRuntime::_new_array_ctr++; // new array requires GC
a61af66fc99e Initial load
duke
parents:
diff changeset
280 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
281 assert(check_compiled_frame(thread), "incorrect caller");
a61af66fc99e Initial load
duke
parents:
diff changeset
282
a61af66fc99e Initial load
duke
parents:
diff changeset
283 // Scavenge and allocate an instance.
a61af66fc99e Initial load
duke
parents:
diff changeset
284 oop result;
a61af66fc99e Initial load
duke
parents:
diff changeset
285
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6894
diff changeset
286 if (array_type->oop_is_typeArray()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
287 // The oopFactory likes to work with the element type.
a61af66fc99e Initial load
duke
parents:
diff changeset
288 // (We could bypass the oopFactory, since it doesn't add much value.)
6831
d8ce2825b193 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 6739
diff changeset
289 BasicType elem_type = TypeArrayKlass::cast(array_type)->element_type();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
290 result = oopFactory::new_typeArray(elem_type, len, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
291 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
292 // Although the oopFactory likes to work with the elem_type,
a61af66fc99e Initial load
duke
parents:
diff changeset
293 // the compiler prefers the array_type, since it must already have
a61af66fc99e Initial load
duke
parents:
diff changeset
294 // that latter value in hand for the fast path.
6831
d8ce2825b193 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 6739
diff changeset
295 Klass* elem_type = ObjArrayKlass::cast(array_type)->element_klass();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
296 result = oopFactory::new_objArray(elem_type, len, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
297 }
a61af66fc99e Initial load
duke
parents:
diff changeset
298
a61af66fc99e Initial load
duke
parents:
diff changeset
299 // Pass oops back through thread local storage. Our apparent type to Java
a61af66fc99e Initial load
duke
parents:
diff changeset
300 // is that we return an oop, but we can block on exit from this routine and
a61af66fc99e Initial load
duke
parents:
diff changeset
301 // a GC can trash the oop in C's return register. The generated stub will
a61af66fc99e Initial load
duke
parents:
diff changeset
302 // fetch the oop from TLS after any possible GC.
a61af66fc99e Initial load
duke
parents:
diff changeset
303 deoptimize_caller_frame(thread, HAS_PENDING_EXCEPTION);
a61af66fc99e Initial load
duke
parents:
diff changeset
304 thread->set_vm_result(result);
a61af66fc99e Initial load
duke
parents:
diff changeset
305 JRT_BLOCK_END;
a61af66fc99e Initial load
duke
parents:
diff changeset
306
a61af66fc99e Initial load
duke
parents:
diff changeset
307 if (GraphKit::use_ReduceInitialCardMarks()) {
1027
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 605
diff changeset
308 // 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
309 new_store_pre_barrier(thread);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
310 }
a61af66fc99e Initial load
duke
parents:
diff changeset
311 JRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
312
3961
a92cdbac8b9e 7081933: Use zeroing elimination optimization for large array
kvn
parents: 3899
diff changeset
313 // array allocation without zeroing
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6633
diff changeset
314 JRT_BLOCK_ENTRY(void, OptoRuntime::new_array_nozero_C(Klass* array_type, int len, JavaThread *thread))
3961
a92cdbac8b9e 7081933: Use zeroing elimination optimization for large array
kvn
parents: 3899
diff changeset
315 JRT_BLOCK;
a92cdbac8b9e 7081933: Use zeroing elimination optimization for large array
kvn
parents: 3899
diff changeset
316 #ifndef PRODUCT
a92cdbac8b9e 7081933: Use zeroing elimination optimization for large array
kvn
parents: 3899
diff changeset
317 SharedRuntime::_new_array_ctr++; // new array requires GC
a92cdbac8b9e 7081933: Use zeroing elimination optimization for large array
kvn
parents: 3899
diff changeset
318 #endif
a92cdbac8b9e 7081933: Use zeroing elimination optimization for large array
kvn
parents: 3899
diff changeset
319 assert(check_compiled_frame(thread), "incorrect caller");
a92cdbac8b9e 7081933: Use zeroing elimination optimization for large array
kvn
parents: 3899
diff changeset
320
a92cdbac8b9e 7081933: Use zeroing elimination optimization for large array
kvn
parents: 3899
diff changeset
321 // Scavenge and allocate an instance.
a92cdbac8b9e 7081933: Use zeroing elimination optimization for large array
kvn
parents: 3899
diff changeset
322 oop result;
a92cdbac8b9e 7081933: Use zeroing elimination optimization for large array
kvn
parents: 3899
diff changeset
323
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6894
diff changeset
324 assert(array_type->oop_is_typeArray(), "should be called only for type array");
3961
a92cdbac8b9e 7081933: Use zeroing elimination optimization for large array
kvn
parents: 3899
diff changeset
325 // The oopFactory likes to work with the element type.
6831
d8ce2825b193 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 6739
diff changeset
326 BasicType elem_type = TypeArrayKlass::cast(array_type)->element_type();
3961
a92cdbac8b9e 7081933: Use zeroing elimination optimization for large array
kvn
parents: 3899
diff changeset
327 result = oopFactory::new_typeArray_nozero(elem_type, len, THREAD);
a92cdbac8b9e 7081933: Use zeroing elimination optimization for large array
kvn
parents: 3899
diff changeset
328
a92cdbac8b9e 7081933: Use zeroing elimination optimization for large array
kvn
parents: 3899
diff changeset
329 // Pass oops back through thread local storage. Our apparent type to Java
a92cdbac8b9e 7081933: Use zeroing elimination optimization for large array
kvn
parents: 3899
diff changeset
330 // is that we return an oop, but we can block on exit from this routine and
a92cdbac8b9e 7081933: Use zeroing elimination optimization for large array
kvn
parents: 3899
diff changeset
331 // a GC can trash the oop in C's return register. The generated stub will
a92cdbac8b9e 7081933: Use zeroing elimination optimization for large array
kvn
parents: 3899
diff changeset
332 // fetch the oop from TLS after any possible GC.
a92cdbac8b9e 7081933: Use zeroing elimination optimization for large array
kvn
parents: 3899
diff changeset
333 deoptimize_caller_frame(thread, HAS_PENDING_EXCEPTION);
a92cdbac8b9e 7081933: Use zeroing elimination optimization for large array
kvn
parents: 3899
diff changeset
334 thread->set_vm_result(result);
a92cdbac8b9e 7081933: Use zeroing elimination optimization for large array
kvn
parents: 3899
diff changeset
335 JRT_BLOCK_END;
a92cdbac8b9e 7081933: Use zeroing elimination optimization for large array
kvn
parents: 3899
diff changeset
336
a92cdbac8b9e 7081933: Use zeroing elimination optimization for large array
kvn
parents: 3899
diff changeset
337 if (GraphKit::use_ReduceInitialCardMarks()) {
a92cdbac8b9e 7081933: Use zeroing elimination optimization for large array
kvn
parents: 3899
diff changeset
338 // inform GC that we won't do card marks for initializing writes.
a92cdbac8b9e 7081933: Use zeroing elimination optimization for large array
kvn
parents: 3899
diff changeset
339 new_store_pre_barrier(thread);
a92cdbac8b9e 7081933: Use zeroing elimination optimization for large array
kvn
parents: 3899
diff changeset
340 }
4063
7e0e43cf86d6 7109887: java/util/Arrays/CopyMethods.java fails with -XX:+DeoptimizeALot
kvn
parents: 4048
diff changeset
341
7e0e43cf86d6 7109887: java/util/Arrays/CopyMethods.java fails with -XX:+DeoptimizeALot
kvn
parents: 4048
diff changeset
342 oop result = thread->vm_result();
7e0e43cf86d6 7109887: java/util/Arrays/CopyMethods.java fails with -XX:+DeoptimizeALot
kvn
parents: 4048
diff changeset
343 if ((len > 0) && (result != NULL) &&
7e0e43cf86d6 7109887: java/util/Arrays/CopyMethods.java fails with -XX:+DeoptimizeALot
kvn
parents: 4048
diff changeset
344 is_deoptimized_caller_frame(thread)) {
7e0e43cf86d6 7109887: java/util/Arrays/CopyMethods.java fails with -XX:+DeoptimizeALot
kvn
parents: 4048
diff changeset
345 // Zero array here if the caller is deoptimized.
7e0e43cf86d6 7109887: java/util/Arrays/CopyMethods.java fails with -XX:+DeoptimizeALot
kvn
parents: 4048
diff changeset
346 int size = ((typeArrayOop)result)->object_size();
6831
d8ce2825b193 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 6739
diff changeset
347 BasicType elem_type = TypeArrayKlass::cast(array_type)->element_type();
4063
7e0e43cf86d6 7109887: java/util/Arrays/CopyMethods.java fails with -XX:+DeoptimizeALot
kvn
parents: 4048
diff changeset
348 const size_t hs = arrayOopDesc::header_size(elem_type);
7e0e43cf86d6 7109887: java/util/Arrays/CopyMethods.java fails with -XX:+DeoptimizeALot
kvn
parents: 4048
diff changeset
349 // Align to next 8 bytes to avoid trashing arrays's length.
7e0e43cf86d6 7109887: java/util/Arrays/CopyMethods.java fails with -XX:+DeoptimizeALot
kvn
parents: 4048
diff changeset
350 const size_t aligned_hs = align_object_offset(hs);
7e0e43cf86d6 7109887: java/util/Arrays/CopyMethods.java fails with -XX:+DeoptimizeALot
kvn
parents: 4048
diff changeset
351 HeapWord* obj = (HeapWord*)result;
7e0e43cf86d6 7109887: java/util/Arrays/CopyMethods.java fails with -XX:+DeoptimizeALot
kvn
parents: 4048
diff changeset
352 if (aligned_hs > hs) {
7e0e43cf86d6 7109887: java/util/Arrays/CopyMethods.java fails with -XX:+DeoptimizeALot
kvn
parents: 4048
diff changeset
353 Copy::zero_to_words(obj+hs, aligned_hs-hs);
7e0e43cf86d6 7109887: java/util/Arrays/CopyMethods.java fails with -XX:+DeoptimizeALot
kvn
parents: 4048
diff changeset
354 }
7e0e43cf86d6 7109887: java/util/Arrays/CopyMethods.java fails with -XX:+DeoptimizeALot
kvn
parents: 4048
diff changeset
355 // Optimized zeroing.
7e0e43cf86d6 7109887: java/util/Arrays/CopyMethods.java fails with -XX:+DeoptimizeALot
kvn
parents: 4048
diff changeset
356 Copy::fill_to_aligned_words(obj+aligned_hs, size-aligned_hs);
7e0e43cf86d6 7109887: java/util/Arrays/CopyMethods.java fails with -XX:+DeoptimizeALot
kvn
parents: 4048
diff changeset
357 }
7e0e43cf86d6 7109887: java/util/Arrays/CopyMethods.java fails with -XX:+DeoptimizeALot
kvn
parents: 4048
diff changeset
358
3961
a92cdbac8b9e 7081933: Use zeroing elimination optimization for large array
kvn
parents: 3899
diff changeset
359 JRT_END
a92cdbac8b9e 7081933: Use zeroing elimination optimization for large array
kvn
parents: 3899
diff changeset
360
0
a61af66fc99e Initial load
duke
parents:
diff changeset
361 // Note: multianewarray for one dimension is handled inline by GraphKit::new_array.
a61af66fc99e Initial load
duke
parents:
diff changeset
362
a61af66fc99e Initial load
duke
parents:
diff changeset
363 // multianewarray for 2 dimensions
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6633
diff changeset
364 JRT_ENTRY(void, OptoRuntime::multianewarray2_C(Klass* elem_type, int len1, int len2, JavaThread *thread))
0
a61af66fc99e Initial load
duke
parents:
diff changeset
365 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
366 SharedRuntime::_multi2_ctr++; // multianewarray for 1 dimension
a61af66fc99e Initial load
duke
parents:
diff changeset
367 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
368 assert(check_compiled_frame(thread), "incorrect caller");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6633
diff changeset
369 assert(elem_type->is_klass(), "not a class");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
370 jint dims[2];
a61af66fc99e Initial load
duke
parents:
diff changeset
371 dims[0] = len1;
a61af66fc99e Initial load
duke
parents:
diff changeset
372 dims[1] = len2;
6831
d8ce2825b193 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 6739
diff changeset
373 oop obj = ArrayKlass::cast(elem_type)->multi_allocate(2, dims, THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
374 deoptimize_caller_frame(thread, HAS_PENDING_EXCEPTION);
a61af66fc99e Initial load
duke
parents:
diff changeset
375 thread->set_vm_result(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
376 JRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
377
a61af66fc99e Initial load
duke
parents:
diff changeset
378 // multianewarray for 3 dimensions
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6633
diff changeset
379 JRT_ENTRY(void, OptoRuntime::multianewarray3_C(Klass* elem_type, int len1, int len2, int len3, JavaThread *thread))
0
a61af66fc99e Initial load
duke
parents:
diff changeset
380 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
381 SharedRuntime::_multi3_ctr++; // multianewarray for 1 dimension
a61af66fc99e Initial load
duke
parents:
diff changeset
382 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
383 assert(check_compiled_frame(thread), "incorrect caller");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6633
diff changeset
384 assert(elem_type->is_klass(), "not a class");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
385 jint dims[3];
a61af66fc99e Initial load
duke
parents:
diff changeset
386 dims[0] = len1;
a61af66fc99e Initial load
duke
parents:
diff changeset
387 dims[1] = len2;
a61af66fc99e Initial load
duke
parents:
diff changeset
388 dims[2] = len3;
6831
d8ce2825b193 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 6739
diff changeset
389 oop obj = ArrayKlass::cast(elem_type)->multi_allocate(3, dims, THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
390 deoptimize_caller_frame(thread, HAS_PENDING_EXCEPTION);
a61af66fc99e Initial load
duke
parents:
diff changeset
391 thread->set_vm_result(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
392 JRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
393
a61af66fc99e Initial load
duke
parents:
diff changeset
394 // multianewarray for 4 dimensions
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6633
diff changeset
395 JRT_ENTRY(void, OptoRuntime::multianewarray4_C(Klass* elem_type, int len1, int len2, int len3, int len4, JavaThread *thread))
0
a61af66fc99e Initial load
duke
parents:
diff changeset
396 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
397 SharedRuntime::_multi4_ctr++; // multianewarray for 1 dimension
a61af66fc99e Initial load
duke
parents:
diff changeset
398 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
399 assert(check_compiled_frame(thread), "incorrect caller");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6633
diff changeset
400 assert(elem_type->is_klass(), "not a class");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
401 jint dims[4];
a61af66fc99e Initial load
duke
parents:
diff changeset
402 dims[0] = len1;
a61af66fc99e Initial load
duke
parents:
diff changeset
403 dims[1] = len2;
a61af66fc99e Initial load
duke
parents:
diff changeset
404 dims[2] = len3;
a61af66fc99e Initial load
duke
parents:
diff changeset
405 dims[3] = len4;
6831
d8ce2825b193 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 6739
diff changeset
406 oop obj = ArrayKlass::cast(elem_type)->multi_allocate(4, dims, THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
407 deoptimize_caller_frame(thread, HAS_PENDING_EXCEPTION);
a61af66fc99e Initial load
duke
parents:
diff changeset
408 thread->set_vm_result(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
409 JRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
410
a61af66fc99e Initial load
duke
parents:
diff changeset
411 // multianewarray for 5 dimensions
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6633
diff changeset
412 JRT_ENTRY(void, OptoRuntime::multianewarray5_C(Klass* elem_type, int len1, int len2, int len3, int len4, int len5, JavaThread *thread))
0
a61af66fc99e Initial load
duke
parents:
diff changeset
413 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
414 SharedRuntime::_multi5_ctr++; // multianewarray for 1 dimension
a61af66fc99e Initial load
duke
parents:
diff changeset
415 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
416 assert(check_compiled_frame(thread), "incorrect caller");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6633
diff changeset
417 assert(elem_type->is_klass(), "not a class");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
418 jint dims[5];
a61af66fc99e Initial load
duke
parents:
diff changeset
419 dims[0] = len1;
a61af66fc99e Initial load
duke
parents:
diff changeset
420 dims[1] = len2;
a61af66fc99e Initial load
duke
parents:
diff changeset
421 dims[2] = len3;
a61af66fc99e Initial load
duke
parents:
diff changeset
422 dims[3] = len4;
a61af66fc99e Initial load
duke
parents:
diff changeset
423 dims[4] = len5;
6831
d8ce2825b193 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 6739
diff changeset
424 oop obj = ArrayKlass::cast(elem_type)->multi_allocate(5, dims, THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
425 deoptimize_caller_frame(thread, HAS_PENDING_EXCEPTION);
a61af66fc99e Initial load
duke
parents:
diff changeset
426 thread->set_vm_result(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
427 JRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
428
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6633
diff changeset
429 JRT_ENTRY(void, OptoRuntime::multianewarrayN_C(Klass* elem_type, arrayOopDesc* dims, JavaThread *thread))
3805
263247c478c5 7058510: multinewarray with 6 dimensions uncommon traps in server compiler
iveresov
parents: 3442
diff changeset
430 assert(check_compiled_frame(thread), "incorrect caller");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6633
diff changeset
431 assert(elem_type->is_klass(), "not a class");
3805
263247c478c5 7058510: multinewarray with 6 dimensions uncommon traps in server compiler
iveresov
parents: 3442
diff changeset
432 assert(oop(dims)->is_typeArray(), "not an array");
263247c478c5 7058510: multinewarray with 6 dimensions uncommon traps in server compiler
iveresov
parents: 3442
diff changeset
433
263247c478c5 7058510: multinewarray with 6 dimensions uncommon traps in server compiler
iveresov
parents: 3442
diff changeset
434 ResourceMark rm;
263247c478c5 7058510: multinewarray with 6 dimensions uncommon traps in server compiler
iveresov
parents: 3442
diff changeset
435 jint len = dims->length();
263247c478c5 7058510: multinewarray with 6 dimensions uncommon traps in server compiler
iveresov
parents: 3442
diff changeset
436 assert(len > 0, "Dimensions array should contain data");
263247c478c5 7058510: multinewarray with 6 dimensions uncommon traps in server compiler
iveresov
parents: 3442
diff changeset
437 jint *j_dims = typeArrayOop(dims)->int_at_addr(0);
263247c478c5 7058510: multinewarray with 6 dimensions uncommon traps in server compiler
iveresov
parents: 3442
diff changeset
438 jint *c_dims = NEW_RESOURCE_ARRAY(jint, len);
263247c478c5 7058510: multinewarray with 6 dimensions uncommon traps in server compiler
iveresov
parents: 3442
diff changeset
439 Copy::conjoint_jints_atomic(j_dims, c_dims, len);
263247c478c5 7058510: multinewarray with 6 dimensions uncommon traps in server compiler
iveresov
parents: 3442
diff changeset
440
6831
d8ce2825b193 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 6739
diff changeset
441 oop obj = ArrayKlass::cast(elem_type)->multi_allocate(len, c_dims, THREAD);
3805
263247c478c5 7058510: multinewarray with 6 dimensions uncommon traps in server compiler
iveresov
parents: 3442
diff changeset
442 deoptimize_caller_frame(thread, HAS_PENDING_EXCEPTION);
263247c478c5 7058510: multinewarray with 6 dimensions uncommon traps in server compiler
iveresov
parents: 3442
diff changeset
443 thread->set_vm_result(obj);
263247c478c5 7058510: multinewarray with 6 dimensions uncommon traps in server compiler
iveresov
parents: 3442
diff changeset
444 JRT_END
263247c478c5 7058510: multinewarray with 6 dimensions uncommon traps in server compiler
iveresov
parents: 3442
diff changeset
445
263247c478c5 7058510: multinewarray with 6 dimensions uncommon traps in server compiler
iveresov
parents: 3442
diff changeset
446
0
a61af66fc99e Initial load
duke
parents:
diff changeset
447 const TypeFunc *OptoRuntime::new_instance_Type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
448 // create input type (domain)
a61af66fc99e Initial load
duke
parents:
diff changeset
449 const Type **fields = TypeTuple::fields(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
450 fields[TypeFunc::Parms+0] = TypeInstPtr::NOTNULL; // Klass to be allocated
a61af66fc99e Initial load
duke
parents:
diff changeset
451 const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+1, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
452
a61af66fc99e Initial load
duke
parents:
diff changeset
453 // create result type (range)
a61af66fc99e Initial load
duke
parents:
diff changeset
454 fields = TypeTuple::fields(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
455 fields[TypeFunc::Parms+0] = TypeRawPtr::NOTNULL; // Returned oop
a61af66fc99e Initial load
duke
parents:
diff changeset
456
a61af66fc99e Initial load
duke
parents:
diff changeset
457 const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+1, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
458
a61af66fc99e Initial load
duke
parents:
diff changeset
459 return TypeFunc::make(domain, range);
a61af66fc99e Initial load
duke
parents:
diff changeset
460 }
a61af66fc99e Initial load
duke
parents:
diff changeset
461
a61af66fc99e Initial load
duke
parents:
diff changeset
462
a61af66fc99e Initial load
duke
parents:
diff changeset
463 const TypeFunc *OptoRuntime::athrow_Type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
464 // create input type (domain)
a61af66fc99e Initial load
duke
parents:
diff changeset
465 const Type **fields = TypeTuple::fields(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
466 fields[TypeFunc::Parms+0] = TypeInstPtr::NOTNULL; // Klass to be allocated
a61af66fc99e Initial load
duke
parents:
diff changeset
467 const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+1, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
468
a61af66fc99e Initial load
duke
parents:
diff changeset
469 // create result type (range)
a61af66fc99e Initial load
duke
parents:
diff changeset
470 fields = TypeTuple::fields(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
471
a61af66fc99e Initial load
duke
parents:
diff changeset
472 const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+0, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
473
a61af66fc99e Initial load
duke
parents:
diff changeset
474 return TypeFunc::make(domain, range);
a61af66fc99e Initial load
duke
parents:
diff changeset
475 }
a61af66fc99e Initial load
duke
parents:
diff changeset
476
a61af66fc99e Initial load
duke
parents:
diff changeset
477
a61af66fc99e Initial load
duke
parents:
diff changeset
478 const TypeFunc *OptoRuntime::new_array_Type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
479 // create input type (domain)
a61af66fc99e Initial load
duke
parents:
diff changeset
480 const Type **fields = TypeTuple::fields(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
481 fields[TypeFunc::Parms+0] = TypeInstPtr::NOTNULL; // element klass
a61af66fc99e Initial load
duke
parents:
diff changeset
482 fields[TypeFunc::Parms+1] = TypeInt::INT; // array size
a61af66fc99e Initial load
duke
parents:
diff changeset
483 const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+2, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
484
a61af66fc99e Initial load
duke
parents:
diff changeset
485 // create result type (range)
a61af66fc99e Initial load
duke
parents:
diff changeset
486 fields = TypeTuple::fields(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
487 fields[TypeFunc::Parms+0] = TypeRawPtr::NOTNULL; // Returned oop
a61af66fc99e Initial load
duke
parents:
diff changeset
488
a61af66fc99e Initial load
duke
parents:
diff changeset
489 const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+1, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
490
a61af66fc99e Initial load
duke
parents:
diff changeset
491 return TypeFunc::make(domain, range);
a61af66fc99e Initial load
duke
parents:
diff changeset
492 }
a61af66fc99e Initial load
duke
parents:
diff changeset
493
a61af66fc99e Initial load
duke
parents:
diff changeset
494 const TypeFunc *OptoRuntime::multianewarray_Type(int ndim) {
a61af66fc99e Initial load
duke
parents:
diff changeset
495 // create input type (domain)
a61af66fc99e Initial load
duke
parents:
diff changeset
496 const int nargs = ndim + 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
497 const Type **fields = TypeTuple::fields(nargs);
a61af66fc99e Initial load
duke
parents:
diff changeset
498 fields[TypeFunc::Parms+0] = TypeInstPtr::NOTNULL; // element klass
a61af66fc99e Initial load
duke
parents:
diff changeset
499 for( int i = 1; i < nargs; i++ )
a61af66fc99e Initial load
duke
parents:
diff changeset
500 fields[TypeFunc::Parms + i] = TypeInt::INT; // array size
a61af66fc99e Initial load
duke
parents:
diff changeset
501 const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+nargs, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
502
a61af66fc99e Initial load
duke
parents:
diff changeset
503 // create result type (range)
a61af66fc99e Initial load
duke
parents:
diff changeset
504 fields = TypeTuple::fields(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
505 fields[TypeFunc::Parms+0] = TypeRawPtr::NOTNULL; // Returned oop
a61af66fc99e Initial load
duke
parents:
diff changeset
506 const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+1, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
507
a61af66fc99e Initial load
duke
parents:
diff changeset
508 return TypeFunc::make(domain, range);
a61af66fc99e Initial load
duke
parents:
diff changeset
509 }
a61af66fc99e Initial load
duke
parents:
diff changeset
510
a61af66fc99e Initial load
duke
parents:
diff changeset
511 const TypeFunc *OptoRuntime::multianewarray2_Type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
512 return multianewarray_Type(2);
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::multianewarray3_Type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
516 return multianewarray_Type(3);
a61af66fc99e Initial load
duke
parents:
diff changeset
517 }
a61af66fc99e Initial load
duke
parents:
diff changeset
518
a61af66fc99e Initial load
duke
parents:
diff changeset
519 const TypeFunc *OptoRuntime::multianewarray4_Type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
520 return multianewarray_Type(4);
a61af66fc99e Initial load
duke
parents:
diff changeset
521 }
a61af66fc99e Initial load
duke
parents:
diff changeset
522
a61af66fc99e Initial load
duke
parents:
diff changeset
523 const TypeFunc *OptoRuntime::multianewarray5_Type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
524 return multianewarray_Type(5);
a61af66fc99e Initial load
duke
parents:
diff changeset
525 }
a61af66fc99e Initial load
duke
parents:
diff changeset
526
3805
263247c478c5 7058510: multinewarray with 6 dimensions uncommon traps in server compiler
iveresov
parents: 3442
diff changeset
527 const TypeFunc *OptoRuntime::multianewarrayN_Type() {
263247c478c5 7058510: multinewarray with 6 dimensions uncommon traps in server compiler
iveresov
parents: 3442
diff changeset
528 // create input type (domain)
263247c478c5 7058510: multinewarray with 6 dimensions uncommon traps in server compiler
iveresov
parents: 3442
diff changeset
529 const Type **fields = TypeTuple::fields(2);
263247c478c5 7058510: multinewarray with 6 dimensions uncommon traps in server compiler
iveresov
parents: 3442
diff changeset
530 fields[TypeFunc::Parms+0] = TypeInstPtr::NOTNULL; // element klass
263247c478c5 7058510: multinewarray with 6 dimensions uncommon traps in server compiler
iveresov
parents: 3442
diff changeset
531 fields[TypeFunc::Parms+1] = TypeInstPtr::NOTNULL; // array of dim sizes
263247c478c5 7058510: multinewarray with 6 dimensions uncommon traps in server compiler
iveresov
parents: 3442
diff changeset
532 const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+2, fields);
263247c478c5 7058510: multinewarray with 6 dimensions uncommon traps in server compiler
iveresov
parents: 3442
diff changeset
533
263247c478c5 7058510: multinewarray with 6 dimensions uncommon traps in server compiler
iveresov
parents: 3442
diff changeset
534 // create result type (range)
263247c478c5 7058510: multinewarray with 6 dimensions uncommon traps in server compiler
iveresov
parents: 3442
diff changeset
535 fields = TypeTuple::fields(1);
263247c478c5 7058510: multinewarray with 6 dimensions uncommon traps in server compiler
iveresov
parents: 3442
diff changeset
536 fields[TypeFunc::Parms+0] = TypeRawPtr::NOTNULL; // Returned oop
263247c478c5 7058510: multinewarray with 6 dimensions uncommon traps in server compiler
iveresov
parents: 3442
diff changeset
537 const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+1, fields);
263247c478c5 7058510: multinewarray with 6 dimensions uncommon traps in server compiler
iveresov
parents: 3442
diff changeset
538
263247c478c5 7058510: multinewarray with 6 dimensions uncommon traps in server compiler
iveresov
parents: 3442
diff changeset
539 return TypeFunc::make(domain, range);
263247c478c5 7058510: multinewarray with 6 dimensions uncommon traps in server compiler
iveresov
parents: 3442
diff changeset
540 }
263247c478c5 7058510: multinewarray with 6 dimensions uncommon traps in server compiler
iveresov
parents: 3442
diff changeset
541
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
542 const TypeFunc *OptoRuntime::g1_wb_pre_Type() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
543 const Type **fields = TypeTuple::fields(2);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
544 fields[TypeFunc::Parms+0] = TypeInstPtr::NOTNULL; // original field value
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
545 fields[TypeFunc::Parms+1] = TypeRawPtr::NOTNULL; // thread
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
546 const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+2, fields);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
547
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
548 // create result type (range)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
549 fields = TypeTuple::fields(0);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
550 const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+0, fields);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
551
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
552 return TypeFunc::make(domain, range);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
553 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
554
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
555 const TypeFunc *OptoRuntime::g1_wb_post_Type() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
556
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
557 const Type **fields = TypeTuple::fields(2);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
558 fields[TypeFunc::Parms+0] = TypeRawPtr::NOTNULL; // Card addr
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
559 fields[TypeFunc::Parms+1] = TypeRawPtr::NOTNULL; // thread
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
560 const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+2, fields);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
561
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
562 // create result type (range)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
563 fields = TypeTuple::fields(0);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
564 const TypeTuple *range = TypeTuple::make(TypeFunc::Parms, fields);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
565
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
566 return TypeFunc::make(domain, range);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
567 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
568
0
a61af66fc99e Initial load
duke
parents:
diff changeset
569 const TypeFunc *OptoRuntime::uncommon_trap_Type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
570 // create input type (domain)
a61af66fc99e Initial load
duke
parents:
diff changeset
571 const Type **fields = TypeTuple::fields(1);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
572 // Symbol* name of class to be loaded
0
a61af66fc99e Initial load
duke
parents:
diff changeset
573 fields[TypeFunc::Parms+0] = TypeInt::INT;
a61af66fc99e Initial load
duke
parents:
diff changeset
574 const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+1, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
575
a61af66fc99e Initial load
duke
parents:
diff changeset
576 // create result type (range)
a61af66fc99e Initial load
duke
parents:
diff changeset
577 fields = TypeTuple::fields(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
578 const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+0, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
579
a61af66fc99e Initial load
duke
parents:
diff changeset
580 return TypeFunc::make(domain, range);
a61af66fc99e Initial load
duke
parents:
diff changeset
581 }
a61af66fc99e Initial load
duke
parents:
diff changeset
582
a61af66fc99e Initial load
duke
parents:
diff changeset
583 # ifdef ENABLE_ZAP_DEAD_LOCALS
a61af66fc99e Initial load
duke
parents:
diff changeset
584 // Type used for stub generation for zap_dead_locals.
a61af66fc99e Initial load
duke
parents:
diff changeset
585 // No inputs or outputs
a61af66fc99e Initial load
duke
parents:
diff changeset
586 const TypeFunc *OptoRuntime::zap_dead_locals_Type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
587 // create input type (domain)
a61af66fc99e Initial load
duke
parents:
diff changeset
588 const Type **fields = TypeTuple::fields(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
589 const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms,fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
590
a61af66fc99e Initial load
duke
parents:
diff changeset
591 // create result type (range)
a61af66fc99e Initial load
duke
parents:
diff changeset
592 fields = TypeTuple::fields(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
593 const TypeTuple *range = TypeTuple::make(TypeFunc::Parms,fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
594
a61af66fc99e Initial load
duke
parents:
diff changeset
595 return TypeFunc::make(domain,range);
a61af66fc99e Initial load
duke
parents:
diff changeset
596 }
a61af66fc99e Initial load
duke
parents:
diff changeset
597 # endif
a61af66fc99e Initial load
duke
parents:
diff changeset
598
a61af66fc99e Initial load
duke
parents:
diff changeset
599
a61af66fc99e Initial load
duke
parents:
diff changeset
600 //-----------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
601 // Monitor Handling
a61af66fc99e Initial load
duke
parents:
diff changeset
602 const TypeFunc *OptoRuntime::complete_monitor_enter_Type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
603 // create input type (domain)
a61af66fc99e Initial load
duke
parents:
diff changeset
604 const Type **fields = TypeTuple::fields(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
605 fields[TypeFunc::Parms+0] = TypeInstPtr::NOTNULL; // Object to be Locked
a61af66fc99e Initial load
duke
parents:
diff changeset
606 fields[TypeFunc::Parms+1] = TypeRawPtr::BOTTOM; // Address of stack location for lock
a61af66fc99e Initial load
duke
parents:
diff changeset
607 const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+2,fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
608
a61af66fc99e Initial load
duke
parents:
diff changeset
609 // create result type (range)
a61af66fc99e Initial load
duke
parents:
diff changeset
610 fields = TypeTuple::fields(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
611
a61af66fc99e Initial load
duke
parents:
diff changeset
612 const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+0,fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
613
a61af66fc99e Initial load
duke
parents:
diff changeset
614 return TypeFunc::make(domain,range);
a61af66fc99e Initial load
duke
parents:
diff changeset
615 }
a61af66fc99e Initial load
duke
parents:
diff changeset
616
a61af66fc99e Initial load
duke
parents:
diff changeset
617
a61af66fc99e Initial load
duke
parents:
diff changeset
618 //-----------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
619 const TypeFunc *OptoRuntime::complete_monitor_exit_Type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
620 // create input type (domain)
a61af66fc99e Initial load
duke
parents:
diff changeset
621 const Type **fields = TypeTuple::fields(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
622 fields[TypeFunc::Parms+0] = TypeInstPtr::NOTNULL; // Object to be Locked
a61af66fc99e Initial load
duke
parents:
diff changeset
623 fields[TypeFunc::Parms+1] = TypeRawPtr::BOTTOM; // Address of stack location for lock
a61af66fc99e Initial load
duke
parents:
diff changeset
624 const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+2,fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
625
a61af66fc99e Initial load
duke
parents:
diff changeset
626 // create result type (range)
a61af66fc99e Initial load
duke
parents:
diff changeset
627 fields = TypeTuple::fields(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
628
a61af66fc99e Initial load
duke
parents:
diff changeset
629 const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+0,fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
630
a61af66fc99e Initial load
duke
parents:
diff changeset
631 return TypeFunc::make(domain,range);
a61af66fc99e Initial load
duke
parents:
diff changeset
632 }
a61af66fc99e Initial load
duke
parents:
diff changeset
633
a61af66fc99e Initial load
duke
parents:
diff changeset
634 const TypeFunc* OptoRuntime::flush_windows_Type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
635 // create input type (domain)
a61af66fc99e Initial load
duke
parents:
diff changeset
636 const Type** fields = TypeTuple::fields(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
637 fields[TypeFunc::Parms+0] = NULL; // void
a61af66fc99e Initial load
duke
parents:
diff changeset
638 const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
639
a61af66fc99e Initial load
duke
parents:
diff changeset
640 // create result type
a61af66fc99e Initial load
duke
parents:
diff changeset
641 fields = TypeTuple::fields(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
642 fields[TypeFunc::Parms+0] = NULL; // void
a61af66fc99e Initial load
duke
parents:
diff changeset
643 const TypeTuple *range = TypeTuple::make(TypeFunc::Parms, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
644
a61af66fc99e Initial load
duke
parents:
diff changeset
645 return TypeFunc::make(domain, range);
a61af66fc99e Initial load
duke
parents:
diff changeset
646 }
a61af66fc99e Initial load
duke
parents:
diff changeset
647
a61af66fc99e Initial load
duke
parents:
diff changeset
648 const TypeFunc* OptoRuntime::l2f_Type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
649 // create input type (domain)
a61af66fc99e Initial load
duke
parents:
diff changeset
650 const Type **fields = TypeTuple::fields(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
651 fields[TypeFunc::Parms+0] = TypeLong::LONG;
a61af66fc99e Initial load
duke
parents:
diff changeset
652 fields[TypeFunc::Parms+1] = Type::HALF;
a61af66fc99e Initial load
duke
parents:
diff changeset
653 const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+2, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
654
a61af66fc99e Initial load
duke
parents:
diff changeset
655 // create result type (range)
a61af66fc99e Initial load
duke
parents:
diff changeset
656 fields = TypeTuple::fields(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
657 fields[TypeFunc::Parms+0] = Type::FLOAT;
a61af66fc99e Initial load
duke
parents:
diff changeset
658 const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+1, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
659
a61af66fc99e Initial load
duke
parents:
diff changeset
660 return TypeFunc::make(domain, range);
a61af66fc99e Initial load
duke
parents:
diff changeset
661 }
a61af66fc99e Initial load
duke
parents:
diff changeset
662
a61af66fc99e Initial load
duke
parents:
diff changeset
663 const TypeFunc* OptoRuntime::modf_Type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
664 const Type **fields = TypeTuple::fields(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
665 fields[TypeFunc::Parms+0] = Type::FLOAT;
a61af66fc99e Initial load
duke
parents:
diff changeset
666 fields[TypeFunc::Parms+1] = Type::FLOAT;
a61af66fc99e Initial load
duke
parents:
diff changeset
667 const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+2, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
668
a61af66fc99e Initial load
duke
parents:
diff changeset
669 // create result type (range)
a61af66fc99e Initial load
duke
parents:
diff changeset
670 fields = TypeTuple::fields(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
671 fields[TypeFunc::Parms+0] = Type::FLOAT;
a61af66fc99e Initial load
duke
parents:
diff changeset
672
a61af66fc99e Initial load
duke
parents:
diff changeset
673 const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+1, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
674
a61af66fc99e Initial load
duke
parents:
diff changeset
675 return TypeFunc::make(domain, range);
a61af66fc99e Initial load
duke
parents:
diff changeset
676 }
a61af66fc99e Initial load
duke
parents:
diff changeset
677
a61af66fc99e Initial load
duke
parents:
diff changeset
678 const TypeFunc *OptoRuntime::Math_D_D_Type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
679 // create input type (domain)
a61af66fc99e Initial load
duke
parents:
diff changeset
680 const Type **fields = TypeTuple::fields(2);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
681 // Symbol* name of class to be loaded
0
a61af66fc99e Initial load
duke
parents:
diff changeset
682 fields[TypeFunc::Parms+0] = Type::DOUBLE;
a61af66fc99e Initial load
duke
parents:
diff changeset
683 fields[TypeFunc::Parms+1] = Type::HALF;
a61af66fc99e Initial load
duke
parents:
diff changeset
684 const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+2, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
685
a61af66fc99e Initial load
duke
parents:
diff changeset
686 // create result type (range)
a61af66fc99e Initial load
duke
parents:
diff changeset
687 fields = TypeTuple::fields(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
688 fields[TypeFunc::Parms+0] = Type::DOUBLE;
a61af66fc99e Initial load
duke
parents:
diff changeset
689 fields[TypeFunc::Parms+1] = Type::HALF;
a61af66fc99e Initial load
duke
parents:
diff changeset
690 const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+2, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
691
a61af66fc99e Initial load
duke
parents:
diff changeset
692 return TypeFunc::make(domain, range);
a61af66fc99e Initial load
duke
parents:
diff changeset
693 }
a61af66fc99e Initial load
duke
parents:
diff changeset
694
a61af66fc99e Initial load
duke
parents:
diff changeset
695 const TypeFunc* OptoRuntime::Math_DD_D_Type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
696 const Type **fields = TypeTuple::fields(4);
a61af66fc99e Initial load
duke
parents:
diff changeset
697 fields[TypeFunc::Parms+0] = Type::DOUBLE;
a61af66fc99e Initial load
duke
parents:
diff changeset
698 fields[TypeFunc::Parms+1] = Type::HALF;
a61af66fc99e Initial load
duke
parents:
diff changeset
699 fields[TypeFunc::Parms+2] = Type::DOUBLE;
a61af66fc99e Initial load
duke
parents:
diff changeset
700 fields[TypeFunc::Parms+3] = Type::HALF;
a61af66fc99e Initial load
duke
parents:
diff changeset
701 const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+4, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
702
a61af66fc99e Initial load
duke
parents:
diff changeset
703 // create result type (range)
a61af66fc99e Initial load
duke
parents:
diff changeset
704 fields = TypeTuple::fields(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
705 fields[TypeFunc::Parms+0] = Type::DOUBLE;
a61af66fc99e Initial load
duke
parents:
diff changeset
706 fields[TypeFunc::Parms+1] = Type::HALF;
a61af66fc99e Initial load
duke
parents:
diff changeset
707 const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+2, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
708
a61af66fc99e Initial load
duke
parents:
diff changeset
709 return TypeFunc::make(domain, range);
a61af66fc99e Initial load
duke
parents:
diff changeset
710 }
a61af66fc99e Initial load
duke
parents:
diff changeset
711
6006
0105f367a14c 7160570: Intrinsification support for tracing framework
rbackman
parents: 4063
diff changeset
712 //-------------- currentTimeMillis, currentTimeNanos, etc
0
a61af66fc99e Initial load
duke
parents:
diff changeset
713
6006
0105f367a14c 7160570: Intrinsification support for tracing framework
rbackman
parents: 4063
diff changeset
714 const TypeFunc* OptoRuntime::void_long_Type() {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
715 // create input type (domain)
a61af66fc99e Initial load
duke
parents:
diff changeset
716 const Type **fields = TypeTuple::fields(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
717 const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+0, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
718
a61af66fc99e Initial load
duke
parents:
diff changeset
719 // create result type (range)
a61af66fc99e Initial load
duke
parents:
diff changeset
720 fields = TypeTuple::fields(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
721 fields[TypeFunc::Parms+0] = TypeLong::LONG;
a61af66fc99e Initial load
duke
parents:
diff changeset
722 fields[TypeFunc::Parms+1] = Type::HALF;
a61af66fc99e Initial load
duke
parents:
diff changeset
723 const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+2, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
724
a61af66fc99e Initial load
duke
parents:
diff changeset
725 return TypeFunc::make(domain, range);
a61af66fc99e Initial load
duke
parents:
diff changeset
726 }
a61af66fc99e Initial load
duke
parents:
diff changeset
727
a61af66fc99e Initial load
duke
parents:
diff changeset
728 // arraycopy stub variations:
a61af66fc99e Initial load
duke
parents:
diff changeset
729 enum ArrayCopyType {
a61af66fc99e Initial load
duke
parents:
diff changeset
730 ac_fast, // void(ptr, ptr, size_t)
a61af66fc99e Initial load
duke
parents:
diff changeset
731 ac_checkcast, // int(ptr, ptr, size_t, size_t, ptr)
a61af66fc99e Initial load
duke
parents:
diff changeset
732 ac_slow, // void(ptr, int, ptr, int, int)
a61af66fc99e Initial load
duke
parents:
diff changeset
733 ac_generic // int(ptr, int, ptr, int, int)
a61af66fc99e Initial load
duke
parents:
diff changeset
734 };
a61af66fc99e Initial load
duke
parents:
diff changeset
735
a61af66fc99e Initial load
duke
parents:
diff changeset
736 static const TypeFunc* make_arraycopy_Type(ArrayCopyType act) {
a61af66fc99e Initial load
duke
parents:
diff changeset
737 // create input type (domain)
a61af66fc99e Initial load
duke
parents:
diff changeset
738 int num_args = (act == ac_fast ? 3 : 5);
a61af66fc99e Initial load
duke
parents:
diff changeset
739 int num_size_args = (act == ac_fast ? 1 : act == ac_checkcast ? 2 : 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
740 int argcnt = num_args;
a61af66fc99e Initial load
duke
parents:
diff changeset
741 LP64_ONLY(argcnt += num_size_args); // halfwords for lengths
a61af66fc99e Initial load
duke
parents:
diff changeset
742 const Type** fields = TypeTuple::fields(argcnt);
a61af66fc99e Initial load
duke
parents:
diff changeset
743 int argp = TypeFunc::Parms;
a61af66fc99e Initial load
duke
parents:
diff changeset
744 fields[argp++] = TypePtr::NOTNULL; // src
a61af66fc99e Initial load
duke
parents:
diff changeset
745 if (num_size_args == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
746 fields[argp++] = TypeInt::INT; // src_pos
a61af66fc99e Initial load
duke
parents:
diff changeset
747 }
a61af66fc99e Initial load
duke
parents:
diff changeset
748 fields[argp++] = TypePtr::NOTNULL; // dest
a61af66fc99e Initial load
duke
parents:
diff changeset
749 if (num_size_args == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
750 fields[argp++] = TypeInt::INT; // dest_pos
a61af66fc99e Initial load
duke
parents:
diff changeset
751 fields[argp++] = TypeInt::INT; // length
a61af66fc99e Initial load
duke
parents:
diff changeset
752 }
a61af66fc99e Initial load
duke
parents:
diff changeset
753 while (num_size_args-- > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
754 fields[argp++] = TypeX_X; // size in whatevers (size_t)
a61af66fc99e Initial load
duke
parents:
diff changeset
755 LP64_ONLY(fields[argp++] = Type::HALF); // other half of long length
a61af66fc99e Initial load
duke
parents:
diff changeset
756 }
a61af66fc99e Initial load
duke
parents:
diff changeset
757 if (act == ac_checkcast) {
a61af66fc99e Initial load
duke
parents:
diff changeset
758 fields[argp++] = TypePtr::NOTNULL; // super_klass
a61af66fc99e Initial load
duke
parents:
diff changeset
759 }
a61af66fc99e Initial load
duke
parents:
diff changeset
760 assert(argp == TypeFunc::Parms+argcnt, "correct decoding of act");
a61af66fc99e Initial load
duke
parents:
diff changeset
761 const TypeTuple* domain = TypeTuple::make(TypeFunc::Parms+argcnt, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
762
a61af66fc99e Initial load
duke
parents:
diff changeset
763 // create result type if needed
a61af66fc99e Initial load
duke
parents:
diff changeset
764 int retcnt = (act == ac_checkcast || act == ac_generic ? 1 : 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
765 fields = TypeTuple::fields(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
766 if (retcnt == 0)
a61af66fc99e Initial load
duke
parents:
diff changeset
767 fields[TypeFunc::Parms+0] = NULL; // void
a61af66fc99e Initial load
duke
parents:
diff changeset
768 else
a61af66fc99e Initial load
duke
parents:
diff changeset
769 fields[TypeFunc::Parms+0] = TypeInt::INT; // status result, if needed
a61af66fc99e Initial load
duke
parents:
diff changeset
770 const TypeTuple* range = TypeTuple::make(TypeFunc::Parms+retcnt, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
771 return TypeFunc::make(domain, range);
a61af66fc99e Initial load
duke
parents:
diff changeset
772 }
a61af66fc99e Initial load
duke
parents:
diff changeset
773
a61af66fc99e Initial load
duke
parents:
diff changeset
774 const TypeFunc* OptoRuntime::fast_arraycopy_Type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
775 // This signature is simple: Two base pointers and a size_t.
a61af66fc99e Initial load
duke
parents:
diff changeset
776 return make_arraycopy_Type(ac_fast);
a61af66fc99e Initial load
duke
parents:
diff changeset
777 }
a61af66fc99e Initial load
duke
parents:
diff changeset
778
a61af66fc99e Initial load
duke
parents:
diff changeset
779 const TypeFunc* OptoRuntime::checkcast_arraycopy_Type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
780 // An extension of fast_arraycopy_Type which adds type checking.
a61af66fc99e Initial load
duke
parents:
diff changeset
781 return make_arraycopy_Type(ac_checkcast);
a61af66fc99e Initial load
duke
parents:
diff changeset
782 }
a61af66fc99e Initial load
duke
parents:
diff changeset
783
a61af66fc99e Initial load
duke
parents:
diff changeset
784 const TypeFunc* OptoRuntime::slow_arraycopy_Type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
785 // This signature is exactly the same as System.arraycopy.
a61af66fc99e Initial load
duke
parents:
diff changeset
786 // There are no intptr_t (int/long) arguments.
a61af66fc99e Initial load
duke
parents:
diff changeset
787 return make_arraycopy_Type(ac_slow);
a61af66fc99e Initial load
duke
parents:
diff changeset
788 }
a61af66fc99e Initial load
duke
parents:
diff changeset
789
a61af66fc99e Initial load
duke
parents:
diff changeset
790 const TypeFunc* OptoRuntime::generic_arraycopy_Type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
791 // This signature is like System.arraycopy, except that it returns status.
a61af66fc99e Initial load
duke
parents:
diff changeset
792 return make_arraycopy_Type(ac_generic);
a61af66fc99e Initial load
duke
parents:
diff changeset
793 }
a61af66fc99e Initial load
duke
parents:
diff changeset
794
a61af66fc99e Initial load
duke
parents:
diff changeset
795
1763
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1552
diff changeset
796 const TypeFunc* OptoRuntime::array_fill_Type() {
1844
75588558f1bf 6980792: Crash "exception happened outside interpreter, nmethods and vtable stubs (1)"
never
parents: 1763
diff changeset
797 // 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
798 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
799 int argp = TypeFunc::Parms;
75588558f1bf 6980792: Crash "exception happened outside interpreter, nmethods and vtable stubs (1)"
never
parents: 1763
diff changeset
800 fields[argp++] = TypePtr::NOTNULL;
75588558f1bf 6980792: Crash "exception happened outside interpreter, nmethods and vtable stubs (1)"
never
parents: 1763
diff changeset
801 fields[argp++] = TypeInt::INT;
75588558f1bf 6980792: Crash "exception happened outside interpreter, nmethods and vtable stubs (1)"
never
parents: 1763
diff changeset
802 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
803 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
804 const TypeTuple *domain = TypeTuple::make(argp, fields);
1763
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1552
diff changeset
805
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1552
diff changeset
806 // create result type
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1552
diff changeset
807 fields = TypeTuple::fields(1);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1552
diff changeset
808 fields[TypeFunc::Parms+0] = NULL; // void
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1552
diff changeset
809 const TypeTuple *range = TypeTuple::make(TypeFunc::Parms, fields);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1552
diff changeset
810
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1552
diff changeset
811 return TypeFunc::make(domain, range);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1552
diff changeset
812 }
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1552
diff changeset
813
6894
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6831
diff changeset
814 // for aescrypt encrypt/decrypt operations, just three pointers returning void (length is constant)
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6831
diff changeset
815 const TypeFunc* OptoRuntime::aescrypt_block_Type() {
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6831
diff changeset
816 // create input type (domain)
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6831
diff changeset
817 int num_args = 3;
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6831
diff changeset
818 int argcnt = num_args;
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6831
diff changeset
819 const Type** fields = TypeTuple::fields(argcnt);
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6831
diff changeset
820 int argp = TypeFunc::Parms;
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6831
diff changeset
821 fields[argp++] = TypePtr::NOTNULL; // src
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6831
diff changeset
822 fields[argp++] = TypePtr::NOTNULL; // dest
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6831
diff changeset
823 fields[argp++] = TypePtr::NOTNULL; // k array
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6831
diff changeset
824 assert(argp == TypeFunc::Parms+argcnt, "correct decoding");
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6831
diff changeset
825 const TypeTuple* domain = TypeTuple::make(TypeFunc::Parms+argcnt, fields);
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6831
diff changeset
826
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6831
diff changeset
827 // no result type needed
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6831
diff changeset
828 fields = TypeTuple::fields(1);
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6831
diff changeset
829 fields[TypeFunc::Parms+0] = NULL; // void
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6831
diff changeset
830 const TypeTuple* range = TypeTuple::make(TypeFunc::Parms, fields);
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6831
diff changeset
831 return TypeFunc::make(domain, range);
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6831
diff changeset
832 }
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6831
diff changeset
833
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6831
diff changeset
834 // for cipherBlockChaining calls of aescrypt encrypt/decrypt, four pointers and a length, returning void
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6831
diff changeset
835 const TypeFunc* OptoRuntime::cipherBlockChaining_aescrypt_Type() {
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6831
diff changeset
836 // create input type (domain)
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6831
diff changeset
837 int num_args = 5;
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6831
diff changeset
838 int argcnt = num_args;
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6831
diff changeset
839 const Type** fields = TypeTuple::fields(argcnt);
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6831
diff changeset
840 int argp = TypeFunc::Parms;
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6831
diff changeset
841 fields[argp++] = TypePtr::NOTNULL; // src
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6831
diff changeset
842 fields[argp++] = TypePtr::NOTNULL; // dest
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6831
diff changeset
843 fields[argp++] = TypePtr::NOTNULL; // k array
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6831
diff changeset
844 fields[argp++] = TypePtr::NOTNULL; // r array
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6831
diff changeset
845 fields[argp++] = TypeInt::INT; // src len
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6831
diff changeset
846 assert(argp == TypeFunc::Parms+argcnt, "correct decoding");
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6831
diff changeset
847 const TypeTuple* domain = TypeTuple::make(TypeFunc::Parms+argcnt, fields);
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6831
diff changeset
848
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6831
diff changeset
849 // no result type needed
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6831
diff changeset
850 fields = TypeTuple::fields(1);
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6831
diff changeset
851 fields[TypeFunc::Parms+0] = NULL; // void
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6831
diff changeset
852 const TypeTuple* range = TypeTuple::make(TypeFunc::Parms, fields);
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6831
diff changeset
853 return TypeFunc::make(domain, range);
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6831
diff changeset
854 }
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6831
diff changeset
855
0
a61af66fc99e Initial load
duke
parents:
diff changeset
856 //------------- Interpreter state access for on stack replacement
a61af66fc99e Initial load
duke
parents:
diff changeset
857 const TypeFunc* OptoRuntime::osr_end_Type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
858 // create input type (domain)
a61af66fc99e Initial load
duke
parents:
diff changeset
859 const Type **fields = TypeTuple::fields(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
860 fields[TypeFunc::Parms+0] = TypeRawPtr::BOTTOM; // OSR temp buf
a61af66fc99e Initial load
duke
parents:
diff changeset
861 const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+1, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
862
a61af66fc99e Initial load
duke
parents:
diff changeset
863 // create result type
a61af66fc99e Initial load
duke
parents:
diff changeset
864 fields = TypeTuple::fields(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
865 // fields[TypeFunc::Parms+0] = TypeInstPtr::NOTNULL; // locked oop
a61af66fc99e Initial load
duke
parents:
diff changeset
866 fields[TypeFunc::Parms+0] = NULL; // void
a61af66fc99e Initial load
duke
parents:
diff changeset
867 const TypeTuple *range = TypeTuple::make(TypeFunc::Parms, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
868 return TypeFunc::make(domain, range);
a61af66fc99e Initial load
duke
parents:
diff changeset
869 }
a61af66fc99e Initial load
duke
parents:
diff changeset
870
a61af66fc99e Initial load
duke
parents:
diff changeset
871 //-------------- methodData update helpers
a61af66fc99e Initial load
duke
parents:
diff changeset
872
a61af66fc99e Initial load
duke
parents:
diff changeset
873 const TypeFunc* OptoRuntime::profile_receiver_type_Type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
874 // create input type (domain)
a61af66fc99e Initial load
duke
parents:
diff changeset
875 const Type **fields = TypeTuple::fields(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
876 fields[TypeFunc::Parms+0] = TypeAryPtr::NOTNULL; // methodData pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
877 fields[TypeFunc::Parms+1] = TypeInstPtr::BOTTOM; // receiver oop
a61af66fc99e Initial load
duke
parents:
diff changeset
878 const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+2, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
879
a61af66fc99e Initial load
duke
parents:
diff changeset
880 // create result type
a61af66fc99e Initial load
duke
parents:
diff changeset
881 fields = TypeTuple::fields(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
882 fields[TypeFunc::Parms+0] = NULL; // void
a61af66fc99e Initial load
duke
parents:
diff changeset
883 const TypeTuple *range = TypeTuple::make(TypeFunc::Parms, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
884 return TypeFunc::make(domain,range);
a61af66fc99e Initial load
duke
parents:
diff changeset
885 }
a61af66fc99e Initial load
duke
parents:
diff changeset
886
a61af66fc99e Initial load
duke
parents:
diff changeset
887 JRT_LEAF(void, OptoRuntime::profile_receiver_type_C(DataLayout* data, oopDesc* receiver))
a61af66fc99e Initial load
duke
parents:
diff changeset
888 if (receiver == NULL) return;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6633
diff changeset
889 Klass* receiver_klass = receiver->klass();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
890
a61af66fc99e Initial load
duke
parents:
diff changeset
891 intptr_t* mdp = ((intptr_t*)(data)) + DataLayout::header_size_in_cells();
a61af66fc99e Initial load
duke
parents:
diff changeset
892 int empty_row = -1; // free row, if any is encountered
a61af66fc99e Initial load
duke
parents:
diff changeset
893
a61af66fc99e Initial load
duke
parents:
diff changeset
894 // ReceiverTypeData* vc = new ReceiverTypeData(mdp);
a61af66fc99e Initial load
duke
parents:
diff changeset
895 for (uint row = 0; row < ReceiverTypeData::row_limit(); row++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
896 // if (vc->receiver(row) == receiver_klass)
a61af66fc99e Initial load
duke
parents:
diff changeset
897 int receiver_off = ReceiverTypeData::receiver_cell_index(row);
a61af66fc99e Initial load
duke
parents:
diff changeset
898 intptr_t row_recv = *(mdp + receiver_off);
a61af66fc99e Initial load
duke
parents:
diff changeset
899 if (row_recv == (intptr_t) receiver_klass) {
a61af66fc99e Initial load
duke
parents:
diff changeset
900 // vc->set_receiver_count(row, vc->receiver_count(row) + DataLayout::counter_increment);
a61af66fc99e Initial load
duke
parents:
diff changeset
901 int count_off = ReceiverTypeData::receiver_count_cell_index(row);
a61af66fc99e Initial load
duke
parents:
diff changeset
902 *(mdp + count_off) += DataLayout::counter_increment;
a61af66fc99e Initial load
duke
parents:
diff changeset
903 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
904 } else if (row_recv == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
905 // else if (vc->receiver(row) == NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
906 empty_row = (int) row;
a61af66fc99e Initial load
duke
parents:
diff changeset
907 }
a61af66fc99e Initial load
duke
parents:
diff changeset
908 }
a61af66fc99e Initial load
duke
parents:
diff changeset
909
a61af66fc99e Initial load
duke
parents:
diff changeset
910 if (empty_row != -1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
911 int receiver_off = ReceiverTypeData::receiver_cell_index(empty_row);
a61af66fc99e Initial load
duke
parents:
diff changeset
912 // vc->set_receiver(empty_row, receiver_klass);
a61af66fc99e Initial load
duke
parents:
diff changeset
913 *(mdp + receiver_off) = (intptr_t) receiver_klass;
a61af66fc99e Initial load
duke
parents:
diff changeset
914 // vc->set_receiver_count(empty_row, DataLayout::counter_increment);
a61af66fc99e Initial load
duke
parents:
diff changeset
915 int count_off = ReceiverTypeData::receiver_count_cell_index(empty_row);
a61af66fc99e Initial load
duke
parents:
diff changeset
916 *(mdp + count_off) = DataLayout::counter_increment;
1206
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1166
diff changeset
917 } else {
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1166
diff changeset
918 // 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
919 // Increment total counter to indicate polymorphic case.
1206
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1166
diff changeset
920 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
921 *count_p += DataLayout::counter_increment;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
922 }
a61af66fc99e Initial load
duke
parents:
diff changeset
923 JRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
924
a61af66fc99e Initial load
duke
parents:
diff changeset
925 //-------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
926 // register policy
a61af66fc99e Initial load
duke
parents:
diff changeset
927
a61af66fc99e Initial load
duke
parents:
diff changeset
928 bool OptoRuntime::is_callee_saved_register(MachRegisterNumbers reg) {
a61af66fc99e Initial load
duke
parents:
diff changeset
929 assert(reg >= 0 && reg < _last_Mach_Reg, "must be a machine register");
a61af66fc99e Initial load
duke
parents:
diff changeset
930 switch (register_save_policy[reg]) {
a61af66fc99e Initial load
duke
parents:
diff changeset
931 case 'C': return false; //SOC
a61af66fc99e Initial load
duke
parents:
diff changeset
932 case 'E': return true ; //SOE
a61af66fc99e Initial load
duke
parents:
diff changeset
933 case 'N': return false; //NS
a61af66fc99e Initial load
duke
parents:
diff changeset
934 case 'A': return false; //AS
a61af66fc99e Initial load
duke
parents:
diff changeset
935 }
a61af66fc99e Initial load
duke
parents:
diff changeset
936 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
937 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
938 }
a61af66fc99e Initial load
duke
parents:
diff changeset
939
a61af66fc99e Initial load
duke
parents:
diff changeset
940 //-----------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
941 // Exceptions
a61af66fc99e Initial load
duke
parents:
diff changeset
942 //
a61af66fc99e Initial load
duke
parents:
diff changeset
943
a61af66fc99e Initial load
duke
parents:
diff changeset
944 static void trace_exception(oop exception_oop, address exception_pc, const char* msg) PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
945
a61af66fc99e Initial load
duke
parents:
diff changeset
946 // The method is an entry that is always called by a C++ method not
a61af66fc99e Initial load
duke
parents:
diff changeset
947 // directly from compiled code. Compiled code will call the C++ method following.
a61af66fc99e Initial load
duke
parents:
diff changeset
948 // We can't allow async exception to be installed during exception processing.
a61af66fc99e Initial load
duke
parents:
diff changeset
949 JRT_ENTRY_NO_ASYNC(address, OptoRuntime::handle_exception_C_helper(JavaThread* thread, nmethod* &nm))
a61af66fc99e Initial load
duke
parents:
diff changeset
950
a61af66fc99e Initial load
duke
parents:
diff changeset
951 // Do not confuse exception_oop with pending_exception. The exception_oop
a61af66fc99e Initial load
duke
parents:
diff changeset
952 // is only used to pass arguments into the method. Not for general
a61af66fc99e Initial load
duke
parents:
diff changeset
953 // exception handling. DO NOT CHANGE IT to use pending_exception, since
a61af66fc99e Initial load
duke
parents:
diff changeset
954 // the runtime stubs checks this on exit.
a61af66fc99e Initial load
duke
parents:
diff changeset
955 assert(thread->exception_oop() != NULL, "exception oop is found");
a61af66fc99e Initial load
duke
parents:
diff changeset
956 address handler_address = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
957
a61af66fc99e Initial load
duke
parents:
diff changeset
958 Handle exception(thread, thread->exception_oop());
a61af66fc99e Initial load
duke
parents:
diff changeset
959
a61af66fc99e Initial load
duke
parents:
diff changeset
960 if (TraceExceptions) {
a61af66fc99e Initial load
duke
parents:
diff changeset
961 trace_exception(exception(), thread->exception_pc(), "");
a61af66fc99e Initial load
duke
parents:
diff changeset
962 }
a61af66fc99e Initial load
duke
parents:
diff changeset
963 // for AbortVMOnException flag
a61af66fc99e Initial load
duke
parents:
diff changeset
964 NOT_PRODUCT(Exceptions::debug_check_abort(exception));
a61af66fc99e Initial load
duke
parents:
diff changeset
965
a61af66fc99e Initial load
duke
parents:
diff changeset
966 #ifdef ASSERT
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1135
diff changeset
967 if (!(exception->is_a(SystemDictionary::Throwable_klass()))) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
968 // should throw an exception here
a61af66fc99e Initial load
duke
parents:
diff changeset
969 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
970 }
a61af66fc99e Initial load
duke
parents:
diff changeset
971 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
972
a61af66fc99e Initial load
duke
parents:
diff changeset
973
a61af66fc99e Initial load
duke
parents:
diff changeset
974 // new exception handling: this method is entered only from adapters
a61af66fc99e Initial load
duke
parents:
diff changeset
975 // exceptions from compiled java methods are handled in compiled code
a61af66fc99e Initial load
duke
parents:
diff changeset
976 // using rethrow node
a61af66fc99e Initial load
duke
parents:
diff changeset
977
a61af66fc99e Initial load
duke
parents:
diff changeset
978 address pc = thread->exception_pc();
a61af66fc99e Initial load
duke
parents:
diff changeset
979 nm = CodeCache::find_nmethod(pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
980 assert(nm != NULL, "No NMethod found");
a61af66fc99e Initial load
duke
parents:
diff changeset
981 if (nm->is_native_method()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
982 fatal("Native mathod should not have path to exception handling");
a61af66fc99e Initial load
duke
parents:
diff changeset
983 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
984 // we are switching to old paradigm: search for exception handler in caller_frame
a61af66fc99e Initial load
duke
parents:
diff changeset
985 // instead in exception handler of caller_frame.sender()
a61af66fc99e Initial load
duke
parents:
diff changeset
986
1213
6deeaebad47a 6902182: 4/4 Starting with jdwp agent should not incur performance penalty
dcubed
parents: 1166
diff changeset
987 if (JvmtiExport::can_post_on_exceptions()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
988 // "Full-speed catching" is not necessary here,
a61af66fc99e Initial load
duke
parents:
diff changeset
989 // since we're notifying the VM on every catch.
a61af66fc99e Initial load
duke
parents:
diff changeset
990 // Force deoptimization and the rest of the lookup
a61af66fc99e Initial load
duke
parents:
diff changeset
991 // will be fine.
7428
2d6c433b1f38 8004741: Missing compiled exception handle table entry for multidimensional array allocation
kvn
parents: 6983
diff changeset
992 deoptimize_caller_frame(thread);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
993 }
a61af66fc99e Initial load
duke
parents:
diff changeset
994
a61af66fc99e Initial load
duke
parents:
diff changeset
995 // Check the stack guard pages. If enabled, look for handler in this frame;
a61af66fc99e Initial load
duke
parents:
diff changeset
996 // otherwise, forcibly unwind the frame.
a61af66fc99e Initial load
duke
parents:
diff changeset
997 //
a61af66fc99e Initial load
duke
parents:
diff changeset
998 // 4826555: use default current sp for reguard_stack instead of &nm: it's more accurate.
a61af66fc99e Initial load
duke
parents:
diff changeset
999 bool force_unwind = !thread->reguard_stack();
a61af66fc99e Initial load
duke
parents:
diff changeset
1000 bool deopting = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1001 if (nm->is_deopt_pc(pc)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1002 deopting = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1003 RegisterMap map(thread, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1004 frame deoptee = thread->last_frame().sender(&map);
a61af66fc99e Initial load
duke
parents:
diff changeset
1005 assert(deoptee.is_deoptimized_frame(), "must be deopted");
a61af66fc99e Initial load
duke
parents:
diff changeset
1006 // Adjust the pc back to the original throwing pc
a61af66fc99e Initial load
duke
parents:
diff changeset
1007 pc = deoptee.pc();
a61af66fc99e Initial load
duke
parents:
diff changeset
1008 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1009
a61af66fc99e Initial load
duke
parents:
diff changeset
1010 // If we are forcing an unwind because of stack overflow then deopt is
a61af66fc99e Initial load
duke
parents:
diff changeset
1011 // irrelevant sice we are throwing the frame away anyway.
a61af66fc99e Initial load
duke
parents:
diff changeset
1012
a61af66fc99e Initial load
duke
parents:
diff changeset
1013 if (deopting && !force_unwind) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1014 handler_address = SharedRuntime::deopt_blob()->unpack_with_exception();
a61af66fc99e Initial load
duke
parents:
diff changeset
1015 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1016
a61af66fc99e Initial load
duke
parents:
diff changeset
1017 handler_address =
a61af66fc99e Initial load
duke
parents:
diff changeset
1018 force_unwind ? NULL : nm->handler_for_exception_and_pc(exception, pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
1019
a61af66fc99e Initial load
duke
parents:
diff changeset
1020 if (handler_address == NULL) {
3998
ec5ce9326985 6865265: JVM crashes with "missing exception handler" error
kvn
parents: 3961
diff changeset
1021 Handle original_exception(thread, exception());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1022 handler_address = SharedRuntime::compute_compiled_exc_handler(nm, pc, exception, force_unwind, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1023 assert (handler_address != NULL, "must have compiled handler");
3998
ec5ce9326985 6865265: JVM crashes with "missing exception handler" error
kvn
parents: 3961
diff changeset
1024 // Update the exception cache only when the unwind was not forced
ec5ce9326985 6865265: JVM crashes with "missing exception handler" error
kvn
parents: 3961
diff changeset
1025 // and there didn't happen another exception during the computation of the
ec5ce9326985 6865265: JVM crashes with "missing exception handler" error
kvn
parents: 3961
diff changeset
1026 // compiled exception handler.
ec5ce9326985 6865265: JVM crashes with "missing exception handler" error
kvn
parents: 3961
diff changeset
1027 if (!force_unwind && original_exception() == exception()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1028 nm->add_handler_for_exception_and_pc(exception,pc,handler_address);
a61af66fc99e Initial load
duke
parents:
diff changeset
1029 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1030 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1031 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
1032 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1033 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1034
a61af66fc99e Initial load
duke
parents:
diff changeset
1035 thread->set_exception_pc(pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
1036 thread->set_exception_handler_pc(handler_address);
1135
e66fd840cb6b 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 1027
diff changeset
1037
1295
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 1257
diff changeset
1038 // 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
1039 thread->set_is_method_handle_return(nm->is_method_handle_return(pc));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1040 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1041
a61af66fc99e Initial load
duke
parents:
diff changeset
1042 // Restore correct return pc. Was saved above.
a61af66fc99e Initial load
duke
parents:
diff changeset
1043 thread->set_exception_oop(exception());
a61af66fc99e Initial load
duke
parents:
diff changeset
1044 return handler_address;
a61af66fc99e Initial load
duke
parents:
diff changeset
1045
a61af66fc99e Initial load
duke
parents:
diff changeset
1046 JRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1047
a61af66fc99e Initial load
duke
parents:
diff changeset
1048 // We are entering here from exception_blob
a61af66fc99e Initial load
duke
parents:
diff changeset
1049 // If there is a compiled exception handler in this method, we will continue there;
a61af66fc99e Initial load
duke
parents:
diff changeset
1050 // otherwise we will unwind the stack and continue at the caller of top frame method
a61af66fc99e Initial load
duke
parents:
diff changeset
1051 // Note we enter without the usual JRT wrapper. We will call a helper routine that
a61af66fc99e Initial load
duke
parents:
diff changeset
1052 // 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
1053 // we looked up the handler for has been deoptimized in the meantime. If it has been
a61af66fc99e Initial load
duke
parents:
diff changeset
1054 // we must not use the handler and instread return the deopt blob.
a61af66fc99e Initial load
duke
parents:
diff changeset
1055 address OptoRuntime::handle_exception_C(JavaThread* thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1056 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1057 // We are in Java not VM and in debug mode we have a NoHandleMark
a61af66fc99e Initial load
duke
parents:
diff changeset
1058 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1059 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1060 SharedRuntime::_find_handler_ctr++; // find exception handler
a61af66fc99e Initial load
duke
parents:
diff changeset
1061 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1062 debug_only(NoHandleMark __hm;)
a61af66fc99e Initial load
duke
parents:
diff changeset
1063 nmethod* nm = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1064 address handler_address = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1065 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1066 // Enter the VM
a61af66fc99e Initial load
duke
parents:
diff changeset
1067
a61af66fc99e Initial load
duke
parents:
diff changeset
1068 ResetNoHandleMark rnhm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1069 handler_address = handle_exception_C_helper(thread, nm);
a61af66fc99e Initial load
duke
parents:
diff changeset
1070 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1071
a61af66fc99e Initial load
duke
parents:
diff changeset
1072 // Back in java: Use no oops, DON'T safepoint
a61af66fc99e Initial load
duke
parents:
diff changeset
1073
a61af66fc99e Initial load
duke
parents:
diff changeset
1074 // Now check to see if the handler we are returning is in a now
a61af66fc99e Initial load
duke
parents:
diff changeset
1075 // deoptimized frame
a61af66fc99e Initial load
duke
parents:
diff changeset
1076
a61af66fc99e Initial load
duke
parents:
diff changeset
1077 if (nm != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1078 RegisterMap map(thread, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 frame caller = thread->last_frame().sender(&map);
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1081 assert(caller.is_compiled_frame(), "must be");
a61af66fc99e Initial load
duke
parents:
diff changeset
1082 #endif // ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1083 if (caller.is_deoptimized_frame()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1084 handler_address = SharedRuntime::deopt_blob()->unpack_with_exception();
a61af66fc99e Initial load
duke
parents:
diff changeset
1085 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1086 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1087 return handler_address;
a61af66fc99e Initial load
duke
parents:
diff changeset
1088 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1089
a61af66fc99e Initial load
duke
parents:
diff changeset
1090 //------------------------------rethrow----------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1091 // We get here after compiled code has executed a 'RethrowNode'. The callee
a61af66fc99e Initial load
duke
parents:
diff changeset
1092 // is either throwing or rethrowing an exception. The callee-save registers
a61af66fc99e Initial load
duke
parents:
diff changeset
1093 // have been restored, synchronized objects have been unlocked and the callee
a61af66fc99e Initial load
duke
parents:
diff changeset
1094 // stack frame has been removed. The return address was passed in.
a61af66fc99e Initial load
duke
parents:
diff changeset
1095 // Exception oop is passed as the 1st argument. This routine is then called
a61af66fc99e Initial load
duke
parents:
diff changeset
1096 // from the stub. On exit, we know where to jump in the caller's code.
a61af66fc99e Initial load
duke
parents:
diff changeset
1097 // After this C code exits, the stub will pop his frame and end in a jump
a61af66fc99e Initial load
duke
parents:
diff changeset
1098 // (instead of a return). We enter the caller's default handler.
a61af66fc99e Initial load
duke
parents:
diff changeset
1099 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1100 // This must be JRT_LEAF:
a61af66fc99e Initial load
duke
parents:
diff changeset
1101 // - caller will not change its state as we cannot block on exit,
a61af66fc99e Initial load
duke
parents:
diff changeset
1102 // therefore raw_exception_handler_for_return_address is all it takes
a61af66fc99e Initial load
duke
parents:
diff changeset
1103 // to handle deoptimized blobs
a61af66fc99e Initial load
duke
parents:
diff changeset
1104 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1105 // However, there needs to be a safepoint check in the middle! So compiled
a61af66fc99e Initial load
duke
parents:
diff changeset
1106 // safepoints are completely watertight.
a61af66fc99e Initial load
duke
parents:
diff changeset
1107 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1108 // Thus, it cannot be a leaf since it contains the No_GC_Verifier.
a61af66fc99e Initial load
duke
parents:
diff changeset
1109 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1110 // *THIS IS NOT RECOMMENDED PROGRAMMING STYLE*
a61af66fc99e Initial load
duke
parents:
diff changeset
1111 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1112 address OptoRuntime::rethrow_C(oopDesc* exception, JavaThread* thread, address ret_pc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1113 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1114 SharedRuntime::_rethrow_ctr++; // count rethrows
a61af66fc99e Initial load
duke
parents:
diff changeset
1115 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1116 assert (exception != NULL, "should have thrown a NULLPointerException");
a61af66fc99e Initial load
duke
parents:
diff changeset
1117 #ifdef ASSERT
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1135
diff changeset
1118 if (!(exception->is_a(SystemDictionary::Throwable_klass()))) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1119 // should throw an exception here
a61af66fc99e Initial load
duke
parents:
diff changeset
1120 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
1121 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1122 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1123
a61af66fc99e Initial load
duke
parents:
diff changeset
1124 thread->set_vm_result(exception);
a61af66fc99e Initial load
duke
parents:
diff changeset
1125 // Frame not compiled (handles deoptimization blob)
1295
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 1257
diff changeset
1126 return SharedRuntime::raw_exception_handler_for_return_address(thread, ret_pc);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1127 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1128
a61af66fc99e Initial load
duke
parents:
diff changeset
1129
a61af66fc99e Initial load
duke
parents:
diff changeset
1130 const TypeFunc *OptoRuntime::rethrow_Type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1131 // create input type (domain)
a61af66fc99e Initial load
duke
parents:
diff changeset
1132 const Type **fields = TypeTuple::fields(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1133 fields[TypeFunc::Parms+0] = TypeInstPtr::NOTNULL; // Exception oop
a61af66fc99e Initial load
duke
parents:
diff changeset
1134 const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+1,fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
1135
a61af66fc99e Initial load
duke
parents:
diff changeset
1136 // create result type (range)
a61af66fc99e Initial load
duke
parents:
diff changeset
1137 fields = TypeTuple::fields(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1138 fields[TypeFunc::Parms+0] = TypeInstPtr::NOTNULL; // Exception oop
a61af66fc99e Initial load
duke
parents:
diff changeset
1139 const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+1, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
1140
a61af66fc99e Initial load
duke
parents:
diff changeset
1141 return TypeFunc::make(domain, range);
a61af66fc99e Initial load
duke
parents:
diff changeset
1142 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1143
a61af66fc99e Initial load
duke
parents:
diff changeset
1144
a61af66fc99e Initial load
duke
parents:
diff changeset
1145 void OptoRuntime::deoptimize_caller_frame(JavaThread *thread, bool doit) {
7428
2d6c433b1f38 8004741: Missing compiled exception handle table entry for multidimensional array allocation
kvn
parents: 6983
diff changeset
1146 // Deoptimize the caller before continuing, as the compiled
2d6c433b1f38 8004741: Missing compiled exception handle table entry for multidimensional array allocation
kvn
parents: 6983
diff changeset
1147 // exception handler table may not be valid.
2d6c433b1f38 8004741: Missing compiled exception handle table entry for multidimensional array allocation
kvn
parents: 6983
diff changeset
1148 if (!StressCompiledExceptionHandlers && doit) {
2d6c433b1f38 8004741: Missing compiled exception handle table entry for multidimensional array allocation
kvn
parents: 6983
diff changeset
1149 deoptimize_caller_frame(thread);
2d6c433b1f38 8004741: Missing compiled exception handle table entry for multidimensional array allocation
kvn
parents: 6983
diff changeset
1150 }
2d6c433b1f38 8004741: Missing compiled exception handle table entry for multidimensional array allocation
kvn
parents: 6983
diff changeset
1151 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1152
7428
2d6c433b1f38 8004741: Missing compiled exception handle table entry for multidimensional array allocation
kvn
parents: 6983
diff changeset
1153 void OptoRuntime::deoptimize_caller_frame(JavaThread *thread) {
2d6c433b1f38 8004741: Missing compiled exception handle table entry for multidimensional array allocation
kvn
parents: 6983
diff changeset
1154 // Called from within the owner thread, so no need for safepoint
2d6c433b1f38 8004741: Missing compiled exception handle table entry for multidimensional array allocation
kvn
parents: 6983
diff changeset
1155 RegisterMap reg_map(thread);
2d6c433b1f38 8004741: Missing compiled exception handle table entry for multidimensional array allocation
kvn
parents: 6983
diff changeset
1156 frame stub_frame = thread->last_frame();
2d6c433b1f38 8004741: Missing compiled exception handle table entry for multidimensional array allocation
kvn
parents: 6983
diff changeset
1157 assert(stub_frame.is_runtime_frame() || exception_blob()->contains(stub_frame.pc()), "sanity check");
2d6c433b1f38 8004741: Missing compiled exception handle table entry for multidimensional array allocation
kvn
parents: 6983
diff changeset
1158 frame caller_frame = stub_frame.sender(&reg_map);
2d6c433b1f38 8004741: Missing compiled exception handle table entry for multidimensional array allocation
kvn
parents: 6983
diff changeset
1159
2d6c433b1f38 8004741: Missing compiled exception handle table entry for multidimensional array allocation
kvn
parents: 6983
diff changeset
1160 // Deoptimize the caller frame.
7485
4fc2763e670e Another merge fix.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7482
diff changeset
1161 Deoptimization::deoptimize_frame(thread, caller_frame.id(), Deoptimization::Reason_constraint);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1162 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1163
a61af66fc99e Initial load
duke
parents:
diff changeset
1164
4063
7e0e43cf86d6 7109887: java/util/Arrays/CopyMethods.java fails with -XX:+DeoptimizeALot
kvn
parents: 4048
diff changeset
1165 bool OptoRuntime::is_deoptimized_caller_frame(JavaThread *thread) {
7e0e43cf86d6 7109887: java/util/Arrays/CopyMethods.java fails with -XX:+DeoptimizeALot
kvn
parents: 4048
diff changeset
1166 // Called from within the owner thread, so no need for safepoint
7e0e43cf86d6 7109887: java/util/Arrays/CopyMethods.java fails with -XX:+DeoptimizeALot
kvn
parents: 4048
diff changeset
1167 RegisterMap reg_map(thread);
7e0e43cf86d6 7109887: java/util/Arrays/CopyMethods.java fails with -XX:+DeoptimizeALot
kvn
parents: 4048
diff changeset
1168 frame stub_frame = thread->last_frame();
7e0e43cf86d6 7109887: java/util/Arrays/CopyMethods.java fails with -XX:+DeoptimizeALot
kvn
parents: 4048
diff changeset
1169 assert(stub_frame.is_runtime_frame() || exception_blob()->contains(stub_frame.pc()), "sanity check");
7e0e43cf86d6 7109887: java/util/Arrays/CopyMethods.java fails with -XX:+DeoptimizeALot
kvn
parents: 4048
diff changeset
1170 frame caller_frame = stub_frame.sender(&reg_map);
7e0e43cf86d6 7109887: java/util/Arrays/CopyMethods.java fails with -XX:+DeoptimizeALot
kvn
parents: 4048
diff changeset
1171 return caller_frame.is_deoptimized_frame();
7e0e43cf86d6 7109887: java/util/Arrays/CopyMethods.java fails with -XX:+DeoptimizeALot
kvn
parents: 4048
diff changeset
1172 }
7e0e43cf86d6 7109887: java/util/Arrays/CopyMethods.java fails with -XX:+DeoptimizeALot
kvn
parents: 4048
diff changeset
1173
7e0e43cf86d6 7109887: java/util/Arrays/CopyMethods.java fails with -XX:+DeoptimizeALot
kvn
parents: 4048
diff changeset
1174
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1175 const TypeFunc *OptoRuntime::register_finalizer_Type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1176 // create input type (domain)
a61af66fc99e Initial load
duke
parents:
diff changeset
1177 const Type **fields = TypeTuple::fields(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1178 fields[TypeFunc::Parms+0] = TypeInstPtr::NOTNULL; // oop; Receiver
a61af66fc99e Initial load
duke
parents:
diff changeset
1179 // // The JavaThread* is passed to each routine as the last argument
a61af66fc99e Initial load
duke
parents:
diff changeset
1180 // fields[TypeFunc::Parms+1] = TypeRawPtr::NOTNULL; // JavaThread *; Executing thread
a61af66fc99e Initial load
duke
parents:
diff changeset
1181 const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+1,fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
1182
a61af66fc99e Initial load
duke
parents:
diff changeset
1183 // create result type (range)
a61af66fc99e Initial load
duke
parents:
diff changeset
1184 fields = TypeTuple::fields(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1185
a61af66fc99e Initial load
duke
parents:
diff changeset
1186 const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+0,fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
1187
a61af66fc99e Initial load
duke
parents:
diff changeset
1188 return TypeFunc::make(domain,range);
a61af66fc99e Initial load
duke
parents:
diff changeset
1189 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1190
a61af66fc99e Initial load
duke
parents:
diff changeset
1191
a61af66fc99e Initial load
duke
parents:
diff changeset
1192 //-----------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1193 // Dtrace support. entry and exit probes have the same signature
a61af66fc99e Initial load
duke
parents:
diff changeset
1194 const TypeFunc *OptoRuntime::dtrace_method_entry_exit_Type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1195 // create input type (domain)
a61af66fc99e Initial load
duke
parents:
diff changeset
1196 const Type **fields = TypeTuple::fields(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
1197 fields[TypeFunc::Parms+0] = TypeRawPtr::BOTTOM; // Thread-local storage
6739
8a02ca5e5576 7195816: NPG: Crash in c1_ValueType - ShouldNotReachHere
roland
parents: 6725
diff changeset
1198 fields[TypeFunc::Parms+1] = TypeMetadataPtr::BOTTOM; // Method*; Method we are entering
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1199 const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+2,fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
1200
a61af66fc99e Initial load
duke
parents:
diff changeset
1201 // create result type (range)
a61af66fc99e Initial load
duke
parents:
diff changeset
1202 fields = TypeTuple::fields(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1203
a61af66fc99e Initial load
duke
parents:
diff changeset
1204 const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+0,fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
1205
a61af66fc99e Initial load
duke
parents:
diff changeset
1206 return TypeFunc::make(domain,range);
a61af66fc99e Initial load
duke
parents:
diff changeset
1207 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1208
a61af66fc99e Initial load
duke
parents:
diff changeset
1209 const TypeFunc *OptoRuntime::dtrace_object_alloc_Type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1210 // create input type (domain)
a61af66fc99e Initial load
duke
parents:
diff changeset
1211 const Type **fields = TypeTuple::fields(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
1212 fields[TypeFunc::Parms+0] = TypeRawPtr::BOTTOM; // Thread-local storage
a61af66fc99e Initial load
duke
parents:
diff changeset
1213 fields[TypeFunc::Parms+1] = TypeInstPtr::NOTNULL; // oop; newly allocated object
a61af66fc99e Initial load
duke
parents:
diff changeset
1214
a61af66fc99e Initial load
duke
parents:
diff changeset
1215 const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+2,fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
1216
a61af66fc99e Initial load
duke
parents:
diff changeset
1217 // create result type (range)
a61af66fc99e Initial load
duke
parents:
diff changeset
1218 fields = TypeTuple::fields(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1219
a61af66fc99e Initial load
duke
parents:
diff changeset
1220 const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+0,fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
1221
a61af66fc99e Initial load
duke
parents:
diff changeset
1222 return TypeFunc::make(domain,range);
a61af66fc99e Initial load
duke
parents:
diff changeset
1223 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1224
a61af66fc99e Initial load
duke
parents:
diff changeset
1225
a61af66fc99e Initial load
duke
parents:
diff changeset
1226 JRT_ENTRY_NO_ASYNC(void, OptoRuntime::register_finalizer(oopDesc* obj, JavaThread* thread))
a61af66fc99e Initial load
duke
parents:
diff changeset
1227 assert(obj->is_oop(), "must be a valid oop");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6633
diff changeset
1228 assert(obj->klass()->has_finalizer(), "shouldn't be here otherwise");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6633
diff changeset
1229 InstanceKlass::register_finalizer(instanceOop(obj), CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1230 JRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1231
a61af66fc99e Initial load
duke
parents:
diff changeset
1232 //-----------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1233
a61af66fc99e Initial load
duke
parents:
diff changeset
1234 NamedCounter * volatile OptoRuntime::_named_counters = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1235
a61af66fc99e Initial load
duke
parents:
diff changeset
1236 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1237 // dump the collected NamedCounters.
a61af66fc99e Initial load
duke
parents:
diff changeset
1238 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1239 void OptoRuntime::print_named_counters() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1240 int total_lock_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1241 int eliminated_lock_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1242
a61af66fc99e Initial load
duke
parents:
diff changeset
1243 NamedCounter* c = _named_counters;
a61af66fc99e Initial load
duke
parents:
diff changeset
1244 while (c) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1245 if (c->tag() == NamedCounter::LockCounter || c->tag() == NamedCounter::EliminatedLockCounter) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1246 int count = c->count();
a61af66fc99e Initial load
duke
parents:
diff changeset
1247 if (count > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1248 bool eliminated = c->tag() == NamedCounter::EliminatedLockCounter;
a61af66fc99e Initial load
duke
parents:
diff changeset
1249 if (Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1250 tty->print_cr("%d %s%s", count, c->name(), eliminated ? " (eliminated)" : "");
a61af66fc99e Initial load
duke
parents:
diff changeset
1251 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1252 total_lock_count += count;
a61af66fc99e Initial load
duke
parents:
diff changeset
1253 if (eliminated) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1254 eliminated_lock_count += count;
a61af66fc99e Initial load
duke
parents:
diff changeset
1255 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1256 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1257 } else if (c->tag() == NamedCounter::BiasedLockingCounter) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1258 BiasedLockingCounters* blc = ((BiasedLockingNamedCounter*)c)->counters();
a61af66fc99e Initial load
duke
parents:
diff changeset
1259 if (blc->nonzero()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1260 tty->print_cr("%s", c->name());
a61af66fc99e Initial load
duke
parents:
diff changeset
1261 blc->print_on(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
1262 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1263 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1264 c = c->next();
a61af66fc99e Initial load
duke
parents:
diff changeset
1265 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1266 if (total_lock_count > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1267 tty->print_cr("dynamic locks: %d", total_lock_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
1268 if (eliminated_lock_count) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1269 tty->print_cr("eliminated locks: %d (%d%%)", eliminated_lock_count,
a61af66fc99e Initial load
duke
parents:
diff changeset
1270 (int)(eliminated_lock_count * 100.0 / total_lock_count));
a61af66fc99e Initial load
duke
parents:
diff changeset
1271 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1272 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1273 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1274
a61af66fc99e Initial load
duke
parents:
diff changeset
1275 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1276 // Allocate a new NamedCounter. The JVMState is used to generate the
a61af66fc99e Initial load
duke
parents:
diff changeset
1277 // name which consists of method@line for the inlining tree.
a61af66fc99e Initial load
duke
parents:
diff changeset
1278 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1279
a61af66fc99e Initial load
duke
parents:
diff changeset
1280 NamedCounter* OptoRuntime::new_named_counter(JVMState* youngest_jvms, NamedCounter::CounterTag tag) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1281 int max_depth = youngest_jvms->depth();
a61af66fc99e Initial load
duke
parents:
diff changeset
1282
a61af66fc99e Initial load
duke
parents:
diff changeset
1283 // Visit scopes from youngest to oldest.
a61af66fc99e Initial load
duke
parents:
diff changeset
1284 bool first = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1285 stringStream st;
a61af66fc99e Initial load
duke
parents:
diff changeset
1286 for (int depth = max_depth; depth >= 1; depth--) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1287 JVMState* jvms = youngest_jvms->of_depth(depth);
a61af66fc99e Initial load
duke
parents:
diff changeset
1288 ciMethod* m = jvms->has_method() ? jvms->method() : NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1289 if (!first) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1290 st.print(" ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1291 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1292 first = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1293 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1294 int bci = jvms->bci();
a61af66fc99e Initial load
duke
parents:
diff changeset
1295 if (bci < 0) bci = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1296 st.print("%s.%s@%d", m->holder()->name()->as_utf8(), m->name()->as_utf8(), bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
1297 // To print linenumbers instead of bci use: m->line_number_from_bci(bci)
a61af66fc99e Initial load
duke
parents:
diff changeset
1298 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1299 NamedCounter* c;
a61af66fc99e Initial load
duke
parents:
diff changeset
1300 if (tag == NamedCounter::BiasedLockingCounter) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1301 c = new BiasedLockingNamedCounter(strdup(st.as_string()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1302 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1303 c = new NamedCounter(strdup(st.as_string()), tag);
a61af66fc99e Initial load
duke
parents:
diff changeset
1304 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1305
a61af66fc99e Initial load
duke
parents:
diff changeset
1306 // atomically add the new counter to the head of the list. We only
a61af66fc99e Initial load
duke
parents:
diff changeset
1307 // add counters so this is safe.
a61af66fc99e Initial load
duke
parents:
diff changeset
1308 NamedCounter* head;
a61af66fc99e Initial load
duke
parents:
diff changeset
1309 do {
a61af66fc99e Initial load
duke
parents:
diff changeset
1310 head = _named_counters;
a61af66fc99e Initial load
duke
parents:
diff changeset
1311 c->set_next(head);
a61af66fc99e Initial load
duke
parents:
diff changeset
1312 } while (Atomic::cmpxchg_ptr(c, &_named_counters, head) != head);
a61af66fc99e Initial load
duke
parents:
diff changeset
1313 return c;
a61af66fc99e Initial load
duke
parents:
diff changeset
1314 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1315
a61af66fc99e Initial load
duke
parents:
diff changeset
1316 //-----------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1317 // Non-product code
a61af66fc99e Initial load
duke
parents:
diff changeset
1318 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1319
a61af66fc99e Initial load
duke
parents:
diff changeset
1320 int trace_exception_counter = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1321 static void trace_exception(oop exception_oop, address exception_pc, const char* msg) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1322 ttyLocker ttyl;
a61af66fc99e Initial load
duke
parents:
diff changeset
1323 trace_exception_counter++;
a61af66fc99e Initial load
duke
parents:
diff changeset
1324 tty->print("%d [Exception (%s): ", trace_exception_counter, msg);
a61af66fc99e Initial load
duke
parents:
diff changeset
1325 exception_oop->print_value();
a61af66fc99e Initial load
duke
parents:
diff changeset
1326 tty->print(" in ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1327 CodeBlob* blob = CodeCache::find_blob(exception_pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
1328 if (blob->is_nmethod()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1329 ((nmethod*)blob)->method()->print_value();
a61af66fc99e Initial load
duke
parents:
diff changeset
1330 } else if (blob->is_runtime_stub()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1331 tty->print("<runtime-stub>");
a61af66fc99e Initial load
duke
parents:
diff changeset
1332 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1333 tty->print("<unknown>");
a61af66fc99e Initial load
duke
parents:
diff changeset
1334 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1335 tty->print(" at " INTPTR_FORMAT, exception_pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
1336 tty->print_cr("]");
a61af66fc99e Initial load
duke
parents:
diff changeset
1337 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1338
a61af66fc99e Initial load
duke
parents:
diff changeset
1339 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1340
a61af66fc99e Initial load
duke
parents:
diff changeset
1341
a61af66fc99e Initial load
duke
parents:
diff changeset
1342 # ifdef ENABLE_ZAP_DEAD_LOCALS
a61af66fc99e Initial load
duke
parents:
diff changeset
1343 // Called from call sites in compiled code with oop maps (actually safepoints)
a61af66fc99e Initial load
duke
parents:
diff changeset
1344 // Zaps dead locals in first java frame.
a61af66fc99e Initial load
duke
parents:
diff changeset
1345 // Is entry because may need to lock to generate oop maps
a61af66fc99e Initial load
duke
parents:
diff changeset
1346 // Currently, only used for compiler frames, but someday may be used
a61af66fc99e Initial load
duke
parents:
diff changeset
1347 // for interpreter frames, too.
a61af66fc99e Initial load
duke
parents:
diff changeset
1348
a61af66fc99e Initial load
duke
parents:
diff changeset
1349 int OptoRuntime::ZapDeadCompiledLocals_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1350
a61af66fc99e Initial load
duke
parents:
diff changeset
1351 // avoid pointers to member funcs with these helpers
a61af66fc99e Initial load
duke
parents:
diff changeset
1352 static bool is_java_frame( frame* f) { return f->is_java_frame(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1353 static bool is_native_frame(frame* f) { return f->is_native_frame(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1354
a61af66fc99e Initial load
duke
parents:
diff changeset
1355
a61af66fc99e Initial load
duke
parents:
diff changeset
1356 void OptoRuntime::zap_dead_java_or_native_locals(JavaThread* thread,
a61af66fc99e Initial load
duke
parents:
diff changeset
1357 bool (*is_this_the_right_frame_to_zap)(frame*)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1358 assert(JavaThread::current() == thread, "is this needed?");
a61af66fc99e Initial load
duke
parents:
diff changeset
1359
a61af66fc99e Initial load
duke
parents:
diff changeset
1360 if ( !ZapDeadCompiledLocals ) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1361
a61af66fc99e Initial load
duke
parents:
diff changeset
1362 bool skip = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1363
a61af66fc99e Initial load
duke
parents:
diff changeset
1364 if ( ZapDeadCompiledLocalsFirst == 0 ) ; // nothing special
a61af66fc99e Initial load
duke
parents:
diff changeset
1365 else if ( ZapDeadCompiledLocalsFirst > ZapDeadCompiledLocals_count ) skip = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1366 else if ( ZapDeadCompiledLocalsFirst == ZapDeadCompiledLocals_count )
a61af66fc99e Initial load
duke
parents:
diff changeset
1367 warning("starting zapping after skipping");
a61af66fc99e Initial load
duke
parents:
diff changeset
1368
a61af66fc99e Initial load
duke
parents:
diff changeset
1369 if ( ZapDeadCompiledLocalsLast == -1 ) ; // nothing special
a61af66fc99e Initial load
duke
parents:
diff changeset
1370 else if ( ZapDeadCompiledLocalsLast < ZapDeadCompiledLocals_count ) skip = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1371 else if ( ZapDeadCompiledLocalsLast == ZapDeadCompiledLocals_count )
a61af66fc99e Initial load
duke
parents:
diff changeset
1372 warning("about to zap last zap");
a61af66fc99e Initial load
duke
parents:
diff changeset
1373
a61af66fc99e Initial load
duke
parents:
diff changeset
1374 ++ZapDeadCompiledLocals_count; // counts skipped zaps, too
a61af66fc99e Initial load
duke
parents:
diff changeset
1375
a61af66fc99e Initial load
duke
parents:
diff changeset
1376 if ( skip ) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1377
a61af66fc99e Initial load
duke
parents:
diff changeset
1378 // find java frame and zap it
a61af66fc99e Initial load
duke
parents:
diff changeset
1379
a61af66fc99e Initial load
duke
parents:
diff changeset
1380 for (StackFrameStream sfs(thread); !sfs.is_done(); sfs.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1381 if (is_this_the_right_frame_to_zap(sfs.current()) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1382 sfs.current()->zap_dead_locals(thread, sfs.register_map());
a61af66fc99e Initial load
duke
parents:
diff changeset
1383 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1384 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1385 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1386 warning("no frame found to zap in zap_dead_Java_locals_C");
a61af66fc99e Initial load
duke
parents:
diff changeset
1387 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1388
a61af66fc99e Initial load
duke
parents:
diff changeset
1389 JRT_LEAF(void, OptoRuntime::zap_dead_Java_locals_C(JavaThread* thread))
a61af66fc99e Initial load
duke
parents:
diff changeset
1390 zap_dead_java_or_native_locals(thread, is_java_frame);
a61af66fc99e Initial load
duke
parents:
diff changeset
1391 JRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1392
a61af66fc99e Initial load
duke
parents:
diff changeset
1393 // The following does not work because for one thing, the
a61af66fc99e Initial load
duke
parents:
diff changeset
1394 // thread state is wrong; it expects java, but it is native.
605
98cb887364d3 6810672: Comment typos
twisti
parents: 342
diff changeset
1395 // Also, the invariants in a native stub are different and
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1396 // I'm not sure it is safe to have a MachCalRuntimeDirectNode
a61af66fc99e Initial load
duke
parents:
diff changeset
1397 // in there.
a61af66fc99e Initial load
duke
parents:
diff changeset
1398 // So for now, we do not zap in native stubs.
a61af66fc99e Initial load
duke
parents:
diff changeset
1399
a61af66fc99e Initial load
duke
parents:
diff changeset
1400 JRT_LEAF(void, OptoRuntime::zap_dead_native_locals_C(JavaThread* thread))
a61af66fc99e Initial load
duke
parents:
diff changeset
1401 zap_dead_java_or_native_locals(thread, is_native_frame);
a61af66fc99e Initial load
duke
parents:
diff changeset
1402 JRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1403
a61af66fc99e Initial load
duke
parents:
diff changeset
1404 # endif