annotate agent/src/share/classes/sun/jvm/hotspot/runtime/x86/X86Frame.java @ 6725:da91efe96a93

6964458: Reimplement class meta-data storage to use native memory Summary: Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland Contributed-by: jmasa <jon.masamitsu@oracle.com>, stefank <stefan.karlsson@oracle.com>, mgerdin <mikael.gerdin@oracle.com>, never <tom.rodriguez@oracle.com>
author coleenp
date Sat, 01 Sep 2012 13:25:18 -0400
parents 1d7922586cf6
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2 * Copyright (c) 2001, 2012, 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: 0
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 0
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: 0
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 package sun.jvm.hotspot.runtime.x86;
a61af66fc99e Initial load
duke
parents:
diff changeset
26
a61af66fc99e Initial load
duke
parents:
diff changeset
27 import java.util.*;
a61af66fc99e Initial load
duke
parents:
diff changeset
28 import sun.jvm.hotspot.code.*;
a61af66fc99e Initial load
duke
parents:
diff changeset
29 import sun.jvm.hotspot.compiler.*;
a61af66fc99e Initial load
duke
parents:
diff changeset
30 import sun.jvm.hotspot.debugger.*;
a61af66fc99e Initial load
duke
parents:
diff changeset
31 import sun.jvm.hotspot.oops.*;
a61af66fc99e Initial load
duke
parents:
diff changeset
32 import sun.jvm.hotspot.runtime.*;
a61af66fc99e Initial load
duke
parents:
diff changeset
33 import sun.jvm.hotspot.types.*;
a61af66fc99e Initial load
duke
parents:
diff changeset
34 import sun.jvm.hotspot.utilities.*;
a61af66fc99e Initial load
duke
parents:
diff changeset
35
a61af66fc99e Initial load
duke
parents:
diff changeset
36 /** Specialization of and implementation of abstract methods of the
a61af66fc99e Initial load
duke
parents:
diff changeset
37 Frame class for the x86 family of CPUs. */
a61af66fc99e Initial load
duke
parents:
diff changeset
38
a61af66fc99e Initial load
duke
parents:
diff changeset
39 public class X86Frame extends Frame {
a61af66fc99e Initial load
duke
parents:
diff changeset
40 private static final boolean DEBUG;
a61af66fc99e Initial load
duke
parents:
diff changeset
41 static {
a61af66fc99e Initial load
duke
parents:
diff changeset
42 DEBUG = System.getProperty("sun.jvm.hotspot.runtime.x86.X86Frame.DEBUG") != null;
a61af66fc99e Initial load
duke
parents:
diff changeset
43 }
a61af66fc99e Initial load
duke
parents:
diff changeset
44
a61af66fc99e Initial load
duke
parents:
diff changeset
45 // All frames
a61af66fc99e Initial load
duke
parents:
diff changeset
46 private static final int LINK_OFFSET = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
47 private static final int RETURN_ADDR_OFFSET = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
48 private static final int SENDER_SP_OFFSET = 2;
a61af66fc99e Initial load
duke
parents:
diff changeset
49
a61af66fc99e Initial load
duke
parents:
diff changeset
50 // Interpreter frames
a61af66fc99e Initial load
duke
parents:
diff changeset
51 private static final int INTERPRETER_FRAME_MIRROR_OFFSET = 2; // for native calls only
a61af66fc99e Initial load
duke
parents:
diff changeset
52 private static final int INTERPRETER_FRAME_SENDER_SP_OFFSET = -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
53 private static final int INTERPRETER_FRAME_LAST_SP_OFFSET = INTERPRETER_FRAME_SENDER_SP_OFFSET - 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
54 private static final int INTERPRETER_FRAME_METHOD_OFFSET = INTERPRETER_FRAME_LAST_SP_OFFSET - 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
55 private static int INTERPRETER_FRAME_MDX_OFFSET; // Non-core builds only
a61af66fc99e Initial load
duke
parents:
diff changeset
56 private static int INTERPRETER_FRAME_CACHE_OFFSET;
a61af66fc99e Initial load
duke
parents:
diff changeset
57 private static int INTERPRETER_FRAME_LOCALS_OFFSET;
a61af66fc99e Initial load
duke
parents:
diff changeset
58 private static int INTERPRETER_FRAME_BCX_OFFSET;
a61af66fc99e Initial load
duke
parents:
diff changeset
59 private static int INTERPRETER_FRAME_INITIAL_SP_OFFSET;
a61af66fc99e Initial load
duke
parents:
diff changeset
60 private static int INTERPRETER_FRAME_MONITOR_BLOCK_TOP_OFFSET;
a61af66fc99e Initial load
duke
parents:
diff changeset
61 private static int INTERPRETER_FRAME_MONITOR_BLOCK_BOTTOM_OFFSET;
a61af66fc99e Initial load
duke
parents:
diff changeset
62
a61af66fc99e Initial load
duke
parents:
diff changeset
63 // Entry frames
3908
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
64 private static int ENTRY_FRAME_CALL_WRAPPER_OFFSET;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
65
a61af66fc99e Initial load
duke
parents:
diff changeset
66 // Native frames
a61af66fc99e Initial load
duke
parents:
diff changeset
67 private static final int NATIVE_FRAME_INITIAL_PARAM_OFFSET = 2;
a61af66fc99e Initial load
duke
parents:
diff changeset
68
3908
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
69 private static VMReg rbp;
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
70
0
a61af66fc99e Initial load
duke
parents:
diff changeset
71 static {
a61af66fc99e Initial load
duke
parents:
diff changeset
72 VM.registerVMInitializedObserver(new Observer() {
a61af66fc99e Initial load
duke
parents:
diff changeset
73 public void update(Observable o, Object data) {
a61af66fc99e Initial load
duke
parents:
diff changeset
74 initialize(VM.getVM().getTypeDataBase());
a61af66fc99e Initial load
duke
parents:
diff changeset
75 }
a61af66fc99e Initial load
duke
parents:
diff changeset
76 });
a61af66fc99e Initial load
duke
parents:
diff changeset
77 }
a61af66fc99e Initial load
duke
parents:
diff changeset
78
a61af66fc99e Initial load
duke
parents:
diff changeset
79 private static synchronized void initialize(TypeDataBase db) {
3908
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
80 INTERPRETER_FRAME_MDX_OFFSET = INTERPRETER_FRAME_METHOD_OFFSET - 1;
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
81 INTERPRETER_FRAME_CACHE_OFFSET = INTERPRETER_FRAME_MDX_OFFSET - 1;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
82 INTERPRETER_FRAME_LOCALS_OFFSET = INTERPRETER_FRAME_CACHE_OFFSET - 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
83 INTERPRETER_FRAME_BCX_OFFSET = INTERPRETER_FRAME_LOCALS_OFFSET - 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
84 INTERPRETER_FRAME_INITIAL_SP_OFFSET = INTERPRETER_FRAME_BCX_OFFSET - 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
85 INTERPRETER_FRAME_MONITOR_BLOCK_TOP_OFFSET = INTERPRETER_FRAME_INITIAL_SP_OFFSET;
a61af66fc99e Initial load
duke
parents:
diff changeset
86 INTERPRETER_FRAME_MONITOR_BLOCK_BOTTOM_OFFSET = INTERPRETER_FRAME_INITIAL_SP_OFFSET;
3908
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
87
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
88 ENTRY_FRAME_CALL_WRAPPER_OFFSET = db.lookupIntConstant("frame::entry_frame_call_wrapper_offset");
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
89 if (VM.getVM().getAddressSize() == 4) {
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
90 rbp = new VMReg(5);
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
91 } else {
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
92 rbp = new VMReg(5 << 1);
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
93 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
94 }
a61af66fc99e Initial load
duke
parents:
diff changeset
95
3908
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
96
0
a61af66fc99e Initial load
duke
parents:
diff changeset
97 // an additional field beyond sp and pc:
a61af66fc99e Initial load
duke
parents:
diff changeset
98 Address raw_fp; // frame pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
99 private Address raw_unextendedSP;
a61af66fc99e Initial load
duke
parents:
diff changeset
100
a61af66fc99e Initial load
duke
parents:
diff changeset
101 private X86Frame() {
a61af66fc99e Initial load
duke
parents:
diff changeset
102 }
a61af66fc99e Initial load
duke
parents:
diff changeset
103
a61af66fc99e Initial load
duke
parents:
diff changeset
104 private void adjustForDeopt() {
a61af66fc99e Initial load
duke
parents:
diff changeset
105 if ( pc != null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
106 // Look for a deopt pc and if it is deopted convert to original pc
a61af66fc99e Initial load
duke
parents:
diff changeset
107 CodeBlob cb = VM.getVM().getCodeCache().findBlob(pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
108 if (cb != null && cb.isJavaMethod()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
109 NMethod nm = (NMethod) cb;
3908
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
110 if (pc.equals(nm.deoptHandlerBegin())) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
111 if (Assert.ASSERTS_ENABLED) {
a61af66fc99e Initial load
duke
parents:
diff changeset
112 Assert.that(this.getUnextendedSP() != null, "null SP in Java frame");
a61af66fc99e Initial load
duke
parents:
diff changeset
113 }
a61af66fc99e Initial load
duke
parents:
diff changeset
114 // adjust pc if frame is deoptimized.
a61af66fc99e Initial load
duke
parents:
diff changeset
115 pc = this.getUnextendedSP().getAddressAt(nm.origPCOffset());
a61af66fc99e Initial load
duke
parents:
diff changeset
116 deoptimized = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
117 }
a61af66fc99e Initial load
duke
parents:
diff changeset
118 }
a61af66fc99e Initial load
duke
parents:
diff changeset
119 }
a61af66fc99e Initial load
duke
parents:
diff changeset
120 }
a61af66fc99e Initial load
duke
parents:
diff changeset
121
a61af66fc99e Initial load
duke
parents:
diff changeset
122 public X86Frame(Address raw_sp, Address raw_fp, Address pc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
123 this.raw_sp = raw_sp;
a61af66fc99e Initial load
duke
parents:
diff changeset
124 this.raw_unextendedSP = raw_sp;
a61af66fc99e Initial load
duke
parents:
diff changeset
125 this.raw_fp = raw_fp;
a61af66fc99e Initial load
duke
parents:
diff changeset
126 this.pc = pc;
3908
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
127 adjustUnextendedSP();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
128
a61af66fc99e Initial load
duke
parents:
diff changeset
129 // Frame must be fully constructed before this call
a61af66fc99e Initial load
duke
parents:
diff changeset
130 adjustForDeopt();
a61af66fc99e Initial load
duke
parents:
diff changeset
131
a61af66fc99e Initial load
duke
parents:
diff changeset
132 if (DEBUG) {
a61af66fc99e Initial load
duke
parents:
diff changeset
133 System.out.println("X86Frame(sp, fp, pc): " + this);
a61af66fc99e Initial load
duke
parents:
diff changeset
134 dumpStack();
a61af66fc99e Initial load
duke
parents:
diff changeset
135 }
a61af66fc99e Initial load
duke
parents:
diff changeset
136 }
a61af66fc99e Initial load
duke
parents:
diff changeset
137
a61af66fc99e Initial load
duke
parents:
diff changeset
138 public X86Frame(Address raw_sp, Address raw_fp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
139 this.raw_sp = raw_sp;
a61af66fc99e Initial load
duke
parents:
diff changeset
140 this.raw_unextendedSP = raw_sp;
a61af66fc99e Initial load
duke
parents:
diff changeset
141 this.raw_fp = raw_fp;
a61af66fc99e Initial load
duke
parents:
diff changeset
142 this.pc = raw_sp.getAddressAt(-1 * VM.getVM().getAddressSize());
3908
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
143 adjustUnextendedSP();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
144
a61af66fc99e Initial load
duke
parents:
diff changeset
145 // Frame must be fully constructed before this call
a61af66fc99e Initial load
duke
parents:
diff changeset
146 adjustForDeopt();
a61af66fc99e Initial load
duke
parents:
diff changeset
147
a61af66fc99e Initial load
duke
parents:
diff changeset
148 if (DEBUG) {
a61af66fc99e Initial load
duke
parents:
diff changeset
149 System.out.println("X86Frame(sp, fp): " + this);
a61af66fc99e Initial load
duke
parents:
diff changeset
150 dumpStack();
a61af66fc99e Initial load
duke
parents:
diff changeset
151 }
a61af66fc99e Initial load
duke
parents:
diff changeset
152 }
a61af66fc99e Initial load
duke
parents:
diff changeset
153
3908
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
154 public X86Frame(Address raw_sp, Address raw_unextendedSp, Address raw_fp, Address pc) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
155 this.raw_sp = raw_sp;
3908
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
156 this.raw_unextendedSP = raw_unextendedSp;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
157 this.raw_fp = raw_fp;
3908
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
158 this.pc = pc;
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
159 adjustUnextendedSP();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
160
a61af66fc99e Initial load
duke
parents:
diff changeset
161 // Frame must be fully constructed before this call
a61af66fc99e Initial load
duke
parents:
diff changeset
162 adjustForDeopt();
a61af66fc99e Initial load
duke
parents:
diff changeset
163
a61af66fc99e Initial load
duke
parents:
diff changeset
164 if (DEBUG) {
3908
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
165 System.out.println("X86Frame(sp, unextendedSP, fp, pc): " + this);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
166 dumpStack();
a61af66fc99e Initial load
duke
parents:
diff changeset
167 }
a61af66fc99e Initial load
duke
parents:
diff changeset
168
a61af66fc99e Initial load
duke
parents:
diff changeset
169 }
a61af66fc99e Initial load
duke
parents:
diff changeset
170
a61af66fc99e Initial load
duke
parents:
diff changeset
171 public Object clone() {
a61af66fc99e Initial load
duke
parents:
diff changeset
172 X86Frame frame = new X86Frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
173 frame.raw_sp = raw_sp;
a61af66fc99e Initial load
duke
parents:
diff changeset
174 frame.raw_unextendedSP = raw_unextendedSP;
a61af66fc99e Initial load
duke
parents:
diff changeset
175 frame.raw_fp = raw_fp;
a61af66fc99e Initial load
duke
parents:
diff changeset
176 frame.pc = pc;
a61af66fc99e Initial load
duke
parents:
diff changeset
177 frame.deoptimized = deoptimized;
a61af66fc99e Initial load
duke
parents:
diff changeset
178 return frame;
a61af66fc99e Initial load
duke
parents:
diff changeset
179 }
a61af66fc99e Initial load
duke
parents:
diff changeset
180
a61af66fc99e Initial load
duke
parents:
diff changeset
181 public boolean equals(Object arg) {
a61af66fc99e Initial load
duke
parents:
diff changeset
182 if (arg == null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
183 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
184 }
a61af66fc99e Initial load
duke
parents:
diff changeset
185
a61af66fc99e Initial load
duke
parents:
diff changeset
186 if (!(arg instanceof X86Frame)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
187 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
188 }
a61af66fc99e Initial load
duke
parents:
diff changeset
189
a61af66fc99e Initial load
duke
parents:
diff changeset
190 X86Frame other = (X86Frame) arg;
a61af66fc99e Initial load
duke
parents:
diff changeset
191
a61af66fc99e Initial load
duke
parents:
diff changeset
192 return (AddressOps.equal(getSP(), other.getSP()) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
193 AddressOps.equal(getUnextendedSP(), other.getUnextendedSP()) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
194 AddressOps.equal(getFP(), other.getFP()) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
195 AddressOps.equal(getPC(), other.getPC()));
a61af66fc99e Initial load
duke
parents:
diff changeset
196 }
a61af66fc99e Initial load
duke
parents:
diff changeset
197
a61af66fc99e Initial load
duke
parents:
diff changeset
198 public int hashCode() {
a61af66fc99e Initial load
duke
parents:
diff changeset
199 if (raw_sp == null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
200 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
201 }
a61af66fc99e Initial load
duke
parents:
diff changeset
202
a61af66fc99e Initial load
duke
parents:
diff changeset
203 return raw_sp.hashCode();
a61af66fc99e Initial load
duke
parents:
diff changeset
204 }
a61af66fc99e Initial load
duke
parents:
diff changeset
205
a61af66fc99e Initial load
duke
parents:
diff changeset
206 public String toString() {
a61af66fc99e Initial load
duke
parents:
diff changeset
207 return "sp: " + (getSP() == null? "null" : getSP().toString()) +
a61af66fc99e Initial load
duke
parents:
diff changeset
208 ", unextendedSP: " + (getUnextendedSP() == null? "null" : getUnextendedSP().toString()) +
a61af66fc99e Initial load
duke
parents:
diff changeset
209 ", fp: " + (getFP() == null? "null" : getFP().toString()) +
a61af66fc99e Initial load
duke
parents:
diff changeset
210 ", pc: " + (pc == null? "null" : pc.toString());
a61af66fc99e Initial load
duke
parents:
diff changeset
211 }
a61af66fc99e Initial load
duke
parents:
diff changeset
212
a61af66fc99e Initial load
duke
parents:
diff changeset
213 // accessors for the instance variables
a61af66fc99e Initial load
duke
parents:
diff changeset
214 public Address getFP() { return raw_fp; }
a61af66fc99e Initial load
duke
parents:
diff changeset
215 public Address getSP() { return raw_sp; }
a61af66fc99e Initial load
duke
parents:
diff changeset
216 public Address getID() { return raw_sp; }
a61af66fc99e Initial load
duke
parents:
diff changeset
217
a61af66fc99e Initial load
duke
parents:
diff changeset
218 // FIXME: not implemented yet (should be done for Solaris/X86)
a61af66fc99e Initial load
duke
parents:
diff changeset
219 public boolean isSignalHandlerFrameDbg() { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
220 public int getSignalNumberDbg() { return 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
221 public String getSignalNameDbg() { return null; }
a61af66fc99e Initial load
duke
parents:
diff changeset
222
a61af66fc99e Initial load
duke
parents:
diff changeset
223 public boolean isInterpretedFrameValid() {
a61af66fc99e Initial load
duke
parents:
diff changeset
224 if (Assert.ASSERTS_ENABLED) {
a61af66fc99e Initial load
duke
parents:
diff changeset
225 Assert.that(isInterpretedFrame(), "Not an interpreted frame");
a61af66fc99e Initial load
duke
parents:
diff changeset
226 }
a61af66fc99e Initial load
duke
parents:
diff changeset
227
a61af66fc99e Initial load
duke
parents:
diff changeset
228 // These are reasonable sanity checks
a61af66fc99e Initial load
duke
parents:
diff changeset
229 if (getFP() == null || getFP().andWithMask(0x3) != null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
230 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
231 }
a61af66fc99e Initial load
duke
parents:
diff changeset
232
a61af66fc99e Initial load
duke
parents:
diff changeset
233 if (getSP() == null || getSP().andWithMask(0x3) != null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
234 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
235 }
a61af66fc99e Initial load
duke
parents:
diff changeset
236
a61af66fc99e Initial load
duke
parents:
diff changeset
237 if (getFP().addOffsetTo(INTERPRETER_FRAME_INITIAL_SP_OFFSET * VM.getVM().getAddressSize()).lessThan(getSP())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
238 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
239 }
a61af66fc99e Initial load
duke
parents:
diff changeset
240
a61af66fc99e Initial load
duke
parents:
diff changeset
241 // These are hacks to keep us out of trouble.
a61af66fc99e Initial load
duke
parents:
diff changeset
242 // The problem with these is that they mask other problems
a61af66fc99e Initial load
duke
parents:
diff changeset
243 if (getFP().lessThanOrEqual(getSP())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
244 // this attempts to deal with unsigned comparison above
a61af66fc99e Initial load
duke
parents:
diff changeset
245 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
246 }
a61af66fc99e Initial load
duke
parents:
diff changeset
247
a61af66fc99e Initial load
duke
parents:
diff changeset
248 if (getFP().minus(getSP()) > 4096 * VM.getVM().getAddressSize()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
249 // stack frames shouldn't be large.
a61af66fc99e Initial load
duke
parents:
diff changeset
250 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
251 }
a61af66fc99e Initial load
duke
parents:
diff changeset
252
a61af66fc99e Initial load
duke
parents:
diff changeset
253 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
254 }
a61af66fc99e Initial load
duke
parents:
diff changeset
255
a61af66fc99e Initial load
duke
parents:
diff changeset
256 // FIXME: not applicable in current system
a61af66fc99e Initial load
duke
parents:
diff changeset
257 // void patch_pc(Thread* thread, address pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
258
a61af66fc99e Initial load
duke
parents:
diff changeset
259 public Frame sender(RegisterMap regMap, CodeBlob cb) {
a61af66fc99e Initial load
duke
parents:
diff changeset
260 X86RegisterMap map = (X86RegisterMap) regMap;
a61af66fc99e Initial load
duke
parents:
diff changeset
261
a61af66fc99e Initial load
duke
parents:
diff changeset
262 if (Assert.ASSERTS_ENABLED) {
a61af66fc99e Initial load
duke
parents:
diff changeset
263 Assert.that(map != null, "map must be set");
a61af66fc99e Initial load
duke
parents:
diff changeset
264 }
a61af66fc99e Initial load
duke
parents:
diff changeset
265
a61af66fc99e Initial load
duke
parents:
diff changeset
266 // Default is we done have to follow them. The sender_for_xxx will
a61af66fc99e Initial load
duke
parents:
diff changeset
267 // update it accordingly
a61af66fc99e Initial load
duke
parents:
diff changeset
268 map.setIncludeArgumentOops(false);
a61af66fc99e Initial load
duke
parents:
diff changeset
269
a61af66fc99e Initial load
duke
parents:
diff changeset
270 if (isEntryFrame()) return senderForEntryFrame(map);
a61af66fc99e Initial load
duke
parents:
diff changeset
271 if (isInterpretedFrame()) return senderForInterpreterFrame(map);
a61af66fc99e Initial load
duke
parents:
diff changeset
272
3908
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
273 if(cb == null) {
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
274 cb = VM.getVM().getCodeCache().findBlob(getPC());
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
275 } else {
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
276 if (Assert.ASSERTS_ENABLED) {
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
277 Assert.that(cb.equals(VM.getVM().getCodeCache().findBlob(getPC())), "Must be the same");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
278 }
3908
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
279 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
280
3908
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
281 if (cb != null) {
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
282 return senderForCompiledFrame(map, cb);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
283 }
a61af66fc99e Initial load
duke
parents:
diff changeset
284
a61af66fc99e Initial load
duke
parents:
diff changeset
285 // Must be native-compiled frame, i.e. the marshaling code for native
a61af66fc99e Initial load
duke
parents:
diff changeset
286 // methods that exists in the core system.
a61af66fc99e Initial load
duke
parents:
diff changeset
287 return new X86Frame(getSenderSP(), getLink(), getSenderPC());
a61af66fc99e Initial load
duke
parents:
diff changeset
288 }
a61af66fc99e Initial load
duke
parents:
diff changeset
289
a61af66fc99e Initial load
duke
parents:
diff changeset
290 private Frame senderForEntryFrame(X86RegisterMap map) {
3908
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
291 if (DEBUG) {
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
292 System.out.println("senderForEntryFrame");
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
293 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
294 if (Assert.ASSERTS_ENABLED) {
a61af66fc99e Initial load
duke
parents:
diff changeset
295 Assert.that(map != null, "map must be set");
a61af66fc99e Initial load
duke
parents:
diff changeset
296 }
a61af66fc99e Initial load
duke
parents:
diff changeset
297 // Java frame called from C; skip all C frames and return top C
a61af66fc99e Initial load
duke
parents:
diff changeset
298 // frame of that chunk as the sender
a61af66fc99e Initial load
duke
parents:
diff changeset
299 X86JavaCallWrapper jcw = (X86JavaCallWrapper) getEntryFrameCallWrapper();
a61af66fc99e Initial load
duke
parents:
diff changeset
300 if (Assert.ASSERTS_ENABLED) {
a61af66fc99e Initial load
duke
parents:
diff changeset
301 Assert.that(!entryFrameIsFirst(), "next Java fp must be non zero");
a61af66fc99e Initial load
duke
parents:
diff changeset
302 Assert.that(jcw.getLastJavaSP().greaterThan(getSP()), "must be above this frame on stack");
a61af66fc99e Initial load
duke
parents:
diff changeset
303 }
a61af66fc99e Initial load
duke
parents:
diff changeset
304 X86Frame fr;
a61af66fc99e Initial load
duke
parents:
diff changeset
305 if (jcw.getLastJavaPC() != null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
306 fr = new X86Frame(jcw.getLastJavaSP(), jcw.getLastJavaFP(), jcw.getLastJavaPC());
a61af66fc99e Initial load
duke
parents:
diff changeset
307 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
308 fr = new X86Frame(jcw.getLastJavaSP(), jcw.getLastJavaFP());
a61af66fc99e Initial load
duke
parents:
diff changeset
309 }
a61af66fc99e Initial load
duke
parents:
diff changeset
310 map.clear();
a61af66fc99e Initial load
duke
parents:
diff changeset
311 if (Assert.ASSERTS_ENABLED) {
a61af66fc99e Initial load
duke
parents:
diff changeset
312 Assert.that(map.getIncludeArgumentOops(), "should be set by clear");
a61af66fc99e Initial load
duke
parents:
diff changeset
313 }
a61af66fc99e Initial load
duke
parents:
diff changeset
314 return fr;
a61af66fc99e Initial load
duke
parents:
diff changeset
315 }
a61af66fc99e Initial load
duke
parents:
diff changeset
316
3908
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
317 //------------------------------------------------------------------------------
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
318 // frame::adjust_unextended_sp
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
319 private void adjustUnextendedSP() {
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
320 // If we are returning to a compiled MethodHandle call site, the
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
321 // saved_fp will in fact be a saved value of the unextended SP. The
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
322 // simplest way to tell whether we are returning to such a call site
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
323 // is as follows:
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
324
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
325 CodeBlob cb = cb();
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
326 NMethod senderNm = (cb == null) ? null : cb.asNMethodOrNull();
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
327 if (senderNm != null) {
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
328 // If the sender PC is a deoptimization point, get the original
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
329 // PC. For MethodHandle call site the unextended_sp is stored in
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
330 // saved_fp.
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
331 if (senderNm.isDeoptMhEntry(getPC())) {
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
332 // DEBUG_ONLY(verifyDeoptMhOriginalPc(senderNm, getFP()));
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
333 raw_unextendedSP = getFP();
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
334 }
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
335 else if (senderNm.isDeoptEntry(getPC())) {
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
336 // DEBUG_ONLY(verifyDeoptOriginalPc(senderNm, raw_unextendedSp));
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
337 }
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
338 else if (senderNm.isMethodHandleReturn(getPC())) {
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
339 raw_unextendedSP = getFP();
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
340 }
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
341 }
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
342 }
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
343
0
a61af66fc99e Initial load
duke
parents:
diff changeset
344 private Frame senderForInterpreterFrame(X86RegisterMap map) {
3908
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
345 if (DEBUG) {
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
346 System.out.println("senderForInterpreterFrame");
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
347 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
348 Address unextendedSP = addressOfStackSlot(INTERPRETER_FRAME_SENDER_SP_OFFSET).getAddressAt(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
349 Address sp = addressOfStackSlot(SENDER_SP_OFFSET);
a61af66fc99e Initial load
duke
parents:
diff changeset
350 // We do not need to update the callee-save register mapping because above
a61af66fc99e Initial load
duke
parents:
diff changeset
351 // us is either another interpreter frame or a converter-frame, but never
a61af66fc99e Initial load
duke
parents:
diff changeset
352 // directly a compiled frame.
a61af66fc99e Initial load
duke
parents:
diff changeset
353 // 11/24/04 SFG. With the removal of adapter frames this is no longer true.
a61af66fc99e Initial load
duke
parents:
diff changeset
354 // However c2 no longer uses callee save register for java calls so there
a61af66fc99e Initial load
duke
parents:
diff changeset
355 // are no callee register to find.
a61af66fc99e Initial load
duke
parents:
diff changeset
356
3908
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
357 if (map.getUpdateMap())
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
358 updateMapWithSavedLink(map, addressOfStackSlot(LINK_OFFSET));
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
359
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
360 return new X86Frame(sp, unextendedSP, getLink(), getSenderPC());
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
361 }
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
362
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
363 private void updateMapWithSavedLink(RegisterMap map, Address savedFPAddr) {
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
364 map.setLocation(rbp, savedFPAddr);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
365 }
a61af66fc99e Initial load
duke
parents:
diff changeset
366
a61af66fc99e Initial load
duke
parents:
diff changeset
367 private Frame senderForCompiledFrame(X86RegisterMap map, CodeBlob cb) {
3908
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
368 if (DEBUG) {
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
369 System.out.println("senderForCompiledFrame");
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
370 }
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
371
0
a61af66fc99e Initial load
duke
parents:
diff changeset
372 //
a61af66fc99e Initial load
duke
parents:
diff changeset
373 // NOTE: some of this code is (unfortunately) duplicated in X86CurrentFrameGuess
a61af66fc99e Initial load
duke
parents:
diff changeset
374 //
a61af66fc99e Initial load
duke
parents:
diff changeset
375
a61af66fc99e Initial load
duke
parents:
diff changeset
376 if (Assert.ASSERTS_ENABLED) {
a61af66fc99e Initial load
duke
parents:
diff changeset
377 Assert.that(map != null, "map must be set");
a61af66fc99e Initial load
duke
parents:
diff changeset
378 }
a61af66fc99e Initial load
duke
parents:
diff changeset
379
a61af66fc99e Initial load
duke
parents:
diff changeset
380 // frame owned by optimizing compiler
3908
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
381 if (Assert.ASSERTS_ENABLED) {
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
382 Assert.that(cb.getFrameSize() >= 0, "must have non-zero frame size");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
383 }
3908
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
384 Address senderSP = getUnextendedSP().addOffsetTo(cb.getFrameSize());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
385
a61af66fc99e Initial load
duke
parents:
diff changeset
386 // On Intel the return_address is always the word on the stack
3908
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
387 Address senderPC = senderSP.getAddressAt(-1 * VM.getVM().getAddressSize());
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
388
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
389 // This is the saved value of EBP which may or may not really be an FP.
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
390 // It is only an FP if the sender is an interpreter frame (or C1?).
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
391 Address savedFPAddr = senderSP.addOffsetTo(- SENDER_SP_OFFSET * VM.getVM().getAddressSize());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
392
3908
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
393 if (map.getUpdateMap()) {
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
394 // Tell GC to use argument oopmaps for some runtime stubs that need it.
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
395 // For C1, the runtime stub might not have oop maps, so set this flag
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
396 // outside of update_register_map.
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
397 map.setIncludeArgumentOops(cb.callerMustGCArguments());
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
398
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
399 if (cb.getOopMaps() != null) {
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
400 OopMapSet.updateRegisterMap(this, cb, map, true);
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
401 }
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
402
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
403 // Since the prolog does the save and restore of EBP there is no oopmap
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
404 // for it so we must fill in its location as if there was an oopmap entry
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
405 // since if our caller was compiled code there could be live jvm state in it.
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
406 updateMapWithSavedLink(map, savedFPAddr);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
407 }
a61af66fc99e Initial load
duke
parents:
diff changeset
408
3908
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1552
diff changeset
409 return new X86Frame(senderSP, savedFPAddr.getAddressAt(0), senderPC);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
410 }
a61af66fc99e Initial load
duke
parents:
diff changeset
411
a61af66fc99e Initial load
duke
parents:
diff changeset
412 protected boolean hasSenderPD() {
a61af66fc99e Initial load
duke
parents:
diff changeset
413 // FIXME
a61af66fc99e Initial load
duke
parents:
diff changeset
414 // Check for null ebp? Need to do some tests.
a61af66fc99e Initial load
duke
parents:
diff changeset
415 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
416 }
a61af66fc99e Initial load
duke
parents:
diff changeset
417
a61af66fc99e Initial load
duke
parents:
diff changeset
418 public long frameSize() {
a61af66fc99e Initial load
duke
parents:
diff changeset
419 return (getSenderSP().minus(getSP()) / VM.getVM().getAddressSize());
a61af66fc99e Initial load
duke
parents:
diff changeset
420 }
a61af66fc99e Initial load
duke
parents:
diff changeset
421
a61af66fc99e Initial load
duke
parents:
diff changeset
422 public Address getLink() {
a61af66fc99e Initial load
duke
parents:
diff changeset
423 return addressOfStackSlot(LINK_OFFSET).getAddressAt(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
424 }
a61af66fc99e Initial load
duke
parents:
diff changeset
425
a61af66fc99e Initial load
duke
parents:
diff changeset
426 // FIXME: not implementable yet
a61af66fc99e Initial load
duke
parents:
diff changeset
427 //inline void frame::set_link(intptr_t* addr) { *(intptr_t **)addr_at(link_offset) = addr; }
a61af66fc99e Initial load
duke
parents:
diff changeset
428
a61af66fc99e Initial load
duke
parents:
diff changeset
429 public Address getUnextendedSP() { return raw_unextendedSP; }
a61af66fc99e Initial load
duke
parents:
diff changeset
430
a61af66fc99e Initial load
duke
parents:
diff changeset
431 // Return address:
a61af66fc99e Initial load
duke
parents:
diff changeset
432 public Address getSenderPCAddr() { return addressOfStackSlot(RETURN_ADDR_OFFSET); }
a61af66fc99e Initial load
duke
parents:
diff changeset
433 public Address getSenderPC() { return getSenderPCAddr().getAddressAt(0); }
a61af66fc99e Initial load
duke
parents:
diff changeset
434
a61af66fc99e Initial load
duke
parents:
diff changeset
435 // return address of param, zero origin index.
a61af66fc99e Initial load
duke
parents:
diff changeset
436 public Address getNativeParamAddr(int idx) {
a61af66fc99e Initial load
duke
parents:
diff changeset
437 return addressOfStackSlot(NATIVE_FRAME_INITIAL_PARAM_OFFSET + idx);
a61af66fc99e Initial load
duke
parents:
diff changeset
438 }
a61af66fc99e Initial load
duke
parents:
diff changeset
439
a61af66fc99e Initial load
duke
parents:
diff changeset
440 public Address getSenderSP() { return addressOfStackSlot(SENDER_SP_OFFSET); }
a61af66fc99e Initial load
duke
parents:
diff changeset
441
a61af66fc99e Initial load
duke
parents:
diff changeset
442 public Address addressOfInterpreterFrameLocals() {
a61af66fc99e Initial load
duke
parents:
diff changeset
443 return addressOfStackSlot(INTERPRETER_FRAME_LOCALS_OFFSET);
a61af66fc99e Initial load
duke
parents:
diff changeset
444 }
a61af66fc99e Initial load
duke
parents:
diff changeset
445
a61af66fc99e Initial load
duke
parents:
diff changeset
446 private Address addressOfInterpreterFrameBCX() {
a61af66fc99e Initial load
duke
parents:
diff changeset
447 return addressOfStackSlot(INTERPRETER_FRAME_BCX_OFFSET);
a61af66fc99e Initial load
duke
parents:
diff changeset
448 }
a61af66fc99e Initial load
duke
parents:
diff changeset
449
a61af66fc99e Initial load
duke
parents:
diff changeset
450 public int getInterpreterFrameBCI() {
a61af66fc99e Initial load
duke
parents:
diff changeset
451 // FIXME: this is not atomic with respect to GC and is unsuitable
a61af66fc99e Initial load
duke
parents:
diff changeset
452 // for use in a non-debugging, or reflective, system. Need to
a61af66fc99e Initial load
duke
parents:
diff changeset
453 // figure out how to express this.
a61af66fc99e Initial load
duke
parents:
diff changeset
454 Address bcp = addressOfInterpreterFrameBCX().getAddressAt(0);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
455 Address methodHandle = addressOfInterpreterFrameMethod().getAddressAt(0);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
456 Method method = (Method)Metadata.instantiateWrapperFor(methodHandle);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
457 return bcpToBci(bcp, method);
a61af66fc99e Initial load
duke
parents:
diff changeset
458 }
a61af66fc99e Initial load
duke
parents:
diff changeset
459
a61af66fc99e Initial load
duke
parents:
diff changeset
460 public Address addressOfInterpreterFrameMDX() {
a61af66fc99e Initial load
duke
parents:
diff changeset
461 return addressOfStackSlot(INTERPRETER_FRAME_MDX_OFFSET);
a61af66fc99e Initial load
duke
parents:
diff changeset
462 }
a61af66fc99e Initial load
duke
parents:
diff changeset
463
a61af66fc99e Initial load
duke
parents:
diff changeset
464 // FIXME
a61af66fc99e Initial load
duke
parents:
diff changeset
465 //inline int frame::interpreter_frame_monitor_size() {
a61af66fc99e Initial load
duke
parents:
diff changeset
466 // return BasicObjectLock::size();
a61af66fc99e Initial load
duke
parents:
diff changeset
467 //}
a61af66fc99e Initial load
duke
parents:
diff changeset
468
a61af66fc99e Initial load
duke
parents:
diff changeset
469 // expression stack
a61af66fc99e Initial load
duke
parents:
diff changeset
470 // (the max_stack arguments are used by the GC; see class FrameClosure)
a61af66fc99e Initial load
duke
parents:
diff changeset
471
a61af66fc99e Initial load
duke
parents:
diff changeset
472 public Address addressOfInterpreterFrameExpressionStack() {
a61af66fc99e Initial load
duke
parents:
diff changeset
473 Address monitorEnd = interpreterFrameMonitorEnd().address();
a61af66fc99e Initial load
duke
parents:
diff changeset
474 return monitorEnd.addOffsetTo(-1 * VM.getVM().getAddressSize());
a61af66fc99e Initial load
duke
parents:
diff changeset
475 }
a61af66fc99e Initial load
duke
parents:
diff changeset
476
a61af66fc99e Initial load
duke
parents:
diff changeset
477 public int getInterpreterFrameExpressionStackDirection() { return -1; }
a61af66fc99e Initial load
duke
parents:
diff changeset
478
a61af66fc99e Initial load
duke
parents:
diff changeset
479 // top of expression stack
a61af66fc99e Initial load
duke
parents:
diff changeset
480 public Address addressOfInterpreterFrameTOS() {
a61af66fc99e Initial load
duke
parents:
diff changeset
481 return getSP();
a61af66fc99e Initial load
duke
parents:
diff changeset
482 }
a61af66fc99e Initial load
duke
parents:
diff changeset
483
a61af66fc99e Initial load
duke
parents:
diff changeset
484 /** Expression stack from top down */
a61af66fc99e Initial load
duke
parents:
diff changeset
485 public Address addressOfInterpreterFrameTOSAt(int slot) {
a61af66fc99e Initial load
duke
parents:
diff changeset
486 return addressOfInterpreterFrameTOS().addOffsetTo(slot * VM.getVM().getAddressSize());
a61af66fc99e Initial load
duke
parents:
diff changeset
487 }
a61af66fc99e Initial load
duke
parents:
diff changeset
488
a61af66fc99e Initial load
duke
parents:
diff changeset
489 public Address getInterpreterFrameSenderSP() {
a61af66fc99e Initial load
duke
parents:
diff changeset
490 if (Assert.ASSERTS_ENABLED) {
a61af66fc99e Initial load
duke
parents:
diff changeset
491 Assert.that(isInterpretedFrame(), "interpreted frame expected");
a61af66fc99e Initial load
duke
parents:
diff changeset
492 }
a61af66fc99e Initial load
duke
parents:
diff changeset
493 return addressOfStackSlot(INTERPRETER_FRAME_SENDER_SP_OFFSET).getAddressAt(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
494 }
a61af66fc99e Initial load
duke
parents:
diff changeset
495
a61af66fc99e Initial load
duke
parents:
diff changeset
496 // Monitors
a61af66fc99e Initial load
duke
parents:
diff changeset
497 public BasicObjectLock interpreterFrameMonitorBegin() {
a61af66fc99e Initial load
duke
parents:
diff changeset
498 return new BasicObjectLock(addressOfStackSlot(INTERPRETER_FRAME_MONITOR_BLOCK_BOTTOM_OFFSET));
a61af66fc99e Initial load
duke
parents:
diff changeset
499 }
a61af66fc99e Initial load
duke
parents:
diff changeset
500
a61af66fc99e Initial load
duke
parents:
diff changeset
501 public BasicObjectLock interpreterFrameMonitorEnd() {
a61af66fc99e Initial load
duke
parents:
diff changeset
502 Address result = addressOfStackSlot(INTERPRETER_FRAME_MONITOR_BLOCK_TOP_OFFSET).getAddressAt(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
503 if (Assert.ASSERTS_ENABLED) {
a61af66fc99e Initial load
duke
parents:
diff changeset
504 // make sure the pointer points inside the frame
a61af66fc99e Initial load
duke
parents:
diff changeset
505 Assert.that(AddressOps.gt(getFP(), result), "result must < than frame pointer");
a61af66fc99e Initial load
duke
parents:
diff changeset
506 Assert.that(AddressOps.lte(getSP(), result), "result must >= than stack pointer");
a61af66fc99e Initial load
duke
parents:
diff changeset
507 }
a61af66fc99e Initial load
duke
parents:
diff changeset
508 return new BasicObjectLock(result);
a61af66fc99e Initial load
duke
parents:
diff changeset
509 }
a61af66fc99e Initial load
duke
parents:
diff changeset
510
a61af66fc99e Initial load
duke
parents:
diff changeset
511 public int interpreterFrameMonitorSize() {
a61af66fc99e Initial load
duke
parents:
diff changeset
512 return BasicObjectLock.size();
a61af66fc99e Initial load
duke
parents:
diff changeset
513 }
a61af66fc99e Initial load
duke
parents:
diff changeset
514
a61af66fc99e Initial load
duke
parents:
diff changeset
515 // Method
a61af66fc99e Initial load
duke
parents:
diff changeset
516 public Address addressOfInterpreterFrameMethod() {
a61af66fc99e Initial load
duke
parents:
diff changeset
517 return addressOfStackSlot(INTERPRETER_FRAME_METHOD_OFFSET);
a61af66fc99e Initial load
duke
parents:
diff changeset
518 }
a61af66fc99e Initial load
duke
parents:
diff changeset
519
a61af66fc99e Initial load
duke
parents:
diff changeset
520 // Constant pool cache
a61af66fc99e Initial load
duke
parents:
diff changeset
521 public Address addressOfInterpreterFrameCPCache() {
a61af66fc99e Initial load
duke
parents:
diff changeset
522 return addressOfStackSlot(INTERPRETER_FRAME_CACHE_OFFSET);
a61af66fc99e Initial load
duke
parents:
diff changeset
523 }
a61af66fc99e Initial load
duke
parents:
diff changeset
524
a61af66fc99e Initial load
duke
parents:
diff changeset
525 // Entry frames
a61af66fc99e Initial load
duke
parents:
diff changeset
526 public JavaCallWrapper getEntryFrameCallWrapper() {
a61af66fc99e Initial load
duke
parents:
diff changeset
527 return new X86JavaCallWrapper(addressOfStackSlot(ENTRY_FRAME_CALL_WRAPPER_OFFSET).getAddressAt(0));
a61af66fc99e Initial load
duke
parents:
diff changeset
528 }
a61af66fc99e Initial load
duke
parents:
diff changeset
529
a61af66fc99e Initial load
duke
parents:
diff changeset
530 protected Address addressOfSavedOopResult() {
a61af66fc99e Initial load
duke
parents:
diff changeset
531 // offset is 2 for compiler2 and 3 for compiler1
a61af66fc99e Initial load
duke
parents:
diff changeset
532 return getSP().addOffsetTo((VM.getVM().isClientCompiler() ? 2 : 3) *
a61af66fc99e Initial load
duke
parents:
diff changeset
533 VM.getVM().getAddressSize());
a61af66fc99e Initial load
duke
parents:
diff changeset
534 }
a61af66fc99e Initial load
duke
parents:
diff changeset
535
a61af66fc99e Initial load
duke
parents:
diff changeset
536 protected Address addressOfSavedReceiver() {
a61af66fc99e Initial load
duke
parents:
diff changeset
537 return getSP().addOffsetTo(-4 * VM.getVM().getAddressSize());
a61af66fc99e Initial load
duke
parents:
diff changeset
538 }
a61af66fc99e Initial load
duke
parents:
diff changeset
539
a61af66fc99e Initial load
duke
parents:
diff changeset
540 private void dumpStack() {
a61af66fc99e Initial load
duke
parents:
diff changeset
541 if (getFP() != null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
542 for (Address addr = getSP().addOffsetTo(-5 * VM.getVM().getAddressSize());
a61af66fc99e Initial load
duke
parents:
diff changeset
543 AddressOps.lte(addr, getFP().addOffsetTo(5 * VM.getVM().getAddressSize()));
a61af66fc99e Initial load
duke
parents:
diff changeset
544 addr = addr.addOffsetTo(VM.getVM().getAddressSize())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
545 System.out.println(addr + ": " + addr.getAddressAt(0));
a61af66fc99e Initial load
duke
parents:
diff changeset
546 }
a61af66fc99e Initial load
duke
parents:
diff changeset
547 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
548 for (Address addr = getSP().addOffsetTo(-5 * VM.getVM().getAddressSize());
a61af66fc99e Initial load
duke
parents:
diff changeset
549 AddressOps.lte(addr, getSP().addOffsetTo(20 * VM.getVM().getAddressSize()));
a61af66fc99e Initial load
duke
parents:
diff changeset
550 addr = addr.addOffsetTo(VM.getVM().getAddressSize())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
551 System.out.println(addr + ": " + addr.getAddressAt(0));
a61af66fc99e Initial load
duke
parents:
diff changeset
552 }
a61af66fc99e Initial load
duke
parents:
diff changeset
553 }
a61af66fc99e Initial load
duke
parents:
diff changeset
554 }
a61af66fc99e Initial load
duke
parents:
diff changeset
555 }