annotate src/cpu/x86/vm/frame_x86.inline.hpp @ 17716:cdb71841f4bc

6498581: ThreadInterruptTest3 produces wrong output on Windows Summary: There is race condition between os::interrupt and os::is_interrupted on Windows. In JVM_Sleep(Thread.sleep), check if thread gets interrupted, it may see interrupted but not really interrupted so cause spurious waking up (early return from sleep). Fix by checking if interrupt event really gets set thus prevent false return. For intrinsic of _isInterrupted, on Windows, go fastpath only on bit not set. Reviewed-by: acorn, kvn Contributed-by: david.holmes@oracle.com, yumin.qi@oracle.com
author minqi
date Wed, 26 Feb 2014 15:20:41 -0800
parents 55fb97c4c58d
children 78112be27ba0
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: 11146
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: 1255
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1255
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: 1255
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: 1748
diff changeset
25 #ifndef CPU_X86_VM_FRAME_X86_INLINE_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1748
diff changeset
26 #define CPU_X86_VM_FRAME_X86_INLINE_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1748
diff changeset
27
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents: 6725
diff changeset
28 #include "code/codeCache.hpp"
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents: 6725
diff changeset
29
0
a61af66fc99e Initial load
duke
parents:
diff changeset
30 // Inline functions for Intel frames:
a61af66fc99e Initial load
duke
parents:
diff changeset
31
a61af66fc99e Initial load
duke
parents:
diff changeset
32 // Constructors:
a61af66fc99e Initial load
duke
parents:
diff changeset
33
a61af66fc99e Initial load
duke
parents:
diff changeset
34 inline frame::frame() {
a61af66fc99e Initial load
duke
parents:
diff changeset
35 _pc = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
36 _sp = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
37 _unextended_sp = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
38 _fp = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
39 _cb = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
40 _deopt_state = unknown;
a61af66fc99e Initial load
duke
parents:
diff changeset
41 }
a61af66fc99e Initial load
duke
parents:
diff changeset
42
1204
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1201
diff changeset
43 inline frame::frame(intptr_t* sp, intptr_t* fp, address pc) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
44 _sp = sp;
a61af66fc99e Initial load
duke
parents:
diff changeset
45 _unextended_sp = sp;
a61af66fc99e Initial load
duke
parents:
diff changeset
46 _fp = fp;
a61af66fc99e Initial load
duke
parents:
diff changeset
47 _pc = pc;
a61af66fc99e Initial load
duke
parents:
diff changeset
48 assert(pc != NULL, "no pc?");
a61af66fc99e Initial load
duke
parents:
diff changeset
49 _cb = CodeCache::find_blob(pc);
3755
5cf771a79037 7047697: MethodHandle.invokeExact call for wrong method causes VM failure if run with -Xcomp
jrose
parents: 3363
diff changeset
50 adjust_unextended_sp();
1204
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1201
diff changeset
51
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1201
diff changeset
52 address original_pc = nmethod::get_deopt_original_pc(this);
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1201
diff changeset
53 if (original_pc != NULL) {
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1201
diff changeset
54 _pc = original_pc;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
55 _deopt_state = is_deoptimized;
a61af66fc99e Initial load
duke
parents:
diff changeset
56 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
57 _deopt_state = not_deoptimized;
a61af66fc99e Initial load
duke
parents:
diff changeset
58 }
a61af66fc99e Initial load
duke
parents:
diff changeset
59 }
a61af66fc99e Initial load
duke
parents:
diff changeset
60
1204
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1201
diff changeset
61 inline frame::frame(intptr_t* sp, intptr_t* unextended_sp, intptr_t* fp, address pc) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
62 _sp = sp;
a61af66fc99e Initial load
duke
parents:
diff changeset
63 _unextended_sp = unextended_sp;
a61af66fc99e Initial load
duke
parents:
diff changeset
64 _fp = fp;
a61af66fc99e Initial load
duke
parents:
diff changeset
65 _pc = pc;
a61af66fc99e Initial load
duke
parents:
diff changeset
66 assert(pc != NULL, "no pc?");
a61af66fc99e Initial load
duke
parents:
diff changeset
67 _cb = CodeCache::find_blob(pc);
3363
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 1972
diff changeset
68 adjust_unextended_sp();
1204
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1201
diff changeset
69
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1201
diff changeset
70 address original_pc = nmethod::get_deopt_original_pc(this);
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1201
diff changeset
71 if (original_pc != NULL) {
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1201
diff changeset
72 _pc = original_pc;
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1552
diff changeset
73 assert(((nmethod*)_cb)->insts_contains(_pc), "original PC must be in nmethod");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
74 _deopt_state = is_deoptimized;
a61af66fc99e Initial load
duke
parents:
diff changeset
75 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
76 _deopt_state = not_deoptimized;
a61af66fc99e Initial load
duke
parents:
diff changeset
77 }
a61af66fc99e Initial load
duke
parents:
diff changeset
78 }
a61af66fc99e Initial load
duke
parents:
diff changeset
79
a61af66fc99e Initial load
duke
parents:
diff changeset
80 inline frame::frame(intptr_t* sp, intptr_t* fp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
81 _sp = sp;
a61af66fc99e Initial load
duke
parents:
diff changeset
82 _unextended_sp = sp;
a61af66fc99e Initial load
duke
parents:
diff changeset
83 _fp = fp;
a61af66fc99e Initial load
duke
parents:
diff changeset
84 _pc = (address)(sp[-1]);
107
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
85
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
86 // Here's a sticky one. This constructor can be called via AsyncGetCallTrace
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
87 // when last_Java_sp is non-null but the pc fetched is junk. If we are truly
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
88 // unlucky the junk value could be to a zombied method and we'll die on the
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
89 // find_blob call. This is also why we can have no asserts on the validity
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
90 // of the pc we find here. AsyncGetCallTrace -> pd_get_top_frame_for_signal_handler
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
91 // -> pd_last_frame should use a specialized version of pd_last_frame which could
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
92 // call a specilaized frame constructor instead of this one.
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
93 // Then we could use the assert below. However this assert is of somewhat dubious
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
94 // value.
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
95 // assert(_pc != NULL, "no pc?");
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
96
0
a61af66fc99e Initial load
duke
parents:
diff changeset
97 _cb = CodeCache::find_blob(_pc);
3755
5cf771a79037 7047697: MethodHandle.invokeExact call for wrong method causes VM failure if run with -Xcomp
jrose
parents: 3363
diff changeset
98 adjust_unextended_sp();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
99
1204
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1201
diff changeset
100 address original_pc = nmethod::get_deopt_original_pc(this);
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1201
diff changeset
101 if (original_pc != NULL) {
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1201
diff changeset
102 _pc = original_pc;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
103 _deopt_state = is_deoptimized;
a61af66fc99e Initial load
duke
parents:
diff changeset
104 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
105 _deopt_state = not_deoptimized;
a61af66fc99e Initial load
duke
parents:
diff changeset
106 }
a61af66fc99e Initial load
duke
parents:
diff changeset
107 }
a61af66fc99e Initial load
duke
parents:
diff changeset
108
a61af66fc99e Initial load
duke
parents:
diff changeset
109 // Accessors
a61af66fc99e Initial load
duke
parents:
diff changeset
110
a61af66fc99e Initial load
duke
parents:
diff changeset
111 inline bool frame::equal(frame other) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
112 bool ret = sp() == other.sp()
a61af66fc99e Initial load
duke
parents:
diff changeset
113 && unextended_sp() == other.unextended_sp()
a61af66fc99e Initial load
duke
parents:
diff changeset
114 && fp() == other.fp()
a61af66fc99e Initial load
duke
parents:
diff changeset
115 && pc() == other.pc();
a61af66fc99e Initial load
duke
parents:
diff changeset
116 assert(!ret || ret && cb() == other.cb() && _deopt_state == other._deopt_state, "inconsistent construction");
a61af66fc99e Initial load
duke
parents:
diff changeset
117 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
118 }
a61af66fc99e Initial load
duke
parents:
diff changeset
119
a61af66fc99e Initial load
duke
parents:
diff changeset
120 // Return unique id for this frame. The id must have a value where we can distinguish
a61af66fc99e Initial load
duke
parents:
diff changeset
121 // identity and younger/older relationship. NULL represents an invalid (incomparable)
a61af66fc99e Initial load
duke
parents:
diff changeset
122 // frame.
a61af66fc99e Initial load
duke
parents:
diff changeset
123 inline intptr_t* frame::id(void) const { return unextended_sp(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
124
a61af66fc99e Initial load
duke
parents:
diff changeset
125 // Relationals on frames based
a61af66fc99e Initial load
duke
parents:
diff changeset
126 // Return true if the frame is younger (more recent activation) than the frame represented by id
a61af66fc99e Initial load
duke
parents:
diff changeset
127 inline bool frame::is_younger(intptr_t* id) const { assert(this->id() != NULL && id != NULL, "NULL frame id");
a61af66fc99e Initial load
duke
parents:
diff changeset
128 return this->id() < id ; }
a61af66fc99e Initial load
duke
parents:
diff changeset
129
a61af66fc99e Initial load
duke
parents:
diff changeset
130 // Return true if the frame is older (less recent activation) than the frame represented by id
a61af66fc99e Initial load
duke
parents:
diff changeset
131 inline bool frame::is_older(intptr_t* id) const { assert(this->id() != NULL && id != NULL, "NULL frame id");
a61af66fc99e Initial load
duke
parents:
diff changeset
132 return this->id() > id ; }
a61af66fc99e Initial load
duke
parents:
diff changeset
133
a61af66fc99e Initial load
duke
parents:
diff changeset
134
a61af66fc99e Initial load
duke
parents:
diff changeset
135
a61af66fc99e Initial load
duke
parents:
diff changeset
136 inline intptr_t* frame::link() const { return (intptr_t*) *(intptr_t **)addr_at(link_offset); }
a61af66fc99e Initial load
duke
parents:
diff changeset
137 inline void frame::set_link(intptr_t* addr) { *(intptr_t **)addr_at(link_offset) = addr; }
a61af66fc99e Initial load
duke
parents:
diff changeset
138
a61af66fc99e Initial load
duke
parents:
diff changeset
139
a61af66fc99e Initial load
duke
parents:
diff changeset
140 inline intptr_t* frame::unextended_sp() const { return _unextended_sp; }
a61af66fc99e Initial load
duke
parents:
diff changeset
141
a61af66fc99e Initial load
duke
parents:
diff changeset
142 // Return address:
a61af66fc99e Initial load
duke
parents:
diff changeset
143
a61af66fc99e Initial load
duke
parents:
diff changeset
144 inline address* frame::sender_pc_addr() const { return (address*) addr_at( return_addr_offset); }
a61af66fc99e Initial load
duke
parents:
diff changeset
145 inline address frame::sender_pc() const { return *sender_pc_addr(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
146
a61af66fc99e Initial load
duke
parents:
diff changeset
147 // return address of param, zero origin index.
a61af66fc99e Initial load
duke
parents:
diff changeset
148 inline address* frame::native_param_addr(int idx) const { return (address*) addr_at( native_frame_initial_param_offset+idx); }
a61af66fc99e Initial load
duke
parents:
diff changeset
149
a61af66fc99e Initial load
duke
parents:
diff changeset
150 #ifdef CC_INTERP
a61af66fc99e Initial load
duke
parents:
diff changeset
151
a61af66fc99e Initial load
duke
parents:
diff changeset
152 inline interpreterState frame::get_interpreterState() const {
520
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 304
diff changeset
153 return ((interpreterState)addr_at( -((int)sizeof(BytecodeInterpreter))/wordSize ));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
154 }
a61af66fc99e Initial load
duke
parents:
diff changeset
155
a61af66fc99e Initial load
duke
parents:
diff changeset
156 inline intptr_t* frame::sender_sp() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
157 // Hmm this seems awfully expensive QQQ, is this really called with interpreted frames?
a61af66fc99e Initial load
duke
parents:
diff changeset
158 if (is_interpreted_frame()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
159 assert(false, "should never happen");
a61af66fc99e Initial load
duke
parents:
diff changeset
160 return get_interpreterState()->sender_sp();
a61af66fc99e Initial load
duke
parents:
diff changeset
161 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
162 return addr_at(sender_sp_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
163 }
a61af66fc99e Initial load
duke
parents:
diff changeset
164 }
a61af66fc99e Initial load
duke
parents:
diff changeset
165
a61af66fc99e Initial load
duke
parents:
diff changeset
166 inline intptr_t** frame::interpreter_frame_locals_addr() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
167 assert(is_interpreted_frame(), "must be interpreted");
a61af66fc99e Initial load
duke
parents:
diff changeset
168 return &(get_interpreterState()->_locals);
a61af66fc99e Initial load
duke
parents:
diff changeset
169 }
a61af66fc99e Initial load
duke
parents:
diff changeset
170
a61af66fc99e Initial load
duke
parents:
diff changeset
171 inline intptr_t* frame::interpreter_frame_bcx_addr() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
172 assert(is_interpreted_frame(), "must be interpreted");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
173 return (intptr_t*) &(get_interpreterState()->_bcp);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
174 }
a61af66fc99e Initial load
duke
parents:
diff changeset
175
a61af66fc99e Initial load
duke
parents:
diff changeset
176
a61af66fc99e Initial load
duke
parents:
diff changeset
177 // Constant pool cache
a61af66fc99e Initial load
duke
parents:
diff changeset
178
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 3755
diff changeset
179 inline ConstantPoolCache** frame::interpreter_frame_cache_addr() const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
180 assert(is_interpreted_frame(), "must be interpreted");
a61af66fc99e Initial load
duke
parents:
diff changeset
181 return &(get_interpreterState()->_constants);
a61af66fc99e Initial load
duke
parents:
diff changeset
182 }
a61af66fc99e Initial load
duke
parents:
diff changeset
183
a61af66fc99e Initial load
duke
parents:
diff changeset
184 // Method
a61af66fc99e Initial load
duke
parents:
diff changeset
185
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 3755
diff changeset
186 inline Method** frame::interpreter_frame_method_addr() const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
187 assert(is_interpreted_frame(), "must be interpreted");
a61af66fc99e Initial load
duke
parents:
diff changeset
188 return &(get_interpreterState()->_method);
a61af66fc99e Initial load
duke
parents:
diff changeset
189 }
a61af66fc99e Initial load
duke
parents:
diff changeset
190
a61af66fc99e Initial load
duke
parents:
diff changeset
191 inline intptr_t* frame::interpreter_frame_mdx_addr() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
192 assert(is_interpreted_frame(), "must be interpreted");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
193 return (intptr_t*) &(get_interpreterState()->_mdx);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
194 }
a61af66fc99e Initial load
duke
parents:
diff changeset
195
a61af66fc99e Initial load
duke
parents:
diff changeset
196 // top of expression stack
a61af66fc99e Initial load
duke
parents:
diff changeset
197 inline intptr_t* frame::interpreter_frame_tos_address() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
198 assert(is_interpreted_frame(), "wrong frame type");
a61af66fc99e Initial load
duke
parents:
diff changeset
199 return get_interpreterState()->_stack + 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
200 }
a61af66fc99e Initial load
duke
parents:
diff changeset
201
a61af66fc99e Initial load
duke
parents:
diff changeset
202 #else /* asm interpreter */
a61af66fc99e Initial load
duke
parents:
diff changeset
203 inline intptr_t* frame::sender_sp() const { return addr_at( sender_sp_offset); }
a61af66fc99e Initial load
duke
parents:
diff changeset
204
a61af66fc99e Initial load
duke
parents:
diff changeset
205 inline intptr_t** frame::interpreter_frame_locals_addr() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
206 return (intptr_t**)addr_at(interpreter_frame_locals_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
207 }
a61af66fc99e Initial load
duke
parents:
diff changeset
208
a61af66fc99e Initial load
duke
parents:
diff changeset
209 inline intptr_t* frame::interpreter_frame_last_sp() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
210 return *(intptr_t**)addr_at(interpreter_frame_last_sp_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
211 }
a61af66fc99e Initial load
duke
parents:
diff changeset
212
a61af66fc99e Initial load
duke
parents:
diff changeset
213 inline intptr_t* frame::interpreter_frame_bcx_addr() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
214 return (intptr_t*)addr_at(interpreter_frame_bcx_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
215 }
a61af66fc99e Initial load
duke
parents:
diff changeset
216
a61af66fc99e Initial load
duke
parents:
diff changeset
217
a61af66fc99e Initial load
duke
parents:
diff changeset
218 inline intptr_t* frame::interpreter_frame_mdx_addr() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
219 return (intptr_t*)addr_at(interpreter_frame_mdx_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
220 }
a61af66fc99e Initial load
duke
parents:
diff changeset
221
a61af66fc99e Initial load
duke
parents:
diff changeset
222
a61af66fc99e Initial load
duke
parents:
diff changeset
223
a61af66fc99e Initial load
duke
parents:
diff changeset
224 // Constant pool cache
a61af66fc99e Initial load
duke
parents:
diff changeset
225
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 3755
diff changeset
226 inline ConstantPoolCache** frame::interpreter_frame_cache_addr() const {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 3755
diff changeset
227 return (ConstantPoolCache**)addr_at(interpreter_frame_cache_offset);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
228 }
a61af66fc99e Initial load
duke
parents:
diff changeset
229
a61af66fc99e Initial load
duke
parents:
diff changeset
230 // Method
a61af66fc99e Initial load
duke
parents:
diff changeset
231
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 3755
diff changeset
232 inline Method** frame::interpreter_frame_method_addr() const {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 3755
diff changeset
233 return (Method**)addr_at(interpreter_frame_method_offset);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
234 }
a61af66fc99e Initial load
duke
parents:
diff changeset
235
a61af66fc99e Initial load
duke
parents:
diff changeset
236 // top of expression stack
a61af66fc99e Initial load
duke
parents:
diff changeset
237 inline intptr_t* frame::interpreter_frame_tos_address() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
238 intptr_t* last_sp = interpreter_frame_last_sp();
1137
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 579
diff changeset
239 if (last_sp == NULL) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
240 return sp();
a61af66fc99e Initial load
duke
parents:
diff changeset
241 } else {
1137
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 579
diff changeset
242 // sp() may have been extended or shrunk by an adapter. At least
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 579
diff changeset
243 // check that we don't fall behind the legal region.
1255
e3a4305c6bc3 6925249: assert(last_sp < (intptr_t*) interpreter_frame_monitor_begin(),"bad tos")
kvn
parents: 1204
diff changeset
244 // For top deoptimized frame last_sp == interpreter_frame_monitor_end.
e3a4305c6bc3 6925249: assert(last_sp < (intptr_t*) interpreter_frame_monitor_begin(),"bad tos")
kvn
parents: 1204
diff changeset
245 assert(last_sp <= (intptr_t*) interpreter_frame_monitor_end(), "bad tos");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
246 return last_sp;
a61af66fc99e Initial load
duke
parents:
diff changeset
247 }
a61af66fc99e Initial load
duke
parents:
diff changeset
248 }
a61af66fc99e Initial load
duke
parents:
diff changeset
249
a61af66fc99e Initial load
duke
parents:
diff changeset
250 #endif /* CC_INTERP */
a61af66fc99e Initial load
duke
parents:
diff changeset
251
a61af66fc99e Initial load
duke
parents:
diff changeset
252 inline int frame::pd_oop_map_offset_adjustment() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
253 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
254 }
a61af66fc99e Initial load
duke
parents:
diff changeset
255
a61af66fc99e Initial load
duke
parents:
diff changeset
256 inline int frame::interpreter_frame_monitor_size() {
a61af66fc99e Initial load
duke
parents:
diff changeset
257 return BasicObjectLock::size();
a61af66fc99e Initial load
duke
parents:
diff changeset
258 }
a61af66fc99e Initial load
duke
parents:
diff changeset
259
a61af66fc99e Initial load
duke
parents:
diff changeset
260
a61af66fc99e Initial load
duke
parents:
diff changeset
261 // expression stack
a61af66fc99e Initial load
duke
parents:
diff changeset
262 // (the max_stack arguments are used by the GC; see class FrameClosure)
a61af66fc99e Initial load
duke
parents:
diff changeset
263
a61af66fc99e Initial load
duke
parents:
diff changeset
264 inline intptr_t* frame::interpreter_frame_expression_stack() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
265 intptr_t* monitor_end = (intptr_t*) interpreter_frame_monitor_end();
a61af66fc99e Initial load
duke
parents:
diff changeset
266 return monitor_end-1;
a61af66fc99e Initial load
duke
parents:
diff changeset
267 }
a61af66fc99e Initial load
duke
parents:
diff changeset
268
a61af66fc99e Initial load
duke
parents:
diff changeset
269
a61af66fc99e Initial load
duke
parents:
diff changeset
270 inline jint frame::interpreter_frame_expression_stack_direction() { return -1; }
a61af66fc99e Initial load
duke
parents:
diff changeset
271
a61af66fc99e Initial load
duke
parents:
diff changeset
272
a61af66fc99e Initial load
duke
parents:
diff changeset
273 // Entry frames
a61af66fc99e Initial load
duke
parents:
diff changeset
274
11146
e619a2766bcc 8016131: nsk/sysdict/vm/stress/chain tests crash the VM in 'entry_frame_is_first()'
rbackman
parents: 8762
diff changeset
275 inline JavaCallWrapper** frame::entry_frame_call_wrapper_addr() const {
e619a2766bcc 8016131: nsk/sysdict/vm/stress/chain tests crash the VM in 'entry_frame_is_first()'
rbackman
parents: 8762
diff changeset
276 return (JavaCallWrapper**)addr_at(entry_frame_call_wrapper_offset);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
277 }
a61af66fc99e Initial load
duke
parents:
diff changeset
278
a61af66fc99e Initial load
duke
parents:
diff changeset
279 // Compiled frames
a61af66fc99e Initial load
duke
parents:
diff changeset
280
a61af66fc99e Initial load
duke
parents:
diff changeset
281 inline int frame::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
282 return (nof_args - local_index + (local_index < nof_args ? 1: -1));
a61af66fc99e Initial load
duke
parents:
diff changeset
283 }
a61af66fc99e Initial load
duke
parents:
diff changeset
284
a61af66fc99e Initial load
duke
parents:
diff changeset
285 inline int frame::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
286 return local_offset_for_compiler(local_index, nof_args, max_nof_locals, max_nof_monitors);
a61af66fc99e Initial load
duke
parents:
diff changeset
287 }
a61af66fc99e Initial load
duke
parents:
diff changeset
288
a61af66fc99e Initial load
duke
parents:
diff changeset
289 inline int frame::min_local_offset_for_compiler(int nof_args, int max_nof_locals, int max_nof_monitors) {
a61af66fc99e Initial load
duke
parents:
diff changeset
290 return (nof_args - (max_nof_locals + max_nof_monitors*2) - 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
291 }
a61af66fc99e Initial load
duke
parents:
diff changeset
292
a61af66fc99e Initial load
duke
parents:
diff changeset
293 inline bool frame::volatile_across_calls(Register reg) {
a61af66fc99e Initial load
duke
parents:
diff changeset
294 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
295 }
a61af66fc99e Initial load
duke
parents:
diff changeset
296
8762
0a2deac0bbfb 8008328: [partfait] Null pointer defererence in hotspot/src/cpu/x86/vm/frame_x86.inline.hpp
morris
parents: 7199
diff changeset
297 inline oop frame::saved_oop_result(RegisterMap* map) const {
0a2deac0bbfb 8008328: [partfait] Null pointer defererence in hotspot/src/cpu/x86/vm/frame_x86.inline.hpp
morris
parents: 7199
diff changeset
298 oop* result_adr = (oop *)map->location(rax->as_VMReg());
0a2deac0bbfb 8008328: [partfait] Null pointer defererence in hotspot/src/cpu/x86/vm/frame_x86.inline.hpp
morris
parents: 7199
diff changeset
299 guarantee(result_adr != NULL, "bad register save location");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
300
8762
0a2deac0bbfb 8008328: [partfait] Null pointer defererence in hotspot/src/cpu/x86/vm/frame_x86.inline.hpp
morris
parents: 7199
diff changeset
301 return (*result_adr);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
302 }
a61af66fc99e Initial load
duke
parents:
diff changeset
303
a61af66fc99e Initial load
duke
parents:
diff changeset
304 inline void frame::set_saved_oop_result(RegisterMap* map, oop obj) {
8762
0a2deac0bbfb 8008328: [partfait] Null pointer defererence in hotspot/src/cpu/x86/vm/frame_x86.inline.hpp
morris
parents: 7199
diff changeset
305 oop* result_adr = (oop *)map->location(rax->as_VMReg());
0a2deac0bbfb 8008328: [partfait] Null pointer defererence in hotspot/src/cpu/x86/vm/frame_x86.inline.hpp
morris
parents: 7199
diff changeset
306 guarantee(result_adr != NULL, "bad register save location");
0a2deac0bbfb 8008328: [partfait] Null pointer defererence in hotspot/src/cpu/x86/vm/frame_x86.inline.hpp
morris
parents: 7199
diff changeset
307
0a2deac0bbfb 8008328: [partfait] Null pointer defererence in hotspot/src/cpu/x86/vm/frame_x86.inline.hpp
morris
parents: 7199
diff changeset
308 *result_adr = obj;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
309 }
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1748
diff changeset
310
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1748
diff changeset
311 #endif // CPU_X86_VM_FRAME_X86_INLINE_HPP