annotate src/cpu/x86/vm/frame_x86.hpp @ 17467:55fb97c4c58d hs25-b65

8029233: Update copyright year to match last edit in jdk8 hotspot repository for 2013 Summary: Copyright year updated for files modified during 2013 Reviewed-by: twisti, iveresov
author mikael
date Tue, 24 Dec 2013 11:48:39 -0800
parents 47bc9800972c
children d8041d695d19
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
17467
55fb97c4c58d 8029233: Update copyright year to match last edit in jdk8 hotspot repository for 2013
mikael
parents: 8721
diff changeset
2 * Copyright (c) 1997, 2013, 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: 1204
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1204
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: 1204
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 CPU_X86_VM_FRAME_X86_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
26 #define CPU_X86_VM_FRAME_X86_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 "runtime/synchronizer.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
29 #include "utilities/top.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
30
0
a61af66fc99e Initial load
duke
parents:
diff changeset
31 // A frame represents a physical stack frame (an activation). Frames can be
a61af66fc99e Initial load
duke
parents:
diff changeset
32 // C or Java frames, and the Java frames can be interpreted or compiled.
a61af66fc99e Initial load
duke
parents:
diff changeset
33 // In contrast, vframes represent source-level activations, so that one physical frame
a61af66fc99e Initial load
duke
parents:
diff changeset
34 // can correspond to multiple source level frames because of inlining.
a61af66fc99e Initial load
duke
parents:
diff changeset
35 // A frame is comprised of {pc, fp, sp}
a61af66fc99e Initial load
duke
parents:
diff changeset
36 // ------------------------------ Asm interpreter ----------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
37 // Layout of asm interpreter frame:
a61af66fc99e Initial load
duke
parents:
diff changeset
38 // [expression stack ] * <- sp
a61af66fc99e Initial load
duke
parents:
diff changeset
39 // [monitors ] \
a61af66fc99e Initial load
duke
parents:
diff changeset
40 // ... | monitor block size
a61af66fc99e Initial load
duke
parents:
diff changeset
41 // [monitors ] /
a61af66fc99e Initial load
duke
parents:
diff changeset
42 // [monitor block size ]
a61af66fc99e Initial load
duke
parents:
diff changeset
43 // [byte code index/pointr] = bcx() bcx_offset
a61af66fc99e Initial load
duke
parents:
diff changeset
44 // [pointer to locals ] = locals() locals_offset
a61af66fc99e Initial load
duke
parents:
diff changeset
45 // [constant pool cache ] = cache() cache_offset
a61af66fc99e Initial load
duke
parents:
diff changeset
46 // [methodData ] = mdp() mdx_offset
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 4806
diff changeset
47 // [Method* ] = method() method_offset
0
a61af66fc99e Initial load
duke
parents:
diff changeset
48 // [last sp ] = last_sp() last_sp_offset
a61af66fc99e Initial load
duke
parents:
diff changeset
49 // [old stack pointer ] (sender_sp) sender_sp_offset
a61af66fc99e Initial load
duke
parents:
diff changeset
50 // [old frame pointer ] <- fp = link()
a61af66fc99e Initial load
duke
parents:
diff changeset
51 // [return pc ]
a61af66fc99e Initial load
duke
parents:
diff changeset
52 // [oop temp ] (only for native calls)
a61af66fc99e Initial load
duke
parents:
diff changeset
53 // [locals and parameters ]
a61af66fc99e Initial load
duke
parents:
diff changeset
54 // <- sender sp
a61af66fc99e Initial load
duke
parents:
diff changeset
55 // ------------------------------ Asm interpreter ----------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
56
a61af66fc99e Initial load
duke
parents:
diff changeset
57 // ------------------------------ C++ interpreter ----------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
58 //
a61af66fc99e Initial load
duke
parents:
diff changeset
59 // Layout of C++ interpreter frame: (While executing in BytecodeInterpreter::run)
a61af66fc99e Initial load
duke
parents:
diff changeset
60 //
a61af66fc99e Initial load
duke
parents:
diff changeset
61 // <- SP (current esp/rsp)
a61af66fc99e Initial load
duke
parents:
diff changeset
62 // [local variables ] BytecodeInterpreter::run local variables
a61af66fc99e Initial load
duke
parents:
diff changeset
63 // ... BytecodeInterpreter::run local variables
a61af66fc99e Initial load
duke
parents:
diff changeset
64 // [local variables ] BytecodeInterpreter::run local variables
a61af66fc99e Initial load
duke
parents:
diff changeset
65 // [old frame pointer ] fp [ BytecodeInterpreter::run's ebp/rbp ]
a61af66fc99e Initial load
duke
parents:
diff changeset
66 // [return pc ] (return to frame manager)
a61af66fc99e Initial load
duke
parents:
diff changeset
67 // [interpreter_state* ] (arg to BytecodeInterpreter::run) --------------
a61af66fc99e Initial load
duke
parents:
diff changeset
68 // [expression stack ] <- last_Java_sp |
a61af66fc99e Initial load
duke
parents:
diff changeset
69 // [... ] * <- interpreter_state.stack |
a61af66fc99e Initial load
duke
parents:
diff changeset
70 // [expression stack ] * <- interpreter_state.stack_base |
a61af66fc99e Initial load
duke
parents:
diff changeset
71 // [monitors ] \ |
a61af66fc99e Initial load
duke
parents:
diff changeset
72 // ... | monitor block size |
a61af66fc99e Initial load
duke
parents:
diff changeset
73 // [monitors ] / <- interpreter_state.monitor_base |
a61af66fc99e Initial load
duke
parents:
diff changeset
74 // [struct interpretState ] <-----------------------------------------|
a61af66fc99e Initial load
duke
parents:
diff changeset
75 // [return pc ] (return to callee of frame manager [1]
a61af66fc99e Initial load
duke
parents:
diff changeset
76 // [locals and parameters ]
a61af66fc99e Initial load
duke
parents:
diff changeset
77 // <- sender sp
a61af66fc99e Initial load
duke
parents:
diff changeset
78
a61af66fc99e Initial load
duke
parents:
diff changeset
79 // [1] When the c++ interpreter calls a new method it returns to the frame
a61af66fc99e Initial load
duke
parents:
diff changeset
80 // manager which allocates a new frame on the stack. In that case there
a61af66fc99e Initial load
duke
parents:
diff changeset
81 // is no real callee of this newly allocated frame. The frame manager is
a61af66fc99e Initial load
duke
parents:
diff changeset
82 // aware of the additional frame(s) and will pop them as nested calls
a61af66fc99e Initial load
duke
parents:
diff changeset
83 // complete. Howevers tTo make it look good in the debugger the frame
a61af66fc99e Initial load
duke
parents:
diff changeset
84 // manager actually installs a dummy pc pointing to RecursiveInterpreterActivation
a61af66fc99e Initial load
duke
parents:
diff changeset
85 // with a fake interpreter_state* parameter to make it easy to debug
a61af66fc99e Initial load
duke
parents:
diff changeset
86 // nested calls.
a61af66fc99e Initial load
duke
parents:
diff changeset
87
a61af66fc99e Initial load
duke
parents:
diff changeset
88 // Note that contrary to the layout for the assembly interpreter the
a61af66fc99e Initial load
duke
parents:
diff changeset
89 // expression stack allocated for the C++ interpreter is full sized.
a61af66fc99e Initial load
duke
parents:
diff changeset
90 // However this is not as bad as it seems as the interpreter frame_manager
a61af66fc99e Initial load
duke
parents:
diff changeset
91 // will truncate the unused space on succesive method calls.
a61af66fc99e Initial load
duke
parents:
diff changeset
92 //
a61af66fc99e Initial load
duke
parents:
diff changeset
93 // ------------------------------ C++ interpreter ----------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
94
a61af66fc99e Initial load
duke
parents:
diff changeset
95 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
96 enum {
a61af66fc99e Initial load
duke
parents:
diff changeset
97 pc_return_offset = 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
98 // All frames
a61af66fc99e Initial load
duke
parents:
diff changeset
99 link_offset = 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
100 return_addr_offset = 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
101 // non-interpreter frames
a61af66fc99e Initial load
duke
parents:
diff changeset
102 sender_sp_offset = 2,
a61af66fc99e Initial load
duke
parents:
diff changeset
103
a61af66fc99e Initial load
duke
parents:
diff changeset
104 #ifndef CC_INTERP
a61af66fc99e Initial load
duke
parents:
diff changeset
105
a61af66fc99e Initial load
duke
parents:
diff changeset
106 // Interpreter frames
a61af66fc99e Initial load
duke
parents:
diff changeset
107 interpreter_frame_result_handler_offset = 3, // for native calls only
a61af66fc99e Initial load
duke
parents:
diff changeset
108 interpreter_frame_oop_temp_offset = 2, // for native calls only
a61af66fc99e Initial load
duke
parents:
diff changeset
109
a61af66fc99e Initial load
duke
parents:
diff changeset
110 interpreter_frame_sender_sp_offset = -1,
a61af66fc99e Initial load
duke
parents:
diff changeset
111 // outgoing sp before a call to an invoked method
a61af66fc99e Initial load
duke
parents:
diff changeset
112 interpreter_frame_last_sp_offset = interpreter_frame_sender_sp_offset - 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
113 interpreter_frame_method_offset = interpreter_frame_last_sp_offset - 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
114 interpreter_frame_mdx_offset = interpreter_frame_method_offset - 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
115 interpreter_frame_cache_offset = interpreter_frame_mdx_offset - 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
116 interpreter_frame_locals_offset = interpreter_frame_cache_offset - 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
117 interpreter_frame_bcx_offset = interpreter_frame_locals_offset - 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
118 interpreter_frame_initial_sp_offset = interpreter_frame_bcx_offset - 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
119
a61af66fc99e Initial load
duke
parents:
diff changeset
120 interpreter_frame_monitor_block_top_offset = interpreter_frame_initial_sp_offset,
a61af66fc99e Initial load
duke
parents:
diff changeset
121 interpreter_frame_monitor_block_bottom_offset = interpreter_frame_initial_sp_offset,
a61af66fc99e Initial load
duke
parents:
diff changeset
122
a61af66fc99e Initial load
duke
parents:
diff changeset
123 #endif // CC_INTERP
a61af66fc99e Initial load
duke
parents:
diff changeset
124
a61af66fc99e Initial load
duke
parents:
diff changeset
125 // Entry frames
a61af66fc99e Initial load
duke
parents:
diff changeset
126 #ifdef AMD64
a61af66fc99e Initial load
duke
parents:
diff changeset
127 #ifdef _WIN64
2407
b1c22848507b 6741940: Nonvolatile XMM registers not preserved across JNI calls
iveresov
parents: 1972
diff changeset
128 entry_frame_after_call_words = 28,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
129 entry_frame_call_wrapper_offset = 2,
a61af66fc99e Initial load
duke
parents:
diff changeset
130
a61af66fc99e Initial load
duke
parents:
diff changeset
131 arg_reg_save_area_bytes = 32, // Register argument save area
a61af66fc99e Initial load
duke
parents:
diff changeset
132 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
133 entry_frame_after_call_words = 13,
a61af66fc99e Initial load
duke
parents:
diff changeset
134 entry_frame_call_wrapper_offset = -6,
a61af66fc99e Initial load
duke
parents:
diff changeset
135
a61af66fc99e Initial load
duke
parents:
diff changeset
136 arg_reg_save_area_bytes = 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
137 #endif // _WIN64
a61af66fc99e Initial load
duke
parents:
diff changeset
138 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
139 entry_frame_call_wrapper_offset = 2,
a61af66fc99e Initial load
duke
parents:
diff changeset
140 #endif // AMD64
a61af66fc99e Initial load
duke
parents:
diff changeset
141
a61af66fc99e Initial load
duke
parents:
diff changeset
142 // Native frames
a61af66fc99e Initial load
duke
parents:
diff changeset
143
a61af66fc99e Initial load
duke
parents:
diff changeset
144 native_frame_initial_param_offset = 2
a61af66fc99e Initial load
duke
parents:
diff changeset
145
a61af66fc99e Initial load
duke
parents:
diff changeset
146 };
a61af66fc99e Initial load
duke
parents:
diff changeset
147
a61af66fc99e Initial load
duke
parents:
diff changeset
148 intptr_t ptr_at(int offset) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
149 return *ptr_at_addr(offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
150 }
a61af66fc99e Initial load
duke
parents:
diff changeset
151
a61af66fc99e Initial load
duke
parents:
diff changeset
152 void ptr_at_put(int offset, intptr_t value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
153 *ptr_at_addr(offset) = value;
a61af66fc99e Initial load
duke
parents:
diff changeset
154 }
a61af66fc99e Initial load
duke
parents:
diff changeset
155
a61af66fc99e Initial load
duke
parents:
diff changeset
156 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
157 // an additional field beyond _sp and _pc:
a61af66fc99e Initial load
duke
parents:
diff changeset
158 intptr_t* _fp; // frame pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
159 // The interpreter and adapters will extend the frame of the caller.
a61af66fc99e Initial load
duke
parents:
diff changeset
160 // Since oopMaps are based on the sp of the caller before extension
a61af66fc99e Initial load
duke
parents:
diff changeset
161 // we need to know that value. However in order to compute the address
a61af66fc99e Initial load
duke
parents:
diff changeset
162 // of the return address we need the real "raw" sp. Since sparc already
a61af66fc99e Initial load
duke
parents:
diff changeset
163 // uses sp() to mean "raw" sp and unextended_sp() to mean the caller's
a61af66fc99e Initial load
duke
parents:
diff changeset
164 // original sp we use that convention.
a61af66fc99e Initial load
duke
parents:
diff changeset
165
a61af66fc99e Initial load
duke
parents:
diff changeset
166 intptr_t* _unextended_sp;
3363
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 2407
diff changeset
167 void adjust_unextended_sp();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
168
a61af66fc99e Initial load
duke
parents:
diff changeset
169 intptr_t* ptr_at_addr(int offset) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
170 return (intptr_t*) addr_at(offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
171 }
a61af66fc99e Initial load
duke
parents:
diff changeset
172
8721
47bc9800972c 8006498: #if <symbol> is wrong in the code.
jprovino
parents: 6725
diff changeset
173 #ifdef ASSERT
1204
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 0
diff changeset
174 // Used in frame::sender_for_{interpreter,compiled}_frame
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 0
diff changeset
175 static void verify_deopt_original_pc( nmethod* nm, intptr_t* unextended_sp, bool is_method_handle_return = false);
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 0
diff changeset
176 static void verify_deopt_mh_original_pc(nmethod* nm, intptr_t* unextended_sp) {
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 0
diff changeset
177 verify_deopt_original_pc(nm, unextended_sp, true);
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 0
diff changeset
178 }
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 0
diff changeset
179 #endif
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 0
diff changeset
180
0
a61af66fc99e Initial load
duke
parents:
diff changeset
181 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
182 // Constructors
a61af66fc99e Initial load
duke
parents:
diff changeset
183
a61af66fc99e Initial load
duke
parents:
diff changeset
184 frame(intptr_t* sp, intptr_t* fp, address pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
185
a61af66fc99e Initial load
duke
parents:
diff changeset
186 frame(intptr_t* sp, intptr_t* unextended_sp, intptr_t* fp, address pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
187
a61af66fc99e Initial load
duke
parents:
diff changeset
188 frame(intptr_t* sp, intptr_t* fp);
a61af66fc99e Initial load
duke
parents:
diff changeset
189
a61af66fc99e Initial load
duke
parents:
diff changeset
190 // accessors for the instance variables
4806
eaa9557116a2 7120448: Fix FP values for compiled frames in frame::describe
bdelsart
parents: 3363
diff changeset
191 // Note: not necessarily the real 'frame pointer' (see real_fp)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
192 intptr_t* fp() const { return _fp; }
a61af66fc99e Initial load
duke
parents:
diff changeset
193
a61af66fc99e Initial load
duke
parents:
diff changeset
194 inline address* sender_pc_addr() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
195
a61af66fc99e Initial load
duke
parents:
diff changeset
196 // return address of param, zero origin index.
a61af66fc99e Initial load
duke
parents:
diff changeset
197 inline address* native_param_addr(int idx) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
198
a61af66fc99e Initial load
duke
parents:
diff changeset
199 // expression stack tos if we are nested in a java call
a61af66fc99e Initial load
duke
parents:
diff changeset
200 intptr_t* interpreter_frame_last_sp() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
201
3363
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 2407
diff changeset
202 // helper to update a map with callee-saved RBP
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 2407
diff changeset
203 static void update_map_with_saved_link(RegisterMap* map, intptr_t** link_addr);
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 2407
diff changeset
204
0
a61af66fc99e Initial load
duke
parents:
diff changeset
205 #ifndef CC_INTERP
a61af66fc99e Initial load
duke
parents:
diff changeset
206 // deoptimization support
a61af66fc99e Initial load
duke
parents:
diff changeset
207 void interpreter_frame_set_last_sp(intptr_t* sp);
a61af66fc99e Initial load
duke
parents:
diff changeset
208 #endif // CC_INTERP
a61af66fc99e Initial load
duke
parents:
diff changeset
209
a61af66fc99e Initial load
duke
parents:
diff changeset
210 #ifdef CC_INTERP
a61af66fc99e Initial load
duke
parents:
diff changeset
211 inline interpreterState get_interpreterState() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
212 #endif // CC_INTERP
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
213
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
214 #endif // CPU_X86_VM_FRAME_X86_HPP