annotate src/share/vm/runtime/frame.cpp @ 2368:dde920245681

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