annotate src/share/vm/runtime/vframe.hpp @ 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 f95d63e2154a
children da91efe96a93
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
2 * Copyright (c) 1997, 2010, 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: 931
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 931
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: 931
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: 1552
diff changeset
25 #ifndef SHARE_VM_RUNTIME_VFRAME_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
26 #define SHARE_VM_RUNTIME_VFRAME_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
27
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
28 #include "code/debugInfo.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
29 #include "code/debugInfoRec.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
30 #include "code/location.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
31 #include "oops/oop.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
32 #include "runtime/frame.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
33 #include "runtime/frame.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
34 #include "runtime/stackValue.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
35 #include "runtime/stackValueCollection.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
36 #include "utilities/growableArray.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
37
0
a61af66fc99e Initial load
duke
parents:
diff changeset
38 // vframes are virtual stack frames representing source level activations.
a61af66fc99e Initial load
duke
parents:
diff changeset
39 // A single frame may hold several source level activations in the case of
a61af66fc99e Initial load
duke
parents:
diff changeset
40 // optimized code. The debugging stored with the optimized code enables
a61af66fc99e Initial load
duke
parents:
diff changeset
41 // us to unfold a frame as a stack of vframes.
a61af66fc99e Initial load
duke
parents:
diff changeset
42 // A cVFrame represents an activation of a non-java method.
a61af66fc99e Initial load
duke
parents:
diff changeset
43
a61af66fc99e Initial load
duke
parents:
diff changeset
44 // The vframe inheritance hierarchy:
a61af66fc99e Initial load
duke
parents:
diff changeset
45 // - vframe
a61af66fc99e Initial load
duke
parents:
diff changeset
46 // - javaVFrame
a61af66fc99e Initial load
duke
parents:
diff changeset
47 // - interpretedVFrame
a61af66fc99e Initial load
duke
parents:
diff changeset
48 // - compiledVFrame ; (used for both compiled Java methods and native stubs)
a61af66fc99e Initial load
duke
parents:
diff changeset
49 // - externalVFrame
a61af66fc99e Initial load
duke
parents:
diff changeset
50 // - entryVFrame ; special frame created when calling Java from C
a61af66fc99e Initial load
duke
parents:
diff changeset
51
a61af66fc99e Initial load
duke
parents:
diff changeset
52 // - BasicLock
a61af66fc99e Initial load
duke
parents:
diff changeset
53
a61af66fc99e Initial load
duke
parents:
diff changeset
54 class vframe: public ResourceObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
55 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
56 frame _fr; // Raw frame behind the virtual frame.
a61af66fc99e Initial load
duke
parents:
diff changeset
57 RegisterMap _reg_map; // Register map for the raw frame (used to handle callee-saved registers).
a61af66fc99e Initial load
duke
parents:
diff changeset
58 JavaThread* _thread; // The thread owning the raw frame.
a61af66fc99e Initial load
duke
parents:
diff changeset
59
a61af66fc99e Initial load
duke
parents:
diff changeset
60 vframe(const frame* fr, const RegisterMap* reg_map, JavaThread* thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
61 vframe(const frame* fr, JavaThread* thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
62 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
63 // Factory method for creating vframes
a61af66fc99e Initial load
duke
parents:
diff changeset
64 static vframe* new_vframe(const frame* f, const RegisterMap *reg_map, JavaThread* thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
65
a61af66fc99e Initial load
duke
parents:
diff changeset
66 // Accessors
a61af66fc99e Initial load
duke
parents:
diff changeset
67 frame fr() const { return _fr; }
a61af66fc99e Initial load
duke
parents:
diff changeset
68 CodeBlob* cb() const { return _fr.cb(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
69 nmethod* nm() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
70 assert( cb() != NULL && cb()->is_nmethod(), "usage");
a61af66fc99e Initial load
duke
parents:
diff changeset
71 return (nmethod*) cb();
a61af66fc99e Initial load
duke
parents:
diff changeset
72 }
a61af66fc99e Initial load
duke
parents:
diff changeset
73
a61af66fc99e Initial load
duke
parents:
diff changeset
74 // ???? Does this need to be a copy?
a61af66fc99e Initial load
duke
parents:
diff changeset
75 frame* frame_pointer() { return &_fr; }
a61af66fc99e Initial load
duke
parents:
diff changeset
76 const RegisterMap* register_map() const { return &_reg_map; }
a61af66fc99e Initial load
duke
parents:
diff changeset
77 JavaThread* thread() const { return _thread; }
a61af66fc99e Initial load
duke
parents:
diff changeset
78
a61af66fc99e Initial load
duke
parents:
diff changeset
79 // Returns the sender vframe
a61af66fc99e Initial load
duke
parents:
diff changeset
80 virtual vframe* sender() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
81
a61af66fc99e Initial load
duke
parents:
diff changeset
82 // Returns the next javaVFrame on the stack (skipping all other kinds of frame)
a61af66fc99e Initial load
duke
parents:
diff changeset
83 javaVFrame *java_sender() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
84
a61af66fc99e Initial load
duke
parents:
diff changeset
85 // Answers if the this is the top vframe in the frame, i.e., if the sender vframe
a61af66fc99e Initial load
duke
parents:
diff changeset
86 // is in the caller frame
a61af66fc99e Initial load
duke
parents:
diff changeset
87 virtual bool is_top() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
88
a61af66fc99e Initial load
duke
parents:
diff changeset
89 // Returns top vframe within same frame (see is_top())
a61af66fc99e Initial load
duke
parents:
diff changeset
90 virtual vframe* top() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
91
a61af66fc99e Initial load
duke
parents:
diff changeset
92 // Type testing operations
a61af66fc99e Initial load
duke
parents:
diff changeset
93 virtual bool is_entry_frame() const { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
94 virtual bool is_java_frame() const { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
95 virtual bool is_interpreted_frame() const { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
96 virtual bool is_compiled_frame() const { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
97
a61af66fc99e Initial load
duke
parents:
diff changeset
98 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
99 // printing operations
a61af66fc99e Initial load
duke
parents:
diff changeset
100 virtual void print_value() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
101 virtual void print();
a61af66fc99e Initial load
duke
parents:
diff changeset
102 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
103 };
a61af66fc99e Initial load
duke
parents:
diff changeset
104
a61af66fc99e Initial load
duke
parents:
diff changeset
105
a61af66fc99e Initial load
duke
parents:
diff changeset
106 class javaVFrame: public vframe {
a61af66fc99e Initial load
duke
parents:
diff changeset
107 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
108 // JVM state
a61af66fc99e Initial load
duke
parents:
diff changeset
109 virtual methodOop method() const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
110 virtual int bci() const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
111 virtual StackValueCollection* locals() const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
112 virtual StackValueCollection* expressions() const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
113 // the order returned by monitors() is from oldest -> youngest#4418568
a61af66fc99e Initial load
duke
parents:
diff changeset
114 virtual GrowableArray<MonitorInfo*>* monitors() const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
115
a61af66fc99e Initial load
duke
parents:
diff changeset
116 // Debugging support via JVMTI.
a61af66fc99e Initial load
duke
parents:
diff changeset
117 // NOTE that this is not guaranteed to give correct results for compiled vframes.
a61af66fc99e Initial load
duke
parents:
diff changeset
118 // Deoptimize first if necessary.
a61af66fc99e Initial load
duke
parents:
diff changeset
119 virtual void set_locals(StackValueCollection* values) const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
120
a61af66fc99e Initial load
duke
parents:
diff changeset
121 // Test operation
a61af66fc99e Initial load
duke
parents:
diff changeset
122 bool is_java_frame() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
123
a61af66fc99e Initial load
duke
parents:
diff changeset
124 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
125 javaVFrame(const frame* fr, const RegisterMap* reg_map, JavaThread* thread) : vframe(fr, reg_map, thread) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
126 javaVFrame(const frame* fr, JavaThread* thread) : vframe(fr, thread) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
127
a61af66fc99e Initial load
duke
parents:
diff changeset
128 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
129 // casting
a61af66fc99e Initial load
duke
parents:
diff changeset
130 static javaVFrame* cast(vframe* vf) {
a61af66fc99e Initial load
duke
parents:
diff changeset
131 assert(vf == NULL || vf->is_java_frame(), "must be java frame");
a61af66fc99e Initial load
duke
parents:
diff changeset
132 return (javaVFrame*) vf;
a61af66fc99e Initial load
duke
parents:
diff changeset
133 }
a61af66fc99e Initial load
duke
parents:
diff changeset
134
a61af66fc99e Initial load
duke
parents:
diff changeset
135 // Return an array of monitors locked by this frame in the youngest to oldest order
a61af66fc99e Initial load
duke
parents:
diff changeset
136 GrowableArray<MonitorInfo*>* locked_monitors();
a61af66fc99e Initial load
duke
parents:
diff changeset
137
a61af66fc99e Initial load
duke
parents:
diff changeset
138 // printing used during stack dumps
a61af66fc99e Initial load
duke
parents:
diff changeset
139 void print_lock_info_on(outputStream* st, int frame_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
140 void print_lock_info(int frame_count) { print_lock_info_on(tty, frame_count); }
a61af66fc99e Initial load
duke
parents:
diff changeset
141
a61af66fc99e Initial load
duke
parents:
diff changeset
142 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
143 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
144 // printing operations
a61af66fc99e Initial load
duke
parents:
diff changeset
145 void print();
a61af66fc99e Initial load
duke
parents:
diff changeset
146 void print_value() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
147 void print_activation(int index) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
148
a61af66fc99e Initial load
duke
parents:
diff changeset
149 // verify operations
a61af66fc99e Initial load
duke
parents:
diff changeset
150 virtual void verify() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
151
a61af66fc99e Initial load
duke
parents:
diff changeset
152 // Structural compare
a61af66fc99e Initial load
duke
parents:
diff changeset
153 bool structural_compare(javaVFrame* other);
a61af66fc99e Initial load
duke
parents:
diff changeset
154 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
155 friend class vframe;
a61af66fc99e Initial load
duke
parents:
diff changeset
156 };
a61af66fc99e Initial load
duke
parents:
diff changeset
157
a61af66fc99e Initial load
duke
parents:
diff changeset
158 class interpretedVFrame: public javaVFrame {
a61af66fc99e Initial load
duke
parents:
diff changeset
159 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
160 // JVM state
a61af66fc99e Initial load
duke
parents:
diff changeset
161 methodOop method() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
162 int bci() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
163 StackValueCollection* locals() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
164 StackValueCollection* expressions() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
165 GrowableArray<MonitorInfo*>* monitors() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
166
a61af66fc99e Initial load
duke
parents:
diff changeset
167 void set_locals(StackValueCollection* values) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
168
a61af66fc99e Initial load
duke
parents:
diff changeset
169 // Test operation
a61af66fc99e Initial load
duke
parents:
diff changeset
170 bool is_interpreted_frame() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
171
a61af66fc99e Initial load
duke
parents:
diff changeset
172 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
173 interpretedVFrame(const frame* fr, const RegisterMap* reg_map, JavaThread* thread) : javaVFrame(fr, reg_map, thread) {};
a61af66fc99e Initial load
duke
parents:
diff changeset
174
a61af66fc99e Initial load
duke
parents:
diff changeset
175 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
176 // Accessors for Byte Code Pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
177 u_char* bcp() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
178 void set_bcp(u_char* bcp);
a61af66fc99e Initial load
duke
parents:
diff changeset
179
a61af66fc99e Initial load
duke
parents:
diff changeset
180 // casting
a61af66fc99e Initial load
duke
parents:
diff changeset
181 static interpretedVFrame* cast(vframe* vf) {
a61af66fc99e Initial load
duke
parents:
diff changeset
182 assert(vf == NULL || vf->is_interpreted_frame(), "must be interpreted frame");
a61af66fc99e Initial load
duke
parents:
diff changeset
183 return (interpretedVFrame*) vf;
a61af66fc99e Initial load
duke
parents:
diff changeset
184 }
a61af66fc99e Initial load
duke
parents:
diff changeset
185
a61af66fc99e Initial load
duke
parents:
diff changeset
186 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
187 static const int bcp_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
188 intptr_t* locals_addr_at(int offset) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
189
a61af66fc99e Initial load
duke
parents:
diff changeset
190 // returns where the parameters starts relative to the frame pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
191 int start_of_parameters() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
192
a61af66fc99e Initial load
duke
parents:
diff changeset
193 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
194 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
195 // verify operations
a61af66fc99e Initial load
duke
parents:
diff changeset
196 void verify() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
197 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
198 friend class vframe;
a61af66fc99e Initial load
duke
parents:
diff changeset
199 };
a61af66fc99e Initial load
duke
parents:
diff changeset
200
a61af66fc99e Initial load
duke
parents:
diff changeset
201
a61af66fc99e Initial load
duke
parents:
diff changeset
202 class externalVFrame: public vframe {
a61af66fc99e Initial load
duke
parents:
diff changeset
203 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
204 externalVFrame(const frame* fr, const RegisterMap* reg_map, JavaThread* thread) : vframe(fr, reg_map, thread) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
205
a61af66fc99e Initial load
duke
parents:
diff changeset
206 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
207 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
208 // printing operations
a61af66fc99e Initial load
duke
parents:
diff changeset
209 void print_value() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
210 void print();
a61af66fc99e Initial load
duke
parents:
diff changeset
211 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
212 friend class vframe;
a61af66fc99e Initial load
duke
parents:
diff changeset
213 };
a61af66fc99e Initial load
duke
parents:
diff changeset
214
a61af66fc99e Initial load
duke
parents:
diff changeset
215 class entryVFrame: public externalVFrame {
a61af66fc99e Initial load
duke
parents:
diff changeset
216 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
217 bool is_entry_frame() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
218
a61af66fc99e Initial load
duke
parents:
diff changeset
219 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
220 entryVFrame(const frame* fr, const RegisterMap* reg_map, JavaThread* thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
221
a61af66fc99e Initial load
duke
parents:
diff changeset
222 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
223 // casting
a61af66fc99e Initial load
duke
parents:
diff changeset
224 static entryVFrame* cast(vframe* vf) {
a61af66fc99e Initial load
duke
parents:
diff changeset
225 assert(vf == NULL || vf->is_entry_frame(), "must be entry frame");
a61af66fc99e Initial load
duke
parents:
diff changeset
226 return (entryVFrame*) vf;
a61af66fc99e Initial load
duke
parents:
diff changeset
227 }
a61af66fc99e Initial load
duke
parents:
diff changeset
228
a61af66fc99e Initial load
duke
parents:
diff changeset
229 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
230 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
231 // printing
a61af66fc99e Initial load
duke
parents:
diff changeset
232 void print_value() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
233 void print();
a61af66fc99e Initial load
duke
parents:
diff changeset
234 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
235 friend class vframe;
a61af66fc99e Initial load
duke
parents:
diff changeset
236 };
a61af66fc99e Initial load
duke
parents:
diff changeset
237
a61af66fc99e Initial load
duke
parents:
diff changeset
238
a61af66fc99e Initial load
duke
parents:
diff changeset
239 // A MonitorInfo is a ResourceObject that describes a the pair:
a61af66fc99e Initial load
duke
parents:
diff changeset
240 // 1) the owner of the monitor
a61af66fc99e Initial load
duke
parents:
diff changeset
241 // 2) the monitor lock
a61af66fc99e Initial load
duke
parents:
diff changeset
242 class MonitorInfo : public ResourceObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
243 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
244 oop _owner; // the object owning the monitor
a61af66fc99e Initial load
duke
parents:
diff changeset
245 BasicLock* _lock;
818
b109e761e927 6837472: com/sun/jdi/MonitorFrameInfo.java fails with AggressiveOpts in 6u14
kvn
parents: 196
diff changeset
246 oop _owner_klass; // klass if owner was scalar replaced
83
d3cd40645d0d 6681646: Relocking of a scalar replaced object during deoptimization is broken
kvn
parents: 0
diff changeset
247 bool _eliminated;
818
b109e761e927 6837472: com/sun/jdi/MonitorFrameInfo.java fails with AggressiveOpts in 6u14
kvn
parents: 196
diff changeset
248 bool _owner_is_scalar_replaced;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
249 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
250 // Constructor
818
b109e761e927 6837472: com/sun/jdi/MonitorFrameInfo.java fails with AggressiveOpts in 6u14
kvn
parents: 196
diff changeset
251 MonitorInfo(oop owner, BasicLock* lock, bool eliminated, bool owner_is_scalar_replaced) {
b109e761e927 6837472: com/sun/jdi/MonitorFrameInfo.java fails with AggressiveOpts in 6u14
kvn
parents: 196
diff changeset
252 if (!owner_is_scalar_replaced) {
b109e761e927 6837472: com/sun/jdi/MonitorFrameInfo.java fails with AggressiveOpts in 6u14
kvn
parents: 196
diff changeset
253 _owner = owner;
b109e761e927 6837472: com/sun/jdi/MonitorFrameInfo.java fails with AggressiveOpts in 6u14
kvn
parents: 196
diff changeset
254 _owner_klass = NULL;
b109e761e927 6837472: com/sun/jdi/MonitorFrameInfo.java fails with AggressiveOpts in 6u14
kvn
parents: 196
diff changeset
255 } else {
b109e761e927 6837472: com/sun/jdi/MonitorFrameInfo.java fails with AggressiveOpts in 6u14
kvn
parents: 196
diff changeset
256 assert(eliminated, "monitor should be eliminated for scalar replaced object");
b109e761e927 6837472: com/sun/jdi/MonitorFrameInfo.java fails with AggressiveOpts in 6u14
kvn
parents: 196
diff changeset
257 _owner = NULL;
b109e761e927 6837472: com/sun/jdi/MonitorFrameInfo.java fails with AggressiveOpts in 6u14
kvn
parents: 196
diff changeset
258 _owner_klass = owner;
b109e761e927 6837472: com/sun/jdi/MonitorFrameInfo.java fails with AggressiveOpts in 6u14
kvn
parents: 196
diff changeset
259 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
260 _lock = lock;
83
d3cd40645d0d 6681646: Relocking of a scalar replaced object during deoptimization is broken
kvn
parents: 0
diff changeset
261 _eliminated = eliminated;
818
b109e761e927 6837472: com/sun/jdi/MonitorFrameInfo.java fails with AggressiveOpts in 6u14
kvn
parents: 196
diff changeset
262 _owner_is_scalar_replaced = owner_is_scalar_replaced;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
263 }
a61af66fc99e Initial load
duke
parents:
diff changeset
264 // Accessors
818
b109e761e927 6837472: com/sun/jdi/MonitorFrameInfo.java fails with AggressiveOpts in 6u14
kvn
parents: 196
diff changeset
265 oop owner() const {
b109e761e927 6837472: com/sun/jdi/MonitorFrameInfo.java fails with AggressiveOpts in 6u14
kvn
parents: 196
diff changeset
266 assert(!_owner_is_scalar_replaced, "should not be called for scalar replaced object");
b109e761e927 6837472: com/sun/jdi/MonitorFrameInfo.java fails with AggressiveOpts in 6u14
kvn
parents: 196
diff changeset
267 return _owner;
b109e761e927 6837472: com/sun/jdi/MonitorFrameInfo.java fails with AggressiveOpts in 6u14
kvn
parents: 196
diff changeset
268 }
b109e761e927 6837472: com/sun/jdi/MonitorFrameInfo.java fails with AggressiveOpts in 6u14
kvn
parents: 196
diff changeset
269 klassOop owner_klass() const {
b109e761e927 6837472: com/sun/jdi/MonitorFrameInfo.java fails with AggressiveOpts in 6u14
kvn
parents: 196
diff changeset
270 assert(_owner_is_scalar_replaced, "should not be called for not scalar replaced object");
b109e761e927 6837472: com/sun/jdi/MonitorFrameInfo.java fails with AggressiveOpts in 6u14
kvn
parents: 196
diff changeset
271 return (klassOop)_owner_klass;
b109e761e927 6837472: com/sun/jdi/MonitorFrameInfo.java fails with AggressiveOpts in 6u14
kvn
parents: 196
diff changeset
272 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
273 BasicLock* lock() const { return _lock; }
83
d3cd40645d0d 6681646: Relocking of a scalar replaced object during deoptimization is broken
kvn
parents: 0
diff changeset
274 bool eliminated() const { return _eliminated; }
818
b109e761e927 6837472: com/sun/jdi/MonitorFrameInfo.java fails with AggressiveOpts in 6u14
kvn
parents: 196
diff changeset
275 bool owner_is_scalar_replaced() const { return _owner_is_scalar_replaced; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
276 };
a61af66fc99e Initial load
duke
parents:
diff changeset
277
a61af66fc99e Initial load
duke
parents:
diff changeset
278 class vframeStreamCommon : StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
279 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
280 // common
a61af66fc99e Initial load
duke
parents:
diff changeset
281 frame _frame;
a61af66fc99e Initial load
duke
parents:
diff changeset
282 JavaThread* _thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
283 RegisterMap _reg_map;
a61af66fc99e Initial load
duke
parents:
diff changeset
284 enum { interpreted_mode, compiled_mode, at_end_mode } _mode;
a61af66fc99e Initial load
duke
parents:
diff changeset
285
a61af66fc99e Initial load
duke
parents:
diff changeset
286 int _sender_decode_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
287
a61af66fc99e Initial load
duke
parents:
diff changeset
288 // Cached information
a61af66fc99e Initial load
duke
parents:
diff changeset
289 methodOop _method;
a61af66fc99e Initial load
duke
parents:
diff changeset
290 int _bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
291
a61af66fc99e Initial load
duke
parents:
diff changeset
292 // Should VM activations be ignored or not
a61af66fc99e Initial load
duke
parents:
diff changeset
293 bool _stop_at_java_call_stub;
a61af66fc99e Initial load
duke
parents:
diff changeset
294
a61af66fc99e Initial load
duke
parents:
diff changeset
295 bool fill_in_compiled_inlined_sender();
a61af66fc99e Initial load
duke
parents:
diff changeset
296 void fill_from_compiled_frame(int decode_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
297 void fill_from_compiled_native_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
298
a61af66fc99e Initial load
duke
parents:
diff changeset
299 void found_bad_method_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
300
a61af66fc99e Initial load
duke
parents:
diff changeset
301 void fill_from_interpreter_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
302 bool fill_from_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
303
a61af66fc99e Initial load
duke
parents:
diff changeset
304 // Helper routine for security_get_caller_frame
a61af66fc99e Initial load
duke
parents:
diff changeset
305 void skip_prefixed_method_and_wrappers();
a61af66fc99e Initial load
duke
parents:
diff changeset
306
a61af66fc99e Initial load
duke
parents:
diff changeset
307 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
308 // Constructor
a61af66fc99e Initial load
duke
parents:
diff changeset
309 vframeStreamCommon(JavaThread* thread) : _reg_map(thread, false) {
a61af66fc99e Initial load
duke
parents:
diff changeset
310 _thread = thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
311 }
a61af66fc99e Initial load
duke
parents:
diff changeset
312
a61af66fc99e Initial load
duke
parents:
diff changeset
313 // Accessors
a61af66fc99e Initial load
duke
parents:
diff changeset
314 methodOop method() const { return _method; }
a61af66fc99e Initial load
duke
parents:
diff changeset
315 int bci() const { return _bci; }
a61af66fc99e Initial load
duke
parents:
diff changeset
316 intptr_t* frame_id() const { return _frame.id(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
317 address frame_pc() const { return _frame.pc(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
318
a61af66fc99e Initial load
duke
parents:
diff changeset
319 CodeBlob* cb() const { return _frame.cb(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
320 nmethod* nm() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
321 assert( cb() != NULL && cb()->is_nmethod(), "usage");
a61af66fc99e Initial load
duke
parents:
diff changeset
322 return (nmethod*) cb();
a61af66fc99e Initial load
duke
parents:
diff changeset
323 }
a61af66fc99e Initial load
duke
parents:
diff changeset
324
a61af66fc99e Initial load
duke
parents:
diff changeset
325 // Frame type
a61af66fc99e Initial load
duke
parents:
diff changeset
326 bool is_interpreted_frame() const { return _frame.is_interpreted_frame(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
327 bool is_entry_frame() const { return _frame.is_entry_frame(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
328
a61af66fc99e Initial load
duke
parents:
diff changeset
329 // Iteration
a61af66fc99e Initial load
duke
parents:
diff changeset
330 void next() {
a61af66fc99e Initial load
duke
parents:
diff changeset
331 // handle frames with inlining
a61af66fc99e Initial load
duke
parents:
diff changeset
332 if (_mode == compiled_mode && fill_in_compiled_inlined_sender()) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
333
a61af66fc99e Initial load
duke
parents:
diff changeset
334 // handle general case
a61af66fc99e Initial load
duke
parents:
diff changeset
335 do {
a61af66fc99e Initial load
duke
parents:
diff changeset
336 _frame = _frame.sender(&_reg_map);
a61af66fc99e Initial load
duke
parents:
diff changeset
337 } while (!fill_from_frame());
a61af66fc99e Initial load
duke
parents:
diff changeset
338 }
a61af66fc99e Initial load
duke
parents:
diff changeset
339
a61af66fc99e Initial load
duke
parents:
diff changeset
340 bool at_end() const { return _mode == at_end_mode; }
a61af66fc99e Initial load
duke
parents:
diff changeset
341
a61af66fc99e Initial load
duke
parents:
diff changeset
342 // Implements security traversal. Skips depth no. of frame including
a61af66fc99e Initial load
duke
parents:
diff changeset
343 // special security frames and prefixed native methods
a61af66fc99e Initial load
duke
parents:
diff changeset
344 void security_get_caller_frame(int depth);
a61af66fc99e Initial load
duke
parents:
diff changeset
345
a61af66fc99e Initial load
duke
parents:
diff changeset
346 // Helper routine for JVM_LatestUserDefinedLoader -- needed for 1.4
a61af66fc99e Initial load
duke
parents:
diff changeset
347 // reflection implementation
a61af66fc99e Initial load
duke
parents:
diff changeset
348 void skip_reflection_related_frames();
a61af66fc99e Initial load
duke
parents:
diff changeset
349 };
a61af66fc99e Initial load
duke
parents:
diff changeset
350
a61af66fc99e Initial load
duke
parents:
diff changeset
351 class vframeStream : public vframeStreamCommon {
a61af66fc99e Initial load
duke
parents:
diff changeset
352 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
353 // Constructors
a61af66fc99e Initial load
duke
parents:
diff changeset
354 vframeStream(JavaThread* thread, bool stop_at_java_call_stub = false)
a61af66fc99e Initial load
duke
parents:
diff changeset
355 : vframeStreamCommon(thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
356 _stop_at_java_call_stub = stop_at_java_call_stub;
a61af66fc99e Initial load
duke
parents:
diff changeset
357
a61af66fc99e Initial load
duke
parents:
diff changeset
358 if (!thread->has_last_Java_frame()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
359 _mode = at_end_mode;
a61af66fc99e Initial load
duke
parents:
diff changeset
360 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
361 }
a61af66fc99e Initial load
duke
parents:
diff changeset
362
a61af66fc99e Initial load
duke
parents:
diff changeset
363 _frame = _thread->last_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
364 while (!fill_from_frame()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
365 _frame = _frame.sender(&_reg_map);
a61af66fc99e Initial load
duke
parents:
diff changeset
366 }
a61af66fc99e Initial load
duke
parents:
diff changeset
367 }
a61af66fc99e Initial load
duke
parents:
diff changeset
368
a61af66fc99e Initial load
duke
parents:
diff changeset
369 // top_frame may not be at safepoint, start with sender
a61af66fc99e Initial load
duke
parents:
diff changeset
370 vframeStream(JavaThread* thread, frame top_frame, bool stop_at_java_call_stub = false);
a61af66fc99e Initial load
duke
parents:
diff changeset
371 };
a61af66fc99e Initial load
duke
parents:
diff changeset
372
a61af66fc99e Initial load
duke
parents:
diff changeset
373
a61af66fc99e Initial load
duke
parents:
diff changeset
374 inline bool vframeStreamCommon::fill_in_compiled_inlined_sender() {
a61af66fc99e Initial load
duke
parents:
diff changeset
375 if (_sender_decode_offset == DebugInformationRecorder::serialized_null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
376 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
377 }
a61af66fc99e Initial load
duke
parents:
diff changeset
378 fill_from_compiled_frame(_sender_decode_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
379 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
380 }
a61af66fc99e Initial load
duke
parents:
diff changeset
381
a61af66fc99e Initial load
duke
parents:
diff changeset
382
a61af66fc99e Initial load
duke
parents:
diff changeset
383 inline void vframeStreamCommon::fill_from_compiled_frame(int decode_offset) {
a61af66fc99e Initial load
duke
parents:
diff changeset
384 _mode = compiled_mode;
a61af66fc99e Initial load
duke
parents:
diff changeset
385
a61af66fc99e Initial load
duke
parents:
diff changeset
386 // Range check to detect ridiculous offsets.
a61af66fc99e Initial load
duke
parents:
diff changeset
387 if (decode_offset == DebugInformationRecorder::serialized_null ||
a61af66fc99e Initial load
duke
parents:
diff changeset
388 decode_offset < 0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
389 decode_offset >= nm()->scopes_data_size()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
390 // 6379830 AsyncGetCallTrace sometimes feeds us wild frames.
a61af66fc99e Initial load
duke
parents:
diff changeset
391 // If we attempt to read nmethod::scopes_data at serialized_null (== 0),
a61af66fc99e Initial load
duke
parents:
diff changeset
392 // or if we read some at other crazy offset,
a61af66fc99e Initial load
duke
parents:
diff changeset
393 // we will decode garbage and make wild references into the heap,
a61af66fc99e Initial load
duke
parents:
diff changeset
394 // leading to crashes in product mode.
a61af66fc99e Initial load
duke
parents:
diff changeset
395 // (This isn't airtight, of course, since there are internal
a61af66fc99e Initial load
duke
parents:
diff changeset
396 // offsets which are also crazy.)
a61af66fc99e Initial load
duke
parents:
diff changeset
397 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
398 if (WizardMode) {
a61af66fc99e Initial load
duke
parents:
diff changeset
399 tty->print_cr("Error in fill_from_frame: pc_desc for "
a61af66fc99e Initial load
duke
parents:
diff changeset
400 INTPTR_FORMAT " not found or invalid at %d",
a61af66fc99e Initial load
duke
parents:
diff changeset
401 _frame.pc(), decode_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
402 nm()->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
403 nm()->method()->print_codes();
a61af66fc99e Initial load
duke
parents:
diff changeset
404 nm()->print_code();
a61af66fc99e Initial load
duke
parents:
diff changeset
405 nm()->print_pcs();
a61af66fc99e Initial load
duke
parents:
diff changeset
406 }
a61af66fc99e Initial load
duke
parents:
diff changeset
407 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
408 // Provide a cheap fallback in product mode. (See comment above.)
a61af66fc99e Initial load
duke
parents:
diff changeset
409 found_bad_method_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
410 fill_from_compiled_native_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
411 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
412 }
a61af66fc99e Initial load
duke
parents:
diff changeset
413
a61af66fc99e Initial load
duke
parents:
diff changeset
414 // Decode first part of scopeDesc
a61af66fc99e Initial load
duke
parents:
diff changeset
415 DebugInfoReadStream buffer(nm(), decode_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
416 _sender_decode_offset = buffer.read_int();
a61af66fc99e Initial load
duke
parents:
diff changeset
417 _method = methodOop(buffer.read_oop());
931
72088be4b386 6873116: Modify reexecute implementation to use pcDesc to record the reexecute bit
cfang
parents: 903
diff changeset
418 _bci = buffer.read_bci();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
419
a61af66fc99e Initial load
duke
parents:
diff changeset
420 assert(_method->is_method(), "checking type of decoded method");
a61af66fc99e Initial load
duke
parents:
diff changeset
421 }
a61af66fc99e Initial load
duke
parents:
diff changeset
422
a61af66fc99e Initial load
duke
parents:
diff changeset
423 // The native frames are handled specially. We do not rely on ScopeDesc info
a61af66fc99e Initial load
duke
parents:
diff changeset
424 // since the pc might not be exact due to the _last_native_pc trick.
a61af66fc99e Initial load
duke
parents:
diff changeset
425 inline void vframeStreamCommon::fill_from_compiled_native_frame() {
a61af66fc99e Initial load
duke
parents:
diff changeset
426 _mode = compiled_mode;
a61af66fc99e Initial load
duke
parents:
diff changeset
427 _sender_decode_offset = DebugInformationRecorder::serialized_null;
a61af66fc99e Initial load
duke
parents:
diff changeset
428 _method = nm()->method();
a61af66fc99e Initial load
duke
parents:
diff changeset
429 _bci = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
430 }
a61af66fc99e Initial load
duke
parents:
diff changeset
431
a61af66fc99e Initial load
duke
parents:
diff changeset
432 inline bool vframeStreamCommon::fill_from_frame() {
a61af66fc99e Initial load
duke
parents:
diff changeset
433 // Interpreted frame
a61af66fc99e Initial load
duke
parents:
diff changeset
434 if (_frame.is_interpreted_frame()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
435 fill_from_interpreter_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
436 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
437 }
a61af66fc99e Initial load
duke
parents:
diff changeset
438
a61af66fc99e Initial load
duke
parents:
diff changeset
439 // Compiled frame
a61af66fc99e Initial load
duke
parents:
diff changeset
440
a61af66fc99e Initial load
duke
parents:
diff changeset
441 if (cb() != NULL && cb()->is_nmethod()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
442 if (nm()->is_native_method()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
443 // Do not rely on scopeDesc since the pc might be unprecise due to the _last_native_pc trick.
a61af66fc99e Initial load
duke
parents:
diff changeset
444 fill_from_compiled_native_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
445 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
446 PcDesc* pc_desc = nm()->pc_desc_at(_frame.pc());
a61af66fc99e Initial load
duke
parents:
diff changeset
447 int decode_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
448 if (pc_desc == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
449 // Should not happen, but let fill_from_compiled_frame handle it.
107
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
450
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
451 // If we are trying to walk the stack of a thread that is not
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
452 // at a safepoint (like AsyncGetCallTrace would do) then this is an
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
453 // acceptable result. [ This is assuming that safe_for_sender
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
454 // is so bullet proof that we can trust the frames it produced. ]
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
455 //
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
456 // So if we see that the thread is not safepoint safe
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
457 // then simply produce the method and a bci of zero
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
458 // and skip the possibility of decoding any inlining that
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
459 // may be present. That is far better than simply stopping (or
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
460 // asserting. If however the thread is safepoint safe this
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
461 // is the sign of a compiler bug and we'll let
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
462 // fill_from_compiled_frame handle it.
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
463
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
464
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
465 JavaThreadState state = _thread->thread_state();
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
466
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
467 // in_Java should be good enough to test safepoint safety
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
468 // if state were say in_Java_trans then we'd expect that
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
469 // the pc would have already been slightly adjusted to
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
470 // one that would produce a pcDesc since the trans state
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
471 // would be one that might in fact anticipate a safepoint
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
472
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
473 if (state == _thread_in_Java ) {
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
474 // This will get a method a zero bci and no inlining.
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
475 // Might be nice to have a unique bci to signify this
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
476 // particular case but for now zero will do.
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
477
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
478 fill_from_compiled_native_frame();
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
479
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
480 // There is something to be said for setting the mode to
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
481 // at_end_mode to prevent trying to walk further up the
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
482 // stack. There is evidence that if we walk any further
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
483 // that we could produce a bad stack chain. However until
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
484 // we see evidence that allowing this causes us to find
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
485 // frames bad enough to cause segv's or assertion failures
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
486 // we don't do it as while we may get a bad call chain the
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
487 // probability is much higher (several magnitudes) that we
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
488 // get good data.
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
489
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
490 return true;
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
491 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
492 decode_offset = DebugInformationRecorder::serialized_null;
a61af66fc99e Initial load
duke
parents:
diff changeset
493 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
494 decode_offset = pc_desc->scope_decode_offset();
a61af66fc99e Initial load
duke
parents:
diff changeset
495 }
a61af66fc99e Initial load
duke
parents:
diff changeset
496 fill_from_compiled_frame(decode_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
497 }
a61af66fc99e Initial load
duke
parents:
diff changeset
498 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
499 }
a61af66fc99e Initial load
duke
parents:
diff changeset
500
a61af66fc99e Initial load
duke
parents:
diff changeset
501 // End of stack?
a61af66fc99e Initial load
duke
parents:
diff changeset
502 if (_frame.is_first_frame() || (_stop_at_java_call_stub && _frame.is_entry_frame())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
503 _mode = at_end_mode;
a61af66fc99e Initial load
duke
parents:
diff changeset
504 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
505 }
a61af66fc99e Initial load
duke
parents:
diff changeset
506
a61af66fc99e Initial load
duke
parents:
diff changeset
507 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
508 }
a61af66fc99e Initial load
duke
parents:
diff changeset
509
a61af66fc99e Initial load
duke
parents:
diff changeset
510
a61af66fc99e Initial load
duke
parents:
diff changeset
511 inline void vframeStreamCommon::fill_from_interpreter_frame() {
a61af66fc99e Initial load
duke
parents:
diff changeset
512 methodOop method = _frame.interpreter_frame_method();
a61af66fc99e Initial load
duke
parents:
diff changeset
513 intptr_t bcx = _frame.interpreter_frame_bcx();
a61af66fc99e Initial load
duke
parents:
diff changeset
514 int bci = method->validate_bci_from_bcx(bcx);
a61af66fc99e Initial load
duke
parents:
diff changeset
515 // 6379830 AsyncGetCallTrace sometimes feeds us wild frames.
a61af66fc99e Initial load
duke
parents:
diff changeset
516 if (bci < 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
517 found_bad_method_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
518 bci = 0; // pretend it's on the point of entering
a61af66fc99e Initial load
duke
parents:
diff changeset
519 }
a61af66fc99e Initial load
duke
parents:
diff changeset
520 _mode = interpreted_mode;
a61af66fc99e Initial load
duke
parents:
diff changeset
521 _method = method;
a61af66fc99e Initial load
duke
parents:
diff changeset
522 _bci = bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
523 }
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
524
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
525 #endif // SHARE_VM_RUNTIME_VFRAME_HPP