annotate src/share/vm/runtime/frame.cpp @ 3917:eca1193ca245

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