annotate src/share/vm/interpreter/interpreterRuntime.cpp @ 6972:bd7a7ce2e264

6830717: replay of compilations would help with debugging Summary: When java process crashed in compiler thread, repeat the compilation process will help finding root cause. This is done with using SA dump application class data and replay data from core dump, then use debug version of jvm to recompile the problematic java method. Reviewed-by: kvn, twisti, sspitsyn Contributed-by: yumin.qi@oracle.com
author minqi
date Mon, 12 Nov 2012 14:03:53 -0800
parents 64672b22ef05
children e522a00b91aa 80e866b1d053
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
6213
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6145
diff changeset
2 * Copyright (c) 1997, 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: 1507
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1507
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: 1507
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: 1913
diff changeset
25 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
26 #include "classfile/systemDictionary.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
27 #include "classfile/vmSymbols.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
28 #include "compiler/compileBroker.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
29 #include "gc_interface/collectedHeap.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
30 #include "interpreter/interpreter.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
31 #include "interpreter/interpreterRuntime.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
32 #include "interpreter/linkResolver.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
33 #include "interpreter/templateTable.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
34 #include "memory/oopFactory.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
35 #include "memory/universe.inline.hpp"
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
36 #include "oops/constantPool.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
37 #include "oops/instanceKlass.hpp"
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
38 #include "oops/methodData.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
39 #include "oops/objArrayKlass.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
40 #include "oops/oop.inline.hpp"
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2144
diff changeset
41 #include "oops/symbol.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
42 #include "prims/jvmtiExport.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
43 #include "prims/nativeLookup.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
44 #include "runtime/biasedLocking.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
45 #include "runtime/compilationPolicy.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
46 #include "runtime/deoptimization.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
47 #include "runtime/fieldDescriptor.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
48 #include "runtime/handles.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
49 #include "runtime/interfaceSupport.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
50 #include "runtime/java.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
51 #include "runtime/jfieldIDWorkaround.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
52 #include "runtime/osThread.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
53 #include "runtime/sharedRuntime.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
54 #include "runtime/stubRoutines.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
55 #include "runtime/synchronizer.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
56 #include "runtime/threadCritical.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
57 #include "utilities/events.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
58 #ifdef TARGET_ARCH_x86
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
59 # include "vm_version_x86.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
60 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
61 #ifdef TARGET_ARCH_sparc
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
62 # include "vm_version_sparc.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
63 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
64 #ifdef TARGET_ARCH_zero
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
65 # include "vm_version_zero.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
66 #endif
2192
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
67 #ifdef TARGET_ARCH_arm
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
68 # include "vm_version_arm.hpp"
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
69 #endif
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
70 #ifdef TARGET_ARCH_ppc
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
71 # include "vm_version_ppc.hpp"
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
72 #endif
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
73 #ifdef COMPILER2
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
74 #include "opto/runtime.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
75 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
76
a61af66fc99e Initial load
duke
parents:
diff changeset
77 class UnlockFlagSaver {
a61af66fc99e Initial load
duke
parents:
diff changeset
78 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
79 JavaThread* _thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
80 bool _do_not_unlock;
a61af66fc99e Initial load
duke
parents:
diff changeset
81 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
82 UnlockFlagSaver(JavaThread* t) {
a61af66fc99e Initial load
duke
parents:
diff changeset
83 _thread = t;
a61af66fc99e Initial load
duke
parents:
diff changeset
84 _do_not_unlock = t->do_not_unlock_if_synchronized();
a61af66fc99e Initial load
duke
parents:
diff changeset
85 t->set_do_not_unlock_if_synchronized(false);
a61af66fc99e Initial load
duke
parents:
diff changeset
86 }
a61af66fc99e Initial load
duke
parents:
diff changeset
87 ~UnlockFlagSaver() {
a61af66fc99e Initial load
duke
parents:
diff changeset
88 _thread->set_do_not_unlock_if_synchronized(_do_not_unlock);
a61af66fc99e Initial load
duke
parents:
diff changeset
89 }
a61af66fc99e Initial load
duke
parents:
diff changeset
90 };
a61af66fc99e Initial load
duke
parents:
diff changeset
91
a61af66fc99e Initial load
duke
parents:
diff changeset
92 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
93 // State accessors
a61af66fc99e Initial load
duke
parents:
diff changeset
94
a61af66fc99e Initial load
duke
parents:
diff changeset
95 void InterpreterRuntime::set_bcp_and_mdp(address bcp, JavaThread *thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
96 last_frame(thread).interpreter_frame_set_bcp(bcp);
a61af66fc99e Initial load
duke
parents:
diff changeset
97 if (ProfileInterpreter) {
a61af66fc99e Initial load
duke
parents:
diff changeset
98 // ProfileTraps uses MDOs independently of ProfileInterpreter.
a61af66fc99e Initial load
duke
parents:
diff changeset
99 // That is why we must check both ProfileInterpreter and mdo != NULL.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
100 MethodData* mdo = last_frame(thread).interpreter_frame_method()->method_data();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
101 if (mdo != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
102 NEEDS_CLEANUP;
a61af66fc99e Initial load
duke
parents:
diff changeset
103 last_frame(thread).interpreter_frame_set_mdp(mdo->bci_to_dp(last_frame(thread).interpreter_frame_bci()));
a61af66fc99e Initial load
duke
parents:
diff changeset
104 }
a61af66fc99e Initial load
duke
parents:
diff changeset
105 }
a61af66fc99e Initial load
duke
parents:
diff changeset
106 }
a61af66fc99e Initial load
duke
parents:
diff changeset
107
a61af66fc99e Initial load
duke
parents:
diff changeset
108 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
109 // Constants
a61af66fc99e Initial load
duke
parents:
diff changeset
110
a61af66fc99e Initial load
duke
parents:
diff changeset
111
a61af66fc99e Initial load
duke
parents:
diff changeset
112 IRT_ENTRY(void, InterpreterRuntime::ldc(JavaThread* thread, bool wide))
a61af66fc99e Initial load
duke
parents:
diff changeset
113 // access constant pool
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
114 ConstantPool* pool = method(thread)->constants();
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1507
diff changeset
115 int index = wide ? get_index_u2(thread, Bytecodes::_ldc_w) : get_index_u1(thread, Bytecodes::_ldc);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
116 constantTag tag = pool->tag_at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
117
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
118 assert (tag.is_unresolved_klass() || tag.is_klass(), "wrong ldc call");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
119 Klass* klass = pool->klass_at(index, CHECK);
2376
c7f3d0b4570f 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 2357
diff changeset
120 oop java_class = klass->java_mirror();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
121 thread->set_vm_result(java_class);
a61af66fc99e Initial load
duke
parents:
diff changeset
122 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
123
1602
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
124 IRT_ENTRY(void, InterpreterRuntime::resolve_ldc(JavaThread* thread, Bytecodes::Code bytecode)) {
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
125 assert(bytecode == Bytecodes::_fast_aldc ||
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
126 bytecode == Bytecodes::_fast_aldc_w, "wrong bc");
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
127 ResourceMark rm(thread);
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
128 methodHandle m (thread, method(thread));
2142
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1986
diff changeset
129 Bytecode_loadconstant ldc(m, bci(thread));
3403
7db2b9499c36 7046732: JSR 292 assert(result == cpce->f1()) failed: expected result for assembly code
never
parents: 2460
diff changeset
130 oop result = ldc.resolve_constant(CHECK);
7db2b9499c36 7046732: JSR 292 assert(result == cpce->f1()) failed: expected result for assembly code
never
parents: 2460
diff changeset
131 #ifdef ASSERT
7db2b9499c36 7046732: JSR 292 assert(result == cpce->f1()) failed: expected result for assembly code
never
parents: 2460
diff changeset
132 {
7db2b9499c36 7046732: JSR 292 assert(result == cpce->f1()) failed: expected result for assembly code
never
parents: 2460
diff changeset
133 // The bytecode wrappers aren't GC-safe so construct a new one
7db2b9499c36 7046732: JSR 292 assert(result == cpce->f1()) failed: expected result for assembly code
never
parents: 2460
diff changeset
134 Bytecode_loadconstant ldc2(m, bci(thread));
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
135 oop coop = m->constants()->resolved_references()->obj_at(ldc2.cache_index());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
136 assert(result == coop, "expected result for assembly code");
3403
7db2b9499c36 7046732: JSR 292 assert(result == cpce->f1()) failed: expected result for assembly code
never
parents: 2460
diff changeset
137 }
7db2b9499c36 7046732: JSR 292 assert(result == cpce->f1()) failed: expected result for assembly code
never
parents: 2460
diff changeset
138 #endif
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
139 thread->set_vm_result(result);
1602
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
140 }
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
141 IRT_END
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
142
0
a61af66fc99e Initial load
duke
parents:
diff changeset
143
a61af66fc99e Initial load
duke
parents:
diff changeset
144 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
145 // Allocation
a61af66fc99e Initial load
duke
parents:
diff changeset
146
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
147 IRT_ENTRY(void, InterpreterRuntime::_new(JavaThread* thread, ConstantPool* pool, int index))
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
148 Klass* k_oop = pool->klass_at(index, CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
149 instanceKlassHandle klass (THREAD, k_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
150
a61af66fc99e Initial load
duke
parents:
diff changeset
151 // Make sure we are not instantiating an abstract klass
a61af66fc99e Initial load
duke
parents:
diff changeset
152 klass->check_valid_for_instantiation(true, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
153
a61af66fc99e Initial load
duke
parents:
diff changeset
154 // Make sure klass is initialized
a61af66fc99e Initial load
duke
parents:
diff changeset
155 klass->initialize(CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
156
a61af66fc99e Initial load
duke
parents:
diff changeset
157 // At this point the class may not be fully initialized
a61af66fc99e Initial load
duke
parents:
diff changeset
158 // because of recursive initialization. If it is fully
a61af66fc99e Initial load
duke
parents:
diff changeset
159 // initialized & has_finalized is not set, we rewrite
a61af66fc99e Initial load
duke
parents:
diff changeset
160 // it into its fast version (Note: no locking is needed
a61af66fc99e Initial load
duke
parents:
diff changeset
161 // here since this is an atomic byte write and can be
a61af66fc99e Initial load
duke
parents:
diff changeset
162 // done more than once).
a61af66fc99e Initial load
duke
parents:
diff changeset
163 //
a61af66fc99e Initial load
duke
parents:
diff changeset
164 // Note: In case of classes with has_finalized we don't
a61af66fc99e Initial load
duke
parents:
diff changeset
165 // rewrite since that saves us an extra check in
a61af66fc99e Initial load
duke
parents:
diff changeset
166 // the fast version which then would call the
a61af66fc99e Initial load
duke
parents:
diff changeset
167 // slow version anyway (and do a call back into
a61af66fc99e Initial load
duke
parents:
diff changeset
168 // Java).
a61af66fc99e Initial load
duke
parents:
diff changeset
169 // If we have a breakpoint, then we don't rewrite
a61af66fc99e Initial load
duke
parents:
diff changeset
170 // because the _breakpoint bytecode would be lost.
a61af66fc99e Initial load
duke
parents:
diff changeset
171 oop obj = klass->allocate_instance(CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
172 thread->set_vm_result(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
173 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
174
a61af66fc99e Initial load
duke
parents:
diff changeset
175
a61af66fc99e Initial load
duke
parents:
diff changeset
176 IRT_ENTRY(void, InterpreterRuntime::newarray(JavaThread* thread, BasicType type, jint size))
a61af66fc99e Initial load
duke
parents:
diff changeset
177 oop obj = oopFactory::new_typeArray(type, size, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
178 thread->set_vm_result(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
179 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
180
a61af66fc99e Initial load
duke
parents:
diff changeset
181
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
182 IRT_ENTRY(void, InterpreterRuntime::anewarray(JavaThread* thread, ConstantPool* pool, int index, jint size))
0
a61af66fc99e Initial load
duke
parents:
diff changeset
183 // Note: no oopHandle for pool & klass needed since they are not used
a61af66fc99e Initial load
duke
parents:
diff changeset
184 // anymore after new_objArray() and no GC can happen before.
a61af66fc99e Initial load
duke
parents:
diff changeset
185 // (This may have to change if this code changes!)
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
186 Klass* klass = pool->klass_at(index, CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
187 objArrayOop obj = oopFactory::new_objArray(klass, size, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
188 thread->set_vm_result(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
189 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
190
a61af66fc99e Initial load
duke
parents:
diff changeset
191
a61af66fc99e Initial load
duke
parents:
diff changeset
192 IRT_ENTRY(void, InterpreterRuntime::multianewarray(JavaThread* thread, jint* first_size_address))
a61af66fc99e Initial load
duke
parents:
diff changeset
193 // We may want to pass in more arguments - could make this slightly faster
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
194 ConstantPool* constants = method(thread)->constants();
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1507
diff changeset
195 int i = get_index_u2(thread, Bytecodes::_multianewarray);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
196 Klass* klass = constants->klass_at(i, CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
197 int nof_dims = number_of_dimensions(thread);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
198 assert(klass->is_klass(), "not a class");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
199 assert(nof_dims >= 1, "multianewarray rank must be nonzero");
a61af66fc99e Initial load
duke
parents:
diff changeset
200
a61af66fc99e Initial load
duke
parents:
diff changeset
201 // We must create an array of jints to pass to multi_allocate.
a61af66fc99e Initial load
duke
parents:
diff changeset
202 ResourceMark rm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
203 const int small_dims = 10;
a61af66fc99e Initial load
duke
parents:
diff changeset
204 jint dim_array[small_dims];
a61af66fc99e Initial load
duke
parents:
diff changeset
205 jint *dims = &dim_array[0];
a61af66fc99e Initial load
duke
parents:
diff changeset
206 if (nof_dims > small_dims) {
a61af66fc99e Initial load
duke
parents:
diff changeset
207 dims = (jint*) NEW_RESOURCE_ARRAY(jint, nof_dims);
a61af66fc99e Initial load
duke
parents:
diff changeset
208 }
a61af66fc99e Initial load
duke
parents:
diff changeset
209 for (int index = 0; index < nof_dims; index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
210 // offset from first_size_address is addressed as local[index]
a61af66fc99e Initial load
duke
parents:
diff changeset
211 int n = Interpreter::local_offset_in_bytes(index)/jintSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
212 dims[index] = first_size_address[n];
a61af66fc99e Initial load
duke
parents:
diff changeset
213 }
6831
d8ce2825b193 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 6737
diff changeset
214 oop obj = ArrayKlass::cast(klass)->multi_allocate(nof_dims, dims, CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
215 thread->set_vm_result(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
216 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
217
a61af66fc99e Initial load
duke
parents:
diff changeset
218
a61af66fc99e Initial load
duke
parents:
diff changeset
219 IRT_ENTRY(void, InterpreterRuntime::register_finalizer(JavaThread* thread, oopDesc* obj))
a61af66fc99e Initial load
duke
parents:
diff changeset
220 assert(obj->is_oop(), "must be a valid oop");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
221 assert(obj->klass()->has_finalizer(), "shouldn't be here otherwise");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
222 InstanceKlass::register_finalizer(instanceOop(obj), CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
223 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
224
a61af66fc99e Initial load
duke
parents:
diff changeset
225
a61af66fc99e Initial load
duke
parents:
diff changeset
226 // Quicken instance-of and check-cast bytecodes
a61af66fc99e Initial load
duke
parents:
diff changeset
227 IRT_ENTRY(void, InterpreterRuntime::quicken_io_cc(JavaThread* thread))
a61af66fc99e Initial load
duke
parents:
diff changeset
228 // Force resolving; quicken the bytecode
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1507
diff changeset
229 int which = get_index_u2(thread, Bytecodes::_checkcast);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
230 ConstantPool* cpool = method(thread)->constants();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
231 // We'd expect to assert that we're only here to quicken bytecodes, but in a multithreaded
a61af66fc99e Initial load
duke
parents:
diff changeset
232 // program we might have seen an unquick'd bytecode in the interpreter but have another
a61af66fc99e Initial load
duke
parents:
diff changeset
233 // thread quicken the bytecode before we get here.
a61af66fc99e Initial load
duke
parents:
diff changeset
234 // assert( cpool->tag_at(which).is_unresolved_klass(), "should only come here to quicken bytecodes" );
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
235 Klass* klass = cpool->klass_at(which, CHECK);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
236 thread->set_vm_result_2(klass);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
237 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
238
a61af66fc99e Initial load
duke
parents:
diff changeset
239
a61af66fc99e Initial load
duke
parents:
diff changeset
240 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
241 // Exceptions
a61af66fc99e Initial load
duke
parents:
diff changeset
242
a61af66fc99e Initial load
duke
parents:
diff changeset
243 // Assume the compiler is (or will be) interested in this event.
a61af66fc99e Initial load
duke
parents:
diff changeset
244 // If necessary, create an MDO to hold the information, and record it.
a61af66fc99e Initial load
duke
parents:
diff changeset
245 void InterpreterRuntime::note_trap(JavaThread* thread, int reason, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
246 assert(ProfileTraps, "call me only if profiling");
a61af66fc99e Initial load
duke
parents:
diff changeset
247 methodHandle trap_method(thread, method(thread));
1793
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1783
diff changeset
248
0
a61af66fc99e Initial load
duke
parents:
diff changeset
249 if (trap_method.not_null()) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
250 MethodData* trap_mdo = trap_method->method_data();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
251 if (trap_mdo == NULL) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
252 Method::build_interpreter_method_data(trap_method, THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
253 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
254 assert((PENDING_EXCEPTION->is_a(SystemDictionary::OutOfMemoryError_klass())), "we expect only an OOM error here");
a61af66fc99e Initial load
duke
parents:
diff changeset
255 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
256 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
257 trap_mdo = trap_method->method_data();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
258 // and fall through...
a61af66fc99e Initial load
duke
parents:
diff changeset
259 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
260 if (trap_mdo != NULL) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
261 // Update per-method count of trap events. The interpreter
a61af66fc99e Initial load
duke
parents:
diff changeset
262 // is updating the MDO to simulate the effect of compiler traps.
a61af66fc99e Initial load
duke
parents:
diff changeset
263 int trap_bci = trap_method->bci_from(bcp(thread));
a61af66fc99e Initial load
duke
parents:
diff changeset
264 Deoptimization::update_method_data_from_interpreter(trap_mdo, trap_bci, reason);
a61af66fc99e Initial load
duke
parents:
diff changeset
265 }
a61af66fc99e Initial load
duke
parents:
diff changeset
266 }
a61af66fc99e Initial load
duke
parents:
diff changeset
267 }
a61af66fc99e Initial load
duke
parents:
diff changeset
268
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
269 static Handle get_preinitialized_exception(Klass* k, TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
270 // get klass
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
271 InstanceKlass* klass = InstanceKlass::cast(k);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
272 assert(klass->is_initialized(),
a61af66fc99e Initial load
duke
parents:
diff changeset
273 "this klass should have been initialized during VM initialization");
a61af66fc99e Initial load
duke
parents:
diff changeset
274 // create instance - do not call constructor since we may have no
a61af66fc99e Initial load
duke
parents:
diff changeset
275 // (java) stack space left (should assert constructor is empty)
a61af66fc99e Initial load
duke
parents:
diff changeset
276 Handle exception;
a61af66fc99e Initial load
duke
parents:
diff changeset
277 oop exception_oop = klass->allocate_instance(CHECK_(exception));
a61af66fc99e Initial load
duke
parents:
diff changeset
278 exception = Handle(THREAD, exception_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
279 if (StackTraceInThrowable) {
a61af66fc99e Initial load
duke
parents:
diff changeset
280 java_lang_Throwable::fill_in_stack_trace(exception);
a61af66fc99e Initial load
duke
parents:
diff changeset
281 }
a61af66fc99e Initial load
duke
parents:
diff changeset
282 return exception;
a61af66fc99e Initial load
duke
parents:
diff changeset
283 }
a61af66fc99e Initial load
duke
parents:
diff changeset
284
a61af66fc99e Initial load
duke
parents:
diff changeset
285 // Special handling for stack overflow: since we don't have any (java) stack
a61af66fc99e Initial load
duke
parents:
diff changeset
286 // space left we use the pre-allocated & pre-initialized StackOverflowError
a61af66fc99e Initial load
duke
parents:
diff changeset
287 // klass to create an stack overflow error instance. We do not call its
a61af66fc99e Initial load
duke
parents:
diff changeset
288 // constructor for the same reason (it is empty, anyway).
a61af66fc99e Initial load
duke
parents:
diff changeset
289 IRT_ENTRY(void, InterpreterRuntime::throw_StackOverflowError(JavaThread* thread))
a61af66fc99e Initial load
duke
parents:
diff changeset
290 Handle exception = get_preinitialized_exception(
a61af66fc99e Initial load
duke
parents:
diff changeset
291 SystemDictionary::StackOverflowError_klass(),
a61af66fc99e Initial load
duke
parents:
diff changeset
292 CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
293 THROW_HANDLE(exception);
a61af66fc99e Initial load
duke
parents:
diff changeset
294 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
295
a61af66fc99e Initial load
duke
parents:
diff changeset
296
a61af66fc99e Initial load
duke
parents:
diff changeset
297 IRT_ENTRY(void, InterpreterRuntime::create_exception(JavaThread* thread, char* name, char* message))
a61af66fc99e Initial load
duke
parents:
diff changeset
298 // lookup exception klass
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2144
diff changeset
299 TempNewSymbol s = SymbolTable::new_symbol(name, CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
300 if (ProfileTraps) {
a61af66fc99e Initial load
duke
parents:
diff changeset
301 if (s == vmSymbols::java_lang_ArithmeticException()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
302 note_trap(thread, Deoptimization::Reason_div0_check, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
303 } else if (s == vmSymbols::java_lang_NullPointerException()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
304 note_trap(thread, Deoptimization::Reason_null_check, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
305 }
a61af66fc99e Initial load
duke
parents:
diff changeset
306 }
a61af66fc99e Initial load
duke
parents:
diff changeset
307 // create exception
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2144
diff changeset
308 Handle exception = Exceptions::new_exception(thread, s, message);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
309 thread->set_vm_result(exception());
a61af66fc99e Initial load
duke
parents:
diff changeset
310 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
311
a61af66fc99e Initial load
duke
parents:
diff changeset
312
a61af66fc99e Initial load
duke
parents:
diff changeset
313 IRT_ENTRY(void, InterpreterRuntime::create_klass_exception(JavaThread* thread, char* name, oopDesc* obj))
a61af66fc99e Initial load
duke
parents:
diff changeset
314 ResourceMark rm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
315 const char* klass_name = Klass::cast(obj->klass())->external_name();
a61af66fc99e Initial load
duke
parents:
diff changeset
316 // lookup exception klass
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2144
diff changeset
317 TempNewSymbol s = SymbolTable::new_symbol(name, CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
318 if (ProfileTraps) {
a61af66fc99e Initial load
duke
parents:
diff changeset
319 note_trap(thread, Deoptimization::Reason_class_check, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
320 }
a61af66fc99e Initial load
duke
parents:
diff changeset
321 // create exception, with klass name as detail message
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2144
diff changeset
322 Handle exception = Exceptions::new_exception(thread, s, klass_name);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
323 thread->set_vm_result(exception());
a61af66fc99e Initial load
duke
parents:
diff changeset
324 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
325
a61af66fc99e Initial load
duke
parents:
diff changeset
326
a61af66fc99e Initial load
duke
parents:
diff changeset
327 IRT_ENTRY(void, InterpreterRuntime::throw_ArrayIndexOutOfBoundsException(JavaThread* thread, char* name, jint index))
a61af66fc99e Initial load
duke
parents:
diff changeset
328 char message[jintAsStringSize];
a61af66fc99e Initial load
duke
parents:
diff changeset
329 // lookup exception klass
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2144
diff changeset
330 TempNewSymbol s = SymbolTable::new_symbol(name, CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
331 if (ProfileTraps) {
a61af66fc99e Initial load
duke
parents:
diff changeset
332 note_trap(thread, Deoptimization::Reason_range_check, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
333 }
a61af66fc99e Initial load
duke
parents:
diff changeset
334 // create exception
a61af66fc99e Initial load
duke
parents:
diff changeset
335 sprintf(message, "%d", index);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2144
diff changeset
336 THROW_MSG(s, message);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
337 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
338
a61af66fc99e Initial load
duke
parents:
diff changeset
339 IRT_ENTRY(void, InterpreterRuntime::throw_ClassCastException(
a61af66fc99e Initial load
duke
parents:
diff changeset
340 JavaThread* thread, oopDesc* obj))
a61af66fc99e Initial load
duke
parents:
diff changeset
341
a61af66fc99e Initial load
duke
parents:
diff changeset
342 ResourceMark rm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
343 char* message = SharedRuntime::generate_class_cast_message(
a61af66fc99e Initial load
duke
parents:
diff changeset
344 thread, Klass::cast(obj->klass())->external_name());
a61af66fc99e Initial load
duke
parents:
diff changeset
345
a61af66fc99e Initial load
duke
parents:
diff changeset
346 if (ProfileTraps) {
a61af66fc99e Initial load
duke
parents:
diff changeset
347 note_trap(thread, Deoptimization::Reason_class_check, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
348 }
a61af66fc99e Initial load
duke
parents:
diff changeset
349
a61af66fc99e Initial load
duke
parents:
diff changeset
350 // create exception
a61af66fc99e Initial load
duke
parents:
diff changeset
351 THROW_MSG(vmSymbols::java_lang_ClassCastException(), message);
a61af66fc99e Initial load
duke
parents:
diff changeset
352 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
353
a61af66fc99e Initial load
duke
parents:
diff changeset
354 // exception_handler_for_exception(...) returns the continuation address,
a61af66fc99e Initial load
duke
parents:
diff changeset
355 // the exception oop (via TLS) and sets the bci/bcp for the continuation.
a61af66fc99e Initial load
duke
parents:
diff changeset
356 // The exception oop is returned to make sure it is preserved over GC (it
a61af66fc99e Initial load
duke
parents:
diff changeset
357 // is only on the stack if the exception was thrown explicitly via athrow).
a61af66fc99e Initial load
duke
parents:
diff changeset
358 // During this operation, the expression stack contains the values for the
a61af66fc99e Initial load
duke
parents:
diff changeset
359 // bci where the exception happened. If the exception was propagated back
a61af66fc99e Initial load
duke
parents:
diff changeset
360 // from a call, the expression stack contains the values for the bci at the
a61af66fc99e Initial load
duke
parents:
diff changeset
361 // invoke w/o arguments (i.e., as if one were inside the call).
a61af66fc99e Initial load
duke
parents:
diff changeset
362 IRT_ENTRY(address, InterpreterRuntime::exception_handler_for_exception(JavaThread* thread, oopDesc* exception))
a61af66fc99e Initial load
duke
parents:
diff changeset
363
a61af66fc99e Initial load
duke
parents:
diff changeset
364 Handle h_exception(thread, exception);
a61af66fc99e Initial load
duke
parents:
diff changeset
365 methodHandle h_method (thread, method(thread));
a61af66fc99e Initial load
duke
parents:
diff changeset
366 constantPoolHandle h_constants(thread, h_method->constants());
a61af66fc99e Initial load
duke
parents:
diff changeset
367 bool should_repeat;
a61af66fc99e Initial load
duke
parents:
diff changeset
368 int handler_bci;
1602
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
369 int current_bci = bci(thread);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
370
a61af66fc99e Initial load
duke
parents:
diff changeset
371 // Need to do this check first since when _do_not_unlock_if_synchronized
a61af66fc99e Initial load
duke
parents:
diff changeset
372 // is set, we don't want to trigger any classloading which may make calls
a61af66fc99e Initial load
duke
parents:
diff changeset
373 // into java, or surprisingly find a matching exception handler for bci 0
a61af66fc99e Initial load
duke
parents:
diff changeset
374 // since at this moment the method hasn't been "officially" entered yet.
a61af66fc99e Initial load
duke
parents:
diff changeset
375 if (thread->do_not_unlock_if_synchronized()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
376 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
377 assert(current_bci == 0, "bci isn't zero for do_not_unlock_if_synchronized");
a61af66fc99e Initial load
duke
parents:
diff changeset
378 thread->set_vm_result(exception);
a61af66fc99e Initial load
duke
parents:
diff changeset
379 #ifdef CC_INTERP
a61af66fc99e Initial load
duke
parents:
diff changeset
380 return (address) -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
381 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
382 return Interpreter::remove_activation_entry();
a61af66fc99e Initial load
duke
parents:
diff changeset
383 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
384 }
a61af66fc99e Initial load
duke
parents:
diff changeset
385
a61af66fc99e Initial load
duke
parents:
diff changeset
386 do {
a61af66fc99e Initial load
duke
parents:
diff changeset
387 should_repeat = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
388
a61af66fc99e Initial load
duke
parents:
diff changeset
389 // assertions
a61af66fc99e Initial load
duke
parents:
diff changeset
390 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
391 assert(h_exception.not_null(), "NULL exceptions should be handled by athrow");
a61af66fc99e Initial load
duke
parents:
diff changeset
392 assert(h_exception->is_oop(), "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
393 // Check that exception is a subclass of Throwable, otherwise we have a VerifyError
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1138
diff changeset
394 if (!(h_exception->is_a(SystemDictionary::Throwable_klass()))) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
395 if (ExitVMOnVerifyError) vm_exit(-1);
a61af66fc99e Initial load
duke
parents:
diff changeset
396 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
397 }
a61af66fc99e Initial load
duke
parents:
diff changeset
398 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
399
a61af66fc99e Initial load
duke
parents:
diff changeset
400 // tracing
a61af66fc99e Initial load
duke
parents:
diff changeset
401 if (TraceExceptions) {
a61af66fc99e Initial load
duke
parents:
diff changeset
402 ttyLocker ttyl;
a61af66fc99e Initial load
duke
parents:
diff changeset
403 ResourceMark rm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
404 tty->print_cr("Exception <%s> (" INTPTR_FORMAT ")", h_exception->print_value_string(), (address)h_exception());
a61af66fc99e Initial load
duke
parents:
diff changeset
405 tty->print_cr(" thrown in interpreter method <%s>", h_method->print_value_string());
a61af66fc99e Initial load
duke
parents:
diff changeset
406 tty->print_cr(" at bci %d for thread " INTPTR_FORMAT, current_bci, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
407 }
a61af66fc99e Initial load
duke
parents:
diff changeset
408 // Don't go paging in something which won't be used.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
409 // else if (extable->length() == 0) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
410 // // disabled for now - interpreter is not using shortcut yet
a61af66fc99e Initial load
duke
parents:
diff changeset
411 // // (shortcut is not to call runtime if we have no exception handlers)
a61af66fc99e Initial load
duke
parents:
diff changeset
412 // // warning("performance bug: should not call runtime if method has no exception handlers");
a61af66fc99e Initial load
duke
parents:
diff changeset
413 // }
a61af66fc99e Initial load
duke
parents:
diff changeset
414 // for AbortVMOnException flag
a61af66fc99e Initial load
duke
parents:
diff changeset
415 NOT_PRODUCT(Exceptions::debug_check_abort(h_exception));
a61af66fc99e Initial load
duke
parents:
diff changeset
416
a61af66fc99e Initial load
duke
parents:
diff changeset
417 // exception handler lookup
a61af66fc99e Initial load
duke
parents:
diff changeset
418 KlassHandle h_klass(THREAD, h_exception->klass());
a61af66fc99e Initial load
duke
parents:
diff changeset
419 handler_bci = h_method->fast_exception_handler_bci_for(h_klass, current_bci, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
420 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
421 // We threw an exception while trying to find the exception handler.
a61af66fc99e Initial load
duke
parents:
diff changeset
422 // Transfer the new exception to the exception handle which will
a61af66fc99e Initial load
duke
parents:
diff changeset
423 // be set into thread local storage, and do another lookup for an
a61af66fc99e Initial load
duke
parents:
diff changeset
424 // exception handler for this exception, this time starting at the
a61af66fc99e Initial load
duke
parents:
diff changeset
425 // BCI of the exception handler which caused the exception to be
a61af66fc99e Initial load
duke
parents:
diff changeset
426 // thrown (bug 4307310).
a61af66fc99e Initial load
duke
parents:
diff changeset
427 h_exception = Handle(THREAD, PENDING_EXCEPTION);
a61af66fc99e Initial load
duke
parents:
diff changeset
428 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
429 if (handler_bci >= 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
430 current_bci = handler_bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
431 should_repeat = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
432 }
a61af66fc99e Initial load
duke
parents:
diff changeset
433 }
a61af66fc99e Initial load
duke
parents:
diff changeset
434 } while (should_repeat == true);
a61af66fc99e Initial load
duke
parents:
diff changeset
435
a61af66fc99e Initial load
duke
parents:
diff changeset
436 // notify JVMTI of an exception throw; JVMTI will detect if this is a first
a61af66fc99e Initial load
duke
parents:
diff changeset
437 // time throw or a stack unwinding throw and accordingly notify the debugger
1213
6deeaebad47a 6902182: 4/4 Starting with jdwp agent should not incur performance penalty
dcubed
parents: 1142
diff changeset
438 if (JvmtiExport::can_post_on_exceptions()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
439 JvmtiExport::post_exception_throw(thread, h_method(), bcp(thread), h_exception());
a61af66fc99e Initial load
duke
parents:
diff changeset
440 }
a61af66fc99e Initial load
duke
parents:
diff changeset
441
a61af66fc99e Initial load
duke
parents:
diff changeset
442 #ifdef CC_INTERP
a61af66fc99e Initial load
duke
parents:
diff changeset
443 address continuation = (address)(intptr_t) handler_bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
444 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
445 address continuation = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
446 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
447 address handler_pc = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
448 if (handler_bci < 0 || !thread->reguard_stack((address) &continuation)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
449 // Forward exception to callee (leaving bci/bcp untouched) because (a) no
a61af66fc99e Initial load
duke
parents:
diff changeset
450 // handler in this method, or (b) after a stack overflow there is not yet
a61af66fc99e Initial load
duke
parents:
diff changeset
451 // enough stack space available to reprotect the stack.
a61af66fc99e Initial load
duke
parents:
diff changeset
452 #ifndef CC_INTERP
a61af66fc99e Initial load
duke
parents:
diff changeset
453 continuation = Interpreter::remove_activation_entry();
a61af66fc99e Initial load
duke
parents:
diff changeset
454 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
455 // Count this for compilation purposes
a61af66fc99e Initial load
duke
parents:
diff changeset
456 h_method->interpreter_throwout_increment();
a61af66fc99e Initial load
duke
parents:
diff changeset
457 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
458 // handler in this method => change bci/bcp to handler bci/bcp and continue there
a61af66fc99e Initial load
duke
parents:
diff changeset
459 handler_pc = h_method->code_base() + handler_bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
460 #ifndef CC_INTERP
a61af66fc99e Initial load
duke
parents:
diff changeset
461 set_bcp_and_mdp(handler_pc, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
462 continuation = Interpreter::dispatch_table(vtos)[*handler_pc];
a61af66fc99e Initial load
duke
parents:
diff changeset
463 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
464 }
a61af66fc99e Initial load
duke
parents:
diff changeset
465 // notify debugger of an exception catch
a61af66fc99e Initial load
duke
parents:
diff changeset
466 // (this is good for exceptions caught in native methods as well)
1213
6deeaebad47a 6902182: 4/4 Starting with jdwp agent should not incur performance penalty
dcubed
parents: 1142
diff changeset
467 if (JvmtiExport::can_post_on_exceptions()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
468 JvmtiExport::notice_unwind_due_to_exception(thread, h_method(), handler_pc, h_exception(), (handler_pc != NULL));
a61af66fc99e Initial load
duke
parents:
diff changeset
469 }
a61af66fc99e Initial load
duke
parents:
diff changeset
470
a61af66fc99e Initial load
duke
parents:
diff changeset
471 thread->set_vm_result(h_exception());
a61af66fc99e Initial load
duke
parents:
diff changeset
472 return continuation;
a61af66fc99e Initial load
duke
parents:
diff changeset
473 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
474
a61af66fc99e Initial load
duke
parents:
diff changeset
475
a61af66fc99e Initial load
duke
parents:
diff changeset
476 IRT_ENTRY(void, InterpreterRuntime::throw_pending_exception(JavaThread* thread))
a61af66fc99e Initial load
duke
parents:
diff changeset
477 assert(thread->has_pending_exception(), "must only ne called if there's an exception pending");
a61af66fc99e Initial load
duke
parents:
diff changeset
478 // nothing to do - eventually we should remove this code entirely (see comments @ call sites)
a61af66fc99e Initial load
duke
parents:
diff changeset
479 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
480
a61af66fc99e Initial load
duke
parents:
diff changeset
481
a61af66fc99e Initial load
duke
parents:
diff changeset
482 IRT_ENTRY(void, InterpreterRuntime::throw_AbstractMethodError(JavaThread* thread))
a61af66fc99e Initial load
duke
parents:
diff changeset
483 THROW(vmSymbols::java_lang_AbstractMethodError());
a61af66fc99e Initial load
duke
parents:
diff changeset
484 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
485
a61af66fc99e Initial load
duke
parents:
diff changeset
486
a61af66fc99e Initial load
duke
parents:
diff changeset
487 IRT_ENTRY(void, InterpreterRuntime::throw_IncompatibleClassChangeError(JavaThread* thread))
a61af66fc99e Initial load
duke
parents:
diff changeset
488 THROW(vmSymbols::java_lang_IncompatibleClassChangeError());
a61af66fc99e Initial load
duke
parents:
diff changeset
489 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
490
a61af66fc99e Initial load
duke
parents:
diff changeset
491
a61af66fc99e Initial load
duke
parents:
diff changeset
492 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
493 // Fields
a61af66fc99e Initial load
duke
parents:
diff changeset
494 //
a61af66fc99e Initial load
duke
parents:
diff changeset
495
a61af66fc99e Initial load
duke
parents:
diff changeset
496 IRT_ENTRY(void, InterpreterRuntime::resolve_get_put(JavaThread* thread, Bytecodes::Code bytecode))
a61af66fc99e Initial load
duke
parents:
diff changeset
497 // resolve field
a61af66fc99e Initial load
duke
parents:
diff changeset
498 FieldAccessInfo info;
a61af66fc99e Initial load
duke
parents:
diff changeset
499 constantPoolHandle pool(thread, method(thread)->constants());
3852
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 3791
diff changeset
500 bool is_put = (bytecode == Bytecodes::_putfield || bytecode == Bytecodes::_putstatic);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
501 bool is_static = (bytecode == Bytecodes::_getstatic || bytecode == Bytecodes::_putstatic);
a61af66fc99e Initial load
duke
parents:
diff changeset
502
a61af66fc99e Initial load
duke
parents:
diff changeset
503 {
a61af66fc99e Initial load
duke
parents:
diff changeset
504 JvmtiHideSingleStepping jhss(thread);
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1507
diff changeset
505 LinkResolver::resolve_field(info, pool, get_index_u2_cpcache(thread, bytecode),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
506 bytecode, false, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
507 } // end JvmtiHideSingleStepping
a61af66fc99e Initial load
duke
parents:
diff changeset
508
a61af66fc99e Initial load
duke
parents:
diff changeset
509 // check if link resolution caused cpCache to be updated
a61af66fc99e Initial load
duke
parents:
diff changeset
510 if (already_resolved(thread)) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
511
a61af66fc99e Initial load
duke
parents:
diff changeset
512 // compute auxiliary field attributes
a61af66fc99e Initial load
duke
parents:
diff changeset
513 TosState state = as_TosState(info.field_type());
a61af66fc99e Initial load
duke
parents:
diff changeset
514
a61af66fc99e Initial load
duke
parents:
diff changeset
515 // We need to delay resolving put instructions on final fields
a61af66fc99e Initial load
duke
parents:
diff changeset
516 // until we actually invoke one. This is required so we throw
a61af66fc99e Initial load
duke
parents:
diff changeset
517 // exceptions at the correct place. If we do not resolve completely
a61af66fc99e Initial load
duke
parents:
diff changeset
518 // in the current pass, leaving the put_code set to zero will
a61af66fc99e Initial load
duke
parents:
diff changeset
519 // cause the next put instruction to reresolve.
a61af66fc99e Initial load
duke
parents:
diff changeset
520 Bytecodes::Code put_code = (Bytecodes::Code)0;
a61af66fc99e Initial load
duke
parents:
diff changeset
521
a61af66fc99e Initial load
duke
parents:
diff changeset
522 // We also need to delay resolving getstatic instructions until the
a61af66fc99e Initial load
duke
parents:
diff changeset
523 // class is intitialized. This is required so that access to the static
a61af66fc99e Initial load
duke
parents:
diff changeset
524 // field will call the initialization function every time until the class
a61af66fc99e Initial load
duke
parents:
diff changeset
525 // is completely initialized ala. in 2.17.5 in JVM Specification.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
526 InstanceKlass *klass = InstanceKlass::cast(info.klass()());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
527 bool uninitialized_static = ((bytecode == Bytecodes::_getstatic || bytecode == Bytecodes::_putstatic) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
528 !klass->is_initialized());
a61af66fc99e Initial load
duke
parents:
diff changeset
529 Bytecodes::Code get_code = (Bytecodes::Code)0;
a61af66fc99e Initial load
duke
parents:
diff changeset
530
a61af66fc99e Initial load
duke
parents:
diff changeset
531 if (!uninitialized_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
532 get_code = ((is_static) ? Bytecodes::_getstatic : Bytecodes::_getfield);
a61af66fc99e Initial load
duke
parents:
diff changeset
533 if (is_put || !info.access_flags().is_final()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
534 put_code = ((is_static) ? Bytecodes::_putstatic : Bytecodes::_putfield);
a61af66fc99e Initial load
duke
parents:
diff changeset
535 }
a61af66fc99e Initial load
duke
parents:
diff changeset
536 }
a61af66fc99e Initial load
duke
parents:
diff changeset
537
a61af66fc99e Initial load
duke
parents:
diff changeset
538 cache_entry(thread)->set_field(
a61af66fc99e Initial load
duke
parents:
diff changeset
539 get_code,
a61af66fc99e Initial load
duke
parents:
diff changeset
540 put_code,
a61af66fc99e Initial load
duke
parents:
diff changeset
541 info.klass(),
a61af66fc99e Initial load
duke
parents:
diff changeset
542 info.field_index(),
a61af66fc99e Initial load
duke
parents:
diff changeset
543 info.field_offset(),
a61af66fc99e Initial load
duke
parents:
diff changeset
544 state,
a61af66fc99e Initial load
duke
parents:
diff changeset
545 info.access_flags().is_final(),
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
546 info.access_flags().is_volatile(),
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
547 pool->pool_holder()
0
a61af66fc99e Initial load
duke
parents:
diff changeset
548 );
a61af66fc99e Initial load
duke
parents:
diff changeset
549 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
550
a61af66fc99e Initial load
duke
parents:
diff changeset
551
a61af66fc99e Initial load
duke
parents:
diff changeset
552 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
553 // Synchronization
a61af66fc99e Initial load
duke
parents:
diff changeset
554 //
a61af66fc99e Initial load
duke
parents:
diff changeset
555 // The interpreter's synchronization code is factored out so that it can
a61af66fc99e Initial load
duke
parents:
diff changeset
556 // be shared by method invocation and synchronized blocks.
a61af66fc99e Initial load
duke
parents:
diff changeset
557 //%note synchronization_3
a61af66fc99e Initial load
duke
parents:
diff changeset
558
a61af66fc99e Initial load
duke
parents:
diff changeset
559 static void trace_locking(Handle& h_locking_obj, bool is_locking) {
a61af66fc99e Initial load
duke
parents:
diff changeset
560 ObjectSynchronizer::trace_locking(h_locking_obj, false, true, is_locking);
a61af66fc99e Initial load
duke
parents:
diff changeset
561 }
a61af66fc99e Initial load
duke
parents:
diff changeset
562
a61af66fc99e Initial load
duke
parents:
diff changeset
563
a61af66fc99e Initial load
duke
parents:
diff changeset
564 //%note monitor_1
a61af66fc99e Initial load
duke
parents:
diff changeset
565 IRT_ENTRY_NO_ASYNC(void, InterpreterRuntime::monitorenter(JavaThread* thread, BasicObjectLock* elem))
a61af66fc99e Initial load
duke
parents:
diff changeset
566 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
567 thread->last_frame().interpreter_frame_verify_monitor(elem);
a61af66fc99e Initial load
duke
parents:
diff changeset
568 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
569 if (PrintBiasedLockingStatistics) {
a61af66fc99e Initial load
duke
parents:
diff changeset
570 Atomic::inc(BiasedLocking::slow_path_entry_count_addr());
a61af66fc99e Initial load
duke
parents:
diff changeset
571 }
a61af66fc99e Initial load
duke
parents:
diff changeset
572 Handle h_obj(thread, elem->obj());
a61af66fc99e Initial load
duke
parents:
diff changeset
573 assert(Universe::heap()->is_in_reserved_or_null(h_obj()),
a61af66fc99e Initial load
duke
parents:
diff changeset
574 "must be NULL or an object");
a61af66fc99e Initial load
duke
parents:
diff changeset
575 if (UseBiasedLocking) {
a61af66fc99e Initial load
duke
parents:
diff changeset
576 // Retry fast entry if bias is revoked to avoid unnecessary inflation
a61af66fc99e Initial load
duke
parents:
diff changeset
577 ObjectSynchronizer::fast_enter(h_obj, elem->lock(), true, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
578 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
579 ObjectSynchronizer::slow_enter(h_obj, elem->lock(), CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
580 }
a61af66fc99e Initial load
duke
parents:
diff changeset
581 assert(Universe::heap()->is_in_reserved_or_null(elem->obj()),
a61af66fc99e Initial load
duke
parents:
diff changeset
582 "must be NULL or an object");
a61af66fc99e Initial load
duke
parents:
diff changeset
583 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
584 thread->last_frame().interpreter_frame_verify_monitor(elem);
a61af66fc99e Initial load
duke
parents:
diff changeset
585 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
586 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
587
a61af66fc99e Initial load
duke
parents:
diff changeset
588
a61af66fc99e Initial load
duke
parents:
diff changeset
589 //%note monitor_1
a61af66fc99e Initial load
duke
parents:
diff changeset
590 IRT_ENTRY_NO_ASYNC(void, InterpreterRuntime::monitorexit(JavaThread* thread, BasicObjectLock* elem))
a61af66fc99e Initial load
duke
parents:
diff changeset
591 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
592 thread->last_frame().interpreter_frame_verify_monitor(elem);
a61af66fc99e Initial load
duke
parents:
diff changeset
593 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
594 Handle h_obj(thread, elem->obj());
a61af66fc99e Initial load
duke
parents:
diff changeset
595 assert(Universe::heap()->is_in_reserved_or_null(h_obj()),
a61af66fc99e Initial load
duke
parents:
diff changeset
596 "must be NULL or an object");
a61af66fc99e Initial load
duke
parents:
diff changeset
597 if (elem == NULL || h_obj()->is_unlocked()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
598 THROW(vmSymbols::java_lang_IllegalMonitorStateException());
a61af66fc99e Initial load
duke
parents:
diff changeset
599 }
a61af66fc99e Initial load
duke
parents:
diff changeset
600 ObjectSynchronizer::slow_exit(h_obj(), elem->lock(), thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
601 // Free entry. This must be done here, since a pending exception might be installed on
a61af66fc99e Initial load
duke
parents:
diff changeset
602 // exit. If it is not cleared, the exception handling code will try to unlock the monitor again.
a61af66fc99e Initial load
duke
parents:
diff changeset
603 elem->set_obj(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
604 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
605 thread->last_frame().interpreter_frame_verify_monitor(elem);
a61af66fc99e Initial load
duke
parents:
diff changeset
606 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
607 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
608
a61af66fc99e Initial load
duke
parents:
diff changeset
609
a61af66fc99e Initial load
duke
parents:
diff changeset
610 IRT_ENTRY(void, InterpreterRuntime::throw_illegal_monitor_state_exception(JavaThread* thread))
a61af66fc99e Initial load
duke
parents:
diff changeset
611 THROW(vmSymbols::java_lang_IllegalMonitorStateException());
a61af66fc99e Initial load
duke
parents:
diff changeset
612 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
613
a61af66fc99e Initial load
duke
parents:
diff changeset
614
a61af66fc99e Initial load
duke
parents:
diff changeset
615 IRT_ENTRY(void, InterpreterRuntime::new_illegal_monitor_state_exception(JavaThread* thread))
a61af66fc99e Initial load
duke
parents:
diff changeset
616 // Returns an illegal exception to install into the current thread. The
a61af66fc99e Initial load
duke
parents:
diff changeset
617 // pending_exception flag is cleared so normal exception handling does not
a61af66fc99e Initial load
duke
parents:
diff changeset
618 // trigger. Any current installed exception will be overwritten. This
a61af66fc99e Initial load
duke
parents:
diff changeset
619 // method will be called during an exception unwind.
a61af66fc99e Initial load
duke
parents:
diff changeset
620
a61af66fc99e Initial load
duke
parents:
diff changeset
621 assert(!HAS_PENDING_EXCEPTION, "no pending exception");
a61af66fc99e Initial load
duke
parents:
diff changeset
622 Handle exception(thread, thread->vm_result());
a61af66fc99e Initial load
duke
parents:
diff changeset
623 assert(exception() != NULL, "vm result should be set");
a61af66fc99e Initial load
duke
parents:
diff changeset
624 thread->set_vm_result(NULL); // clear vm result before continuing (may cause memory leaks and assert failures)
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1138
diff changeset
625 if (!exception->is_a(SystemDictionary::ThreadDeath_klass())) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
626 exception = get_preinitialized_exception(
a61af66fc99e Initial load
duke
parents:
diff changeset
627 SystemDictionary::IllegalMonitorStateException_klass(),
a61af66fc99e Initial load
duke
parents:
diff changeset
628 CATCH);
a61af66fc99e Initial load
duke
parents:
diff changeset
629 }
a61af66fc99e Initial load
duke
parents:
diff changeset
630 thread->set_vm_result(exception());
a61af66fc99e Initial load
duke
parents:
diff changeset
631 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
632
a61af66fc99e Initial load
duke
parents:
diff changeset
633
a61af66fc99e Initial load
duke
parents:
diff changeset
634 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
635 // Invokes
a61af66fc99e Initial load
duke
parents:
diff changeset
636
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
637 IRT_ENTRY(Bytecodes::Code, InterpreterRuntime::get_original_bytecode_at(JavaThread* thread, Method* method, address bcp))
0
a61af66fc99e Initial load
duke
parents:
diff changeset
638 return method->orig_bytecode_at(method->bci_from(bcp));
a61af66fc99e Initial load
duke
parents:
diff changeset
639 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
640
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
641 IRT_ENTRY(void, InterpreterRuntime::set_original_bytecode_at(JavaThread* thread, Method* method, address bcp, Bytecodes::Code new_code))
0
a61af66fc99e Initial load
duke
parents:
diff changeset
642 method->set_orig_bytecode_at(method->bci_from(bcp), new_code);
a61af66fc99e Initial load
duke
parents:
diff changeset
643 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
644
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
645 IRT_ENTRY(void, InterpreterRuntime::_breakpoint(JavaThread* thread, Method* method, address bcp))
0
a61af66fc99e Initial load
duke
parents:
diff changeset
646 JvmtiExport::post_raw_breakpoint(thread, method, bcp);
a61af66fc99e Initial load
duke
parents:
diff changeset
647 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
648
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
649 IRT_ENTRY(void, InterpreterRuntime::resolve_invoke(JavaThread* thread, Bytecodes::Code bytecode)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
650 // extract receiver from the outgoing argument list if necessary
a61af66fc99e Initial load
duke
parents:
diff changeset
651 Handle receiver(thread, NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
652 if (bytecode == Bytecodes::_invokevirtual || bytecode == Bytecodes::_invokeinterface) {
a61af66fc99e Initial load
duke
parents:
diff changeset
653 ResourceMark rm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
654 methodHandle m (thread, method(thread));
2142
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1986
diff changeset
655 Bytecode_invoke call(m, bci(thread));
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2144
diff changeset
656 Symbol* signature = call.signature();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
657 receiver = Handle(thread,
a61af66fc99e Initial load
duke
parents:
diff changeset
658 thread->last_frame().interpreter_callee_receiver(signature));
a61af66fc99e Initial load
duke
parents:
diff changeset
659 assert(Universe::heap()->is_in_reserved_or_null(receiver()),
a61af66fc99e Initial load
duke
parents:
diff changeset
660 "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
661 assert(receiver.is_null() ||
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
662 !Universe::heap()->is_in_reserved(receiver->klass()),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
663 "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
664 }
a61af66fc99e Initial load
duke
parents:
diff changeset
665
a61af66fc99e Initial load
duke
parents:
diff changeset
666 // resolve method
a61af66fc99e Initial load
duke
parents:
diff changeset
667 CallInfo info;
a61af66fc99e Initial load
duke
parents:
diff changeset
668 constantPoolHandle pool(thread, method(thread)->constants());
a61af66fc99e Initial load
duke
parents:
diff changeset
669
a61af66fc99e Initial load
duke
parents:
diff changeset
670 {
a61af66fc99e Initial load
duke
parents:
diff changeset
671 JvmtiHideSingleStepping jhss(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
672 LinkResolver::resolve_invoke(info, receiver, pool,
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1507
diff changeset
673 get_index_u2_cpcache(thread, bytecode), bytecode, CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
674 if (JvmtiExport::can_hotswap_or_post_breakpoint()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
675 int retry_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
676 while (info.resolved_method()->is_old()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
677 // It is very unlikely that method is redefined more than 100 times
a61af66fc99e Initial load
duke
parents:
diff changeset
678 // in the middle of resolve. If it is looping here more than 100 times
a61af66fc99e Initial load
duke
parents:
diff changeset
679 // means then there could be a bug here.
a61af66fc99e Initial load
duke
parents:
diff changeset
680 guarantee((retry_count++ < 100),
a61af66fc99e Initial load
duke
parents:
diff changeset
681 "Could not resolve to latest version of redefined method");
a61af66fc99e Initial load
duke
parents:
diff changeset
682 // method is redefined in the middle of resolve so re-try.
a61af66fc99e Initial load
duke
parents:
diff changeset
683 LinkResolver::resolve_invoke(info, receiver, pool,
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1507
diff changeset
684 get_index_u2_cpcache(thread, bytecode), bytecode, CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
685 }
a61af66fc99e Initial load
duke
parents:
diff changeset
686 }
a61af66fc99e Initial load
duke
parents:
diff changeset
687 } // end JvmtiHideSingleStepping
a61af66fc99e Initial load
duke
parents:
diff changeset
688
a61af66fc99e Initial load
duke
parents:
diff changeset
689 // check if link resolution caused cpCache to be updated
a61af66fc99e Initial load
duke
parents:
diff changeset
690 if (already_resolved(thread)) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
691
a61af66fc99e Initial load
duke
parents:
diff changeset
692 if (bytecode == Bytecodes::_invokeinterface) {
a61af66fc99e Initial load
duke
parents:
diff changeset
693
a61af66fc99e Initial load
duke
parents:
diff changeset
694 if (TraceItables && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
695 ResourceMark rm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
696 tty->print_cr("Resolving: klass: %s to method: %s", info.resolved_klass()->name()->as_C_string(), info.resolved_method()->name()->as_C_string());
a61af66fc99e Initial load
duke
parents:
diff changeset
697 }
a61af66fc99e Initial load
duke
parents:
diff changeset
698 if (info.resolved_method()->method_holder() ==
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1138
diff changeset
699 SystemDictionary::Object_klass()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
700 // NOTE: THIS IS A FIX FOR A CORNER CASE in the JVM spec
a61af66fc99e Initial load
duke
parents:
diff changeset
701 // (see also cpCacheOop.cpp for details)
a61af66fc99e Initial load
duke
parents:
diff changeset
702 methodHandle rm = info.resolved_method();
a61af66fc99e Initial load
duke
parents:
diff changeset
703 assert(rm->is_final() || info.has_vtable_index(),
a61af66fc99e Initial load
duke
parents:
diff changeset
704 "should have been set already");
a61af66fc99e Initial load
duke
parents:
diff changeset
705 cache_entry(thread)->set_method(bytecode, rm, info.vtable_index());
a61af66fc99e Initial load
duke
parents:
diff changeset
706 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
707 // Setup itable entry
a61af66fc99e Initial load
duke
parents:
diff changeset
708 int index = klassItable::compute_itable_index(info.resolved_method()());
a61af66fc99e Initial load
duke
parents:
diff changeset
709 cache_entry(thread)->set_interface_call(info.resolved_method(), index);
a61af66fc99e Initial load
duke
parents:
diff changeset
710 }
a61af66fc99e Initial load
duke
parents:
diff changeset
711 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
712 cache_entry(thread)->set_method(
a61af66fc99e Initial load
duke
parents:
diff changeset
713 bytecode,
a61af66fc99e Initial load
duke
parents:
diff changeset
714 info.resolved_method(),
a61af66fc99e Initial load
duke
parents:
diff changeset
715 info.vtable_index());
a61af66fc99e Initial load
duke
parents:
diff changeset
716 }
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
717 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
718 IRT_END
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
719
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
720
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
721 // First time execution: Resolve symbols, create a permanent MethodType object.
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
722 IRT_ENTRY(void, InterpreterRuntime::resolve_invokehandle(JavaThread* thread)) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
723 assert(EnableInvokeDynamic, "");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
724 const Bytecodes::Code bytecode = Bytecodes::_invokehandle;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
725
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
726 // resolve method
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
727 CallInfo info;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
728 constantPoolHandle pool(thread, method(thread)->constants());
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
729
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
730 {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
731 JvmtiHideSingleStepping jhss(thread);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
732 LinkResolver::resolve_invoke(info, Handle(), pool,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
733 get_index_u2_cpcache(thread, bytecode), bytecode, CHECK);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
734 } // end JvmtiHideSingleStepping
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
735
6942
64672b22ef05 8001658: No need to pass resolved_references as argument to ConstantPoolCacheEntry::set_method_handle_common
twisti
parents: 6840
diff changeset
736 cache_entry(thread)->set_method_handle(pool, info);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
737 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
738 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
739
a61af66fc99e Initial load
duke
parents:
diff changeset
740
1059
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 941
diff changeset
741 // First time execution: Resolve symbols, create a permanent CallSite object.
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
742 IRT_ENTRY(void, InterpreterRuntime::resolve_invokedynamic(JavaThread* thread)) {
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
743 assert(EnableInvokeDynamic, "");
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
744 const Bytecodes::Code bytecode = Bytecodes::_invokedynamic;
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
745
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
746 //TO DO: consider passing BCI to Java.
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
747 // int caller_bci = method(thread)->bci_from(bcp(thread));
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
748
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
749 // resolve method
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
750 CallInfo info;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
751 constantPoolHandle pool(thread, method(thread)->constants());
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
752 int index = get_index_u4(thread, bytecode);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
753 {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
754 JvmtiHideSingleStepping jhss(thread);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
755 LinkResolver::resolve_invoke(info, Handle(), pool,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
756 index, bytecode, CHECK);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
757 } // end JvmtiHideSingleStepping
1660
083fde3b838e 6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents: 1603
diff changeset
758
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
759 ConstantPoolCacheEntry* cp_cache_entry = pool->invokedynamic_cp_cache_entry_at(index);
6942
64672b22ef05 8001658: No need to pass resolved_references as argument to ConstantPoolCacheEntry::set_method_handle_common
twisti
parents: 6840
diff changeset
760 cp_cache_entry->set_dynamic_call(pool, info);
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
761 }
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
762 IRT_END
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
763
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
764
0
a61af66fc99e Initial load
duke
parents:
diff changeset
765 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
766 // Miscellaneous
a61af66fc99e Initial load
duke
parents:
diff changeset
767
a61af66fc99e Initial load
duke
parents:
diff changeset
768
941
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 726
diff changeset
769 nmethod* InterpreterRuntime::frequency_counter_overflow(JavaThread* thread, address branch_bcp) {
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 726
diff changeset
770 nmethod* nm = frequency_counter_overflow_inner(thread, branch_bcp);
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 726
diff changeset
771 assert(branch_bcp != NULL || nm == NULL, "always returns null for non OSR requests");
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 726
diff changeset
772 if (branch_bcp != NULL && nm != NULL) {
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 726
diff changeset
773 // This was a successful request for an OSR nmethod. Because
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 726
diff changeset
774 // frequency_counter_overflow_inner ends with a safepoint check,
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 726
diff changeset
775 // nm could have been unloaded so look it up again. It's unsafe
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 726
diff changeset
776 // to examine nm directly since it might have been freed and used
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 726
diff changeset
777 // for something else.
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 726
diff changeset
778 frame fr = thread->last_frame();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
779 Method* method = fr.interpreter_frame_method();
941
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 726
diff changeset
780 int bci = method->bci_from(fr.interpreter_frame_bcp());
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
781 nm = method->lookup_osr_nmethod_for(bci, CompLevel_none, false);
941
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 726
diff changeset
782 }
6145
e2fe93124108 7174928: JSR 292: unresolved invokedynamic call sites deopt and osr infinitely
twisti
parents: 4825
diff changeset
783 #ifndef PRODUCT
e2fe93124108 7174928: JSR 292: unresolved invokedynamic call sites deopt and osr infinitely
twisti
parents: 4825
diff changeset
784 if (TraceOnStackReplacement) {
e2fe93124108 7174928: JSR 292: unresolved invokedynamic call sites deopt and osr infinitely
twisti
parents: 4825
diff changeset
785 if (nm != NULL) {
e2fe93124108 7174928: JSR 292: unresolved invokedynamic call sites deopt and osr infinitely
twisti
parents: 4825
diff changeset
786 tty->print("OSR entry @ pc: " INTPTR_FORMAT ": ", nm->osr_entry());
e2fe93124108 7174928: JSR 292: unresolved invokedynamic call sites deopt and osr infinitely
twisti
parents: 4825
diff changeset
787 nm->print();
e2fe93124108 7174928: JSR 292: unresolved invokedynamic call sites deopt and osr infinitely
twisti
parents: 4825
diff changeset
788 }
e2fe93124108 7174928: JSR 292: unresolved invokedynamic call sites deopt and osr infinitely
twisti
parents: 4825
diff changeset
789 }
e2fe93124108 7174928: JSR 292: unresolved invokedynamic call sites deopt and osr infinitely
twisti
parents: 4825
diff changeset
790 #endif
941
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 726
diff changeset
791 return nm;
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 726
diff changeset
792 }
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 726
diff changeset
793
0
a61af66fc99e Initial load
duke
parents:
diff changeset
794 IRT_ENTRY(nmethod*,
941
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 726
diff changeset
795 InterpreterRuntime::frequency_counter_overflow_inner(JavaThread* thread, address branch_bcp))
0
a61af66fc99e Initial load
duke
parents:
diff changeset
796 // use UnlockFlagSaver to clear and restore the _do_not_unlock_if_synchronized
a61af66fc99e Initial load
duke
parents:
diff changeset
797 // flag, in case this method triggers classloading which will call into Java.
a61af66fc99e Initial load
duke
parents:
diff changeset
798 UnlockFlagSaver fs(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
799
a61af66fc99e Initial load
duke
parents:
diff changeset
800 frame fr = thread->last_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
801 assert(fr.is_interpreted_frame(), "must come from interpreter");
a61af66fc99e Initial load
duke
parents:
diff changeset
802 methodHandle method(thread, fr.interpreter_frame_method());
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
803 const int branch_bci = branch_bcp != NULL ? method->bci_from(branch_bcp) : InvocationEntryBci;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
804 const int bci = branch_bcp != NULL ? method->bci_from(fr.interpreter_frame_bcp()) : InvocationEntryBci;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
805
4825
20334ed5ed3c 7131259: compile_method and CompilationPolicy::event shouldn't be declared TRAPS
iveresov
parents: 4043
diff changeset
806 assert(!HAS_PENDING_EXCEPTION, "Should not have any exceptions pending");
3791
2c359f27615c 7057120: Tiered: Allow C1 to inline methods with loops
iveresov
parents: 3781
diff changeset
807 nmethod* osr_nm = CompilationPolicy::policy()->event(method, method, branch_bci, bci, CompLevel_none, NULL, thread);
4825
20334ed5ed3c 7131259: compile_method and CompilationPolicy::event shouldn't be declared TRAPS
iveresov
parents: 4043
diff changeset
808 assert(!HAS_PENDING_EXCEPTION, "Event handler should not throw any exceptions");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
809
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
810 if (osr_nm != NULL) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
811 // We may need to do on-stack replacement which requires that no
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
812 // monitors in the activation are biased because their
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
813 // BasicObjectLocks will need to migrate during OSR. Force
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
814 // unbiasing of all monitors in the activation now (even though
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
815 // the OSR nmethod might be invalidated) because we don't have a
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
816 // safepoint opportunity later once the migration begins.
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
817 if (UseBiasedLocking) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
818 ResourceMark rm;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
819 GrowableArray<Handle>* objects_to_revoke = new GrowableArray<Handle>();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
820 for( BasicObjectLock *kptr = fr.interpreter_frame_monitor_end();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
821 kptr < fr.interpreter_frame_monitor_begin();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
822 kptr = fr.next_monitor_in_interpreter_frame(kptr) ) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
823 if( kptr->obj() != NULL ) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
824 objects_to_revoke->append(Handle(THREAD, kptr->obj()));
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
825 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
826 }
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
827 BiasedLocking::revoke(objects_to_revoke);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
828 }
a61af66fc99e Initial load
duke
parents:
diff changeset
829 }
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
830 return osr_nm;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
831 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
832
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
833 IRT_LEAF(jint, InterpreterRuntime::bcp_to_di(Method* method, address cur_bcp))
0
a61af66fc99e Initial load
duke
parents:
diff changeset
834 assert(ProfileInterpreter, "must be profiling interpreter");
a61af66fc99e Initial load
duke
parents:
diff changeset
835 int bci = method->bci_from(cur_bcp);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
836 MethodData* mdo = method->method_data();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
837 if (mdo == NULL) return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
838 return mdo->bci_to_di(bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
839 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
840
2118
dd031b2226de 4930919: race condition in MDO creation at back branch locations
iveresov
parents: 1986
diff changeset
841 IRT_ENTRY(void, InterpreterRuntime::profile_method(JavaThread* thread))
0
a61af66fc99e Initial load
duke
parents:
diff changeset
842 // use UnlockFlagSaver to clear and restore the _do_not_unlock_if_synchronized
a61af66fc99e Initial load
duke
parents:
diff changeset
843 // flag, in case this method triggers classloading which will call into Java.
a61af66fc99e Initial load
duke
parents:
diff changeset
844 UnlockFlagSaver fs(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
845
a61af66fc99e Initial load
duke
parents:
diff changeset
846 assert(ProfileInterpreter, "must be profiling interpreter");
a61af66fc99e Initial load
duke
parents:
diff changeset
847 frame fr = thread->last_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
848 assert(fr.is_interpreted_frame(), "must come from interpreter");
a61af66fc99e Initial load
duke
parents:
diff changeset
849 methodHandle method(thread, fr.interpreter_frame_method());
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
850 Method::build_interpreter_method_data(method, THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
851 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
852 assert((PENDING_EXCEPTION->is_a(SystemDictionary::OutOfMemoryError_klass())), "we expect only an OOM error here");
a61af66fc99e Initial load
duke
parents:
diff changeset
853 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
854 // and fall through...
a61af66fc99e Initial load
duke
parents:
diff changeset
855 }
a61af66fc99e Initial load
duke
parents:
diff changeset
856 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
857
a61af66fc99e Initial load
duke
parents:
diff changeset
858
a61af66fc99e Initial load
duke
parents:
diff changeset
859 #ifdef ASSERT
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
860 IRT_LEAF(void, InterpreterRuntime::verify_mdp(Method* method, address bcp, address mdp))
0
a61af66fc99e Initial load
duke
parents:
diff changeset
861 assert(ProfileInterpreter, "must be profiling interpreter");
a61af66fc99e Initial load
duke
parents:
diff changeset
862
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
863 MethodData* mdo = method->method_data();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
864 assert(mdo != NULL, "must not be null");
a61af66fc99e Initial load
duke
parents:
diff changeset
865
a61af66fc99e Initial load
duke
parents:
diff changeset
866 int bci = method->bci_from(bcp);
a61af66fc99e Initial load
duke
parents:
diff changeset
867
a61af66fc99e Initial load
duke
parents:
diff changeset
868 address mdp2 = mdo->bci_to_dp(bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
869 if (mdp != mdp2) {
a61af66fc99e Initial load
duke
parents:
diff changeset
870 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
871 ResetNoHandleMark rnm; // In a LEAF entry.
a61af66fc99e Initial load
duke
parents:
diff changeset
872 HandleMark hm;
a61af66fc99e Initial load
duke
parents:
diff changeset
873 tty->print_cr("FAILED verify : actual mdp %p expected mdp %p @ bci %d", mdp, mdp2, bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
874 int current_di = mdo->dp_to_di(mdp);
a61af66fc99e Initial load
duke
parents:
diff changeset
875 int expected_di = mdo->dp_to_di(mdp2);
a61af66fc99e Initial load
duke
parents:
diff changeset
876 tty->print_cr(" actual di %d expected di %d", current_di, expected_di);
a61af66fc99e Initial load
duke
parents:
diff changeset
877 int expected_approx_bci = mdo->data_at(expected_di)->bci();
a61af66fc99e Initial load
duke
parents:
diff changeset
878 int approx_bci = -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
879 if (current_di >= 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
880 approx_bci = mdo->data_at(current_di)->bci();
a61af66fc99e Initial load
duke
parents:
diff changeset
881 }
a61af66fc99e Initial load
duke
parents:
diff changeset
882 tty->print_cr(" actual bci is %d expected bci %d", approx_bci, expected_approx_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
883 mdo->print_on(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
884 method->print_codes();
a61af66fc99e Initial load
duke
parents:
diff changeset
885 }
a61af66fc99e Initial load
duke
parents:
diff changeset
886 assert(mdp == mdp2, "wrong mdp");
a61af66fc99e Initial load
duke
parents:
diff changeset
887 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
888 #endif // ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
889
a61af66fc99e Initial load
duke
parents:
diff changeset
890 IRT_ENTRY(void, InterpreterRuntime::update_mdp_for_ret(JavaThread* thread, int return_bci))
a61af66fc99e Initial load
duke
parents:
diff changeset
891 assert(ProfileInterpreter, "must be profiling interpreter");
a61af66fc99e Initial load
duke
parents:
diff changeset
892 ResourceMark rm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
893 HandleMark hm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
894 frame fr = thread->last_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
895 assert(fr.is_interpreted_frame(), "must come from interpreter");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
896 MethodData* h_mdo = fr.interpreter_frame_method()->method_data();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
897
a61af66fc99e Initial load
duke
parents:
diff changeset
898 // Grab a lock to ensure atomic access to setting the return bci and
a61af66fc99e Initial load
duke
parents:
diff changeset
899 // the displacement. This can block and GC, invalidating all naked oops.
a61af66fc99e Initial load
duke
parents:
diff changeset
900 MutexLocker ml(RetData_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
901
a61af66fc99e Initial load
duke
parents:
diff changeset
902 // ProfileData is essentially a wrapper around a derived oop, so we
a61af66fc99e Initial load
duke
parents:
diff changeset
903 // need to take the lock before making any ProfileData structures.
a61af66fc99e Initial load
duke
parents:
diff changeset
904 ProfileData* data = h_mdo->data_at(h_mdo->dp_to_di(fr.interpreter_frame_mdp()));
a61af66fc99e Initial load
duke
parents:
diff changeset
905 RetData* rdata = data->as_RetData();
a61af66fc99e Initial load
duke
parents:
diff changeset
906 address new_mdp = rdata->fixup_ret(return_bci, h_mdo);
a61af66fc99e Initial load
duke
parents:
diff changeset
907 fr.interpreter_frame_set_mdp(new_mdp);
a61af66fc99e Initial load
duke
parents:
diff changeset
908 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
909
a61af66fc99e Initial load
duke
parents:
diff changeset
910
a61af66fc99e Initial load
duke
parents:
diff changeset
911 IRT_ENTRY(void, InterpreterRuntime::at_safepoint(JavaThread* thread))
a61af66fc99e Initial load
duke
parents:
diff changeset
912 // We used to need an explict preserve_arguments here for invoke bytecodes. However,
a61af66fc99e Initial load
duke
parents:
diff changeset
913 // stack traversal automatically takes care of preserving arguments for invoke, so
a61af66fc99e Initial load
duke
parents:
diff changeset
914 // this is no longer needed.
a61af66fc99e Initial load
duke
parents:
diff changeset
915
a61af66fc99e Initial load
duke
parents:
diff changeset
916 // IRT_END does an implicit safepoint check, hence we are guaranteed to block
a61af66fc99e Initial load
duke
parents:
diff changeset
917 // if this is called during a safepoint
a61af66fc99e Initial load
duke
parents:
diff changeset
918
a61af66fc99e Initial load
duke
parents:
diff changeset
919 if (JvmtiExport::should_post_single_step()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
920 // We are called during regular safepoints and when the VM is
a61af66fc99e Initial load
duke
parents:
diff changeset
921 // single stepping. If any thread is marked for single stepping,
a61af66fc99e Initial load
duke
parents:
diff changeset
922 // then we may have JVMTI work to do.
a61af66fc99e Initial load
duke
parents:
diff changeset
923 JvmtiExport::at_single_stepping_point(thread, method(thread), bcp(thread));
a61af66fc99e Initial load
duke
parents:
diff changeset
924 }
a61af66fc99e Initial load
duke
parents:
diff changeset
925 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
926
a61af66fc99e Initial load
duke
parents:
diff changeset
927 IRT_ENTRY(void, InterpreterRuntime::post_field_access(JavaThread *thread, oopDesc* obj,
a61af66fc99e Initial load
duke
parents:
diff changeset
928 ConstantPoolCacheEntry *cp_entry))
a61af66fc99e Initial load
duke
parents:
diff changeset
929
a61af66fc99e Initial load
duke
parents:
diff changeset
930 // check the access_flags for the field in the klass
2376
c7f3d0b4570f 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 2357
diff changeset
931
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
932 InstanceKlass* ik = InstanceKlass::cast(cp_entry->f1_as_klass());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
933 int index = cp_entry->field_index();
3938
e6b1331a51d2 7086585: make Java field injection more flexible
never
parents: 3912
diff changeset
934 if ((ik->field_access_flags(index) & JVM_ACC_FIELD_ACCESS_WATCHED) == 0) return;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
935
a61af66fc99e Initial load
duke
parents:
diff changeset
936 switch(cp_entry->flag_state()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
937 case btos: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
938 case ctos: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
939 case stos: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
940 case itos: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
941 case ftos: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
942 case ltos: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
943 case dtos: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
944 case atos: break;
a61af66fc99e Initial load
duke
parents:
diff changeset
945 default: ShouldNotReachHere(); return;
a61af66fc99e Initial load
duke
parents:
diff changeset
946 }
a61af66fc99e Initial load
duke
parents:
diff changeset
947 bool is_static = (obj == NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
948 HandleMark hm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
949
a61af66fc99e Initial load
duke
parents:
diff changeset
950 Handle h_obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
951 if (!is_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
952 // non-static field accessors have an object, but we need a handle
a61af66fc99e Initial load
duke
parents:
diff changeset
953 h_obj = Handle(thread, obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
954 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
955 instanceKlassHandle h_cp_entry_f1(thread, (Klass*)cp_entry->f1_as_klass());
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
956 jfieldID fid = jfieldIDWorkaround::to_jfieldID(h_cp_entry_f1, cp_entry->f2_as_index(), is_static);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
957 JvmtiExport::post_field_access(thread, method(thread), bcp(thread), h_cp_entry_f1, h_obj, fid);
a61af66fc99e Initial load
duke
parents:
diff changeset
958 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
959
a61af66fc99e Initial load
duke
parents:
diff changeset
960 IRT_ENTRY(void, InterpreterRuntime::post_field_modification(JavaThread *thread,
a61af66fc99e Initial load
duke
parents:
diff changeset
961 oopDesc* obj, ConstantPoolCacheEntry *cp_entry, jvalue *value))
a61af66fc99e Initial load
duke
parents:
diff changeset
962
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
963 Klass* k = (Klass*)cp_entry->f1_as_klass();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
964
a61af66fc99e Initial load
duke
parents:
diff changeset
965 // check the access_flags for the field in the klass
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
966 InstanceKlass* ik = InstanceKlass::cast(k);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
967 int index = cp_entry->field_index();
a61af66fc99e Initial load
duke
parents:
diff changeset
968 // bail out if field modifications are not watched
3938
e6b1331a51d2 7086585: make Java field injection more flexible
never
parents: 3912
diff changeset
969 if ((ik->field_access_flags(index) & JVM_ACC_FIELD_MODIFICATION_WATCHED) == 0) return;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
970
a61af66fc99e Initial load
duke
parents:
diff changeset
971 char sig_type = '\0';
a61af66fc99e Initial load
duke
parents:
diff changeset
972
a61af66fc99e Initial load
duke
parents:
diff changeset
973 switch(cp_entry->flag_state()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
974 case btos: sig_type = 'Z'; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
975 case ctos: sig_type = 'C'; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
976 case stos: sig_type = 'S'; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
977 case itos: sig_type = 'I'; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
978 case ftos: sig_type = 'F'; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
979 case atos: sig_type = 'L'; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
980 case ltos: sig_type = 'J'; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
981 case dtos: sig_type = 'D'; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
982 default: ShouldNotReachHere(); return;
a61af66fc99e Initial load
duke
parents:
diff changeset
983 }
a61af66fc99e Initial load
duke
parents:
diff changeset
984 bool is_static = (obj == NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
985
a61af66fc99e Initial load
duke
parents:
diff changeset
986 HandleMark hm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
987 instanceKlassHandle h_klass(thread, k);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
988 jfieldID fid = jfieldIDWorkaround::to_jfieldID(h_klass, cp_entry->f2_as_index(), is_static);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
989 jvalue fvalue;
a61af66fc99e Initial load
duke
parents:
diff changeset
990 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
991 fvalue = *value;
a61af66fc99e Initial load
duke
parents:
diff changeset
992 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
993 // Long/double values are stored unaligned and also noncontiguously with
a61af66fc99e Initial load
duke
parents:
diff changeset
994 // tagged stacks. We can't just do a simple assignment even in the non-
a61af66fc99e Initial load
duke
parents:
diff changeset
995 // J/D cases because a C++ compiler is allowed to assume that a jvalue is
a61af66fc99e Initial load
duke
parents:
diff changeset
996 // 8-byte aligned, and interpreter stack slots are only 4-byte aligned.
a61af66fc99e Initial load
duke
parents:
diff changeset
997 // We assume that the two halves of longs/doubles are stored in interpreter
a61af66fc99e Initial load
duke
parents:
diff changeset
998 // stack slots in platform-endian order.
a61af66fc99e Initial load
duke
parents:
diff changeset
999 jlong_accessor u;
a61af66fc99e Initial load
duke
parents:
diff changeset
1000 jint* newval = (jint*)value;
a61af66fc99e Initial load
duke
parents:
diff changeset
1001 u.words[0] = newval[0];
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1213
diff changeset
1002 u.words[1] = newval[Interpreter::stackElementWords]; // skip if tag
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1003 fvalue.j = u.long_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
1004 #endif // _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
1005
a61af66fc99e Initial load
duke
parents:
diff changeset
1006 Handle h_obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
1007 if (!is_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1008 // non-static field accessors have an object, but we need a handle
a61af66fc99e Initial load
duke
parents:
diff changeset
1009 h_obj = Handle(thread, obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
1010 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1011
a61af66fc99e Initial load
duke
parents:
diff changeset
1012 JvmtiExport::post_raw_field_modification(thread, method(thread), bcp(thread), h_klass, h_obj,
a61af66fc99e Initial load
duke
parents:
diff changeset
1013 fid, sig_type, &fvalue);
a61af66fc99e Initial load
duke
parents:
diff changeset
1014 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1015
a61af66fc99e Initial load
duke
parents:
diff changeset
1016 IRT_ENTRY(void, InterpreterRuntime::post_method_entry(JavaThread *thread))
a61af66fc99e Initial load
duke
parents:
diff changeset
1017 JvmtiExport::post_method_entry(thread, InterpreterRuntime::method(thread), InterpreterRuntime::last_frame(thread));
a61af66fc99e Initial load
duke
parents:
diff changeset
1018 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1019
a61af66fc99e Initial load
duke
parents:
diff changeset
1020
a61af66fc99e Initial load
duke
parents:
diff changeset
1021 IRT_ENTRY(void, InterpreterRuntime::post_method_exit(JavaThread *thread))
a61af66fc99e Initial load
duke
parents:
diff changeset
1022 JvmtiExport::post_method_exit(thread, InterpreterRuntime::method(thread), InterpreterRuntime::last_frame(thread));
a61af66fc99e Initial load
duke
parents:
diff changeset
1023 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1024
a61af66fc99e Initial load
duke
parents:
diff changeset
1025 IRT_LEAF(int, InterpreterRuntime::interpreter_contains(address pc))
a61af66fc99e Initial load
duke
parents:
diff changeset
1026 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1027 return (Interpreter::contains(pc) ? 1 : 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1028 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1029 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1030
a61af66fc99e Initial load
duke
parents:
diff changeset
1031
a61af66fc99e Initial load
duke
parents:
diff changeset
1032 // Implementation of SignatureHandlerLibrary
a61af66fc99e Initial load
duke
parents:
diff changeset
1033
a61af66fc99e Initial load
duke
parents:
diff changeset
1034 address SignatureHandlerLibrary::set_handler_blob() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1035 BufferBlob* handler_blob = BufferBlob::create("native signature handlers", blob_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1036 if (handler_blob == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1037 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1038 }
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1660
diff changeset
1039 address handler = handler_blob->code_begin();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1040 _handler_blob = handler_blob;
a61af66fc99e Initial load
duke
parents:
diff changeset
1041 _handler = handler;
a61af66fc99e Initial load
duke
parents:
diff changeset
1042 return handler;
a61af66fc99e Initial load
duke
parents:
diff changeset
1043 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1044
a61af66fc99e Initial load
duke
parents:
diff changeset
1045 void SignatureHandlerLibrary::initialize() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1046 if (_fingerprints != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1047 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1048 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1049 if (set_handler_blob() == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1050 vm_exit_out_of_memory(blob_size, "native signature handlers");
a61af66fc99e Initial load
duke
parents:
diff changeset
1051 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1052
a61af66fc99e Initial load
duke
parents:
diff changeset
1053 BufferBlob* bb = BufferBlob::create("Signature Handler Temp Buffer",
a61af66fc99e Initial load
duke
parents:
diff changeset
1054 SignatureHandlerLibrary::buffer_size);
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1660
diff changeset
1055 _buffer = bb->code_begin();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1056
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6145
diff changeset
1057 _fingerprints = new(ResourceObj::C_HEAP, mtCode)GrowableArray<uint64_t>(32, true);
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6145
diff changeset
1058 _handlers = new(ResourceObj::C_HEAP, mtCode)GrowableArray<address>(32, true);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1059 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1060
a61af66fc99e Initial load
duke
parents:
diff changeset
1061 address SignatureHandlerLibrary::set_handler(CodeBuffer* buffer) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1062 address handler = _handler;
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1660
diff changeset
1063 int insts_size = buffer->pure_insts_size();
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1660
diff changeset
1064 if (handler + insts_size > _handler_blob->code_end()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1065 // get a new handler blob
a61af66fc99e Initial load
duke
parents:
diff changeset
1066 handler = set_handler_blob();
a61af66fc99e Initial load
duke
parents:
diff changeset
1067 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1068 if (handler != NULL) {
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1660
diff changeset
1069 memcpy(handler, buffer->insts_begin(), insts_size);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1070 pd_set_handler(handler);
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1660
diff changeset
1071 ICache::invalidate_range(handler, insts_size);
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1660
diff changeset
1072 _handler = handler + insts_size;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1073 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1074 return handler;
a61af66fc99e Initial load
duke
parents:
diff changeset
1075 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1076
a61af66fc99e Initial load
duke
parents:
diff changeset
1077 void SignatureHandlerLibrary::add(methodHandle method) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1078 if (method->signature_handler() == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 // use slow signature handler if we can't do better
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 int handler_index = -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1081 // check if we can use customized (fast) signature handler
a61af66fc99e Initial load
duke
parents:
diff changeset
1082 if (UseFastSignatureHandlers && method->size_of_parameters() <= Fingerprinter::max_size_of_parameters) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1083 // use customized signature handler
a61af66fc99e Initial load
duke
parents:
diff changeset
1084 MutexLocker mu(SignatureHandlerLibrary_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
1085 // make sure data structure is initialized
a61af66fc99e Initial load
duke
parents:
diff changeset
1086 initialize();
a61af66fc99e Initial load
duke
parents:
diff changeset
1087 // lookup method signature's fingerprint
a61af66fc99e Initial load
duke
parents:
diff changeset
1088 uint64_t fingerprint = Fingerprinter(method).fingerprint();
a61af66fc99e Initial load
duke
parents:
diff changeset
1089 handler_index = _fingerprints->find(fingerprint);
a61af66fc99e Initial load
duke
parents:
diff changeset
1090 // create handler if necessary
a61af66fc99e Initial load
duke
parents:
diff changeset
1091 if (handler_index < 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1092 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1093 ptrdiff_t align_offset = (address)
a61af66fc99e Initial load
duke
parents:
diff changeset
1094 round_to((intptr_t)_buffer, CodeEntryAlignment) - (address)_buffer;
a61af66fc99e Initial load
duke
parents:
diff changeset
1095 CodeBuffer buffer((address)(_buffer + align_offset),
a61af66fc99e Initial load
duke
parents:
diff changeset
1096 SignatureHandlerLibrary::buffer_size - align_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
1097 InterpreterRuntime::SignatureHandlerGenerator(method, &buffer).generate(fingerprint);
a61af66fc99e Initial load
duke
parents:
diff changeset
1098 // copy into code heap
a61af66fc99e Initial load
duke
parents:
diff changeset
1099 address handler = set_handler(&buffer);
a61af66fc99e Initial load
duke
parents:
diff changeset
1100 if (handler == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1101 // use slow signature handler
a61af66fc99e Initial load
duke
parents:
diff changeset
1102 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1103 // debugging suppport
a61af66fc99e Initial load
duke
parents:
diff changeset
1104 if (PrintSignatureHandlers) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1105 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1106 tty->print_cr("argument handler #%d for: %s %s (fingerprint = " UINT64_FORMAT ", %d bytes generated)",
a61af66fc99e Initial load
duke
parents:
diff changeset
1107 _handlers->length(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1108 (method->is_static() ? "static" : "receiver"),
a61af66fc99e Initial load
duke
parents:
diff changeset
1109 method->name_and_sig_as_C_string(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1110 fingerprint,
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1660
diff changeset
1111 buffer.insts_size());
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1660
diff changeset
1112 Disassembler::decode(handler, handler + buffer.insts_size());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1113 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1114 tty->print_cr(" --- associated result handler ---");
a61af66fc99e Initial load
duke
parents:
diff changeset
1115 address rh_begin = Interpreter::result_handler(method()->result_type());
a61af66fc99e Initial load
duke
parents:
diff changeset
1116 address rh_end = rh_begin;
a61af66fc99e Initial load
duke
parents:
diff changeset
1117 while (*(int*)rh_end != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1118 rh_end += sizeof(int);
a61af66fc99e Initial load
duke
parents:
diff changeset
1119 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1120 Disassembler::decode(rh_begin, rh_end);
a61af66fc99e Initial load
duke
parents:
diff changeset
1121 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1122 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1123 // add handler to library
a61af66fc99e Initial load
duke
parents:
diff changeset
1124 _fingerprints->append(fingerprint);
a61af66fc99e Initial load
duke
parents:
diff changeset
1125 _handlers->append(handler);
a61af66fc99e Initial load
duke
parents:
diff changeset
1126 // set handler index
a61af66fc99e Initial load
duke
parents:
diff changeset
1127 assert(_fingerprints->length() == _handlers->length(), "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
1128 handler_index = _fingerprints->length() - 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1129 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1130 }
2194
face83fc8882 7012088: jump to 0 address because of lack of memory ordering in SignatureHandlerLibrary::add
coleenp
parents: 2192
diff changeset
1131 // Set handler under SignatureHandlerLibrary_lock
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1132 if (handler_index < 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1133 // use generic signature handler
a61af66fc99e Initial load
duke
parents:
diff changeset
1134 method->set_signature_handler(Interpreter::slow_signature_handler());
a61af66fc99e Initial load
duke
parents:
diff changeset
1135 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1136 // set handler
a61af66fc99e Initial load
duke
parents:
diff changeset
1137 method->set_signature_handler(_handlers->at(handler_index));
a61af66fc99e Initial load
duke
parents:
diff changeset
1138 }
2194
face83fc8882 7012088: jump to 0 address because of lack of memory ordering in SignatureHandlerLibrary::add
coleenp
parents: 2192
diff changeset
1139 } else {
face83fc8882 7012088: jump to 0 address because of lack of memory ordering in SignatureHandlerLibrary::add
coleenp
parents: 2192
diff changeset
1140 CHECK_UNHANDLED_OOPS_ONLY(Thread::current()->clear_unhandled_oops());
face83fc8882 7012088: jump to 0 address because of lack of memory ordering in SignatureHandlerLibrary::add
coleenp
parents: 2192
diff changeset
1141 // use generic signature handler
face83fc8882 7012088: jump to 0 address because of lack of memory ordering in SignatureHandlerLibrary::add
coleenp
parents: 2192
diff changeset
1142 method->set_signature_handler(Interpreter::slow_signature_handler());
face83fc8882 7012088: jump to 0 address because of lack of memory ordering in SignatureHandlerLibrary::add
coleenp
parents: 2192
diff changeset
1143 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1144 }
1986
9bc798875b2a 6704010: Internal Error (src/share/vm/interpreter/interpreterRuntime.cpp:1106)
coleenp
parents: 1972
diff changeset
1145 #ifdef ASSERT
2194
face83fc8882 7012088: jump to 0 address because of lack of memory ordering in SignatureHandlerLibrary::add
coleenp
parents: 2192
diff changeset
1146 int handler_index = -1;
face83fc8882 7012088: jump to 0 address because of lack of memory ordering in SignatureHandlerLibrary::add
coleenp
parents: 2192
diff changeset
1147 int fingerprint_index = -2;
1986
9bc798875b2a 6704010: Internal Error (src/share/vm/interpreter/interpreterRuntime.cpp:1106)
coleenp
parents: 1972
diff changeset
1148 {
9bc798875b2a 6704010: Internal Error (src/share/vm/interpreter/interpreterRuntime.cpp:1106)
coleenp
parents: 1972
diff changeset
1149 // '_handlers' and '_fingerprints' are 'GrowableArray's and are NOT synchronized
9bc798875b2a 6704010: Internal Error (src/share/vm/interpreter/interpreterRuntime.cpp:1106)
coleenp
parents: 1972
diff changeset
1150 // in any way if accessed from multiple threads. To avoid races with another
9bc798875b2a 6704010: Internal Error (src/share/vm/interpreter/interpreterRuntime.cpp:1106)
coleenp
parents: 1972
diff changeset
1151 // thread which may change the arrays in the above, mutex protected block, we
9bc798875b2a 6704010: Internal Error (src/share/vm/interpreter/interpreterRuntime.cpp:1106)
coleenp
parents: 1972
diff changeset
1152 // have to protect this read access here with the same mutex as well!
9bc798875b2a 6704010: Internal Error (src/share/vm/interpreter/interpreterRuntime.cpp:1106)
coleenp
parents: 1972
diff changeset
1153 MutexLocker mu(SignatureHandlerLibrary_lock);
2194
face83fc8882 7012088: jump to 0 address because of lack of memory ordering in SignatureHandlerLibrary::add
coleenp
parents: 2192
diff changeset
1154 if (_handlers != NULL) {
1986
9bc798875b2a 6704010: Internal Error (src/share/vm/interpreter/interpreterRuntime.cpp:1106)
coleenp
parents: 1972
diff changeset
1155 handler_index = _handlers->find(method->signature_handler());
9bc798875b2a 6704010: Internal Error (src/share/vm/interpreter/interpreterRuntime.cpp:1106)
coleenp
parents: 1972
diff changeset
1156 fingerprint_index = _fingerprints->find(Fingerprinter(method).fingerprint());
9bc798875b2a 6704010: Internal Error (src/share/vm/interpreter/interpreterRuntime.cpp:1106)
coleenp
parents: 1972
diff changeset
1157 }
2194
face83fc8882 7012088: jump to 0 address because of lack of memory ordering in SignatureHandlerLibrary::add
coleenp
parents: 2192
diff changeset
1158 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1159 assert(method->signature_handler() == Interpreter::slow_signature_handler() ||
1986
9bc798875b2a 6704010: Internal Error (src/share/vm/interpreter/interpreterRuntime.cpp:1106)
coleenp
parents: 1972
diff changeset
1160 handler_index == fingerprint_index, "sanity check");
2194
face83fc8882 7012088: jump to 0 address because of lack of memory ordering in SignatureHandlerLibrary::add
coleenp
parents: 2192
diff changeset
1161 #endif // ASSERT
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
a61af66fc99e Initial load
duke
parents:
diff changeset
1165 BufferBlob* SignatureHandlerLibrary::_handler_blob = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1166 address SignatureHandlerLibrary::_handler = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1167 GrowableArray<uint64_t>* SignatureHandlerLibrary::_fingerprints = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1168 GrowableArray<address>* SignatureHandlerLibrary::_handlers = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1169 address SignatureHandlerLibrary::_buffer = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1170
a61af66fc99e Initial load
duke
parents:
diff changeset
1171
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1172 IRT_ENTRY(void, InterpreterRuntime::prepare_native_call(JavaThread* thread, Method* method))
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1173 methodHandle m(thread, method);
a61af66fc99e Initial load
duke
parents:
diff changeset
1174 assert(m->is_native(), "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
1175 // lookup native function entry point if it doesn't exist
a61af66fc99e Initial load
duke
parents:
diff changeset
1176 bool in_base_library;
a61af66fc99e Initial load
duke
parents:
diff changeset
1177 if (!m->has_native_function()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1178 NativeLookup::lookup(m, in_base_library, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1179 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1180 // make sure signature handler is installed
a61af66fc99e Initial load
duke
parents:
diff changeset
1181 SignatureHandlerLibrary::add(m);
a61af66fc99e Initial load
duke
parents:
diff changeset
1182 // The interpreter entry point checks the signature handler first,
a61af66fc99e Initial load
duke
parents:
diff changeset
1183 // before trying to fetch the native entry point and klass mirror.
a61af66fc99e Initial load
duke
parents:
diff changeset
1184 // We must set the signature handler last, so that multiple processors
a61af66fc99e Initial load
duke
parents:
diff changeset
1185 // preparing the same method will be sure to see non-null entry & mirror.
a61af66fc99e Initial load
duke
parents:
diff changeset
1186 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1187
3911
2fecca53a2c6 7085012: ARM: com/sun/jdi/PopSynchronousTest.java still fails
roland
parents: 3852
diff changeset
1188 #if defined(IA32) || defined(AMD64) || defined(ARM)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1189 IRT_LEAF(void, InterpreterRuntime::popframe_move_outgoing_args(JavaThread* thread, void* src_address, void* dest_address))
a61af66fc99e Initial load
duke
parents:
diff changeset
1190 if (src_address == dest_address) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1191 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1192 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1193 ResetNoHandleMark rnm; // In a LEAF entry.
a61af66fc99e Initial load
duke
parents:
diff changeset
1194 HandleMark hm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1195 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1196 frame fr = thread->last_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
1197 assert(fr.is_interpreted_frame(), "");
a61af66fc99e Initial load
duke
parents:
diff changeset
1198 jint bci = fr.interpreter_frame_bci();
a61af66fc99e Initial load
duke
parents:
diff changeset
1199 methodHandle mh(thread, fr.interpreter_frame_method());
2142
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1986
diff changeset
1200 Bytecode_invoke invoke(mh, bci);
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1986
diff changeset
1201 ArgumentSizeComputer asc(invoke.signature());
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1986
diff changeset
1202 int size_of_arguments = (asc.size() + (invoke.has_receiver() ? 1 : 0)); // receiver
1603
d93949c5bdcc 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 1602
diff changeset
1203 Copy::conjoint_jbytes(src_address, dest_address,
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1213
diff changeset
1204 size_of_arguments * Interpreter::stackElementSize);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1205 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1206 #endif