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

HotSpotResolvedObjectType: implement hasFinalizeSubclass() correctly don't use the (wrong) cached value, but ask the runtime on each request. Fixes regression on xml.* benchmarks @ specjvm2008. The problem was: After the constructor of Object was deoptimized due to an assumption violation, it was recompiled again after some time. However, on recompilation, the value of hasFinalizeSubclass for the class was not updated and it was compiled again with a, now wrong, assumption, which then triggers deoptimization again. This was repeated until it hit the recompilation limit (defined by PerMethodRecompilationCutoff), and therefore only executed by the interpreter from now on, causing the performance regression.
author Bernhard Urban <bernhard.urban@jku.at>
date Mon, 15 Apr 2013 19:54:58 +0200
parents b9a918201d47
children 836a62f43af9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
4806
eaa9557116a2 7120448: Fix FP values for compiled frames in frame::describe
bdelsart
parents: 4042
diff changeset
2 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1513
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1513
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: 1513
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: 1908
diff changeset
25 #include "precompiled.hpp"
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents: 6725
diff changeset
26 #include "compiler/disassembler.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1908
diff changeset
27 #include "gc_interface/collectedHeap.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1908
diff changeset
28 #include "interpreter/interpreter.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1908
diff changeset
29 #include "interpreter/oopMapCache.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1908
diff changeset
30 #include "memory/resourceArea.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1908
diff changeset
31 #include "memory/universe.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1908
diff changeset
32 #include "oops/markOop.hpp"
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
33 #include "oops/methodData.hpp"
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
34 #include "oops/method.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1908
diff changeset
35 #include "oops/oop.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1908
diff changeset
36 #include "oops/oop.inline2.hpp"
3363
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
37 #include "prims/methodHandles.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1908
diff changeset
38 #include "runtime/frame.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1908
diff changeset
39 #include "runtime/handles.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1908
diff changeset
40 #include "runtime/javaCalls.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1908
diff changeset
41 #include "runtime/monitorChunk.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1908
diff changeset
42 #include "runtime/sharedRuntime.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1908
diff changeset
43 #include "runtime/signature.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1908
diff changeset
44 #include "runtime/stubCodeGenerator.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1908
diff changeset
45 #include "runtime/stubRoutines.hpp"
2022
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents: 1972
diff changeset
46 #include "utilities/decoder.hpp"
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents: 1972
diff changeset
47
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1908
diff changeset
48 #ifdef TARGET_ARCH_x86
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1908
diff changeset
49 # include "nativeInst_x86.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1908
diff changeset
50 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1908
diff changeset
51 #ifdef TARGET_ARCH_sparc
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1908
diff changeset
52 # include "nativeInst_sparc.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1908
diff changeset
53 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1908
diff changeset
54 #ifdef TARGET_ARCH_zero
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1908
diff changeset
55 # include "nativeInst_zero.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1908
diff changeset
56 #endif
2192
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
57 #ifdef TARGET_ARCH_arm
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
58 # include "nativeInst_arm.hpp"
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
59 #endif
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
60 #ifdef TARGET_ARCH_ppc
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
61 # include "nativeInst_ppc.hpp"
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
62 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
63
a61af66fc99e Initial load
duke
parents:
diff changeset
64 RegisterMap::RegisterMap(JavaThread *thread, bool update_map) {
a61af66fc99e Initial load
duke
parents:
diff changeset
65 _thread = thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
66 _update_map = update_map;
a61af66fc99e Initial load
duke
parents:
diff changeset
67 clear();
a61af66fc99e Initial load
duke
parents:
diff changeset
68 debug_only(_update_for_id = NULL;)
a61af66fc99e Initial load
duke
parents:
diff changeset
69 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
70 for (int i = 0; i < reg_count ; i++ ) _location[i] = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
71 #endif /* PRODUCT */
a61af66fc99e Initial load
duke
parents:
diff changeset
72 }
a61af66fc99e Initial load
duke
parents:
diff changeset
73
a61af66fc99e Initial load
duke
parents:
diff changeset
74 RegisterMap::RegisterMap(const RegisterMap* map) {
a61af66fc99e Initial load
duke
parents:
diff changeset
75 assert(map != this, "bad initialization parameter");
a61af66fc99e Initial load
duke
parents:
diff changeset
76 assert(map != NULL, "RegisterMap must be present");
a61af66fc99e Initial load
duke
parents:
diff changeset
77 _thread = map->thread();
a61af66fc99e Initial load
duke
parents:
diff changeset
78 _update_map = map->update_map();
a61af66fc99e Initial load
duke
parents:
diff changeset
79 _include_argument_oops = map->include_argument_oops();
a61af66fc99e Initial load
duke
parents:
diff changeset
80 debug_only(_update_for_id = map->_update_for_id;)
a61af66fc99e Initial load
duke
parents:
diff changeset
81 pd_initialize_from(map);
a61af66fc99e Initial load
duke
parents:
diff changeset
82 if (update_map()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
83 for(int i = 0; i < location_valid_size; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
84 LocationValidType bits = !update_map() ? 0 : map->_location_valid[i];
a61af66fc99e Initial load
duke
parents:
diff changeset
85 _location_valid[i] = bits;
a61af66fc99e Initial load
duke
parents:
diff changeset
86 // for whichever bits are set, pull in the corresponding map->_location
a61af66fc99e Initial load
duke
parents:
diff changeset
87 int j = i*location_valid_type_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
88 while (bits != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
89 if ((bits & 1) != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
90 assert(0 <= j && j < reg_count, "range check");
a61af66fc99e Initial load
duke
parents:
diff changeset
91 _location[j] = map->_location[j];
a61af66fc99e Initial load
duke
parents:
diff changeset
92 }
a61af66fc99e Initial load
duke
parents:
diff changeset
93 bits >>= 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
94 j += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
95 }
a61af66fc99e Initial load
duke
parents:
diff changeset
96 }
a61af66fc99e Initial load
duke
parents:
diff changeset
97 }
a61af66fc99e Initial load
duke
parents:
diff changeset
98 }
a61af66fc99e Initial load
duke
parents:
diff changeset
99
a61af66fc99e Initial load
duke
parents:
diff changeset
100 void RegisterMap::clear() {
a61af66fc99e Initial load
duke
parents:
diff changeset
101 set_include_argument_oops(true);
a61af66fc99e Initial load
duke
parents:
diff changeset
102 if (_update_map) {
a61af66fc99e Initial load
duke
parents:
diff changeset
103 for(int i = 0; i < location_valid_size; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
104 _location_valid[i] = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
105 }
a61af66fc99e Initial load
duke
parents:
diff changeset
106 pd_clear();
a61af66fc99e Initial load
duke
parents:
diff changeset
107 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
108 pd_initialize();
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 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
113
a61af66fc99e Initial load
duke
parents:
diff changeset
114 void RegisterMap::print_on(outputStream* st) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
115 st->print_cr("Register map");
a61af66fc99e Initial load
duke
parents:
diff changeset
116 for(int i = 0; i < reg_count; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
117
a61af66fc99e Initial load
duke
parents:
diff changeset
118 VMReg r = VMRegImpl::as_VMReg(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
119 intptr_t* src = (intptr_t*) location(r);
a61af66fc99e Initial load
duke
parents:
diff changeset
120 if (src != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
121
417
f4fe12e429a4 6764622: IdealGraphVisualizer fixes
never
parents: 196
diff changeset
122 r->print_on(st);
f4fe12e429a4 6764622: IdealGraphVisualizer fixes
never
parents: 196
diff changeset
123 st->print(" [" INTPTR_FORMAT "] = ", src);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
124 if (((uintptr_t)src & (sizeof(*src)-1)) != 0) {
417
f4fe12e429a4 6764622: IdealGraphVisualizer fixes
never
parents: 196
diff changeset
125 st->print_cr("<misaligned>");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
126 } else {
417
f4fe12e429a4 6764622: IdealGraphVisualizer fixes
never
parents: 196
diff changeset
127 st->print_cr(INTPTR_FORMAT, *src);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
128 }
a61af66fc99e Initial load
duke
parents:
diff changeset
129 }
a61af66fc99e Initial load
duke
parents:
diff changeset
130 }
a61af66fc99e Initial load
duke
parents:
diff changeset
131 }
a61af66fc99e Initial load
duke
parents:
diff changeset
132
a61af66fc99e Initial load
duke
parents:
diff changeset
133 void RegisterMap::print() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
134 print_on(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
135 }
a61af66fc99e Initial load
duke
parents:
diff changeset
136
a61af66fc99e Initial load
duke
parents:
diff changeset
137 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
138 // This returns the pc that if you were in the debugger you'd see. Not
a61af66fc99e Initial load
duke
parents:
diff changeset
139 // the idealized value in the frame object. This undoes the magic conversion
a61af66fc99e Initial load
duke
parents:
diff changeset
140 // that happens for deoptimized frames. In addition it makes the value the
a61af66fc99e Initial load
duke
parents:
diff changeset
141 // hardware would want to see in the native frame. The only user (at this point)
a61af66fc99e Initial load
duke
parents:
diff changeset
142 // is deoptimization. It likely no one else should ever use it.
a61af66fc99e Initial load
duke
parents:
diff changeset
143
a61af66fc99e Initial load
duke
parents:
diff changeset
144 address frame::raw_pc() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
145 if (is_deoptimized_frame()) {
1204
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1201
diff changeset
146 nmethod* nm = cb()->as_nmethod_or_null();
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1201
diff changeset
147 if (nm->is_method_handle_return(pc()))
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1201
diff changeset
148 return nm->deopt_mh_handler_begin() - pc_return_offset;
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1201
diff changeset
149 else
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1201
diff changeset
150 return nm->deopt_handler_begin() - pc_return_offset;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
151 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
152 return (pc() - pc_return_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
153 }
a61af66fc99e Initial load
duke
parents:
diff changeset
154 }
a61af66fc99e Initial load
duke
parents:
diff changeset
155
a61af66fc99e Initial load
duke
parents:
diff changeset
156 // Change the pc in a frame object. This does not change the actual pc in
a61af66fc99e Initial load
duke
parents:
diff changeset
157 // actual frame. To do that use patch_pc.
a61af66fc99e Initial load
duke
parents:
diff changeset
158 //
a61af66fc99e Initial load
duke
parents:
diff changeset
159 void frame::set_pc(address newpc ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
160 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
161 if (_cb != NULL && _cb->is_nmethod()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
162 assert(!((nmethod*)_cb)->is_deopt_pc(_pc), "invariant violation");
a61af66fc99e Initial load
duke
parents:
diff changeset
163 }
a61af66fc99e Initial load
duke
parents:
diff changeset
164 #endif // ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
165
a61af66fc99e Initial load
duke
parents:
diff changeset
166 // Unsafe to use the is_deoptimzed tester after changing pc
a61af66fc99e Initial load
duke
parents:
diff changeset
167 _deopt_state = unknown;
a61af66fc99e Initial load
duke
parents:
diff changeset
168 _pc = newpc;
a61af66fc99e Initial load
duke
parents:
diff changeset
169 _cb = CodeCache::find_blob_unsafe(_pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
170
a61af66fc99e Initial load
duke
parents:
diff changeset
171 }
a61af66fc99e Initial load
duke
parents:
diff changeset
172
a61af66fc99e Initial load
duke
parents:
diff changeset
173 // type testers
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4872
diff changeset
174 bool frame::is_ignored_frame() const {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4872
diff changeset
175 return false; // FIXME: some LambdaForm frames should be ignored
3363
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
176 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
177 bool frame::is_deoptimized_frame() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
178 assert(_deopt_state != unknown, "not answerable");
a61af66fc99e Initial load
duke
parents:
diff changeset
179 return _deopt_state == is_deoptimized;
a61af66fc99e Initial load
duke
parents:
diff changeset
180 }
a61af66fc99e Initial load
duke
parents:
diff changeset
181
a61af66fc99e Initial load
duke
parents:
diff changeset
182 bool frame::is_native_frame() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
183 return (_cb != NULL &&
a61af66fc99e Initial load
duke
parents:
diff changeset
184 _cb->is_nmethod() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
185 ((nmethod*)_cb)->is_native_method());
a61af66fc99e Initial load
duke
parents:
diff changeset
186 }
a61af66fc99e Initial load
duke
parents:
diff changeset
187
a61af66fc99e Initial load
duke
parents:
diff changeset
188 bool frame::is_java_frame() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
189 if (is_interpreted_frame()) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
190 if (is_compiled_frame()) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
191 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
192 }
a61af66fc99e Initial load
duke
parents:
diff changeset
193
a61af66fc99e Initial load
duke
parents:
diff changeset
194
a61af66fc99e Initial load
duke
parents:
diff changeset
195 bool frame::is_compiled_frame() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
196 if (_cb != NULL &&
a61af66fc99e Initial load
duke
parents:
diff changeset
197 _cb->is_nmethod() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
198 ((nmethod*)_cb)->is_java_method()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
199 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
200 }
a61af66fc99e Initial load
duke
parents:
diff changeset
201 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
202 }
a61af66fc99e Initial load
duke
parents:
diff changeset
203
a61af66fc99e Initial load
duke
parents:
diff changeset
204
a61af66fc99e Initial load
duke
parents:
diff changeset
205 bool frame::is_runtime_frame() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
206 return (_cb != NULL && _cb->is_runtime_stub());
a61af66fc99e Initial load
duke
parents:
diff changeset
207 }
a61af66fc99e Initial load
duke
parents:
diff changeset
208
a61af66fc99e Initial load
duke
parents:
diff changeset
209 bool frame::is_safepoint_blob_frame() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
210 return (_cb != NULL && _cb->is_safepoint_stub());
a61af66fc99e Initial load
duke
parents:
diff changeset
211 }
a61af66fc99e Initial load
duke
parents:
diff changeset
212
a61af66fc99e Initial load
duke
parents:
diff changeset
213 // testers
a61af66fc99e Initial load
duke
parents:
diff changeset
214
a61af66fc99e Initial load
duke
parents:
diff changeset
215 bool frame::is_first_java_frame() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
216 RegisterMap map(JavaThread::current(), false); // No update
a61af66fc99e Initial load
duke
parents:
diff changeset
217 frame s;
a61af66fc99e Initial load
duke
parents:
diff changeset
218 for (s = sender(&map); !(s.is_java_frame() || s.is_first_frame()); s = s.sender(&map));
a61af66fc99e Initial load
duke
parents:
diff changeset
219 return s.is_first_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
220 }
a61af66fc99e Initial load
duke
parents:
diff changeset
221
a61af66fc99e Initial load
duke
parents:
diff changeset
222
a61af66fc99e Initial load
duke
parents:
diff changeset
223 bool frame::entry_frame_is_first() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
224 return entry_frame_call_wrapper()->anchor()->last_Java_sp() == NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
225 }
a61af66fc99e Initial load
duke
parents:
diff changeset
226
a61af66fc99e Initial load
duke
parents:
diff changeset
227
a61af66fc99e Initial load
duke
parents:
diff changeset
228 bool frame::should_be_deoptimized() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
229 if (_deopt_state == is_deoptimized ||
a61af66fc99e Initial load
duke
parents:
diff changeset
230 !is_compiled_frame() ) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
231 assert(_cb != NULL && _cb->is_nmethod(), "must be an nmethod");
a61af66fc99e Initial load
duke
parents:
diff changeset
232 nmethod* nm = (nmethod *)_cb;
a61af66fc99e Initial load
duke
parents:
diff changeset
233 if (TraceDependencies) {
a61af66fc99e Initial load
duke
parents:
diff changeset
234 tty->print("checking (%s) ", nm->is_marked_for_deoptimization() ? "true" : "false");
a61af66fc99e Initial load
duke
parents:
diff changeset
235 nm->print_value_on(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
236 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
237 }
a61af66fc99e Initial load
duke
parents:
diff changeset
238
a61af66fc99e Initial load
duke
parents:
diff changeset
239 if( !nm->is_marked_for_deoptimization() )
a61af66fc99e Initial load
duke
parents:
diff changeset
240 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
241
a61af66fc99e Initial load
duke
parents:
diff changeset
242 // If at the return point, then the frame has already been popped, and
a61af66fc99e Initial load
duke
parents:
diff changeset
243 // only the return needs to be executed. Don't deoptimize here.
a61af66fc99e Initial load
duke
parents:
diff changeset
244 return !nm->is_at_poll_return(pc());
a61af66fc99e Initial load
duke
parents:
diff changeset
245 }
a61af66fc99e Initial load
duke
parents:
diff changeset
246
a61af66fc99e Initial load
duke
parents:
diff changeset
247 bool frame::can_be_deoptimized() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
248 if (!is_compiled_frame()) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
249 nmethod* nm = (nmethod*)_cb;
a61af66fc99e Initial load
duke
parents:
diff changeset
250
a61af66fc99e Initial load
duke
parents:
diff changeset
251 if( !nm->can_be_deoptimized() )
a61af66fc99e Initial load
duke
parents:
diff changeset
252 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
253
a61af66fc99e Initial load
duke
parents:
diff changeset
254 return !nm->is_at_poll_return(pc());
a61af66fc99e Initial load
duke
parents:
diff changeset
255 }
a61af66fc99e Initial load
duke
parents:
diff changeset
256
1727
da877bdc9000 6975006: assert(check.is_deoptimized_frame()) failed: missed deopt
never
parents: 1692
diff changeset
257 void frame::deoptimize(JavaThread* thread) {
da877bdc9000 6975006: assert(check.is_deoptimized_frame()) failed: missed deopt
never
parents: 1692
diff changeset
258 // Schedule deoptimization of an nmethod activation with this frame.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
259 assert(_cb != NULL && _cb->is_nmethod(), "must be");
a61af66fc99e Initial load
duke
parents:
diff changeset
260 nmethod* nm = (nmethod*)_cb;
a61af66fc99e Initial load
duke
parents:
diff changeset
261
a61af66fc99e Initial load
duke
parents:
diff changeset
262 // This is a fix for register window patching race
1727
da877bdc9000 6975006: assert(check.is_deoptimized_frame()) failed: missed deopt
never
parents: 1692
diff changeset
263 if (NeedsDeoptSuspend && Thread::current() != thread) {
da877bdc9000 6975006: assert(check.is_deoptimized_frame()) failed: missed deopt
never
parents: 1692
diff changeset
264 assert(SafepointSynchronize::is_at_safepoint(),
da877bdc9000 6975006: assert(check.is_deoptimized_frame()) failed: missed deopt
never
parents: 1692
diff changeset
265 "patching other threads for deopt may only occur at a safepoint");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
266
a61af66fc99e Initial load
duke
parents:
diff changeset
267 // It is possible especially with DeoptimizeALot/DeoptimizeRandom that
a61af66fc99e Initial load
duke
parents:
diff changeset
268 // we could see the frame again and ask for it to be deoptimized since
a61af66fc99e Initial load
duke
parents:
diff changeset
269 // it might move for a long time. That is harmless and we just ignore it.
a61af66fc99e Initial load
duke
parents:
diff changeset
270 if (id() == thread->must_deopt_id()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
271 assert(thread->is_deopt_suspend(), "lost suspension");
a61af66fc99e Initial load
duke
parents:
diff changeset
272 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
273 }
a61af66fc99e Initial load
duke
parents:
diff changeset
274
a61af66fc99e Initial load
duke
parents:
diff changeset
275 // We are at a safepoint so the target thread can only be
a61af66fc99e Initial load
duke
parents:
diff changeset
276 // in 4 states:
a61af66fc99e Initial load
duke
parents:
diff changeset
277 // blocked - no problem
a61af66fc99e Initial load
duke
parents:
diff changeset
278 // blocked_trans - no problem (i.e. could have woken up from blocked
a61af66fc99e Initial load
duke
parents:
diff changeset
279 // during a safepoint).
a61af66fc99e Initial load
duke
parents:
diff changeset
280 // native - register window pc patching race
a61af66fc99e Initial load
duke
parents:
diff changeset
281 // native_trans - momentary state
a61af66fc99e Initial load
duke
parents:
diff changeset
282 //
a61af66fc99e Initial load
duke
parents:
diff changeset
283 // We could just wait out a thread in native_trans to block.
a61af66fc99e Initial load
duke
parents:
diff changeset
284 // Then we'd have all the issues that the safepoint code has as to
a61af66fc99e Initial load
duke
parents:
diff changeset
285 // whether to spin or block. It isn't worth it. Just treat it like
a61af66fc99e Initial load
duke
parents:
diff changeset
286 // native and be done with it.
a61af66fc99e Initial load
duke
parents:
diff changeset
287 //
1727
da877bdc9000 6975006: assert(check.is_deoptimized_frame()) failed: missed deopt
never
parents: 1692
diff changeset
288 // Examine the state of the thread at the start of safepoint since
da877bdc9000 6975006: assert(check.is_deoptimized_frame()) failed: missed deopt
never
parents: 1692
diff changeset
289 // threads that were in native at the start of the safepoint could
da877bdc9000 6975006: assert(check.is_deoptimized_frame()) failed: missed deopt
never
parents: 1692
diff changeset
290 // come to a halt during the safepoint, changing the current value
da877bdc9000 6975006: assert(check.is_deoptimized_frame()) failed: missed deopt
never
parents: 1692
diff changeset
291 // of the safepoint_state.
da877bdc9000 6975006: assert(check.is_deoptimized_frame()) failed: missed deopt
never
parents: 1692
diff changeset
292 JavaThreadState state = thread->safepoint_state()->orig_thread_state();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
293 if (state == _thread_in_native || state == _thread_in_native_trans) {
a61af66fc99e Initial load
duke
parents:
diff changeset
294 // Since we are at a safepoint the target thread will stop itself
a61af66fc99e Initial load
duke
parents:
diff changeset
295 // before it can return to java as long as we remain at the safepoint.
a61af66fc99e Initial load
duke
parents:
diff changeset
296 // Therefore we can put an additional request for the thread to stop
a61af66fc99e Initial load
duke
parents:
diff changeset
297 // no matter what no (like a suspend). This will cause the thread
a61af66fc99e Initial load
duke
parents:
diff changeset
298 // to notice it needs to do the deopt on its own once it leaves native.
a61af66fc99e Initial load
duke
parents:
diff changeset
299 //
a61af66fc99e Initial load
duke
parents:
diff changeset
300 // The only reason we must do this is because on machine with register
a61af66fc99e Initial load
duke
parents:
diff changeset
301 // windows we have a race with patching the return address and the
a61af66fc99e Initial load
duke
parents:
diff changeset
302 // window coming live as the thread returns to the Java code (but still
a61af66fc99e Initial load
duke
parents:
diff changeset
303 // in native mode) and then blocks. It is only this top most frame
a61af66fc99e Initial load
duke
parents:
diff changeset
304 // that is at risk. So in truth we could add an additional check to
a61af66fc99e Initial load
duke
parents:
diff changeset
305 // see if this frame is one that is at risk.
a61af66fc99e Initial load
duke
parents:
diff changeset
306 RegisterMap map(thread, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
307 frame at_risk = thread->last_frame().sender(&map);
a61af66fc99e Initial load
duke
parents:
diff changeset
308 if (id() == at_risk.id()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
309 thread->set_must_deopt_id(id());
a61af66fc99e Initial load
duke
parents:
diff changeset
310 thread->set_deopt_suspend();
a61af66fc99e Initial load
duke
parents:
diff changeset
311 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
312 }
a61af66fc99e Initial load
duke
parents:
diff changeset
313 }
a61af66fc99e Initial load
duke
parents:
diff changeset
314 } // NeedsDeoptSuspend
a61af66fc99e Initial load
duke
parents:
diff changeset
315
a61af66fc99e Initial load
duke
parents:
diff changeset
316
1204
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1201
diff changeset
317 // If the call site is a MethodHandle call site use the MH deopt
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1201
diff changeset
318 // handler.
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1201
diff changeset
319 address deopt = nm->is_method_handle_return(pc()) ?
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1201
diff changeset
320 nm->deopt_mh_handler_begin() :
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1201
diff changeset
321 nm->deopt_handler_begin();
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1201
diff changeset
322
0
a61af66fc99e Initial load
duke
parents:
diff changeset
323 // Save the original pc before we patch in the new one
a61af66fc99e Initial load
duke
parents:
diff changeset
324 nm->set_original_pc(this, pc());
a61af66fc99e Initial load
duke
parents:
diff changeset
325 patch_pc(thread, deopt);
1204
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1201
diff changeset
326
0
a61af66fc99e Initial load
duke
parents:
diff changeset
327 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
328 {
a61af66fc99e Initial load
duke
parents:
diff changeset
329 RegisterMap map(thread, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
330 frame check = thread->last_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
331 while (id() != check.id()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
332 check = check.sender(&map);
a61af66fc99e Initial load
duke
parents:
diff changeset
333 }
a61af66fc99e Initial load
duke
parents:
diff changeset
334 assert(check.is_deoptimized_frame(), "missed deopt");
a61af66fc99e Initial load
duke
parents:
diff changeset
335 }
a61af66fc99e Initial load
duke
parents:
diff changeset
336 #endif // ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
337 }
a61af66fc99e Initial load
duke
parents:
diff changeset
338
a61af66fc99e Initial load
duke
parents:
diff changeset
339 frame frame::java_sender() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
340 RegisterMap map(JavaThread::current(), false);
a61af66fc99e Initial load
duke
parents:
diff changeset
341 frame s;
a61af66fc99e Initial load
duke
parents:
diff changeset
342 for (s = sender(&map); !(s.is_java_frame() || s.is_first_frame()); s = s.sender(&map)) ;
a61af66fc99e Initial load
duke
parents:
diff changeset
343 guarantee(s.is_java_frame(), "tried to get caller of first java frame");
a61af66fc99e Initial load
duke
parents:
diff changeset
344 return s;
a61af66fc99e Initial load
duke
parents:
diff changeset
345 }
a61af66fc99e Initial load
duke
parents:
diff changeset
346
a61af66fc99e Initial load
duke
parents:
diff changeset
347 frame frame::real_sender(RegisterMap* map) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
348 frame result = sender(map);
3363
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
349 while (result.is_runtime_frame() ||
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4872
diff changeset
350 result.is_ignored_frame()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
351 result = result.sender(map);
a61af66fc99e Initial load
duke
parents:
diff changeset
352 }
a61af66fc99e Initial load
duke
parents:
diff changeset
353 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
354 }
a61af66fc99e Initial load
duke
parents:
diff changeset
355
a61af66fc99e Initial load
duke
parents:
diff changeset
356 // Note: called by profiler - NOT for current thread
a61af66fc99e Initial load
duke
parents:
diff changeset
357 frame frame::profile_find_Java_sender_frame(JavaThread *thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
358 // If we don't recognize this frame, walk back up the stack until we do
a61af66fc99e Initial load
duke
parents:
diff changeset
359 RegisterMap map(thread, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
360 frame first_java_frame = frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
361
a61af66fc99e Initial load
duke
parents:
diff changeset
362 // Find the first Java frame on the stack starting with input frame
a61af66fc99e Initial load
duke
parents:
diff changeset
363 if (is_java_frame()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
364 // top frame is compiled frame or deoptimized frame
a61af66fc99e Initial load
duke
parents:
diff changeset
365 first_java_frame = *this;
a61af66fc99e Initial load
duke
parents:
diff changeset
366 } else if (safe_for_sender(thread)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
367 for (frame sender_frame = sender(&map);
a61af66fc99e Initial load
duke
parents:
diff changeset
368 sender_frame.safe_for_sender(thread) && !sender_frame.is_first_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
369 sender_frame = sender_frame.sender(&map)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
370 if (sender_frame.is_java_frame()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
371 first_java_frame = sender_frame;
a61af66fc99e Initial load
duke
parents:
diff changeset
372 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
373 }
a61af66fc99e Initial load
duke
parents:
diff changeset
374 }
a61af66fc99e Initial load
duke
parents:
diff changeset
375 }
a61af66fc99e Initial load
duke
parents:
diff changeset
376 return first_java_frame;
a61af66fc99e Initial load
duke
parents:
diff changeset
377 }
a61af66fc99e Initial load
duke
parents:
diff changeset
378
a61af66fc99e Initial load
duke
parents:
diff changeset
379 // Interpreter frames
a61af66fc99e Initial load
duke
parents:
diff changeset
380
a61af66fc99e Initial load
duke
parents:
diff changeset
381
a61af66fc99e Initial load
duke
parents:
diff changeset
382 void frame::interpreter_frame_set_locals(intptr_t* locs) {
a61af66fc99e Initial load
duke
parents:
diff changeset
383 assert(is_interpreted_frame(), "Not an interpreted frame");
a61af66fc99e Initial load
duke
parents:
diff changeset
384 *interpreter_frame_locals_addr() = locs;
a61af66fc99e Initial load
duke
parents:
diff changeset
385 }
a61af66fc99e Initial load
duke
parents:
diff changeset
386
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
387 Method* frame::interpreter_frame_method() const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
388 assert(is_interpreted_frame(), "interpreted frame expected");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
389 Method* m = *interpreter_frame_method_addr();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
390 assert(m->is_metadata(), "bad Method* in interpreter frame");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
391 assert(m->is_method(), "not a Method*");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
392 return m;
a61af66fc99e Initial load
duke
parents:
diff changeset
393 }
a61af66fc99e Initial load
duke
parents:
diff changeset
394
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
395 void frame::interpreter_frame_set_method(Method* method) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
396 assert(is_interpreted_frame(), "interpreted frame expected");
a61af66fc99e Initial load
duke
parents:
diff changeset
397 *interpreter_frame_method_addr() = method;
a61af66fc99e Initial load
duke
parents:
diff changeset
398 }
a61af66fc99e Initial load
duke
parents:
diff changeset
399
a61af66fc99e Initial load
duke
parents:
diff changeset
400 void frame::interpreter_frame_set_bcx(intptr_t bcx) {
a61af66fc99e Initial load
duke
parents:
diff changeset
401 assert(is_interpreted_frame(), "Not an interpreted frame");
a61af66fc99e Initial load
duke
parents:
diff changeset
402 if (ProfileInterpreter) {
a61af66fc99e Initial load
duke
parents:
diff changeset
403 bool formerly_bci = is_bci(interpreter_frame_bcx());
a61af66fc99e Initial load
duke
parents:
diff changeset
404 bool is_now_bci = is_bci(bcx);
a61af66fc99e Initial load
duke
parents:
diff changeset
405 *interpreter_frame_bcx_addr() = bcx;
a61af66fc99e Initial load
duke
parents:
diff changeset
406
a61af66fc99e Initial load
duke
parents:
diff changeset
407 intptr_t mdx = interpreter_frame_mdx();
a61af66fc99e Initial load
duke
parents:
diff changeset
408
a61af66fc99e Initial load
duke
parents:
diff changeset
409 if (mdx != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
410 if (formerly_bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
411 if (!is_now_bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
412 // The bcx was just converted from bci to bcp.
a61af66fc99e Initial load
duke
parents:
diff changeset
413 // Convert the mdx in parallel.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
414 MethodData* mdo = interpreter_frame_method()->method_data();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
415 assert(mdo != NULL, "");
a61af66fc99e Initial load
duke
parents:
diff changeset
416 int mdi = mdx - 1; // We distinguish valid mdi from zero by adding one.
a61af66fc99e Initial load
duke
parents:
diff changeset
417 address mdp = mdo->di_to_dp(mdi);
a61af66fc99e Initial load
duke
parents:
diff changeset
418 interpreter_frame_set_mdx((intptr_t)mdp);
a61af66fc99e Initial load
duke
parents:
diff changeset
419 }
a61af66fc99e Initial load
duke
parents:
diff changeset
420 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
421 if (is_now_bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
422 // The bcx was just converted from bcp to bci.
a61af66fc99e Initial load
duke
parents:
diff changeset
423 // Convert the mdx in parallel.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
424 MethodData* mdo = interpreter_frame_method()->method_data();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
425 assert(mdo != NULL, "");
a61af66fc99e Initial load
duke
parents:
diff changeset
426 int mdi = mdo->dp_to_di((address)mdx);
a61af66fc99e Initial load
duke
parents:
diff changeset
427 interpreter_frame_set_mdx((intptr_t)mdi + 1); // distinguish valid from 0.
a61af66fc99e Initial load
duke
parents:
diff changeset
428 }
a61af66fc99e Initial load
duke
parents:
diff changeset
429 }
a61af66fc99e Initial load
duke
parents:
diff changeset
430 }
a61af66fc99e Initial load
duke
parents:
diff changeset
431 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
432 *interpreter_frame_bcx_addr() = bcx;
a61af66fc99e Initial load
duke
parents:
diff changeset
433 }
a61af66fc99e Initial load
duke
parents:
diff changeset
434 }
a61af66fc99e Initial load
duke
parents:
diff changeset
435
a61af66fc99e Initial load
duke
parents:
diff changeset
436 jint frame::interpreter_frame_bci() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
437 assert(is_interpreted_frame(), "interpreted frame expected");
a61af66fc99e Initial load
duke
parents:
diff changeset
438 intptr_t bcx = interpreter_frame_bcx();
a61af66fc99e Initial load
duke
parents:
diff changeset
439 return is_bci(bcx) ? bcx : interpreter_frame_method()->bci_from((address)bcx);
a61af66fc99e Initial load
duke
parents:
diff changeset
440 }
a61af66fc99e Initial load
duke
parents:
diff changeset
441
a61af66fc99e Initial load
duke
parents:
diff changeset
442 void frame::interpreter_frame_set_bci(jint bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
443 assert(is_interpreted_frame(), "interpreted frame expected");
a61af66fc99e Initial load
duke
parents:
diff changeset
444 assert(!is_bci(interpreter_frame_bcx()), "should not set bci during GC");
a61af66fc99e Initial load
duke
parents:
diff changeset
445 interpreter_frame_set_bcx((intptr_t)interpreter_frame_method()->bcp_from(bci));
a61af66fc99e Initial load
duke
parents:
diff changeset
446 }
a61af66fc99e Initial load
duke
parents:
diff changeset
447
a61af66fc99e Initial load
duke
parents:
diff changeset
448 address frame::interpreter_frame_bcp() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
449 assert(is_interpreted_frame(), "interpreted frame expected");
a61af66fc99e Initial load
duke
parents:
diff changeset
450 intptr_t bcx = interpreter_frame_bcx();
a61af66fc99e Initial load
duke
parents:
diff changeset
451 return is_bci(bcx) ? interpreter_frame_method()->bcp_from(bcx) : (address)bcx;
a61af66fc99e Initial load
duke
parents:
diff changeset
452 }
a61af66fc99e Initial load
duke
parents:
diff changeset
453
a61af66fc99e Initial load
duke
parents:
diff changeset
454 void frame::interpreter_frame_set_bcp(address bcp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
455 assert(is_interpreted_frame(), "interpreted frame expected");
a61af66fc99e Initial load
duke
parents:
diff changeset
456 assert(!is_bci(interpreter_frame_bcx()), "should not set bcp during GC");
a61af66fc99e Initial load
duke
parents:
diff changeset
457 interpreter_frame_set_bcx((intptr_t)bcp);
a61af66fc99e Initial load
duke
parents:
diff changeset
458 }
a61af66fc99e Initial load
duke
parents:
diff changeset
459
a61af66fc99e Initial load
duke
parents:
diff changeset
460 void frame::interpreter_frame_set_mdx(intptr_t mdx) {
a61af66fc99e Initial load
duke
parents:
diff changeset
461 assert(is_interpreted_frame(), "Not an interpreted frame");
a61af66fc99e Initial load
duke
parents:
diff changeset
462 assert(ProfileInterpreter, "must be profiling interpreter");
a61af66fc99e Initial load
duke
parents:
diff changeset
463 *interpreter_frame_mdx_addr() = mdx;
a61af66fc99e Initial load
duke
parents:
diff changeset
464 }
a61af66fc99e Initial load
duke
parents:
diff changeset
465
a61af66fc99e Initial load
duke
parents:
diff changeset
466 address frame::interpreter_frame_mdp() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
467 assert(ProfileInterpreter, "must be profiling interpreter");
a61af66fc99e Initial load
duke
parents:
diff changeset
468 assert(is_interpreted_frame(), "interpreted frame expected");
a61af66fc99e Initial load
duke
parents:
diff changeset
469 intptr_t bcx = interpreter_frame_bcx();
a61af66fc99e Initial load
duke
parents:
diff changeset
470 intptr_t mdx = interpreter_frame_mdx();
a61af66fc99e Initial load
duke
parents:
diff changeset
471
a61af66fc99e Initial load
duke
parents:
diff changeset
472 assert(!is_bci(bcx), "should not access mdp during GC");
a61af66fc99e Initial load
duke
parents:
diff changeset
473 return (address)mdx;
a61af66fc99e Initial load
duke
parents:
diff changeset
474 }
a61af66fc99e Initial load
duke
parents:
diff changeset
475
a61af66fc99e Initial load
duke
parents:
diff changeset
476 void frame::interpreter_frame_set_mdp(address mdp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
477 assert(is_interpreted_frame(), "interpreted frame expected");
a61af66fc99e Initial load
duke
parents:
diff changeset
478 if (mdp == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
479 // Always allow the mdp to be cleared.
a61af66fc99e Initial load
duke
parents:
diff changeset
480 interpreter_frame_set_mdx((intptr_t)mdp);
a61af66fc99e Initial load
duke
parents:
diff changeset
481 }
a61af66fc99e Initial load
duke
parents:
diff changeset
482 intptr_t bcx = interpreter_frame_bcx();
a61af66fc99e Initial load
duke
parents:
diff changeset
483 assert(!is_bci(bcx), "should not set mdp during GC");
a61af66fc99e Initial load
duke
parents:
diff changeset
484 interpreter_frame_set_mdx((intptr_t)mdp);
a61af66fc99e Initial load
duke
parents:
diff changeset
485 }
a61af66fc99e Initial load
duke
parents:
diff changeset
486
a61af66fc99e Initial load
duke
parents:
diff changeset
487 BasicObjectLock* frame::next_monitor_in_interpreter_frame(BasicObjectLock* current) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
488 assert(is_interpreted_frame(), "Not an interpreted frame");
a61af66fc99e Initial load
duke
parents:
diff changeset
489 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
490 interpreter_frame_verify_monitor(current);
a61af66fc99e Initial load
duke
parents:
diff changeset
491 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
492 BasicObjectLock* next = (BasicObjectLock*) (((intptr_t*) current) + interpreter_frame_monitor_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
493 return next;
a61af66fc99e Initial load
duke
parents:
diff changeset
494 }
a61af66fc99e Initial load
duke
parents:
diff changeset
495
a61af66fc99e Initial load
duke
parents:
diff changeset
496 BasicObjectLock* frame::previous_monitor_in_interpreter_frame(BasicObjectLock* current) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
497 assert(is_interpreted_frame(), "Not an interpreted frame");
a61af66fc99e Initial load
duke
parents:
diff changeset
498 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
499 // // This verification needs to be checked before being enabled
a61af66fc99e Initial load
duke
parents:
diff changeset
500 // interpreter_frame_verify_monitor(current);
a61af66fc99e Initial load
duke
parents:
diff changeset
501 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
502 BasicObjectLock* previous = (BasicObjectLock*) (((intptr_t*) current) - interpreter_frame_monitor_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
503 return previous;
a61af66fc99e Initial load
duke
parents:
diff changeset
504 }
a61af66fc99e Initial load
duke
parents:
diff changeset
505
a61af66fc99e Initial load
duke
parents:
diff changeset
506 // Interpreter locals and expression stack locations.
a61af66fc99e Initial load
duke
parents:
diff changeset
507
a61af66fc99e Initial load
duke
parents:
diff changeset
508 intptr_t* frame::interpreter_frame_local_at(int index) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
509 const int n = Interpreter::local_offset_in_bytes(index)/wordSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
510 return &((*interpreter_frame_locals_addr())[n]);
a61af66fc99e Initial load
duke
parents:
diff changeset
511 }
a61af66fc99e Initial load
duke
parents:
diff changeset
512
a61af66fc99e Initial load
duke
parents:
diff changeset
513 intptr_t* frame::interpreter_frame_expression_stack_at(jint offset) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
514 const int i = offset * interpreter_frame_expression_stack_direction();
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1255
diff changeset
515 const int n = i * Interpreter::stackElementWords;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
516 return &(interpreter_frame_expression_stack()[n]);
a61af66fc99e Initial load
duke
parents:
diff changeset
517 }
a61af66fc99e Initial load
duke
parents:
diff changeset
518
a61af66fc99e Initial load
duke
parents:
diff changeset
519 jint frame::interpreter_frame_expression_stack_size() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
520 // Number of elements on the interpreter expression stack
a61af66fc99e Initial load
duke
parents:
diff changeset
521 // Callers should span by stackElementWords
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1255
diff changeset
522 int element_size = Interpreter::stackElementWords;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
523 if (frame::interpreter_frame_expression_stack_direction() < 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
524 return (interpreter_frame_expression_stack() -
a61af66fc99e Initial load
duke
parents:
diff changeset
525 interpreter_frame_tos_address() + 1)/element_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
526 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
527 return (interpreter_frame_tos_address() -
a61af66fc99e Initial load
duke
parents:
diff changeset
528 interpreter_frame_expression_stack() + 1)/element_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
529 }
a61af66fc99e Initial load
duke
parents:
diff changeset
530 }
a61af66fc99e Initial load
duke
parents:
diff changeset
531
a61af66fc99e Initial load
duke
parents:
diff changeset
532
a61af66fc99e Initial load
duke
parents:
diff changeset
533 // (frame::interpreter_frame_sender_sp accessor is in frame_<arch>.cpp)
a61af66fc99e Initial load
duke
parents:
diff changeset
534
a61af66fc99e Initial load
duke
parents:
diff changeset
535 const char* frame::print_name() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
536 if (is_native_frame()) return "Native";
a61af66fc99e Initial load
duke
parents:
diff changeset
537 if (is_interpreted_frame()) return "Interpreted";
a61af66fc99e Initial load
duke
parents:
diff changeset
538 if (is_compiled_frame()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
539 if (is_deoptimized_frame()) return "Deoptimized";
a61af66fc99e Initial load
duke
parents:
diff changeset
540 return "Compiled";
a61af66fc99e Initial load
duke
parents:
diff changeset
541 }
a61af66fc99e Initial load
duke
parents:
diff changeset
542 if (sp() == NULL) return "Empty";
a61af66fc99e Initial load
duke
parents:
diff changeset
543 return "C";
a61af66fc99e Initial load
duke
parents:
diff changeset
544 }
a61af66fc99e Initial load
duke
parents:
diff changeset
545
a61af66fc99e Initial load
duke
parents:
diff changeset
546 void frame::print_value_on(outputStream* st, JavaThread *thread) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
547 NOT_PRODUCT(address begin = pc()-40;)
a61af66fc99e Initial load
duke
parents:
diff changeset
548 NOT_PRODUCT(address end = NULL;)
a61af66fc99e Initial load
duke
parents:
diff changeset
549
a61af66fc99e Initial load
duke
parents:
diff changeset
550 st->print("%s frame (sp=" INTPTR_FORMAT " unextended sp=" INTPTR_FORMAT, print_name(), sp(), unextended_sp());
a61af66fc99e Initial load
duke
parents:
diff changeset
551 if (sp() != NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
552 st->print(", fp=" INTPTR_FORMAT ", pc=" INTPTR_FORMAT, fp(), pc());
a61af66fc99e Initial load
duke
parents:
diff changeset
553
a61af66fc99e Initial load
duke
parents:
diff changeset
554 if (StubRoutines::contains(pc())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
555 st->print_cr(")");
a61af66fc99e Initial load
duke
parents:
diff changeset
556 st->print("(");
a61af66fc99e Initial load
duke
parents:
diff changeset
557 StubCodeDesc* desc = StubCodeDesc::desc_for(pc());
a61af66fc99e Initial load
duke
parents:
diff changeset
558 st->print("~Stub::%s", desc->name());
a61af66fc99e Initial load
duke
parents:
diff changeset
559 NOT_PRODUCT(begin = desc->begin(); end = desc->end();)
a61af66fc99e Initial load
duke
parents:
diff changeset
560 } else if (Interpreter::contains(pc())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
561 st->print_cr(")");
a61af66fc99e Initial load
duke
parents:
diff changeset
562 st->print("(");
a61af66fc99e Initial load
duke
parents:
diff changeset
563 InterpreterCodelet* desc = Interpreter::codelet_containing(pc());
a61af66fc99e Initial load
duke
parents:
diff changeset
564 if (desc != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
565 st->print("~");
4872
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4824
diff changeset
566 desc->print_on(st);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
567 NOT_PRODUCT(begin = desc->code_begin(); end = desc->code_end();)
a61af66fc99e Initial load
duke
parents:
diff changeset
568 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
569 st->print("~interpreter");
a61af66fc99e Initial load
duke
parents:
diff changeset
570 }
a61af66fc99e Initial load
duke
parents:
diff changeset
571 }
a61af66fc99e Initial load
duke
parents:
diff changeset
572 st->print_cr(")");
a61af66fc99e Initial load
duke
parents:
diff changeset
573
a61af66fc99e Initial load
duke
parents:
diff changeset
574 if (_cb != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
575 st->print(" ");
a61af66fc99e Initial load
duke
parents:
diff changeset
576 _cb->print_value_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
577 st->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
578 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
579 if (end == NULL) {
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1727
diff changeset
580 begin = _cb->code_begin();
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1727
diff changeset
581 end = _cb->code_end();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
582 }
a61af66fc99e Initial load
duke
parents:
diff changeset
583 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
584 }
a61af66fc99e Initial load
duke
parents:
diff changeset
585 NOT_PRODUCT(if (WizardMode && Verbose) Disassembler::decode(begin, end);)
a61af66fc99e Initial load
duke
parents:
diff changeset
586 }
a61af66fc99e Initial load
duke
parents:
diff changeset
587
a61af66fc99e Initial load
duke
parents:
diff changeset
588
a61af66fc99e Initial load
duke
parents:
diff changeset
589 void frame::print_on(outputStream* st) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
590 print_value_on(st,NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
591 if (is_interpreted_frame()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
592 interpreter_frame_print_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
593 }
a61af66fc99e Initial load
duke
parents:
diff changeset
594 }
a61af66fc99e Initial load
duke
parents:
diff changeset
595
a61af66fc99e Initial load
duke
parents:
diff changeset
596
a61af66fc99e Initial load
duke
parents:
diff changeset
597 void frame::interpreter_frame_print_on(outputStream* st) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
598 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
599 assert(is_interpreted_frame(), "Not an interpreted frame");
a61af66fc99e Initial load
duke
parents:
diff changeset
600 jint i;
a61af66fc99e Initial load
duke
parents:
diff changeset
601 for (i = 0; i < interpreter_frame_method()->max_locals(); i++ ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
602 intptr_t x = *interpreter_frame_local_at(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
603 st->print(" - local [" INTPTR_FORMAT "]", x);
a61af66fc99e Initial load
duke
parents:
diff changeset
604 st->fill_to(23);
a61af66fc99e Initial load
duke
parents:
diff changeset
605 st->print_cr("; #%d", i);
a61af66fc99e Initial load
duke
parents:
diff changeset
606 }
a61af66fc99e Initial load
duke
parents:
diff changeset
607 for (i = interpreter_frame_expression_stack_size() - 1; i >= 0; --i ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
608 intptr_t x = *interpreter_frame_expression_stack_at(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
609 st->print(" - stack [" INTPTR_FORMAT "]", x);
a61af66fc99e Initial load
duke
parents:
diff changeset
610 st->fill_to(23);
a61af66fc99e Initial load
duke
parents:
diff changeset
611 st->print_cr("; #%d", i);
a61af66fc99e Initial load
duke
parents:
diff changeset
612 }
a61af66fc99e Initial load
duke
parents:
diff changeset
613 // locks for synchronization
a61af66fc99e Initial load
duke
parents:
diff changeset
614 for (BasicObjectLock* current = interpreter_frame_monitor_end();
a61af66fc99e Initial load
duke
parents:
diff changeset
615 current < interpreter_frame_monitor_begin();
a61af66fc99e Initial load
duke
parents:
diff changeset
616 current = next_monitor_in_interpreter_frame(current)) {
1255
e3a4305c6bc3 6925249: assert(last_sp < (intptr_t*) interpreter_frame_monitor_begin(),"bad tos")
kvn
parents: 1204
diff changeset
617 st->print(" - obj [");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
618 current->obj()->print_value_on(st);
1255
e3a4305c6bc3 6925249: assert(last_sp < (intptr_t*) interpreter_frame_monitor_begin(),"bad tos")
kvn
parents: 1204
diff changeset
619 st->print_cr("]");
e3a4305c6bc3 6925249: assert(last_sp < (intptr_t*) interpreter_frame_monitor_begin(),"bad tos")
kvn
parents: 1204
diff changeset
620 st->print(" - lock [");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
621 current->lock()->print_on(st);
1255
e3a4305c6bc3 6925249: assert(last_sp < (intptr_t*) interpreter_frame_monitor_begin(),"bad tos")
kvn
parents: 1204
diff changeset
622 st->print_cr("]");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
623 }
a61af66fc99e Initial load
duke
parents:
diff changeset
624 // monitor
a61af66fc99e Initial load
duke
parents:
diff changeset
625 st->print_cr(" - monitor[" INTPTR_FORMAT "]", interpreter_frame_monitor_begin());
a61af66fc99e Initial load
duke
parents:
diff changeset
626 // bcp
a61af66fc99e Initial load
duke
parents:
diff changeset
627 st->print(" - bcp [" INTPTR_FORMAT "]", interpreter_frame_bcp());
a61af66fc99e Initial load
duke
parents:
diff changeset
628 st->fill_to(23);
a61af66fc99e Initial load
duke
parents:
diff changeset
629 st->print_cr("; @%d", interpreter_frame_bci());
a61af66fc99e Initial load
duke
parents:
diff changeset
630 // locals
a61af66fc99e Initial load
duke
parents:
diff changeset
631 st->print_cr(" - locals [" INTPTR_FORMAT "]", interpreter_frame_local_at(0));
a61af66fc99e Initial load
duke
parents:
diff changeset
632 // method
a61af66fc99e Initial load
duke
parents:
diff changeset
633 st->print(" - method [" INTPTR_FORMAT "]", (address)interpreter_frame_method());
a61af66fc99e Initial load
duke
parents:
diff changeset
634 st->fill_to(23);
a61af66fc99e Initial load
duke
parents:
diff changeset
635 st->print("; ");
a61af66fc99e Initial load
duke
parents:
diff changeset
636 interpreter_frame_method()->print_name(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
637 st->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
638 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
639 }
a61af66fc99e Initial load
duke
parents:
diff changeset
640
a61af66fc99e Initial load
duke
parents:
diff changeset
641 // Return whether the frame is in the VM or os indicating a Hotspot problem.
a61af66fc99e Initial load
duke
parents:
diff changeset
642 // Otherwise, it's likely a bug in the native library that the Java code calls,
a61af66fc99e Initial load
duke
parents:
diff changeset
643 // hopefully indicating where to submit bugs.
a61af66fc99e Initial load
duke
parents:
diff changeset
644 static void print_C_frame(outputStream* st, char* buf, int buflen, address pc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
645 // C/C++ frame
a61af66fc99e Initial load
duke
parents:
diff changeset
646 bool in_vm = os::address_is_in_vm(pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
647 st->print(in_vm ? "V" : "C");
a61af66fc99e Initial load
duke
parents:
diff changeset
648
a61af66fc99e Initial load
duke
parents:
diff changeset
649 int offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
650 bool found;
a61af66fc99e Initial load
duke
parents:
diff changeset
651
a61af66fc99e Initial load
duke
parents:
diff changeset
652 // libname
a61af66fc99e Initial load
duke
parents:
diff changeset
653 found = os::dll_address_to_library_name(pc, buf, buflen, &offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
654 if (found) {
a61af66fc99e Initial load
duke
parents:
diff changeset
655 // skip directory names
a61af66fc99e Initial load
duke
parents:
diff changeset
656 const char *p1, *p2;
a61af66fc99e Initial load
duke
parents:
diff changeset
657 p1 = buf;
a61af66fc99e Initial load
duke
parents:
diff changeset
658 int len = (int)strlen(os::file_separator());
a61af66fc99e Initial load
duke
parents:
diff changeset
659 while ((p2 = strstr(p1, os::file_separator())) != NULL) p1 = p2 + len;
a61af66fc99e Initial load
duke
parents:
diff changeset
660 st->print(" [%s+0x%x]", p1, offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
661 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
662 st->print(" " PTR_FORMAT, pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
663 }
a61af66fc99e Initial load
duke
parents:
diff changeset
664
a61af66fc99e Initial load
duke
parents:
diff changeset
665 // function name - os::dll_address_to_function_name() may return confusing
a61af66fc99e Initial load
duke
parents:
diff changeset
666 // names if pc is within jvm.dll or libjvm.so, because JVM only has
a61af66fc99e Initial load
duke
parents:
diff changeset
667 // JVM_xxxx and a few other symbols in the dynamic symbol table. Do this
a61af66fc99e Initial load
duke
parents:
diff changeset
668 // only for native libraries.
2022
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents: 1972
diff changeset
669 if (!in_vm || Decoder::can_decode_C_frame_in_vm()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
670 found = os::dll_address_to_function_name(pc, buf, buflen, &offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
671
a61af66fc99e Initial load
duke
parents:
diff changeset
672 if (found) {
a61af66fc99e Initial load
duke
parents:
diff changeset
673 st->print(" %s+0x%x", buf, offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
674 }
a61af66fc99e Initial load
duke
parents:
diff changeset
675 }
a61af66fc99e Initial load
duke
parents:
diff changeset
676 }
a61af66fc99e Initial load
duke
parents:
diff changeset
677
a61af66fc99e Initial load
duke
parents:
diff changeset
678 // frame::print_on_error() is called by fatal error handler. Notice that we may
a61af66fc99e Initial load
duke
parents:
diff changeset
679 // crash inside this function if stack frame is corrupted. The fatal error
a61af66fc99e Initial load
duke
parents:
diff changeset
680 // handler can catch and handle the crash. Here we assume the frame is valid.
a61af66fc99e Initial load
duke
parents:
diff changeset
681 //
a61af66fc99e Initial load
duke
parents:
diff changeset
682 // First letter indicates type of the frame:
a61af66fc99e Initial load
duke
parents:
diff changeset
683 // J: Java frame (compiled)
a61af66fc99e Initial load
duke
parents:
diff changeset
684 // j: Java frame (interpreted)
a61af66fc99e Initial load
duke
parents:
diff changeset
685 // V: VM frame (C/C++)
a61af66fc99e Initial load
duke
parents:
diff changeset
686 // v: Other frames running VM generated code (e.g. stubs, adapters, etc.)
a61af66fc99e Initial load
duke
parents:
diff changeset
687 // C: C/C++ frame
a61af66fc99e Initial load
duke
parents:
diff changeset
688 //
a61af66fc99e Initial load
duke
parents:
diff changeset
689 // We don't need detailed frame type as that in frame::print_name(). "C"
a61af66fc99e Initial load
duke
parents:
diff changeset
690 // suggests the problem is in user lib; everything else is likely a VM bug.
a61af66fc99e Initial load
duke
parents:
diff changeset
691
a61af66fc99e Initial load
duke
parents:
diff changeset
692 void frame::print_on_error(outputStream* st, char* buf, int buflen, bool verbose) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
693 if (_cb != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
694 if (Interpreter::contains(pc())) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
695 Method* m = this->interpreter_frame_method();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
696 if (m != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
697 m->name_and_sig_as_C_string(buf, buflen);
a61af66fc99e Initial load
duke
parents:
diff changeset
698 st->print("j %s", buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
699 st->print("+%d", this->interpreter_frame_bci());
a61af66fc99e Initial load
duke
parents:
diff changeset
700 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
701 st->print("j " PTR_FORMAT, pc());
a61af66fc99e Initial load
duke
parents:
diff changeset
702 }
a61af66fc99e Initial load
duke
parents:
diff changeset
703 } else if (StubRoutines::contains(pc())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
704 StubCodeDesc* desc = StubCodeDesc::desc_for(pc());
a61af66fc99e Initial load
duke
parents:
diff changeset
705 if (desc != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
706 st->print("v ~StubRoutines::%s", desc->name());
a61af66fc99e Initial load
duke
parents:
diff changeset
707 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
708 st->print("v ~StubRoutines::" PTR_FORMAT, pc());
a61af66fc99e Initial load
duke
parents:
diff changeset
709 }
a61af66fc99e Initial load
duke
parents:
diff changeset
710 } else if (_cb->is_buffer_blob()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
711 st->print("v ~BufferBlob::%s", ((BufferBlob *)_cb)->name());
a61af66fc99e Initial load
duke
parents:
diff changeset
712 } else if (_cb->is_nmethod()) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
713 Method* m = ((nmethod *)_cb)->method();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
714 if (m != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
715 m->name_and_sig_as_C_string(buf, buflen);
a61af66fc99e Initial load
duke
parents:
diff changeset
716 st->print("J %s", buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
717 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
718 st->print("J " PTR_FORMAT, pc());
a61af66fc99e Initial load
duke
parents:
diff changeset
719 }
a61af66fc99e Initial load
duke
parents:
diff changeset
720 } else if (_cb->is_runtime_stub()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
721 st->print("v ~RuntimeStub::%s", ((RuntimeStub *)_cb)->name());
a61af66fc99e Initial load
duke
parents:
diff changeset
722 } else if (_cb->is_deoptimization_stub()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
723 st->print("v ~DeoptimizationBlob");
a61af66fc99e Initial load
duke
parents:
diff changeset
724 } else if (_cb->is_exception_stub()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
725 st->print("v ~ExceptionBlob");
a61af66fc99e Initial load
duke
parents:
diff changeset
726 } else if (_cb->is_safepoint_stub()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
727 st->print("v ~SafepointBlob");
a61af66fc99e Initial load
duke
parents:
diff changeset
728 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
729 st->print("v blob " PTR_FORMAT, pc());
a61af66fc99e Initial load
duke
parents:
diff changeset
730 }
a61af66fc99e Initial load
duke
parents:
diff changeset
731 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
732 print_C_frame(st, buf, buflen, pc());
a61af66fc99e Initial load
duke
parents:
diff changeset
733 }
a61af66fc99e Initial load
duke
parents:
diff changeset
734 }
a61af66fc99e Initial load
duke
parents:
diff changeset
735
a61af66fc99e Initial load
duke
parents:
diff changeset
736
a61af66fc99e Initial load
duke
parents:
diff changeset
737 /*
a61af66fc99e Initial load
duke
parents:
diff changeset
738 The interpreter_frame_expression_stack_at method in the case of SPARC needs the
a61af66fc99e Initial load
duke
parents:
diff changeset
739 max_stack value of the method in order to compute the expression stack address.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
740 It uses the Method* in order to get the max_stack value but during GC this
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
741 Method* value saved on the frame is changed by reverse_and_push and hence cannot
0
a61af66fc99e Initial load
duke
parents:
diff changeset
742 be used. So we save the max_stack value in the FrameClosure object and pass it
a61af66fc99e Initial load
duke
parents:
diff changeset
743 down to the interpreter_frame_expression_stack_at method
a61af66fc99e Initial load
duke
parents:
diff changeset
744 */
a61af66fc99e Initial load
duke
parents:
diff changeset
745 class InterpreterFrameClosure : public OffsetClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
746 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
747 frame* _fr;
a61af66fc99e Initial load
duke
parents:
diff changeset
748 OopClosure* _f;
a61af66fc99e Initial load
duke
parents:
diff changeset
749 int _max_locals;
a61af66fc99e Initial load
duke
parents:
diff changeset
750 int _max_stack;
a61af66fc99e Initial load
duke
parents:
diff changeset
751
a61af66fc99e Initial load
duke
parents:
diff changeset
752 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
753 InterpreterFrameClosure(frame* fr, int max_locals, int max_stack,
a61af66fc99e Initial load
duke
parents:
diff changeset
754 OopClosure* f) {
a61af66fc99e Initial load
duke
parents:
diff changeset
755 _fr = fr;
a61af66fc99e Initial load
duke
parents:
diff changeset
756 _max_locals = max_locals;
a61af66fc99e Initial load
duke
parents:
diff changeset
757 _max_stack = max_stack;
a61af66fc99e Initial load
duke
parents:
diff changeset
758 _f = f;
a61af66fc99e Initial load
duke
parents:
diff changeset
759 }
a61af66fc99e Initial load
duke
parents:
diff changeset
760
a61af66fc99e Initial load
duke
parents:
diff changeset
761 void offset_do(int offset) {
a61af66fc99e Initial load
duke
parents:
diff changeset
762 oop* addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
763 if (offset < _max_locals) {
a61af66fc99e Initial load
duke
parents:
diff changeset
764 addr = (oop*) _fr->interpreter_frame_local_at(offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
765 assert((intptr_t*)addr >= _fr->sp(), "must be inside the frame");
a61af66fc99e Initial load
duke
parents:
diff changeset
766 _f->do_oop(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
767 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
768 addr = (oop*) _fr->interpreter_frame_expression_stack_at((offset - _max_locals));
a61af66fc99e Initial load
duke
parents:
diff changeset
769 // In case of exceptions, the expression stack is invalid and the esp will be reset to express
a61af66fc99e Initial load
duke
parents:
diff changeset
770 // this condition. Therefore, we call f only if addr is 'inside' the stack (i.e., addr >= esp for Intel).
a61af66fc99e Initial load
duke
parents:
diff changeset
771 bool in_stack;
a61af66fc99e Initial load
duke
parents:
diff changeset
772 if (frame::interpreter_frame_expression_stack_direction() > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
773 in_stack = (intptr_t*)addr <= _fr->interpreter_frame_tos_address();
a61af66fc99e Initial load
duke
parents:
diff changeset
774 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
775 in_stack = (intptr_t*)addr >= _fr->interpreter_frame_tos_address();
a61af66fc99e Initial load
duke
parents:
diff changeset
776 }
a61af66fc99e Initial load
duke
parents:
diff changeset
777 if (in_stack) {
a61af66fc99e Initial load
duke
parents:
diff changeset
778 _f->do_oop(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
779 }
a61af66fc99e Initial load
duke
parents:
diff changeset
780 }
a61af66fc99e Initial load
duke
parents:
diff changeset
781 }
a61af66fc99e Initial load
duke
parents:
diff changeset
782
a61af66fc99e Initial load
duke
parents:
diff changeset
783 int max_locals() { return _max_locals; }
a61af66fc99e Initial load
duke
parents:
diff changeset
784 frame* fr() { return _fr; }
a61af66fc99e Initial load
duke
parents:
diff changeset
785 };
a61af66fc99e Initial load
duke
parents:
diff changeset
786
a61af66fc99e Initial load
duke
parents:
diff changeset
787
a61af66fc99e Initial load
duke
parents:
diff changeset
788 class InterpretedArgumentOopFinder: public SignatureInfo {
a61af66fc99e Initial load
duke
parents:
diff changeset
789 private:
1138
dd57230ba8fe 6893268: additional dynamic language related optimizations in C2
twisti
parents: 989
diff changeset
790 OopClosure* _f; // Closure to invoke
dd57230ba8fe 6893268: additional dynamic language related optimizations in C2
twisti
parents: 989
diff changeset
791 int _offset; // TOS-relative offset, decremented with each argument
dd57230ba8fe 6893268: additional dynamic language related optimizations in C2
twisti
parents: 989
diff changeset
792 bool _has_receiver; // true if the callee has a receiver
0
a61af66fc99e Initial load
duke
parents:
diff changeset
793 frame* _fr;
a61af66fc99e Initial load
duke
parents:
diff changeset
794
a61af66fc99e Initial load
duke
parents:
diff changeset
795 void set(int size, BasicType type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
796 _offset -= size;
a61af66fc99e Initial load
duke
parents:
diff changeset
797 if (type == T_OBJECT || type == T_ARRAY) oop_offset_do();
a61af66fc99e Initial load
duke
parents:
diff changeset
798 }
a61af66fc99e Initial load
duke
parents:
diff changeset
799
a61af66fc99e Initial load
duke
parents:
diff changeset
800 void oop_offset_do() {
a61af66fc99e Initial load
duke
parents:
diff changeset
801 oop* addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
802 addr = (oop*)_fr->interpreter_frame_tos_at(_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
803 _f->do_oop(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
804 }
a61af66fc99e Initial load
duke
parents:
diff changeset
805
a61af66fc99e Initial load
duke
parents:
diff changeset
806 public:
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
807 InterpretedArgumentOopFinder(Symbol* signature, bool has_receiver, frame* fr, OopClosure* f) : SignatureInfo(signature), _has_receiver(has_receiver) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
808 // compute size of arguments
1138
dd57230ba8fe 6893268: additional dynamic language related optimizations in C2
twisti
parents: 989
diff changeset
809 int args_size = ArgumentSizeComputer(signature).size() + (has_receiver ? 1 : 0);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
810 assert(!fr->is_interpreted_frame() ||
a61af66fc99e Initial load
duke
parents:
diff changeset
811 args_size <= fr->interpreter_frame_expression_stack_size(),
a61af66fc99e Initial load
duke
parents:
diff changeset
812 "args cannot be on stack anymore");
a61af66fc99e Initial load
duke
parents:
diff changeset
813 // initialize InterpretedArgumentOopFinder
a61af66fc99e Initial load
duke
parents:
diff changeset
814 _f = f;
a61af66fc99e Initial load
duke
parents:
diff changeset
815 _fr = fr;
a61af66fc99e Initial load
duke
parents:
diff changeset
816 _offset = args_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
817 }
a61af66fc99e Initial load
duke
parents:
diff changeset
818
a61af66fc99e Initial load
duke
parents:
diff changeset
819 void oops_do() {
1138
dd57230ba8fe 6893268: additional dynamic language related optimizations in C2
twisti
parents: 989
diff changeset
820 if (_has_receiver) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
821 --_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
822 oop_offset_do();
a61af66fc99e Initial load
duke
parents:
diff changeset
823 }
a61af66fc99e Initial load
duke
parents:
diff changeset
824 iterate_parameters();
a61af66fc99e Initial load
duke
parents:
diff changeset
825 }
a61af66fc99e Initial load
duke
parents:
diff changeset
826 };
a61af66fc99e Initial load
duke
parents:
diff changeset
827
a61af66fc99e Initial load
duke
parents:
diff changeset
828
a61af66fc99e Initial load
duke
parents:
diff changeset
829 // Entry frame has following form (n arguments)
a61af66fc99e Initial load
duke
parents:
diff changeset
830 // +-----------+
a61af66fc99e Initial load
duke
parents:
diff changeset
831 // sp -> | last arg |
a61af66fc99e Initial load
duke
parents:
diff changeset
832 // +-----------+
a61af66fc99e Initial load
duke
parents:
diff changeset
833 // : ::: :
a61af66fc99e Initial load
duke
parents:
diff changeset
834 // +-----------+
a61af66fc99e Initial load
duke
parents:
diff changeset
835 // (sp+n)->| first arg|
a61af66fc99e Initial load
duke
parents:
diff changeset
836 // +-----------+
a61af66fc99e Initial load
duke
parents:
diff changeset
837
a61af66fc99e Initial load
duke
parents:
diff changeset
838
a61af66fc99e Initial load
duke
parents:
diff changeset
839
a61af66fc99e Initial load
duke
parents:
diff changeset
840 // visits and GC's all the arguments in entry frame
a61af66fc99e Initial load
duke
parents:
diff changeset
841 class EntryFrameOopFinder: public SignatureInfo {
a61af66fc99e Initial load
duke
parents:
diff changeset
842 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
843 bool _is_static;
a61af66fc99e Initial load
duke
parents:
diff changeset
844 int _offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
845 frame* _fr;
a61af66fc99e Initial load
duke
parents:
diff changeset
846 OopClosure* _f;
a61af66fc99e Initial load
duke
parents:
diff changeset
847
a61af66fc99e Initial load
duke
parents:
diff changeset
848 void set(int size, BasicType type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
849 assert (_offset >= 0, "illegal offset");
a61af66fc99e Initial load
duke
parents:
diff changeset
850 if (type == T_OBJECT || type == T_ARRAY) oop_at_offset_do(_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
851 _offset -= size;
a61af66fc99e Initial load
duke
parents:
diff changeset
852 }
a61af66fc99e Initial load
duke
parents:
diff changeset
853
a61af66fc99e Initial load
duke
parents:
diff changeset
854 void oop_at_offset_do(int offset) {
1489
cff162798819 6888953: some calls to function-like macros are missing semicolons
jcoomes
parents: 1255
diff changeset
855 assert (offset >= 0, "illegal offset");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
856 oop* addr = (oop*) _fr->entry_frame_argument_at(offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
857 _f->do_oop(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
858 }
a61af66fc99e Initial load
duke
parents:
diff changeset
859
a61af66fc99e Initial load
duke
parents:
diff changeset
860 public:
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
861 EntryFrameOopFinder(frame* frame, Symbol* signature, bool is_static) : SignatureInfo(signature) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
862 _f = NULL; // will be set later
a61af66fc99e Initial load
duke
parents:
diff changeset
863 _fr = frame;
a61af66fc99e Initial load
duke
parents:
diff changeset
864 _is_static = is_static;
a61af66fc99e Initial load
duke
parents:
diff changeset
865 _offset = ArgumentSizeComputer(signature).size() - 1; // last parameter is at index 0
a61af66fc99e Initial load
duke
parents:
diff changeset
866 }
a61af66fc99e Initial load
duke
parents:
diff changeset
867
a61af66fc99e Initial load
duke
parents:
diff changeset
868 void arguments_do(OopClosure* f) {
a61af66fc99e Initial load
duke
parents:
diff changeset
869 _f = f;
a61af66fc99e Initial load
duke
parents:
diff changeset
870 if (!_is_static) oop_at_offset_do(_offset+1); // do the receiver
a61af66fc99e Initial load
duke
parents:
diff changeset
871 iterate_parameters();
a61af66fc99e Initial load
duke
parents:
diff changeset
872 }
a61af66fc99e Initial load
duke
parents:
diff changeset
873
a61af66fc99e Initial load
duke
parents:
diff changeset
874 };
a61af66fc99e Initial load
duke
parents:
diff changeset
875
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
876 oop* frame::interpreter_callee_receiver_addr(Symbol* signature) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
877 ArgumentSizeComputer asc(signature);
a61af66fc99e Initial load
duke
parents:
diff changeset
878 int size = asc.size();
a61af66fc99e Initial load
duke
parents:
diff changeset
879 return (oop *)interpreter_frame_tos_at(size);
a61af66fc99e Initial load
duke
parents:
diff changeset
880 }
a61af66fc99e Initial load
duke
parents:
diff changeset
881
a61af66fc99e Initial load
duke
parents:
diff changeset
882
7179
d0aa87f04bd5 8003720: NPG: Method in interpreter stack frame can be deallocated
stefank
parents: 6725
diff changeset
883 void frame::oops_interpreted_do(OopClosure* f, CLDToOopClosure* cld_f,
d0aa87f04bd5 8003720: NPG: Method in interpreter stack frame can be deallocated
stefank
parents: 6725
diff changeset
884 const RegisterMap* map, bool query_oop_map_cache) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
885 assert(is_interpreted_frame(), "Not an interpreted frame");
a61af66fc99e Initial load
duke
parents:
diff changeset
886 assert(map != NULL, "map must be set");
a61af66fc99e Initial load
duke
parents:
diff changeset
887 Thread *thread = Thread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
888 methodHandle m (thread, interpreter_frame_method());
a61af66fc99e Initial load
duke
parents:
diff changeset
889 jint bci = interpreter_frame_bci();
a61af66fc99e Initial load
duke
parents:
diff changeset
890
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
891 assert(!Universe::heap()->is_in(m()),
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
892 "must be valid oop");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
893 assert(m->is_method(), "checking frame value");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
894 assert((m->is_native() && bci == 0) ||
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
895 (!m->is_native() && bci >= 0 && bci < m->code_size()),
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
896 "invalid bci value");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
897
a61af66fc99e Initial load
duke
parents:
diff changeset
898 // Handle the monitor elements in the activation
a61af66fc99e Initial load
duke
parents:
diff changeset
899 for (
a61af66fc99e Initial load
duke
parents:
diff changeset
900 BasicObjectLock* current = interpreter_frame_monitor_end();
a61af66fc99e Initial load
duke
parents:
diff changeset
901 current < interpreter_frame_monitor_begin();
a61af66fc99e Initial load
duke
parents:
diff changeset
902 current = next_monitor_in_interpreter_frame(current)
a61af66fc99e Initial load
duke
parents:
diff changeset
903 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
904 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
905 interpreter_frame_verify_monitor(current);
a61af66fc99e Initial load
duke
parents:
diff changeset
906 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
907 current->oops_do(f);
a61af66fc99e Initial load
duke
parents:
diff changeset
908 }
a61af66fc99e Initial load
duke
parents:
diff changeset
909
a61af66fc99e Initial load
duke
parents:
diff changeset
910 // process fixed part
7179
d0aa87f04bd5 8003720: NPG: Method in interpreter stack frame can be deallocated
stefank
parents: 6725
diff changeset
911 if (cld_f != NULL) {
d0aa87f04bd5 8003720: NPG: Method in interpreter stack frame can be deallocated
stefank
parents: 6725
diff changeset
912 // The method pointer in the frame might be the only path to the method's
d0aa87f04bd5 8003720: NPG: Method in interpreter stack frame can be deallocated
stefank
parents: 6725
diff changeset
913 // klass, and the klass needs to be kept alive while executing. The GCs
d0aa87f04bd5 8003720: NPG: Method in interpreter stack frame can be deallocated
stefank
parents: 6725
diff changeset
914 // don't trace through method pointers, so typically in similar situations
d0aa87f04bd5 8003720: NPG: Method in interpreter stack frame can be deallocated
stefank
parents: 6725
diff changeset
915 // the mirror or the class loader of the klass are installed as a GC root.
d0aa87f04bd5 8003720: NPG: Method in interpreter stack frame can be deallocated
stefank
parents: 6725
diff changeset
916 // To minimze the overhead of doing that here, we ask the GC to pass down a
d0aa87f04bd5 8003720: NPG: Method in interpreter stack frame can be deallocated
stefank
parents: 6725
diff changeset
917 // closure that knows how to keep klasses alive given a ClassLoaderData.
d0aa87f04bd5 8003720: NPG: Method in interpreter stack frame can be deallocated
stefank
parents: 6725
diff changeset
918 cld_f->do_cld(m->method_holder()->class_loader_data());
d0aa87f04bd5 8003720: NPG: Method in interpreter stack frame can be deallocated
stefank
parents: 6725
diff changeset
919 }
d0aa87f04bd5 8003720: NPG: Method in interpreter stack frame can be deallocated
stefank
parents: 6725
diff changeset
920
1908
f195c4737aca 6994130: Zero PowerPC fix
twisti
parents: 1748
diff changeset
921 #if !defined(PPC) || defined(ZERO)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
922 if (m->is_native()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
923 #ifdef CC_INTERP
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
924 interpreterState istate = get_interpreterState();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
925 f->do_oop((oop*)&istate->_oop_temp);
a61af66fc99e Initial load
duke
parents:
diff changeset
926 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
927 f->do_oop((oop*)( fp() + interpreter_frame_oop_temp_offset ));
a61af66fc99e Initial load
duke
parents:
diff changeset
928 #endif /* CC_INTERP */
a61af66fc99e Initial load
duke
parents:
diff changeset
929 }
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
930 #else // PPC
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
931 if (m->is_native() && m->is_static()) {
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
932 f->do_oop(interpreter_frame_mirror_addr());
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
933 }
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
934 #endif // PPC
0
a61af66fc99e Initial load
duke
parents:
diff changeset
935
a61af66fc99e Initial load
duke
parents:
diff changeset
936 int max_locals = m->is_native() ? m->size_of_parameters() : m->max_locals();
a61af66fc99e Initial load
duke
parents:
diff changeset
937
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
938 Symbol* signature = NULL;
1138
dd57230ba8fe 6893268: additional dynamic language related optimizations in C2
twisti
parents: 989
diff changeset
939 bool has_receiver = false;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
940
a61af66fc99e Initial load
duke
parents:
diff changeset
941 // Process a callee's arguments if we are at a call site
a61af66fc99e Initial load
duke
parents:
diff changeset
942 // (i.e., if we are at an invoke bytecode)
a61af66fc99e Initial load
duke
parents:
diff changeset
943 // This is used sometimes for calling into the VM, not for another
a61af66fc99e Initial load
duke
parents:
diff changeset
944 // interpreted or compiled frame.
a61af66fc99e Initial load
duke
parents:
diff changeset
945 if (!m->is_native()) {
2142
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 2023
diff changeset
946 Bytecode_invoke call = Bytecode_invoke_check(m, bci);
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 2023
diff changeset
947 if (call.is_valid()) {
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
948 signature = call.signature();
2142
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 2023
diff changeset
949 has_receiver = call.has_receiver();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
950 if (map->include_argument_oops() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
951 interpreter_frame_expression_stack_size() > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
952 ResourceMark rm(thread); // is this right ???
a61af66fc99e Initial load
duke
parents:
diff changeset
953 // we are at a call site & the expression stack is not empty
a61af66fc99e Initial load
duke
parents:
diff changeset
954 // => process callee's arguments
a61af66fc99e Initial load
duke
parents:
diff changeset
955 //
a61af66fc99e Initial load
duke
parents:
diff changeset
956 // Note: The expression stack can be empty if an exception
605
98cb887364d3 6810672: Comment typos
twisti
parents: 417
diff changeset
957 // occurred during method resolution/execution. In all
0
a61af66fc99e Initial load
duke
parents:
diff changeset
958 // cases we empty the expression stack completely be-
a61af66fc99e Initial load
duke
parents:
diff changeset
959 // fore handling the exception (the exception handling
a61af66fc99e Initial load
duke
parents:
diff changeset
960 // code in the interpreter calls a blocking runtime
a61af66fc99e Initial load
duke
parents:
diff changeset
961 // routine which can cause this code to be executed).
a61af66fc99e Initial load
duke
parents:
diff changeset
962 // (was bug gri 7/27/98)
1138
dd57230ba8fe 6893268: additional dynamic language related optimizations in C2
twisti
parents: 989
diff changeset
963 oops_interpreted_arguments_do(signature, has_receiver, f);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
964 }
a61af66fc99e Initial load
duke
parents:
diff changeset
965 }
a61af66fc99e Initial load
duke
parents:
diff changeset
966 }
a61af66fc99e Initial load
duke
parents:
diff changeset
967
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1255
diff changeset
968 InterpreterFrameClosure blk(this, max_locals, m->max_stack(), f);
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1255
diff changeset
969
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1255
diff changeset
970 // process locals & expression stack
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1255
diff changeset
971 InterpreterOopMap mask;
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1255
diff changeset
972 if (query_oop_map_cache) {
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1255
diff changeset
973 m->mask_for(bci, &mask);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
974 } else {
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1255
diff changeset
975 OopMapCache::compute_one_oop_map(m, bci, &mask);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
976 }
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1255
diff changeset
977 mask.iterate_oop(&blk);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
978 }
a61af66fc99e Initial load
duke
parents:
diff changeset
979
a61af66fc99e Initial load
duke
parents:
diff changeset
980
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
981 void frame::oops_interpreted_arguments_do(Symbol* signature, bool has_receiver, OopClosure* f) {
1138
dd57230ba8fe 6893268: additional dynamic language related optimizations in C2
twisti
parents: 989
diff changeset
982 InterpretedArgumentOopFinder finder(signature, has_receiver, this, f);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
983 finder.oops_do();
a61af66fc99e Initial load
duke
parents:
diff changeset
984 }
a61af66fc99e Initial load
duke
parents:
diff changeset
985
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 605
diff changeset
986 void frame::oops_code_blob_do(OopClosure* f, CodeBlobClosure* cf, const RegisterMap* reg_map) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
987 assert(_cb != NULL, "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
988 if (_cb->oop_maps() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
989 OopMapSet::oops_do(this, reg_map, f);
a61af66fc99e Initial load
duke
parents:
diff changeset
990
a61af66fc99e Initial load
duke
parents:
diff changeset
991 // Preserve potential arguments for a callee. We handle this by dispatching
a61af66fc99e Initial load
duke
parents:
diff changeset
992 // on the codeblob. For c2i, we do
a61af66fc99e Initial load
duke
parents:
diff changeset
993 if (reg_map->include_argument_oops()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
994 _cb->preserve_callee_argument_oops(*this, reg_map, f);
a61af66fc99e Initial load
duke
parents:
diff changeset
995 }
a61af66fc99e Initial load
duke
parents:
diff changeset
996 }
a61af66fc99e Initial load
duke
parents:
diff changeset
997 // In cases where perm gen is collected, GC will want to mark
a61af66fc99e Initial load
duke
parents:
diff changeset
998 // oops referenced from nmethods active on thread stacks so as to
a61af66fc99e Initial load
duke
parents:
diff changeset
999 // prevent them from being collected. However, this visit should be
a61af66fc99e Initial load
duke
parents:
diff changeset
1000 // restricted to certain phases of the collection only. The
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 605
diff changeset
1001 // closure decides how it wants nmethods to be traced.
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 605
diff changeset
1002 if (cf != NULL)
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 605
diff changeset
1003 cf->do_code_blob(_cb);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1004 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1005
a61af66fc99e Initial load
duke
parents:
diff changeset
1006 class CompiledArgumentOopFinder: public SignatureInfo {
a61af66fc99e Initial load
duke
parents:
diff changeset
1007 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
1008 OopClosure* _f;
1138
dd57230ba8fe 6893268: additional dynamic language related optimizations in C2
twisti
parents: 989
diff changeset
1009 int _offset; // the current offset, incremented with each argument
dd57230ba8fe 6893268: additional dynamic language related optimizations in C2
twisti
parents: 989
diff changeset
1010 bool _has_receiver; // true if the callee has a receiver
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1011 frame _fr;
a61af66fc99e Initial load
duke
parents:
diff changeset
1012 RegisterMap* _reg_map;
a61af66fc99e Initial load
duke
parents:
diff changeset
1013 int _arg_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
1014 VMRegPair* _regs; // VMReg list of arguments
a61af66fc99e Initial load
duke
parents:
diff changeset
1015
a61af66fc99e Initial load
duke
parents:
diff changeset
1016 void set(int size, BasicType type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1017 if (type == T_OBJECT || type == T_ARRAY) handle_oop_offset();
a61af66fc99e Initial load
duke
parents:
diff changeset
1018 _offset += size;
a61af66fc99e Initial load
duke
parents:
diff changeset
1019 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1020
a61af66fc99e Initial load
duke
parents:
diff changeset
1021 virtual void handle_oop_offset() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1022 // Extract low order register number from register array.
a61af66fc99e Initial load
duke
parents:
diff changeset
1023 // In LP64-land, the high-order bits are valid but unhelpful.
a61af66fc99e Initial load
duke
parents:
diff changeset
1024 VMReg reg = _regs[_offset].first();
a61af66fc99e Initial load
duke
parents:
diff changeset
1025 oop *loc = _fr.oopmapreg_to_location(reg, _reg_map);
a61af66fc99e Initial load
duke
parents:
diff changeset
1026 _f->do_oop(loc);
a61af66fc99e Initial load
duke
parents:
diff changeset
1027 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1028
a61af66fc99e Initial load
duke
parents:
diff changeset
1029 public:
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
1030 CompiledArgumentOopFinder(Symbol* signature, bool has_receiver, OopClosure* f, frame fr, const RegisterMap* reg_map)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1031 : SignatureInfo(signature) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1032
a61af66fc99e Initial load
duke
parents:
diff changeset
1033 // initialize CompiledArgumentOopFinder
a61af66fc99e Initial load
duke
parents:
diff changeset
1034 _f = f;
a61af66fc99e Initial load
duke
parents:
diff changeset
1035 _offset = 0;
1138
dd57230ba8fe 6893268: additional dynamic language related optimizations in C2
twisti
parents: 989
diff changeset
1036 _has_receiver = has_receiver;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1037 _fr = fr;
a61af66fc99e Initial load
duke
parents:
diff changeset
1038 _reg_map = (RegisterMap*)reg_map;
1138
dd57230ba8fe 6893268: additional dynamic language related optimizations in C2
twisti
parents: 989
diff changeset
1039 _arg_size = ArgumentSizeComputer(signature).size() + (has_receiver ? 1 : 0);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1040
a61af66fc99e Initial load
duke
parents:
diff changeset
1041 int arg_size;
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
1042 _regs = SharedRuntime::find_callee_arguments(signature, has_receiver, &arg_size);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1043 assert(arg_size == _arg_size, "wrong arg size");
a61af66fc99e Initial load
duke
parents:
diff changeset
1044 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1045
a61af66fc99e Initial load
duke
parents:
diff changeset
1046 void oops_do() {
1138
dd57230ba8fe 6893268: additional dynamic language related optimizations in C2
twisti
parents: 989
diff changeset
1047 if (_has_receiver) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1048 handle_oop_offset();
a61af66fc99e Initial load
duke
parents:
diff changeset
1049 _offset++;
a61af66fc99e Initial load
duke
parents:
diff changeset
1050 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1051 iterate_parameters();
a61af66fc99e Initial load
duke
parents:
diff changeset
1052 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1053 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1054
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
1055 void frame::oops_compiled_arguments_do(Symbol* signature, bool has_receiver, const RegisterMap* reg_map, OopClosure* f) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1056 ResourceMark rm;
1138
dd57230ba8fe 6893268: additional dynamic language related optimizations in C2
twisti
parents: 989
diff changeset
1057 CompiledArgumentOopFinder finder(signature, has_receiver, f, *this, reg_map);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1058 finder.oops_do();
a61af66fc99e Initial load
duke
parents:
diff changeset
1059 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1060
a61af66fc99e Initial load
duke
parents:
diff changeset
1061
a61af66fc99e Initial load
duke
parents:
diff changeset
1062 // Get receiver out of callers frame, i.e. find parameter 0 in callers
a61af66fc99e Initial load
duke
parents:
diff changeset
1063 // frame. Consult ADLC for where parameter 0 is to be found. Then
a61af66fc99e Initial load
duke
parents:
diff changeset
1064 // check local reg_map for it being a callee-save register or argument
a61af66fc99e Initial load
duke
parents:
diff changeset
1065 // register, both of which are saved in the local frame. If not found
a61af66fc99e Initial load
duke
parents:
diff changeset
1066 // there, it must be an in-stack argument of the caller.
a61af66fc99e Initial load
duke
parents:
diff changeset
1067 // Note: caller.sp() points to callee-arguments
a61af66fc99e Initial load
duke
parents:
diff changeset
1068 oop frame::retrieve_receiver(RegisterMap* reg_map) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1069 frame caller = *this;
a61af66fc99e Initial load
duke
parents:
diff changeset
1070
a61af66fc99e Initial load
duke
parents:
diff changeset
1071 // First consult the ADLC on where it puts parameter 0 for this signature.
a61af66fc99e Initial load
duke
parents:
diff changeset
1072 VMReg reg = SharedRuntime::name_for_receiver();
8690
c40fbf634c90 8008574: [parfait] Null pointer deference in hotspot/src/share/vm/runtime/frame.cpp
morris
parents: 7206
diff changeset
1073 oop* oop_adr = caller.oopmapreg_to_location(reg, reg_map);
c40fbf634c90 8008574: [parfait] Null pointer deference in hotspot/src/share/vm/runtime/frame.cpp
morris
parents: 7206
diff changeset
1074 if (oop_adr == NULL) {
c40fbf634c90 8008574: [parfait] Null pointer deference in hotspot/src/share/vm/runtime/frame.cpp
morris
parents: 7206
diff changeset
1075 guarantee(oop_adr != NULL, "bad register save location");
c40fbf634c90 8008574: [parfait] Null pointer deference in hotspot/src/share/vm/runtime/frame.cpp
morris
parents: 7206
diff changeset
1076 return NULL;
c40fbf634c90 8008574: [parfait] Null pointer deference in hotspot/src/share/vm/runtime/frame.cpp
morris
parents: 7206
diff changeset
1077 }
c40fbf634c90 8008574: [parfait] Null pointer deference in hotspot/src/share/vm/runtime/frame.cpp
morris
parents: 7206
diff changeset
1078 oop r = *oop_adr;
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4872
diff changeset
1079 assert(Universe::heap()->is_in_or_null(r), err_msg("bad receiver: " INTPTR_FORMAT " (" INTX_FORMAT ")", (intptr_t) r, (intptr_t) r));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 return r;
a61af66fc99e Initial load
duke
parents:
diff changeset
1081 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1082
a61af66fc99e Initial load
duke
parents:
diff changeset
1083
a61af66fc99e Initial load
duke
parents:
diff changeset
1084 oop* frame::oopmapreg_to_location(VMReg reg, const RegisterMap* reg_map) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1085 if(reg->is_reg()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1086 // If it is passed in a register, it got spilled in the stub frame.
a61af66fc99e Initial load
duke
parents:
diff changeset
1087 return (oop *)reg_map->location(reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
1088 } else {
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1089 int sp_offset_in_bytes = reg->reg2stack() * VMRegImpl::stack_slot_size;
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1090 return (oop*)(((address)unextended_sp()) + sp_offset_in_bytes);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1091 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1092 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1093
2019
09b4dd4f152b 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 1972
diff changeset
1094 BasicLock* frame::get_native_monitor() {
09b4dd4f152b 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 1972
diff changeset
1095 nmethod* nm = (nmethod*)_cb;
09b4dd4f152b 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 1972
diff changeset
1096 assert(_cb != NULL && _cb->is_nmethod() && nm->method()->is_native(),
09b4dd4f152b 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 1972
diff changeset
1097 "Should not call this unless it's a native nmethod");
09b4dd4f152b 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 1972
diff changeset
1098 int byte_offset = in_bytes(nm->native_basic_lock_sp_offset());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1099 assert(byte_offset >= 0, "should not see invalid offset");
a61af66fc99e Initial load
duke
parents:
diff changeset
1100 return (BasicLock*) &sp()[byte_offset / wordSize];
a61af66fc99e Initial load
duke
parents:
diff changeset
1101 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1102
2019
09b4dd4f152b 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 1972
diff changeset
1103 oop frame::get_native_receiver() {
09b4dd4f152b 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 1972
diff changeset
1104 nmethod* nm = (nmethod*)_cb;
09b4dd4f152b 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 1972
diff changeset
1105 assert(_cb != NULL && _cb->is_nmethod() && nm->method()->is_native(),
09b4dd4f152b 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 1972
diff changeset
1106 "Should not call this unless it's a native nmethod");
09b4dd4f152b 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 1972
diff changeset
1107 int byte_offset = in_bytes(nm->native_receiver_sp_offset());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1108 assert(byte_offset >= 0, "should not see invalid offset");
a61af66fc99e Initial load
duke
parents:
diff changeset
1109 oop owner = ((oop*) sp())[byte_offset / wordSize];
a61af66fc99e Initial load
duke
parents:
diff changeset
1110 assert( Universe::heap()->is_in(owner), "bad receiver" );
a61af66fc99e Initial load
duke
parents:
diff changeset
1111 return owner;
a61af66fc99e Initial load
duke
parents:
diff changeset
1112 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1113
a61af66fc99e Initial load
duke
parents:
diff changeset
1114 void frame::oops_entry_do(OopClosure* f, const RegisterMap* map) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1115 assert(map != NULL, "map must be set");
a61af66fc99e Initial load
duke
parents:
diff changeset
1116 if (map->include_argument_oops()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1117 // must collect argument oops, as nobody else is doing it
a61af66fc99e Initial load
duke
parents:
diff changeset
1118 Thread *thread = Thread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
1119 methodHandle m (thread, entry_frame_call_wrapper()->callee_method());
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
1120 EntryFrameOopFinder finder(this, m->signature(), m->is_static());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1121 finder.arguments_do(f);
a61af66fc99e Initial load
duke
parents:
diff changeset
1122 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1123 // Traverse the Handle Block saved in the entry frame
a61af66fc99e Initial load
duke
parents:
diff changeset
1124 entry_frame_call_wrapper()->oops_do(f);
a61af66fc99e Initial load
duke
parents:
diff changeset
1125 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1126
a61af66fc99e Initial load
duke
parents:
diff changeset
1127
7179
d0aa87f04bd5 8003720: NPG: Method in interpreter stack frame can be deallocated
stefank
parents: 6725
diff changeset
1128 void frame::oops_do_internal(OopClosure* f, CLDToOopClosure* cld_f, CodeBlobClosure* cf, RegisterMap* map, bool use_interpreter_oop_map_cache) {
1119
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 989
diff changeset
1129 #ifndef PRODUCT
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 989
diff changeset
1130 // simulate GC crash here to dump java thread in error report
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 989
diff changeset
1131 if (CrashGCForDumpingJavaThread) {
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 989
diff changeset
1132 char *t = NULL;
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 989
diff changeset
1133 *t = 'c';
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 989
diff changeset
1134 }
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 989
diff changeset
1135 #endif
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 989
diff changeset
1136 if (is_interpreted_frame()) {
7179
d0aa87f04bd5 8003720: NPG: Method in interpreter stack frame can be deallocated
stefank
parents: 6725
diff changeset
1137 oops_interpreted_do(f, cld_f, map, use_interpreter_oop_map_cache);
1119
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 989
diff changeset
1138 } else if (is_entry_frame()) {
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 989
diff changeset
1139 oops_entry_do(f, map);
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 989
diff changeset
1140 } else if (CodeCache::contains(pc())) {
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 989
diff changeset
1141 oops_code_blob_do(f, cf, map);
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1681
diff changeset
1142 #ifdef SHARK
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1681
diff changeset
1143 } else if (is_fake_stub_frame()) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1681
diff changeset
1144 // nothing to do
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1681
diff changeset
1145 #endif // SHARK
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1146 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1147 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
1148 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1149 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1150
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 605
diff changeset
1151 void frame::nmethods_do(CodeBlobClosure* cf) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1152 if (_cb != NULL && _cb->is_nmethod()) {
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 605
diff changeset
1153 cf->do_code_blob(_cb);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1154 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1155 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1156
a61af66fc99e Initial load
duke
parents:
diff changeset
1157
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1158 // call f() on the interpreted Method*s in the stack.
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1159 // Have to walk the entire code cache for the compiled frames Yuck.
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1160 void frame::metadata_do(void f(Metadata*)) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1161 if (_cb != NULL && Interpreter::contains(pc())) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1162 Method* m = this->interpreter_frame_method();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1163 assert(m != NULL, "huh?");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1164 f(m);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1165 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1166 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1167
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1168 void frame::gc_prologue() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1169 if (is_interpreted_frame()) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1170 // set bcx to bci to become Method* position independent during GC
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1171 interpreter_frame_set_bcx(interpreter_frame_bci());
a61af66fc99e Initial load
duke
parents:
diff changeset
1172 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1173 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1174
a61af66fc99e Initial load
duke
parents:
diff changeset
1175
a61af66fc99e Initial load
duke
parents:
diff changeset
1176 void frame::gc_epilogue() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1177 if (is_interpreted_frame()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1178 // set bcx back to bcp for interpreter
a61af66fc99e Initial load
duke
parents:
diff changeset
1179 interpreter_frame_set_bcx((intptr_t)interpreter_frame_bcp());
a61af66fc99e Initial load
duke
parents:
diff changeset
1180 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1181 // call processor specific epilog function
a61af66fc99e Initial load
duke
parents:
diff changeset
1182 pd_gc_epilog();
a61af66fc99e Initial load
duke
parents:
diff changeset
1183 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1184
a61af66fc99e Initial load
duke
parents:
diff changeset
1185
a61af66fc99e Initial load
duke
parents:
diff changeset
1186 # ifdef ENABLE_ZAP_DEAD_LOCALS
a61af66fc99e Initial load
duke
parents:
diff changeset
1187
a61af66fc99e Initial load
duke
parents:
diff changeset
1188 void frame::CheckValueClosure::do_oop(oop* p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1189 if (CheckOopishValues && Universe::heap()->is_in_reserved(*p)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1190 warning("value @ " INTPTR_FORMAT " looks oopish (" INTPTR_FORMAT ") (thread = " INTPTR_FORMAT ")", p, (address)*p, Thread::current());
a61af66fc99e Initial load
duke
parents:
diff changeset
1191 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1192 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1193 frame::CheckValueClosure frame::_check_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
1194
a61af66fc99e Initial load
duke
parents:
diff changeset
1195
a61af66fc99e Initial load
duke
parents:
diff changeset
1196 void frame::CheckOopClosure::do_oop(oop* p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1197 if (*p != NULL && !(*p)->is_oop()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1198 warning("value @ " INTPTR_FORMAT " should be an oop (" INTPTR_FORMAT ") (thread = " INTPTR_FORMAT ")", p, (address)*p, Thread::current());
a61af66fc99e Initial load
duke
parents:
diff changeset
1199 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1200 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1201 frame::CheckOopClosure frame::_check_oop;
a61af66fc99e Initial load
duke
parents:
diff changeset
1202
a61af66fc99e Initial load
duke
parents:
diff changeset
1203 void frame::check_derived_oop(oop* base, oop* derived) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1204 _check_oop.do_oop(base);
a61af66fc99e Initial load
duke
parents:
diff changeset
1205 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1206
a61af66fc99e Initial load
duke
parents:
diff changeset
1207
a61af66fc99e Initial load
duke
parents:
diff changeset
1208 void frame::ZapDeadClosure::do_oop(oop* p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1209 if (TraceZapDeadLocals) tty->print_cr("zapping @ " INTPTR_FORMAT " containing " INTPTR_FORMAT, p, (address)*p);
a61af66fc99e Initial load
duke
parents:
diff changeset
1210 // Need cast because on _LP64 the conversion to oop is ambiguous. Constant
a61af66fc99e Initial load
duke
parents:
diff changeset
1211 // can be either long or int.
a61af66fc99e Initial load
duke
parents:
diff changeset
1212 *p = (oop)(int)0xbabebabe;
a61af66fc99e Initial load
duke
parents:
diff changeset
1213 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1214 frame::ZapDeadClosure frame::_zap_dead;
a61af66fc99e Initial load
duke
parents:
diff changeset
1215
a61af66fc99e Initial load
duke
parents:
diff changeset
1216 void frame::zap_dead_locals(JavaThread* thread, const RegisterMap* map) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1217 assert(thread == Thread::current(), "need to synchronize to do this to another thread");
a61af66fc99e Initial load
duke
parents:
diff changeset
1218 // Tracing - part 1
a61af66fc99e Initial load
duke
parents:
diff changeset
1219 if (TraceZapDeadLocals) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1220 ResourceMark rm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1221 tty->print_cr("--------------------------------------------------------------------------------");
a61af66fc99e Initial load
duke
parents:
diff changeset
1222 tty->print("Zapping dead locals in ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1223 print_on(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
1224 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1225 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1226 // Zapping
a61af66fc99e Initial load
duke
parents:
diff changeset
1227 if (is_entry_frame ()) zap_dead_entry_locals (thread, map);
a61af66fc99e Initial load
duke
parents:
diff changeset
1228 else if (is_interpreted_frame()) zap_dead_interpreted_locals(thread, map);
a61af66fc99e Initial load
duke
parents:
diff changeset
1229 else if (is_compiled_frame()) zap_dead_compiled_locals (thread, map);
a61af66fc99e Initial load
duke
parents:
diff changeset
1230
a61af66fc99e Initial load
duke
parents:
diff changeset
1231 else
a61af66fc99e Initial load
duke
parents:
diff changeset
1232 // could be is_runtime_frame
a61af66fc99e Initial load
duke
parents:
diff changeset
1233 // so remove error: ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
1234 ;
a61af66fc99e Initial load
duke
parents:
diff changeset
1235 // Tracing - part 2
a61af66fc99e Initial load
duke
parents:
diff changeset
1236 if (TraceZapDeadLocals) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1237 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1238 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1239 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1240
a61af66fc99e Initial load
duke
parents:
diff changeset
1241
a61af66fc99e Initial load
duke
parents:
diff changeset
1242 void frame::zap_dead_interpreted_locals(JavaThread *thread, const RegisterMap* map) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1243 // get current interpreter 'pc'
a61af66fc99e Initial load
duke
parents:
diff changeset
1244 assert(is_interpreted_frame(), "Not an interpreted frame");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1245 Method* m = interpreter_frame_method();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1246 int bci = interpreter_frame_bci();
a61af66fc99e Initial load
duke
parents:
diff changeset
1247
a61af66fc99e Initial load
duke
parents:
diff changeset
1248 int max_locals = m->is_native() ? m->size_of_parameters() : m->max_locals();
a61af66fc99e Initial load
duke
parents:
diff changeset
1249
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1255
diff changeset
1250 // process dynamic part
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1255
diff changeset
1251 InterpreterFrameClosure value_blk(this, max_locals, m->max_stack(),
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1255
diff changeset
1252 &_check_value);
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1255
diff changeset
1253 InterpreterFrameClosure oop_blk(this, max_locals, m->max_stack(),
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1255
diff changeset
1254 &_check_oop );
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1255
diff changeset
1255 InterpreterFrameClosure dead_blk(this, max_locals, m->max_stack(),
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1255
diff changeset
1256 &_zap_dead );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1257
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1255
diff changeset
1258 // get frame map
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1255
diff changeset
1259 InterpreterOopMap mask;
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1255
diff changeset
1260 m->mask_for(bci, &mask);
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1255
diff changeset
1261 mask.iterate_all( &oop_blk, &value_blk, &dead_blk);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1262 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1263
a61af66fc99e Initial load
duke
parents:
diff changeset
1264
a61af66fc99e Initial load
duke
parents:
diff changeset
1265 void frame::zap_dead_compiled_locals(JavaThread* thread, const RegisterMap* reg_map) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1266
a61af66fc99e Initial load
duke
parents:
diff changeset
1267 ResourceMark rm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1268 assert(_cb != NULL, "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
1269 if (_cb->oop_maps() != NULL) {
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1270 OopMapSet::all_do(this, reg_map, &_check_oop, check_derived_oop, &_check_value);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1271 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1272 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1273
a61af66fc99e Initial load
duke
parents:
diff changeset
1274
a61af66fc99e Initial load
duke
parents:
diff changeset
1275 void frame::zap_dead_entry_locals(JavaThread*, const RegisterMap*) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1276 if (TraceZapDeadLocals) warning("frame::zap_dead_entry_locals unimplemented");
a61af66fc99e Initial load
duke
parents:
diff changeset
1277 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1278
a61af66fc99e Initial load
duke
parents:
diff changeset
1279
a61af66fc99e Initial load
duke
parents:
diff changeset
1280 void frame::zap_dead_deoptimized_locals(JavaThread*, const RegisterMap*) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1281 if (TraceZapDeadLocals) warning("frame::zap_dead_deoptimized_locals unimplemented");
a61af66fc99e Initial load
duke
parents:
diff changeset
1282 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1283
a61af66fc99e Initial load
duke
parents:
diff changeset
1284 # endif // ENABLE_ZAP_DEAD_LOCALS
a61af66fc99e Initial load
duke
parents:
diff changeset
1285
a61af66fc99e Initial load
duke
parents:
diff changeset
1286 void frame::verify(const RegisterMap* map) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1287 // for now make sure receiver type is correct
a61af66fc99e Initial load
duke
parents:
diff changeset
1288 if (is_interpreted_frame()) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1289 Method* method = interpreter_frame_method();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1290 guarantee(method->is_method(), "method is wrong in frame::verify");
a61af66fc99e Initial load
duke
parents:
diff changeset
1291 if (!method->is_static()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1292 // fetch the receiver
a61af66fc99e Initial load
duke
parents:
diff changeset
1293 oop* p = (oop*) interpreter_frame_local_at(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1294 // make sure we have the right receiver type
a61af66fc99e Initial load
duke
parents:
diff changeset
1295 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1296 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1297 COMPILER2_PRESENT(assert(DerivedPointerTable::is_empty(), "must be empty before verify");)
7179
d0aa87f04bd5 8003720: NPG: Method in interpreter stack frame can be deallocated
stefank
parents: 6725
diff changeset
1298 oops_do_internal(&VerifyOopClosure::verify_oop, NULL, NULL, (RegisterMap*)map, false);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1299 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1300
a61af66fc99e Initial load
duke
parents:
diff changeset
1301
a61af66fc99e Initial load
duke
parents:
diff changeset
1302 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1303 bool frame::verify_return_pc(address x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1304 if (StubRoutines::returns_to_call_stub(x)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1305 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1306 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1307 if (CodeCache::contains(x)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1308 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1309 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1310 if (Interpreter::contains(x)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1311 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1312 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1313 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1314 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1315 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1316
a61af66fc99e Initial load
duke
parents:
diff changeset
1317 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1318 void frame::interpreter_frame_verify_monitor(BasicObjectLock* value) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1319 assert(is_interpreted_frame(), "Not an interpreted frame");
a61af66fc99e Initial load
duke
parents:
diff changeset
1320 // verify that the value is in the right part of the frame
a61af66fc99e Initial load
duke
parents:
diff changeset
1321 address low_mark = (address) interpreter_frame_monitor_end();
a61af66fc99e Initial load
duke
parents:
diff changeset
1322 address high_mark = (address) interpreter_frame_monitor_begin();
a61af66fc99e Initial load
duke
parents:
diff changeset
1323 address current = (address) value;
a61af66fc99e Initial load
duke
parents:
diff changeset
1324
a61af66fc99e Initial load
duke
parents:
diff changeset
1325 const int monitor_size = frame::interpreter_frame_monitor_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
1326 guarantee((high_mark - current) % monitor_size == 0 , "Misaligned top of BasicObjectLock*");
a61af66fc99e Initial load
duke
parents:
diff changeset
1327 guarantee( high_mark > current , "Current BasicObjectLock* higher than high_mark");
a61af66fc99e Initial load
duke
parents:
diff changeset
1328
a61af66fc99e Initial load
duke
parents:
diff changeset
1329 guarantee((current - low_mark) % monitor_size == 0 , "Misaligned bottom of BasicObjectLock*");
a61af66fc99e Initial load
duke
parents:
diff changeset
1330 guarantee( current >= low_mark , "Current BasicObjectLock* below than low_mark");
a61af66fc99e Initial load
duke
parents:
diff changeset
1331 }
4824
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
1332 #endif
3336
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1333
4824
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
1334 #ifndef PRODUCT
3336
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1335 void frame::describe(FrameValues& values, int frame_no) {
4818
82e5a84b7436 7120450: complete information dumped by frame_describe
bdelsart
parents: 4806
diff changeset
1336 // boundaries: sp and the 'real' frame pointer
82e5a84b7436 7120450: complete information dumped by frame_describe
bdelsart
parents: 4806
diff changeset
1337 values.describe(-1, sp(), err_msg("sp for #%d", frame_no), 1);
82e5a84b7436 7120450: complete information dumped by frame_describe
bdelsart
parents: 4806
diff changeset
1338 intptr_t* frame_pointer = real_fp(); // Note: may differ from fp()
82e5a84b7436 7120450: complete information dumped by frame_describe
bdelsart
parents: 4806
diff changeset
1339
82e5a84b7436 7120450: complete information dumped by frame_describe
bdelsart
parents: 4806
diff changeset
1340 // print frame info at the highest boundary
82e5a84b7436 7120450: complete information dumped by frame_describe
bdelsart
parents: 4806
diff changeset
1341 intptr_t* info_address = MAX2(sp(), frame_pointer);
82e5a84b7436 7120450: complete information dumped by frame_describe
bdelsart
parents: 4806
diff changeset
1342
82e5a84b7436 7120450: complete information dumped by frame_describe
bdelsart
parents: 4806
diff changeset
1343 if (info_address != frame_pointer) {
82e5a84b7436 7120450: complete information dumped by frame_describe
bdelsart
parents: 4806
diff changeset
1344 // print frame_pointer explicitly if not marked by the frame info
82e5a84b7436 7120450: complete information dumped by frame_describe
bdelsart
parents: 4806
diff changeset
1345 values.describe(-1, frame_pointer, err_msg("frame pointer for #%d", frame_no), 1);
82e5a84b7436 7120450: complete information dumped by frame_describe
bdelsart
parents: 4806
diff changeset
1346 }
82e5a84b7436 7120450: complete information dumped by frame_describe
bdelsart
parents: 4806
diff changeset
1347
3336
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1348 if (is_entry_frame() || is_compiled_frame() || is_interpreted_frame() || is_native_frame()) {
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1349 // Label values common to most frames
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1350 values.describe(-1, unextended_sp(), err_msg("unextended_sp for #%d", frame_no));
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1351 }
4818
82e5a84b7436 7120450: complete information dumped by frame_describe
bdelsart
parents: 4806
diff changeset
1352
3336
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1353 if (is_interpreted_frame()) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1354 Method* m = interpreter_frame_method();
3336
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1355 int bci = interpreter_frame_bci();
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1356
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1357 // Label the method and current bci
4818
82e5a84b7436 7120450: complete information dumped by frame_describe
bdelsart
parents: 4806
diff changeset
1358 values.describe(-1, info_address,
3336
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1359 FormatBuffer<1024>("#%d method %s @ %d", frame_no, m->name_and_sig_as_C_string(), bci), 2);
4818
82e5a84b7436 7120450: complete information dumped by frame_describe
bdelsart
parents: 4806
diff changeset
1360 values.describe(-1, info_address,
3336
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1361 err_msg("- %d locals %d max stack", m->max_locals(), m->max_stack()), 1);
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1362 if (m->max_locals() > 0) {
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1363 intptr_t* l0 = interpreter_frame_local_at(0);
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1364 intptr_t* ln = interpreter_frame_local_at(m->max_locals() - 1);
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1365 values.describe(-1, MAX2(l0, ln), err_msg("locals for #%d", frame_no), 1);
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1366 // Report each local and mark as owned by this frame
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1367 for (int l = 0; l < m->max_locals(); l++) {
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1368 intptr_t* l0 = interpreter_frame_local_at(l);
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1369 values.describe(frame_no, l0, err_msg("local %d", l));
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1370 }
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1371 }
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1372
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1373 // Compute the actual expression stack size
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1374 InterpreterOopMap mask;
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1375 OopMapCache::compute_one_oop_map(m, bci, &mask);
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1376 intptr_t* tos = NULL;
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1377 // Report each stack element and mark as owned by this frame
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1378 for (int e = 0; e < mask.expression_stack_size(); e++) {
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1379 tos = MAX2(tos, interpreter_frame_expression_stack_at(e));
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1380 values.describe(frame_no, interpreter_frame_expression_stack_at(e),
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1381 err_msg("stack %d", e));
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1382 }
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1383 if (tos != NULL) {
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1384 values.describe(-1, tos, err_msg("expression stack for #%d", frame_no), 1);
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1385 }
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1386 if (interpreter_frame_monitor_begin() != interpreter_frame_monitor_end()) {
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1387 values.describe(frame_no, (intptr_t*)interpreter_frame_monitor_begin(), "monitors begin");
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1388 values.describe(frame_no, (intptr_t*)interpreter_frame_monitor_end(), "monitors end");
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1389 }
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1390 } else if (is_entry_frame()) {
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1391 // For now just label the frame
4818
82e5a84b7436 7120450: complete information dumped by frame_describe
bdelsart
parents: 4806
diff changeset
1392 values.describe(-1, info_address, err_msg("#%d entry frame", frame_no), 2);
3336
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1393 } else if (is_compiled_frame()) {
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1394 // For now just label the frame
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1395 nmethod* nm = cb()->as_nmethod_or_null();
4818
82e5a84b7436 7120450: complete information dumped by frame_describe
bdelsart
parents: 4806
diff changeset
1396 values.describe(-1, info_address,
3336
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1397 FormatBuffer<1024>("#%d nmethod " INTPTR_FORMAT " for method %s%s", frame_no,
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1398 nm, nm->method()->name_and_sig_as_C_string(),
4818
82e5a84b7436 7120450: complete information dumped by frame_describe
bdelsart
parents: 4806
diff changeset
1399 (_deopt_state == is_deoptimized) ?
82e5a84b7436 7120450: complete information dumped by frame_describe
bdelsart
parents: 4806
diff changeset
1400 " (deoptimized)" :
82e5a84b7436 7120450: complete information dumped by frame_describe
bdelsart
parents: 4806
diff changeset
1401 ((_deopt_state == unknown) ? " (state unknown)" : "")),
82e5a84b7436 7120450: complete information dumped by frame_describe
bdelsart
parents: 4806
diff changeset
1402 2);
3336
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1403 } else if (is_native_frame()) {
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1404 // For now just label the frame
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1405 nmethod* nm = cb()->as_nmethod_or_null();
4818
82e5a84b7436 7120450: complete information dumped by frame_describe
bdelsart
parents: 4806
diff changeset
1406 values.describe(-1, info_address,
3336
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1407 FormatBuffer<1024>("#%d nmethod " INTPTR_FORMAT " for native method %s", frame_no,
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1408 nm, nm->method()->name_and_sig_as_C_string()), 2);
4818
82e5a84b7436 7120450: complete information dumped by frame_describe
bdelsart
parents: 4806
diff changeset
1409 } else {
82e5a84b7436 7120450: complete information dumped by frame_describe
bdelsart
parents: 4806
diff changeset
1410 // provide default info if not handled before
82e5a84b7436 7120450: complete information dumped by frame_describe
bdelsart
parents: 4806
diff changeset
1411 char *info = (char *) "special frame";
82e5a84b7436 7120450: complete information dumped by frame_describe
bdelsart
parents: 4806
diff changeset
1412 if ((_cb != NULL) &&
82e5a84b7436 7120450: complete information dumped by frame_describe
bdelsart
parents: 4806
diff changeset
1413 (_cb->name() != NULL)) {
82e5a84b7436 7120450: complete information dumped by frame_describe
bdelsart
parents: 4806
diff changeset
1414 info = (char *)_cb->name();
82e5a84b7436 7120450: complete information dumped by frame_describe
bdelsart
parents: 4806
diff changeset
1415 }
82e5a84b7436 7120450: complete information dumped by frame_describe
bdelsart
parents: 4806
diff changeset
1416 values.describe(-1, info_address, err_msg("#%d <%s>", frame_no, info), 2);
3336
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1417 }
4818
82e5a84b7436 7120450: complete information dumped by frame_describe
bdelsart
parents: 4806
diff changeset
1418
82e5a84b7436 7120450: complete information dumped by frame_describe
bdelsart
parents: 4806
diff changeset
1419 // platform dependent additional data
3336
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1420 describe_pd(values, frame_no);
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1421 }
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1422
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1423 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1424
a61af66fc99e Initial load
duke
parents:
diff changeset
1425
a61af66fc99e Initial load
duke
parents:
diff changeset
1426 //-----------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1427 // StackFrameStream implementation
a61af66fc99e Initial load
duke
parents:
diff changeset
1428
a61af66fc99e Initial load
duke
parents:
diff changeset
1429 StackFrameStream::StackFrameStream(JavaThread *thread, bool update) : _reg_map(thread, update) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1430 assert(thread->has_last_Java_frame(), "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
1431 _fr = thread->last_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
1432 _is_done = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1433 }
3336
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1434
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1435
4824
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
1436 #ifndef PRODUCT
3336
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1437
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1438 void FrameValues::describe(int owner, intptr_t* location, const char* description, int priority) {
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1439 FrameValue fv;
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1440 fv.location = location;
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1441 fv.owner = owner;
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1442 fv.priority = priority;
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1443 fv.description = NEW_RESOURCE_ARRAY(char, strlen(description) + 1);
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1444 strcpy(fv.description, description);
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1445 _values.append(fv);
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1446 }
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1447
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1448
4824
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
1449 #ifdef ASSERT
3365
3cfb240033d1 7043301: assert(locals < caller->fp() || locals > (caller->fp() + 16)) failed: locals in save area
never
parents: 3363
diff changeset
1450 void FrameValues::validate() {
3336
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1451 _values.sort(compare);
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1452 bool error = false;
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1453 FrameValue prev;
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1454 prev.owner = -1;
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1455 for (int i = _values.length() - 1; i >= 0; i--) {
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1456 FrameValue fv = _values.at(i);
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1457 if (fv.owner == -1) continue;
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1458 if (prev.owner == -1) {
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1459 prev = fv;
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1460 continue;
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1461 }
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1462 if (prev.location == fv.location) {
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1463 if (fv.owner != prev.owner) {
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1464 tty->print_cr("overlapping storage");
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1465 tty->print_cr(" " INTPTR_FORMAT ": " INTPTR_FORMAT " %s", prev.location, *prev.location, prev.description);
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1466 tty->print_cr(" " INTPTR_FORMAT ": " INTPTR_FORMAT " %s", fv.location, *fv.location, fv.description);
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1467 error = true;
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1468 }
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1469 } else {
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1470 prev = fv;
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1471 }
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1472 }
3365
3cfb240033d1 7043301: assert(locals < caller->fp() || locals > (caller->fp() + 16)) failed: locals in save area
never
parents: 3363
diff changeset
1473 assert(!error, "invalid layout");
3336
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1474 }
4824
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
1475 #endif // ASSERT
3336
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1476
4042
b20d64f83668 7090904: JSR 292: JRuby junit test crashes in PSScavengeRootsClosure::do_oop
twisti
parents: 3369
diff changeset
1477 void FrameValues::print(JavaThread* thread) {
3336
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1478 _values.sort(compare);
3369
3d2ab563047a 7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents: 3365
diff changeset
1479
3d2ab563047a 7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents: 3365
diff changeset
1480 // Sometimes values like the fp can be invalid values if the
3d2ab563047a 7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents: 3365
diff changeset
1481 // register map wasn't updated during the walk. Trim out values
3d2ab563047a 7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents: 3365
diff changeset
1482 // that aren't actually in the stack of the thread.
3d2ab563047a 7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents: 3365
diff changeset
1483 int min_index = 0;
3d2ab563047a 7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents: 3365
diff changeset
1484 int max_index = _values.length() - 1;
3d2ab563047a 7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents: 3365
diff changeset
1485 intptr_t* v0 = _values.at(min_index).location;
3d2ab563047a 7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents: 3365
diff changeset
1486 intptr_t* v1 = _values.at(max_index).location;
4042
b20d64f83668 7090904: JSR 292: JRuby junit test crashes in PSScavengeRootsClosure::do_oop
twisti
parents: 3369
diff changeset
1487
b20d64f83668 7090904: JSR 292: JRuby junit test crashes in PSScavengeRootsClosure::do_oop
twisti
parents: 3369
diff changeset
1488 if (thread == Thread::current()) {
b20d64f83668 7090904: JSR 292: JRuby junit test crashes in PSScavengeRootsClosure::do_oop
twisti
parents: 3369
diff changeset
1489 while (!thread->is_in_stack((address)v0)) {
b20d64f83668 7090904: JSR 292: JRuby junit test crashes in PSScavengeRootsClosure::do_oop
twisti
parents: 3369
diff changeset
1490 v0 = _values.at(++min_index).location;
b20d64f83668 7090904: JSR 292: JRuby junit test crashes in PSScavengeRootsClosure::do_oop
twisti
parents: 3369
diff changeset
1491 }
b20d64f83668 7090904: JSR 292: JRuby junit test crashes in PSScavengeRootsClosure::do_oop
twisti
parents: 3369
diff changeset
1492 while (!thread->is_in_stack((address)v1)) {
b20d64f83668 7090904: JSR 292: JRuby junit test crashes in PSScavengeRootsClosure::do_oop
twisti
parents: 3369
diff changeset
1493 v1 = _values.at(--max_index).location;
b20d64f83668 7090904: JSR 292: JRuby junit test crashes in PSScavengeRootsClosure::do_oop
twisti
parents: 3369
diff changeset
1494 }
b20d64f83668 7090904: JSR 292: JRuby junit test crashes in PSScavengeRootsClosure::do_oop
twisti
parents: 3369
diff changeset
1495 } else {
b20d64f83668 7090904: JSR 292: JRuby junit test crashes in PSScavengeRootsClosure::do_oop
twisti
parents: 3369
diff changeset
1496 while (!thread->on_local_stack((address)v0)) {
b20d64f83668 7090904: JSR 292: JRuby junit test crashes in PSScavengeRootsClosure::do_oop
twisti
parents: 3369
diff changeset
1497 v0 = _values.at(++min_index).location;
b20d64f83668 7090904: JSR 292: JRuby junit test crashes in PSScavengeRootsClosure::do_oop
twisti
parents: 3369
diff changeset
1498 }
b20d64f83668 7090904: JSR 292: JRuby junit test crashes in PSScavengeRootsClosure::do_oop
twisti
parents: 3369
diff changeset
1499 while (!thread->on_local_stack((address)v1)) {
b20d64f83668 7090904: JSR 292: JRuby junit test crashes in PSScavengeRootsClosure::do_oop
twisti
parents: 3369
diff changeset
1500 v1 = _values.at(--max_index).location;
b20d64f83668 7090904: JSR 292: JRuby junit test crashes in PSScavengeRootsClosure::do_oop
twisti
parents: 3369
diff changeset
1501 }
3369
3d2ab563047a 7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents: 3365
diff changeset
1502 }
3336
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1503 intptr_t* min = MIN2(v0, v1);
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1504 intptr_t* max = MAX2(v0, v1);
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1505 intptr_t* cur = max;
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1506 intptr_t* last = NULL;
3369
3d2ab563047a 7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents: 3365
diff changeset
1507 for (int i = max_index; i >= min_index; i--) {
3336
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1508 FrameValue fv = _values.at(i);
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1509 while (cur > fv.location) {
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1510 tty->print_cr(" " INTPTR_FORMAT ": " INTPTR_FORMAT, cur, *cur);
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1511 cur--;
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1512 }
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1513 if (last == fv.location) {
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1514 const char* spacer = " " LP64_ONLY(" ");
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1515 tty->print_cr(" %s %s %s", spacer, spacer, fv.description);
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1516 } else {
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1517 tty->print_cr(" " INTPTR_FORMAT ": " INTPTR_FORMAT " %s", fv.location, *fv.location, fv.description);
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1518 last = fv.location;
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1519 cur--;
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1520 }
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1521 }
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1522 }
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2192
diff changeset
1523
4824
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
1524 #endif // ndef PRODUCT