annotate src/share/vm/runtime/frame.hpp @ 1721:413ad0331a0c

6977924: Changes for 6975078 produce build error with certain gcc versions Summary: The changes introduced for 6975078 assign badHeapOopVal to the _allocation field in the ResourceObj class. In 32 bit linux builds with certain versions of gcc this assignment will be flagged as an error while compiling allocation.cpp. In 32 bit builds the constant value badHeapOopVal (which is cast to an intptr_t) is negative. The _allocation field is typed as an unsigned intptr_t and gcc catches this as an error. Reviewed-by: jcoomes, ysr, phh
author johnc
date Wed, 18 Aug 2010 10:59:06 -0700
parents 126ea7725993
children da877bdc9000
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1506
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: 1506
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1506
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: 1506
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
a61af66fc99e Initial load
duke
parents:
diff changeset
25 typedef class BytecodeInterpreter* interpreterState;
a61af66fc99e Initial load
duke
parents:
diff changeset
26
a61af66fc99e Initial load
duke
parents:
diff changeset
27 class CodeBlob;
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
28 class vframeArray;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
29
a61af66fc99e Initial load
duke
parents:
diff changeset
30
a61af66fc99e Initial load
duke
parents:
diff changeset
31 // A frame represents a physical stack frame (an activation). Frames
a61af66fc99e Initial load
duke
parents:
diff changeset
32 // can be C or Java frames, and the Java frames can be interpreted or
a61af66fc99e Initial load
duke
parents:
diff changeset
33 // compiled. In contrast, vframes represent source-level activations,
a61af66fc99e Initial load
duke
parents:
diff changeset
34 // so that one physical frame can correspond to multiple source level
a61af66fc99e Initial load
duke
parents:
diff changeset
35 // frames because of inlining.
a61af66fc99e Initial load
duke
parents:
diff changeset
36
a61af66fc99e Initial load
duke
parents:
diff changeset
37 class frame VALUE_OBJ_CLASS_SPEC {
a61af66fc99e Initial load
duke
parents:
diff changeset
38 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
39 // Instance variables:
a61af66fc99e Initial load
duke
parents:
diff changeset
40 intptr_t* _sp; // stack pointer (from Thread::last_Java_sp)
a61af66fc99e Initial load
duke
parents:
diff changeset
41 address _pc; // program counter (the next instruction after the call)
a61af66fc99e Initial load
duke
parents:
diff changeset
42
a61af66fc99e Initial load
duke
parents:
diff changeset
43 CodeBlob* _cb; // CodeBlob that "owns" pc
a61af66fc99e Initial load
duke
parents:
diff changeset
44 enum deopt_state {
a61af66fc99e Initial load
duke
parents:
diff changeset
45 not_deoptimized,
a61af66fc99e Initial load
duke
parents:
diff changeset
46 is_deoptimized,
a61af66fc99e Initial load
duke
parents:
diff changeset
47 unknown
a61af66fc99e Initial load
duke
parents:
diff changeset
48 };
a61af66fc99e Initial load
duke
parents:
diff changeset
49
a61af66fc99e Initial load
duke
parents:
diff changeset
50 deopt_state _deopt_state;
a61af66fc99e Initial load
duke
parents:
diff changeset
51
a61af66fc99e Initial load
duke
parents:
diff changeset
52 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
53 // Constructors
a61af66fc99e Initial load
duke
parents:
diff changeset
54 frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
55
a61af66fc99e Initial load
duke
parents:
diff changeset
56 // Accessors
a61af66fc99e Initial load
duke
parents:
diff changeset
57
a61af66fc99e Initial load
duke
parents:
diff changeset
58 // pc: Returns the pc at which this frame will continue normally.
a61af66fc99e Initial load
duke
parents:
diff changeset
59 // It must point at the beginning of the next instruction to execute.
a61af66fc99e Initial load
duke
parents:
diff changeset
60 address pc() const { return _pc; }
a61af66fc99e Initial load
duke
parents:
diff changeset
61
a61af66fc99e Initial load
duke
parents:
diff changeset
62 // This returns the pc that if you were in the debugger you'd see. Not
a61af66fc99e Initial load
duke
parents:
diff changeset
63 // the idealized value in the frame object. This undoes the magic conversion
a61af66fc99e Initial load
duke
parents:
diff changeset
64 // that happens for deoptimized frames. In addition it makes the value the
a61af66fc99e Initial load
duke
parents:
diff changeset
65 // hardware would want to see in the native frame. The only user (at this point)
a61af66fc99e Initial load
duke
parents:
diff changeset
66 // is deoptimization. It likely no one else should ever use it.
a61af66fc99e Initial load
duke
parents:
diff changeset
67 address raw_pc() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
68
a61af66fc99e Initial load
duke
parents:
diff changeset
69 void set_pc( address newpc );
a61af66fc99e Initial load
duke
parents:
diff changeset
70
a61af66fc99e Initial load
duke
parents:
diff changeset
71 intptr_t* sp() const { return _sp; }
a61af66fc99e Initial load
duke
parents:
diff changeset
72 void set_sp( intptr_t* newsp ) { _sp = newsp; }
a61af66fc99e Initial load
duke
parents:
diff changeset
73
a61af66fc99e Initial load
duke
parents:
diff changeset
74
a61af66fc99e Initial load
duke
parents:
diff changeset
75 CodeBlob* cb() const { return _cb; }
a61af66fc99e Initial load
duke
parents:
diff changeset
76
a61af66fc99e Initial load
duke
parents:
diff changeset
77 // patching operations
a61af66fc99e Initial load
duke
parents:
diff changeset
78 void patch_pc(Thread* thread, address pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
79
a61af66fc99e Initial load
duke
parents:
diff changeset
80 // Every frame needs to return a unique id which distinguishes it from all other frames.
a61af66fc99e Initial load
duke
parents:
diff changeset
81 // For sparc and ia32 use sp. ia64 can have memory frames that are empty so multiple frames
a61af66fc99e Initial load
duke
parents:
diff changeset
82 // will have identical sp values. For ia64 the bsp (fp) value will serve. No real frame
a61af66fc99e Initial load
duke
parents:
diff changeset
83 // should have an id() of NULL so it is a distinguishing value for an unmatchable frame.
a61af66fc99e Initial load
duke
parents:
diff changeset
84 // We also have relationals which allow comparing a frame to anoth frame's id() allow
a61af66fc99e Initial load
duke
parents:
diff changeset
85 // us to distinguish younger (more recent activation) from older (less recent activations)
a61af66fc99e Initial load
duke
parents:
diff changeset
86 // A NULL id is only valid when comparing for equality.
a61af66fc99e Initial load
duke
parents:
diff changeset
87
a61af66fc99e Initial load
duke
parents:
diff changeset
88 intptr_t* id(void) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
89 bool is_younger(intptr_t* id) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
90 bool is_older(intptr_t* id) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
91
a61af66fc99e Initial load
duke
parents:
diff changeset
92 // testers
a61af66fc99e Initial load
duke
parents:
diff changeset
93
a61af66fc99e Initial load
duke
parents:
diff changeset
94 // Compares for strict equality. Rarely used or needed.
a61af66fc99e Initial load
duke
parents:
diff changeset
95 // It can return a different result than f1.id() == f2.id()
a61af66fc99e Initial load
duke
parents:
diff changeset
96 bool equal(frame other) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
97
a61af66fc99e Initial load
duke
parents:
diff changeset
98 // type testers
a61af66fc99e Initial load
duke
parents:
diff changeset
99 bool is_interpreted_frame() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
100 bool is_java_frame() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
101 bool is_entry_frame() const; // Java frame called from C?
a61af66fc99e Initial load
duke
parents:
diff changeset
102 bool is_native_frame() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
103 bool is_runtime_frame() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
104 bool is_compiled_frame() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
105 bool is_safepoint_blob_frame() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
106 bool is_deoptimized_frame() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
107
a61af66fc99e Initial load
duke
parents:
diff changeset
108 // testers
a61af66fc99e Initial load
duke
parents:
diff changeset
109 bool is_first_frame() const; // oldest frame? (has no sender)
a61af66fc99e Initial load
duke
parents:
diff changeset
110 bool is_first_java_frame() const; // same for Java frame
a61af66fc99e Initial load
duke
parents:
diff changeset
111
107
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
112 bool is_interpreted_frame_valid(JavaThread* thread) const; // performs sanity checks on interpreted frames.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
113
a61af66fc99e Initial load
duke
parents:
diff changeset
114 // tells whether this frame is marked for deoptimization
a61af66fc99e Initial load
duke
parents:
diff changeset
115 bool should_be_deoptimized() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
116
a61af66fc99e Initial load
duke
parents:
diff changeset
117 // tells whether this frame can be deoptimized
a61af66fc99e Initial load
duke
parents:
diff changeset
118 bool can_be_deoptimized() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
119
a61af66fc99e Initial load
duke
parents:
diff changeset
120 // returns the frame size in stack slots
793
eacd97c88873 6848466: frame::frame_size() assertion failure with -XX:+DebugDeoptimization
cfang
parents: 196
diff changeset
121 int frame_size(RegisterMap* map) const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
122
a61af66fc99e Initial load
duke
parents:
diff changeset
123 // returns the sending frame
a61af66fc99e Initial load
duke
parents:
diff changeset
124 frame sender(RegisterMap* map) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
125
a61af66fc99e Initial load
duke
parents:
diff changeset
126 // for Profiling - acting on another frame. walks sender frames
a61af66fc99e Initial load
duke
parents:
diff changeset
127 // if valid.
a61af66fc99e Initial load
duke
parents:
diff changeset
128 frame profile_find_Java_sender_frame(JavaThread *thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
129 bool safe_for_sender(JavaThread *thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
130
a61af66fc99e Initial load
duke
parents:
diff changeset
131 // returns the sender, but skips conversion frames
a61af66fc99e Initial load
duke
parents:
diff changeset
132 frame real_sender(RegisterMap* map) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
133
a61af66fc99e Initial load
duke
parents:
diff changeset
134 // returns the the sending Java frame, skipping any intermediate C frames
a61af66fc99e Initial load
duke
parents:
diff changeset
135 // NB: receiver must not be first frame
a61af66fc99e Initial load
duke
parents:
diff changeset
136 frame java_sender() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
137
a61af66fc99e Initial load
duke
parents:
diff changeset
138 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
139 // Helper methods for better factored code in frame::sender
a61af66fc99e Initial load
duke
parents:
diff changeset
140 frame sender_for_compiled_frame(RegisterMap* map) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
141 frame sender_for_entry_frame(RegisterMap* map) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
142 frame sender_for_interpreter_frame(RegisterMap* map) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
143 frame sender_for_native_frame(RegisterMap* map) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
144
a61af66fc99e Initial load
duke
parents:
diff changeset
145 // All frames:
a61af66fc99e Initial load
duke
parents:
diff changeset
146
a61af66fc99e Initial load
duke
parents:
diff changeset
147 // A low-level interface for vframes:
a61af66fc99e Initial load
duke
parents:
diff changeset
148
a61af66fc99e Initial load
duke
parents:
diff changeset
149 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
150
a61af66fc99e Initial load
duke
parents:
diff changeset
151 intptr_t* addr_at(int index) const { return &fp()[index]; }
a61af66fc99e Initial load
duke
parents:
diff changeset
152 intptr_t at(int index) const { return *addr_at(index); }
a61af66fc99e Initial load
duke
parents:
diff changeset
153
a61af66fc99e Initial load
duke
parents:
diff changeset
154 // accessors for locals
a61af66fc99e Initial load
duke
parents:
diff changeset
155 oop obj_at(int offset) const { return *obj_at_addr(offset); }
a61af66fc99e Initial load
duke
parents:
diff changeset
156 void obj_at_put(int offset, oop value) { *obj_at_addr(offset) = value; }
a61af66fc99e Initial load
duke
parents:
diff changeset
157
a61af66fc99e Initial load
duke
parents:
diff changeset
158 jint int_at(int offset) const { return *int_at_addr(offset); }
a61af66fc99e Initial load
duke
parents:
diff changeset
159 void int_at_put(int offset, jint value) { *int_at_addr(offset) = value; }
a61af66fc99e Initial load
duke
parents:
diff changeset
160
a61af66fc99e Initial load
duke
parents:
diff changeset
161 oop* obj_at_addr(int offset) const { return (oop*) addr_at(offset); }
a61af66fc99e Initial load
duke
parents:
diff changeset
162
a61af66fc99e Initial load
duke
parents:
diff changeset
163 oop* adjusted_obj_at_addr(methodOop method, int index) { return obj_at_addr(adjust_offset(method, index)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
164
a61af66fc99e Initial load
duke
parents:
diff changeset
165 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
166 jint* int_at_addr(int offset) const { return (jint*) addr_at(offset); }
a61af66fc99e Initial load
duke
parents:
diff changeset
167
a61af66fc99e Initial load
duke
parents:
diff changeset
168 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
169 // Link (i.e., the pointer to the previous frame)
a61af66fc99e Initial load
duke
parents:
diff changeset
170 intptr_t* link() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
171 void set_link(intptr_t* addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
172
a61af66fc99e Initial load
duke
parents:
diff changeset
173 // Return address
a61af66fc99e Initial load
duke
parents:
diff changeset
174 address sender_pc() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
175
a61af66fc99e Initial load
duke
parents:
diff changeset
176 // Support for deoptimization
a61af66fc99e Initial load
duke
parents:
diff changeset
177 void deoptimize(JavaThread* thread, bool thread_is_known_safe = false);
a61af66fc99e Initial load
duke
parents:
diff changeset
178
a61af66fc99e Initial load
duke
parents:
diff changeset
179 // The frame's original SP, before any extension by an interpreted callee;
a61af66fc99e Initial load
duke
parents:
diff changeset
180 // used for packing debug info into vframeArray objects and vframeArray lookup.
a61af66fc99e Initial load
duke
parents:
diff changeset
181 intptr_t* unextended_sp() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
182
a61af66fc99e Initial load
duke
parents:
diff changeset
183 // returns the stack pointer of the calling frame
a61af66fc99e Initial load
duke
parents:
diff changeset
184 intptr_t* sender_sp() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
185
a61af66fc99e Initial load
duke
parents:
diff changeset
186
a61af66fc99e Initial load
duke
parents:
diff changeset
187 // Interpreter frames:
a61af66fc99e Initial load
duke
parents:
diff changeset
188
a61af66fc99e Initial load
duke
parents:
diff changeset
189 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
190 intptr_t** interpreter_frame_locals_addr() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
191 intptr_t* interpreter_frame_bcx_addr() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
192 intptr_t* interpreter_frame_mdx_addr() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
193
a61af66fc99e Initial load
duke
parents:
diff changeset
194 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
195 // Locals
a61af66fc99e Initial load
duke
parents:
diff changeset
196
a61af66fc99e Initial load
duke
parents:
diff changeset
197 // The _at version returns a pointer because the address is used for GC.
a61af66fc99e Initial load
duke
parents:
diff changeset
198 intptr_t* interpreter_frame_local_at(int index) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
199
a61af66fc99e Initial load
duke
parents:
diff changeset
200 void interpreter_frame_set_locals(intptr_t* locs);
a61af66fc99e Initial load
duke
parents:
diff changeset
201
a61af66fc99e Initial load
duke
parents:
diff changeset
202 // byte code index/pointer (use these functions for unchecked frame access only!)
a61af66fc99e Initial load
duke
parents:
diff changeset
203 intptr_t interpreter_frame_bcx() const { return *interpreter_frame_bcx_addr(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
204 void interpreter_frame_set_bcx(intptr_t bcx);
a61af66fc99e Initial load
duke
parents:
diff changeset
205
a61af66fc99e Initial load
duke
parents:
diff changeset
206 // byte code index
a61af66fc99e Initial load
duke
parents:
diff changeset
207 jint interpreter_frame_bci() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
208 void interpreter_frame_set_bci(jint bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
209
a61af66fc99e Initial load
duke
parents:
diff changeset
210 // byte code pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
211 address interpreter_frame_bcp() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
212 void interpreter_frame_set_bcp(address bcp);
a61af66fc99e Initial load
duke
parents:
diff changeset
213
a61af66fc99e Initial load
duke
parents:
diff changeset
214 // Unchecked access to the method data index/pointer.
a61af66fc99e Initial load
duke
parents:
diff changeset
215 // Only use this if you know what you are doing.
a61af66fc99e Initial load
duke
parents:
diff changeset
216 intptr_t interpreter_frame_mdx() const { return *interpreter_frame_mdx_addr(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
217 void interpreter_frame_set_mdx(intptr_t mdx);
a61af66fc99e Initial load
duke
parents:
diff changeset
218
a61af66fc99e Initial load
duke
parents:
diff changeset
219 // method data pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
220 address interpreter_frame_mdp() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
221 void interpreter_frame_set_mdp(address dp);
a61af66fc99e Initial load
duke
parents:
diff changeset
222
a61af66fc99e Initial load
duke
parents:
diff changeset
223 // Find receiver out of caller's (compiled) argument list
a61af66fc99e Initial load
duke
parents:
diff changeset
224 oop retrieve_receiver(RegisterMap *reg_map);
a61af66fc99e Initial load
duke
parents:
diff changeset
225
a61af66fc99e Initial load
duke
parents:
diff changeset
226 // Return the monitor owner and BasicLock for compiled synchronized
a61af66fc99e Initial load
duke
parents:
diff changeset
227 // native methods so that biased locking can revoke the receiver's
a61af66fc99e Initial load
duke
parents:
diff changeset
228 // bias if necessary. Takes optional nmethod for this frame as
a61af66fc99e Initial load
duke
parents:
diff changeset
229 // argument to avoid performing repeated lookups in code cache.
a61af66fc99e Initial load
duke
parents:
diff changeset
230 BasicLock* compiled_synchronized_native_monitor (nmethod* nm = NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
231 oop compiled_synchronized_native_monitor_owner(nmethod* nm = NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
232
a61af66fc99e Initial load
duke
parents:
diff changeset
233 // Find receiver for an invoke when arguments are just pushed on stack (i.e., callee stack-frame is
a61af66fc99e Initial load
duke
parents:
diff changeset
234 // not setup)
a61af66fc99e Initial load
duke
parents:
diff changeset
235 oop interpreter_callee_receiver(symbolHandle signature) { return *interpreter_callee_receiver_addr(signature); }
a61af66fc99e Initial load
duke
parents:
diff changeset
236
a61af66fc99e Initial load
duke
parents:
diff changeset
237
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 107
diff changeset
238 oop* interpreter_callee_receiver_addr(symbolHandle signature);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
239
a61af66fc99e Initial load
duke
parents:
diff changeset
240
a61af66fc99e Initial load
duke
parents:
diff changeset
241 // expression stack (may go up or down, direction == 1 or -1)
a61af66fc99e Initial load
duke
parents:
diff changeset
242 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
243 intptr_t* interpreter_frame_expression_stack() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
244 static jint interpreter_frame_expression_stack_direction();
a61af66fc99e Initial load
duke
parents:
diff changeset
245
a61af66fc99e Initial load
duke
parents:
diff changeset
246 // The _at version returns a pointer because the address is used for GC.
a61af66fc99e Initial load
duke
parents:
diff changeset
247 intptr_t* interpreter_frame_expression_stack_at(jint offset) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
248
a61af66fc99e Initial load
duke
parents:
diff changeset
249 // top of expression stack
a61af66fc99e Initial load
duke
parents:
diff changeset
250 intptr_t* interpreter_frame_tos_at(jint offset) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
251 intptr_t* interpreter_frame_tos_address() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
252
a61af66fc99e Initial load
duke
parents:
diff changeset
253
a61af66fc99e Initial load
duke
parents:
diff changeset
254 jint interpreter_frame_expression_stack_size() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
255
a61af66fc99e Initial load
duke
parents:
diff changeset
256 intptr_t* interpreter_frame_sender_sp() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
257
a61af66fc99e Initial load
duke
parents:
diff changeset
258 #ifndef CC_INTERP
a61af66fc99e Initial load
duke
parents:
diff changeset
259 // template based interpreter deoptimization support
a61af66fc99e Initial load
duke
parents:
diff changeset
260 void set_interpreter_frame_sender_sp(intptr_t* sender_sp);
a61af66fc99e Initial load
duke
parents:
diff changeset
261 void interpreter_frame_set_monitor_end(BasicObjectLock* value);
a61af66fc99e Initial load
duke
parents:
diff changeset
262 #endif // CC_INTERP
a61af66fc99e Initial load
duke
parents:
diff changeset
263
a61af66fc99e Initial load
duke
parents:
diff changeset
264 // BasicObjectLocks:
a61af66fc99e Initial load
duke
parents:
diff changeset
265 //
a61af66fc99e Initial load
duke
parents:
diff changeset
266 // interpreter_frame_monitor_begin is higher in memory than interpreter_frame_monitor_end
a61af66fc99e Initial load
duke
parents:
diff changeset
267 // Interpreter_frame_monitor_begin points to one element beyond the oldest one,
a61af66fc99e Initial load
duke
parents:
diff changeset
268 // interpreter_frame_monitor_end points to the youngest one, or if there are none,
a61af66fc99e Initial load
duke
parents:
diff changeset
269 // it points to one beyond where the first element will be.
a61af66fc99e Initial load
duke
parents:
diff changeset
270 // interpreter_frame_monitor_size reports the allocation size of a monitor in the interpreter stack.
a61af66fc99e Initial load
duke
parents:
diff changeset
271 // this value is >= BasicObjectLock::size(), and may be rounded up
a61af66fc99e Initial load
duke
parents:
diff changeset
272
a61af66fc99e Initial load
duke
parents:
diff changeset
273 BasicObjectLock* interpreter_frame_monitor_begin() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
274 BasicObjectLock* interpreter_frame_monitor_end() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
275 BasicObjectLock* next_monitor_in_interpreter_frame(BasicObjectLock* current) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
276 BasicObjectLock* previous_monitor_in_interpreter_frame(BasicObjectLock* current) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
277 static int interpreter_frame_monitor_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
278
a61af66fc99e Initial load
duke
parents:
diff changeset
279 void interpreter_frame_verify_monitor(BasicObjectLock* value) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
280
a61af66fc99e Initial load
duke
parents:
diff changeset
281 // Tells whether the current interpreter_frame frame pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
282 // corresponds to the old compiled/deoptimized fp
a61af66fc99e Initial load
duke
parents:
diff changeset
283 // The receiver used to be a top level frame
a61af66fc99e Initial load
duke
parents:
diff changeset
284 bool interpreter_frame_equals_unpacked_fp(intptr_t* fp);
a61af66fc99e Initial load
duke
parents:
diff changeset
285
a61af66fc99e Initial load
duke
parents:
diff changeset
286 // Return/result value from this interpreter frame
a61af66fc99e Initial load
duke
parents:
diff changeset
287 // If the method return type is T_OBJECT or T_ARRAY populates oop_result
a61af66fc99e Initial load
duke
parents:
diff changeset
288 // For other (non-T_VOID) the appropriate field in the jvalue is populated
a61af66fc99e Initial load
duke
parents:
diff changeset
289 // with the result value.
a61af66fc99e Initial load
duke
parents:
diff changeset
290 // Should only be called when at method exit when the method is not
a61af66fc99e Initial load
duke
parents:
diff changeset
291 // exiting due to an exception.
a61af66fc99e Initial load
duke
parents:
diff changeset
292 BasicType interpreter_frame_result(oop* oop_result, jvalue* value_result);
a61af66fc99e Initial load
duke
parents:
diff changeset
293
a61af66fc99e Initial load
duke
parents:
diff changeset
294 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
295 // Method & constant pool cache
a61af66fc99e Initial load
duke
parents:
diff changeset
296 methodOop interpreter_frame_method() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
297 void interpreter_frame_set_method(methodOop method);
a61af66fc99e Initial load
duke
parents:
diff changeset
298 methodOop* interpreter_frame_method_addr() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
299 constantPoolCacheOop* interpreter_frame_cache_addr() const;
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
300 #ifdef PPC
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
301 oop* interpreter_frame_mirror_addr() const;
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
302 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
303
a61af66fc99e Initial load
duke
parents:
diff changeset
304 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
305 // Entry frames
a61af66fc99e Initial load
duke
parents:
diff changeset
306 JavaCallWrapper* entry_frame_call_wrapper() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
307 intptr_t* entry_frame_argument_at(int offset) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
308
a61af66fc99e Initial load
duke
parents:
diff changeset
309 // tells whether there is another chunk of Delta stack above
a61af66fc99e Initial load
duke
parents:
diff changeset
310 bool entry_frame_is_first() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
311
a61af66fc99e Initial load
duke
parents:
diff changeset
312 // Compiled frames:
a61af66fc99e Initial load
duke
parents:
diff changeset
313
a61af66fc99e Initial load
duke
parents:
diff changeset
314 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
315 // Given the index of a local, and the number of argument words
a61af66fc99e Initial load
duke
parents:
diff changeset
316 // in this stack frame, tell which word of the stack frame to find
a61af66fc99e Initial load
duke
parents:
diff changeset
317 // the local in. Arguments are stored above the ofp/rpc pair,
a61af66fc99e Initial load
duke
parents:
diff changeset
318 // while other locals are stored below it.
a61af66fc99e Initial load
duke
parents:
diff changeset
319 // Since monitors (BasicLock blocks) are also assigned indexes,
a61af66fc99e Initial load
duke
parents:
diff changeset
320 // but may have different storage requirements, their presence
a61af66fc99e Initial load
duke
parents:
diff changeset
321 // can also affect the calculation of offsets.
a61af66fc99e Initial load
duke
parents:
diff changeset
322 static int local_offset_for_compiler(int local_index, int nof_args, int max_nof_locals, int max_nof_monitors);
a61af66fc99e Initial load
duke
parents:
diff changeset
323
a61af66fc99e Initial load
duke
parents:
diff changeset
324 // Given the index of a monitor, etc., tell which word of the
a61af66fc99e Initial load
duke
parents:
diff changeset
325 // stack frame contains the start of the BasicLock block.
a61af66fc99e Initial load
duke
parents:
diff changeset
326 // Note that the local index by convention is the __higher__
a61af66fc99e Initial load
duke
parents:
diff changeset
327 // of the two indexes allocated to the block.
a61af66fc99e Initial load
duke
parents:
diff changeset
328 static int monitor_offset_for_compiler(int local_index, int nof_args, int max_nof_locals, int max_nof_monitors);
a61af66fc99e Initial load
duke
parents:
diff changeset
329
a61af66fc99e Initial load
duke
parents:
diff changeset
330 // Tell the smallest value that local_offset_for_compiler will attain.
a61af66fc99e Initial load
duke
parents:
diff changeset
331 // This is used to help determine how much stack frame to allocate.
a61af66fc99e Initial load
duke
parents:
diff changeset
332 static int min_local_offset_for_compiler(int nof_args, int max_nof_locals, int max_nof_monitors);
a61af66fc99e Initial load
duke
parents:
diff changeset
333
a61af66fc99e Initial load
duke
parents:
diff changeset
334 // Tells if this register must be spilled during a call.
a61af66fc99e Initial load
duke
parents:
diff changeset
335 // On Intel, all registers are smashed by calls.
a61af66fc99e Initial load
duke
parents:
diff changeset
336 static bool volatile_across_calls(Register reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
337
a61af66fc99e Initial load
duke
parents:
diff changeset
338
a61af66fc99e Initial load
duke
parents:
diff changeset
339 // Safepoints
a61af66fc99e Initial load
duke
parents:
diff changeset
340
a61af66fc99e Initial load
duke
parents:
diff changeset
341 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
342 oop saved_oop_result(RegisterMap* map) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
343 void set_saved_oop_result(RegisterMap* map, oop obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
344
a61af66fc99e Initial load
duke
parents:
diff changeset
345 // For debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
346 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
347 const char* print_name() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
348
a61af66fc99e Initial load
duke
parents:
diff changeset
349 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
350 void print_value() const { print_value_on(tty,NULL); }
a61af66fc99e Initial load
duke
parents:
diff changeset
351 void print_value_on(outputStream* st, JavaThread *thread) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
352 void print_on(outputStream* st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
353 void interpreter_frame_print_on(outputStream* st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
354 void print_on_error(outputStream* st, char* buf, int buflen, bool verbose = false) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
355
a61af66fc99e Initial load
duke
parents:
diff changeset
356 // Conversion from an VMReg to physical stack location
a61af66fc99e Initial load
duke
parents:
diff changeset
357 oop* oopmapreg_to_location(VMReg reg, const RegisterMap* regmap) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
358
a61af66fc99e Initial load
duke
parents:
diff changeset
359 // Oops-do's
1138
dd57230ba8fe 6893268: additional dynamic language related optimizations in C2
twisti
parents: 989
diff changeset
360 void oops_compiled_arguments_do(symbolHandle signature, bool has_receiver, const RegisterMap* reg_map, OopClosure* f);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
361 void oops_interpreted_do(OopClosure* f, const RegisterMap* map, bool query_oop_map_cache = true);
a61af66fc99e Initial load
duke
parents:
diff changeset
362
a61af66fc99e Initial load
duke
parents:
diff changeset
363 private:
1138
dd57230ba8fe 6893268: additional dynamic language related optimizations in C2
twisti
parents: 989
diff changeset
364 void oops_interpreted_arguments_do(symbolHandle signature, bool has_receiver, OopClosure* f);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
365
a61af66fc99e Initial load
duke
parents:
diff changeset
366 // Iteration of oops
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 844
diff changeset
367 void oops_do_internal(OopClosure* f, CodeBlobClosure* cf, RegisterMap* map, bool use_interpreter_oop_map_cache);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
368 void oops_entry_do(OopClosure* f, const RegisterMap* map);
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 844
diff changeset
369 void oops_code_blob_do(OopClosure* f, CodeBlobClosure* cf, const RegisterMap* map);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
370 int adjust_offset(methodOop method, int index); // helper for above fn
a61af66fc99e Initial load
duke
parents:
diff changeset
371 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
372 // Memory management
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 844
diff changeset
373 void oops_do(OopClosure* f, CodeBlobClosure* cf, RegisterMap* map) { oops_do_internal(f, cf, map, true); }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 844
diff changeset
374 void nmethods_do(CodeBlobClosure* cf);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
375
a61af66fc99e Initial load
duke
parents:
diff changeset
376 void gc_prologue();
a61af66fc99e Initial load
duke
parents:
diff changeset
377 void gc_epilogue();
a61af66fc99e Initial load
duke
parents:
diff changeset
378 void pd_gc_epilog();
a61af66fc99e Initial load
duke
parents:
diff changeset
379
a61af66fc99e Initial load
duke
parents:
diff changeset
380 # ifdef ENABLE_ZAP_DEAD_LOCALS
a61af66fc99e Initial load
duke
parents:
diff changeset
381 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
382 class CheckValueClosure: public OopClosure {
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 107
diff changeset
383 public:
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 107
diff changeset
384 void do_oop(oop* p);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 107
diff changeset
385 void do_oop(narrowOop* p) { ShouldNotReachHere(); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
386 };
a61af66fc99e Initial load
duke
parents:
diff changeset
387 static CheckValueClosure _check_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
388
a61af66fc99e Initial load
duke
parents:
diff changeset
389 class CheckOopClosure: public OopClosure {
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 107
diff changeset
390 public:
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 107
diff changeset
391 void do_oop(oop* p);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 107
diff changeset
392 void do_oop(narrowOop* p) { ShouldNotReachHere(); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
393 };
a61af66fc99e Initial load
duke
parents:
diff changeset
394 static CheckOopClosure _check_oop;
a61af66fc99e Initial load
duke
parents:
diff changeset
395
a61af66fc99e Initial load
duke
parents:
diff changeset
396 static void check_derived_oop(oop* base, oop* derived);
a61af66fc99e Initial load
duke
parents:
diff changeset
397
a61af66fc99e Initial load
duke
parents:
diff changeset
398 class ZapDeadClosure: public OopClosure {
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 107
diff changeset
399 public:
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 107
diff changeset
400 void do_oop(oop* p);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 107
diff changeset
401 void do_oop(narrowOop* p) { ShouldNotReachHere(); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
402 };
a61af66fc99e Initial load
duke
parents:
diff changeset
403 static ZapDeadClosure _zap_dead;
a61af66fc99e Initial load
duke
parents:
diff changeset
404
a61af66fc99e Initial load
duke
parents:
diff changeset
405 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
406 // Zapping
a61af66fc99e Initial load
duke
parents:
diff changeset
407 void zap_dead_locals (JavaThread* thread, const RegisterMap* map);
a61af66fc99e Initial load
duke
parents:
diff changeset
408 void zap_dead_interpreted_locals(JavaThread* thread, const RegisterMap* map);
a61af66fc99e Initial load
duke
parents:
diff changeset
409 void zap_dead_compiled_locals (JavaThread* thread, const RegisterMap* map);
a61af66fc99e Initial load
duke
parents:
diff changeset
410 void zap_dead_entry_locals (JavaThread* thread, const RegisterMap* map);
a61af66fc99e Initial load
duke
parents:
diff changeset
411 void zap_dead_deoptimized_locals(JavaThread* thread, const RegisterMap* map);
a61af66fc99e Initial load
duke
parents:
diff changeset
412 # endif
a61af66fc99e Initial load
duke
parents:
diff changeset
413 // Verification
a61af66fc99e Initial load
duke
parents:
diff changeset
414 void verify(const RegisterMap* map);
a61af66fc99e Initial load
duke
parents:
diff changeset
415 static bool verify_return_pc(address x);
a61af66fc99e Initial load
duke
parents:
diff changeset
416 static bool is_bci(intptr_t bcx);
a61af66fc99e Initial load
duke
parents:
diff changeset
417 // Usage:
a61af66fc99e Initial load
duke
parents:
diff changeset
418 // assert(frame::verify_return_pc(return_address), "must be a return pc");
a61af66fc99e Initial load
duke
parents:
diff changeset
419
a61af66fc99e Initial load
duke
parents:
diff changeset
420 int pd_oop_map_offset_adjustment() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
421
a61af66fc99e Initial load
duke
parents:
diff changeset
422 # include "incls/_frame_pd.hpp.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
423 };
a61af66fc99e Initial load
duke
parents:
diff changeset
424
a61af66fc99e Initial load
duke
parents:
diff changeset
425
a61af66fc99e Initial load
duke
parents:
diff changeset
426 //
a61af66fc99e Initial load
duke
parents:
diff changeset
427 // StackFrameStream iterates through the frames of a thread starting from
a61af66fc99e Initial load
duke
parents:
diff changeset
428 // top most frame. It automatically takes care of updating the location of
a61af66fc99e Initial load
duke
parents:
diff changeset
429 // all (callee-saved) registers. Notice: If a thread is stopped at
a61af66fc99e Initial load
duke
parents:
diff changeset
430 // a safepoint, all registers are saved, not only the callee-saved ones.
a61af66fc99e Initial load
duke
parents:
diff changeset
431 //
a61af66fc99e Initial load
duke
parents:
diff changeset
432 // Use:
a61af66fc99e Initial load
duke
parents:
diff changeset
433 //
a61af66fc99e Initial load
duke
parents:
diff changeset
434 // for(StackFrameStream fst(thread); !fst.is_done(); fst.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
435 // ...
a61af66fc99e Initial load
duke
parents:
diff changeset
436 // }
a61af66fc99e Initial load
duke
parents:
diff changeset
437 //
a61af66fc99e Initial load
duke
parents:
diff changeset
438 class StackFrameStream : public StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
439 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
440 frame _fr;
a61af66fc99e Initial load
duke
parents:
diff changeset
441 RegisterMap _reg_map;
a61af66fc99e Initial load
duke
parents:
diff changeset
442 bool _is_done;
a61af66fc99e Initial load
duke
parents:
diff changeset
443 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
444 StackFrameStream(JavaThread *thread, bool update = true);
a61af66fc99e Initial load
duke
parents:
diff changeset
445
a61af66fc99e Initial load
duke
parents:
diff changeset
446 // Iteration
a61af66fc99e Initial load
duke
parents:
diff changeset
447 bool is_done() { return (_is_done) ? true : (_is_done = _fr.is_first_frame(), false); }
a61af66fc99e Initial load
duke
parents:
diff changeset
448 void next() { if (!_is_done) _fr = _fr.sender(&_reg_map); }
a61af66fc99e Initial load
duke
parents:
diff changeset
449
a61af66fc99e Initial load
duke
parents:
diff changeset
450 // Query
a61af66fc99e Initial load
duke
parents:
diff changeset
451 frame *current() { return &_fr; }
a61af66fc99e Initial load
duke
parents:
diff changeset
452 RegisterMap* register_map() { return &_reg_map; }
a61af66fc99e Initial load
duke
parents:
diff changeset
453 };