annotate src/share/vm/runtime/vframe.hpp @ 18096:ca6d25be853b jdk8u25-b13

8044269: Analysis of archive files. Summary: Add checksum verification. Reviewed-by: iklam, dholmes, mschoene
author jiangli
date Tue, 12 Aug 2014 17:46:16 -0400
parents 78bbf4d43a14
children 52b4284cb496 c204e2044c29
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
17937
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 17467
diff changeset
2 * Copyright (c) 1997, 2014, 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
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 1972
diff changeset
109 virtual Method* method() const = 0;
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
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 1972
diff changeset
161 Method* method() const;
0
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;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 1972
diff changeset
246 oop _owner_klass; // klass (mirror) 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 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 1972
diff changeset
269 oop owner_klass() const {
818
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");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 1972
diff changeset
271 return _owner_klass;
818
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
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 1972
diff changeset
289 Method* _method;
0
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
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 1972
diff changeset
314 Method* method() const { return _method; }
0
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 }
8866
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 6725
diff changeset
339 void security_next();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
340
a61af66fc99e Initial load
duke
parents:
diff changeset
341 bool at_end() const { return _mode == at_end_mode; }
a61af66fc99e Initial load
duke
parents:
diff changeset
342
a61af66fc99e Initial load
duke
parents:
diff changeset
343 // Implements security traversal. Skips depth no. of frame including
a61af66fc99e Initial load
duke
parents:
diff changeset
344 // special security frames and prefixed native methods
a61af66fc99e Initial load
duke
parents:
diff changeset
345 void security_get_caller_frame(int depth);
a61af66fc99e Initial load
duke
parents:
diff changeset
346
a61af66fc99e Initial load
duke
parents:
diff changeset
347 // Helper routine for JVM_LatestUserDefinedLoader -- needed for 1.4
a61af66fc99e Initial load
duke
parents:
diff changeset
348 // reflection implementation
a61af66fc99e Initial load
duke
parents:
diff changeset
349 void skip_reflection_related_frames();
a61af66fc99e Initial load
duke
parents:
diff changeset
350 };
a61af66fc99e Initial load
duke
parents:
diff changeset
351
a61af66fc99e Initial load
duke
parents:
diff changeset
352 class vframeStream : public vframeStreamCommon {
a61af66fc99e Initial load
duke
parents:
diff changeset
353 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
354 // Constructors
a61af66fc99e Initial load
duke
parents:
diff changeset
355 vframeStream(JavaThread* thread, bool stop_at_java_call_stub = false)
a61af66fc99e Initial load
duke
parents:
diff changeset
356 : vframeStreamCommon(thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
357 _stop_at_java_call_stub = stop_at_java_call_stub;
a61af66fc99e Initial load
duke
parents:
diff changeset
358
a61af66fc99e Initial load
duke
parents:
diff changeset
359 if (!thread->has_last_Java_frame()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
360 _mode = at_end_mode;
a61af66fc99e Initial load
duke
parents:
diff changeset
361 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
362 }
a61af66fc99e Initial load
duke
parents:
diff changeset
363
a61af66fc99e Initial load
duke
parents:
diff changeset
364 _frame = _thread->last_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
365 while (!fill_from_frame()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
366 _frame = _frame.sender(&_reg_map);
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 // top_frame may not be at safepoint, start with sender
a61af66fc99e Initial load
duke
parents:
diff changeset
371 vframeStream(JavaThread* thread, frame top_frame, bool stop_at_java_call_stub = false);
a61af66fc99e Initial load
duke
parents:
diff changeset
372 };
a61af66fc99e Initial load
duke
parents:
diff changeset
373
a61af66fc99e Initial load
duke
parents:
diff changeset
374
a61af66fc99e Initial load
duke
parents:
diff changeset
375 inline bool vframeStreamCommon::fill_in_compiled_inlined_sender() {
a61af66fc99e Initial load
duke
parents:
diff changeset
376 if (_sender_decode_offset == DebugInformationRecorder::serialized_null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
377 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
378 }
a61af66fc99e Initial load
duke
parents:
diff changeset
379 fill_from_compiled_frame(_sender_decode_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
380 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
381 }
a61af66fc99e Initial load
duke
parents:
diff changeset
382
a61af66fc99e Initial load
duke
parents:
diff changeset
383
a61af66fc99e Initial load
duke
parents:
diff changeset
384 inline void vframeStreamCommon::fill_from_compiled_frame(int decode_offset) {
a61af66fc99e Initial load
duke
parents:
diff changeset
385 _mode = compiled_mode;
a61af66fc99e Initial load
duke
parents:
diff changeset
386
a61af66fc99e Initial load
duke
parents:
diff changeset
387 // Range check to detect ridiculous offsets.
a61af66fc99e Initial load
duke
parents:
diff changeset
388 if (decode_offset == DebugInformationRecorder::serialized_null ||
a61af66fc99e Initial load
duke
parents:
diff changeset
389 decode_offset < 0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
390 decode_offset >= nm()->scopes_data_size()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
391 // 6379830 AsyncGetCallTrace sometimes feeds us wild frames.
a61af66fc99e Initial load
duke
parents:
diff changeset
392 // If we attempt to read nmethod::scopes_data at serialized_null (== 0),
a61af66fc99e Initial load
duke
parents:
diff changeset
393 // or if we read some at other crazy offset,
a61af66fc99e Initial load
duke
parents:
diff changeset
394 // we will decode garbage and make wild references into the heap,
a61af66fc99e Initial load
duke
parents:
diff changeset
395 // leading to crashes in product mode.
a61af66fc99e Initial load
duke
parents:
diff changeset
396 // (This isn't airtight, of course, since there are internal
a61af66fc99e Initial load
duke
parents:
diff changeset
397 // offsets which are also crazy.)
a61af66fc99e Initial load
duke
parents:
diff changeset
398 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
399 if (WizardMode) {
a61af66fc99e Initial load
duke
parents:
diff changeset
400 tty->print_cr("Error in fill_from_frame: pc_desc for "
a61af66fc99e Initial load
duke
parents:
diff changeset
401 INTPTR_FORMAT " not found or invalid at %d",
17937
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 17467
diff changeset
402 p2i(_frame.pc()), decode_offset);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
403 nm()->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
404 nm()->method()->print_codes();
a61af66fc99e Initial load
duke
parents:
diff changeset
405 nm()->print_code();
a61af66fc99e Initial load
duke
parents:
diff changeset
406 nm()->print_pcs();
a61af66fc99e Initial load
duke
parents:
diff changeset
407 }
a61af66fc99e Initial load
duke
parents:
diff changeset
408 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
409 // Provide a cheap fallback in product mode. (See comment above.)
a61af66fc99e Initial load
duke
parents:
diff changeset
410 found_bad_method_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
411 fill_from_compiled_native_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
412 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
413 }
a61af66fc99e Initial load
duke
parents:
diff changeset
414
a61af66fc99e Initial load
duke
parents:
diff changeset
415 // Decode first part of scopeDesc
a61af66fc99e Initial load
duke
parents:
diff changeset
416 DebugInfoReadStream buffer(nm(), decode_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
417 _sender_decode_offset = buffer.read_int();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 1972
diff changeset
418 _method = buffer.read_method();
931
72088be4b386 6873116: Modify reexecute implementation to use pcDesc to record the reexecute bit
cfang
parents: 903
diff changeset
419 _bci = buffer.read_bci();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
420
a61af66fc99e Initial load
duke
parents:
diff changeset
421 assert(_method->is_method(), "checking type of decoded method");
a61af66fc99e Initial load
duke
parents:
diff changeset
422 }
a61af66fc99e Initial load
duke
parents:
diff changeset
423
a61af66fc99e Initial load
duke
parents:
diff changeset
424 // The native frames are handled specially. We do not rely on ScopeDesc info
a61af66fc99e Initial load
duke
parents:
diff changeset
425 // since the pc might not be exact due to the _last_native_pc trick.
a61af66fc99e Initial load
duke
parents:
diff changeset
426 inline void vframeStreamCommon::fill_from_compiled_native_frame() {
a61af66fc99e Initial load
duke
parents:
diff changeset
427 _mode = compiled_mode;
a61af66fc99e Initial load
duke
parents:
diff changeset
428 _sender_decode_offset = DebugInformationRecorder::serialized_null;
a61af66fc99e Initial load
duke
parents:
diff changeset
429 _method = nm()->method();
a61af66fc99e Initial load
duke
parents:
diff changeset
430 _bci = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
431 }
a61af66fc99e Initial load
duke
parents:
diff changeset
432
a61af66fc99e Initial load
duke
parents:
diff changeset
433 inline bool vframeStreamCommon::fill_from_frame() {
a61af66fc99e Initial load
duke
parents:
diff changeset
434 // Interpreted frame
a61af66fc99e Initial load
duke
parents:
diff changeset
435 if (_frame.is_interpreted_frame()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
436 fill_from_interpreter_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
437 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
438 }
a61af66fc99e Initial load
duke
parents:
diff changeset
439
a61af66fc99e Initial load
duke
parents:
diff changeset
440 // Compiled frame
a61af66fc99e Initial load
duke
parents:
diff changeset
441
a61af66fc99e Initial load
duke
parents:
diff changeset
442 if (cb() != NULL && cb()->is_nmethod()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
443 if (nm()->is_native_method()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
444 // 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
445 fill_from_compiled_native_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
446 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
447 PcDesc* pc_desc = nm()->pc_desc_at(_frame.pc());
a61af66fc99e Initial load
duke
parents:
diff changeset
448 int decode_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
449 if (pc_desc == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
450 // 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
451
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
452 // 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
453 // 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
454 // 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
455 // 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
456 //
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
457 // 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
458 // 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
459 // 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
460 // 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
461 // 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
462 // 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
463 // 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
464
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
465
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
466 JavaThreadState state = _thread->thread_state();
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
467
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
468 // 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
469 // 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
470 // 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
471 // 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
472 // 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
473
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
474 if (state == _thread_in_Java ) {
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
475 // 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
476 // 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
477 // 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
478
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
479 fill_from_compiled_native_frame();
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
480
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
481 // 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
482 // 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
483 // 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
484 // 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
485 // 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
486 // 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
487 // 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
488 // 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
489 // get good data.
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
490
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
491 return true;
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 83
diff changeset
492 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
493 decode_offset = DebugInformationRecorder::serialized_null;
a61af66fc99e Initial load
duke
parents:
diff changeset
494 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
495 decode_offset = pc_desc->scope_decode_offset();
a61af66fc99e Initial load
duke
parents:
diff changeset
496 }
a61af66fc99e Initial load
duke
parents:
diff changeset
497 fill_from_compiled_frame(decode_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
498 }
a61af66fc99e Initial load
duke
parents:
diff changeset
499 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
500 }
a61af66fc99e Initial load
duke
parents:
diff changeset
501
a61af66fc99e Initial load
duke
parents:
diff changeset
502 // End of stack?
a61af66fc99e Initial load
duke
parents:
diff changeset
503 if (_frame.is_first_frame() || (_stop_at_java_call_stub && _frame.is_entry_frame())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
504 _mode = at_end_mode;
a61af66fc99e Initial load
duke
parents:
diff changeset
505 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
506 }
a61af66fc99e Initial load
duke
parents:
diff changeset
507
a61af66fc99e Initial load
duke
parents:
diff changeset
508 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
509 }
a61af66fc99e Initial load
duke
parents:
diff changeset
510
a61af66fc99e Initial load
duke
parents:
diff changeset
511
a61af66fc99e Initial load
duke
parents:
diff changeset
512 inline void vframeStreamCommon::fill_from_interpreter_frame() {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 1972
diff changeset
513 Method* method = _frame.interpreter_frame_method();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
514 intptr_t bcx = _frame.interpreter_frame_bcx();
a61af66fc99e Initial load
duke
parents:
diff changeset
515 int bci = method->validate_bci_from_bcx(bcx);
a61af66fc99e Initial load
duke
parents:
diff changeset
516 // 6379830 AsyncGetCallTrace sometimes feeds us wild frames.
a61af66fc99e Initial load
duke
parents:
diff changeset
517 if (bci < 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
518 found_bad_method_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
519 bci = 0; // pretend it's on the point of entering
a61af66fc99e Initial load
duke
parents:
diff changeset
520 }
a61af66fc99e Initial load
duke
parents:
diff changeset
521 _mode = interpreted_mode;
a61af66fc99e Initial load
duke
parents:
diff changeset
522 _method = method;
a61af66fc99e Initial load
duke
parents:
diff changeset
523 _bci = bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
524 }
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
525
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
526 #endif // SHARE_VM_RUNTIME_VFRAME_HPP