annotate src/share/vm/interpreter/interpreterRuntime.cpp @ 20543:e7d0505c8a30

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