annotate src/share/vm/runtime/frame.cpp @ 13212:eb03a7335eb0

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