annotate agent/src/share/classes/sun/jvm/hotspot/code/NMethod.java @ 6972:bd7a7ce2e264

6830717: replay of compilations would help with debugging Summary: When java process crashed in compiler thread, repeat the compilation process will help finding root cause. This is done with using SA dump application class data and replay data from core dump, then use debug version of jvm to recompile the problematic java method. Reviewed-by: kvn, twisti, sspitsyn Contributed-by: yumin.qi@oracle.com
author minqi
date Mon, 12 Nov 2012 14:03:53 -0800
parents 5a98bf7d847b
children 7b23cb975cf2
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: 3939
diff changeset
2 * Copyright (c) 2000, 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: 1040
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1040
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: 1040
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.code;
a61af66fc99e Initial load
duke
parents:
diff changeset
26
a61af66fc99e Initial load
duke
parents:
diff changeset
27 import java.io.*;
a61af66fc99e Initial load
duke
parents:
diff changeset
28 import java.util.*;
a61af66fc99e Initial load
duke
parents:
diff changeset
29 import sun.jvm.hotspot.debugger.*;
a61af66fc99e Initial load
duke
parents:
diff changeset
30 import sun.jvm.hotspot.memory.*;
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 public class NMethod extends CodeBlob {
a61af66fc99e Initial load
duke
parents:
diff changeset
37 private static long pcDescSize;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 3939
diff changeset
38 private static AddressField methodField;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
39 /** != InvocationEntryBci if this nmethod is an on-stack replacement method */
a61af66fc99e Initial load
duke
parents:
diff changeset
40 private static CIntegerField entryBCIField;
a61af66fc99e Initial load
duke
parents:
diff changeset
41 /** To support simple linked-list chaining of nmethods */
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
42 private static AddressField osrLinkField;
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
43 private static AddressField scavengeRootLinkField;
1040
873ec3787992 6892186: SA does not dump debug info for scalar replaced objects
kvn
parents: 989
diff changeset
44 private static JByteField scavengeRootStateField;
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
45
0
a61af66fc99e Initial load
duke
parents:
diff changeset
46 /** Offsets for different nmethod parts */
a61af66fc99e Initial load
duke
parents:
diff changeset
47 private static CIntegerField exceptionOffsetField;
a61af66fc99e Initial load
duke
parents:
diff changeset
48 private static CIntegerField deoptOffsetField;
3908
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1748
diff changeset
49 private static CIntegerField deoptMhOffsetField;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
50 private static CIntegerField origPCOffsetField;
a61af66fc99e Initial load
duke
parents:
diff changeset
51 private static CIntegerField stubOffsetField;
1563
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1040
diff changeset
52 private static CIntegerField oopsOffsetField;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 3939
diff changeset
53 private static CIntegerField metadataOffsetField;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
54 private static CIntegerField scopesDataOffsetField;
a61af66fc99e Initial load
duke
parents:
diff changeset
55 private static CIntegerField scopesPCsOffsetField;
a61af66fc99e Initial load
duke
parents:
diff changeset
56 private static CIntegerField dependenciesOffsetField;
a61af66fc99e Initial load
duke
parents:
diff changeset
57 private static CIntegerField handlerTableOffsetField;
a61af66fc99e Initial load
duke
parents:
diff changeset
58 private static CIntegerField nulChkTableOffsetField;
a61af66fc99e Initial load
duke
parents:
diff changeset
59 private static CIntegerField nmethodEndOffsetField;
a61af66fc99e Initial load
duke
parents:
diff changeset
60
a61af66fc99e Initial load
duke
parents:
diff changeset
61 /** Offsets for entry points */
a61af66fc99e Initial load
duke
parents:
diff changeset
62 /** Entry point with class check */
a61af66fc99e Initial load
duke
parents:
diff changeset
63 private static AddressField entryPointField;
a61af66fc99e Initial load
duke
parents:
diff changeset
64 /** Entry point without class check */
a61af66fc99e Initial load
duke
parents:
diff changeset
65 private static AddressField verifiedEntryPointField;
a61af66fc99e Initial load
duke
parents:
diff changeset
66 /** Entry point for on stack replacement */
a61af66fc99e Initial load
duke
parents:
diff changeset
67 private static AddressField osrEntryPointField;
a61af66fc99e Initial load
duke
parents:
diff changeset
68
a61af66fc99e Initial load
duke
parents:
diff changeset
69 // FIXME: add access to flags (how?)
a61af66fc99e Initial load
duke
parents:
diff changeset
70
a61af66fc99e Initial load
duke
parents:
diff changeset
71 /** NMethod Flushing lock (if non-zero, then the nmethod is not removed) */
a61af66fc99e Initial load
duke
parents:
diff changeset
72 private static JIntField lockCountField;
a61af66fc99e Initial load
duke
parents:
diff changeset
73
a61af66fc99e Initial load
duke
parents:
diff changeset
74 /** not_entrant method removal. Each mark_sweep pass will update
a61af66fc99e Initial load
duke
parents:
diff changeset
75 this mark to current sweep invocation count if it is seen on the
a61af66fc99e Initial load
duke
parents:
diff changeset
76 stack. An not_entrant method can be removed when there is no
a61af66fc99e Initial load
duke
parents:
diff changeset
77 more activations, i.e., when the _stack_traversal_mark is less than
a61af66fc99e Initial load
duke
parents:
diff changeset
78 current sweep traversal index. */
a61af66fc99e Initial load
duke
parents:
diff changeset
79 private static CIntegerField stackTraversalMarkField;
a61af66fc99e Initial load
duke
parents:
diff changeset
80
a61af66fc99e Initial load
duke
parents:
diff changeset
81 static {
a61af66fc99e Initial load
duke
parents:
diff changeset
82 VM.registerVMInitializedObserver(new Observer() {
a61af66fc99e Initial load
duke
parents:
diff changeset
83 public void update(Observable o, Object data) {
a61af66fc99e Initial load
duke
parents:
diff changeset
84 initialize(VM.getVM().getTypeDataBase());
a61af66fc99e Initial load
duke
parents:
diff changeset
85 }
a61af66fc99e Initial load
duke
parents:
diff changeset
86 });
a61af66fc99e Initial load
duke
parents:
diff changeset
87 }
a61af66fc99e Initial load
duke
parents:
diff changeset
88
a61af66fc99e Initial load
duke
parents:
diff changeset
89 private static void initialize(TypeDataBase db) {
a61af66fc99e Initial load
duke
parents:
diff changeset
90 Type type = db.lookupType("nmethod");
a61af66fc99e Initial load
duke
parents:
diff changeset
91
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 3939
diff changeset
92 methodField = type.getAddressField("_method");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
93 entryBCIField = type.getCIntegerField("_entry_bci");
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
94 osrLinkField = type.getAddressField("_osr_link");
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
95 scavengeRootLinkField = type.getAddressField("_scavenge_root_link");
1040
873ec3787992 6892186: SA does not dump debug info for scalar replaced objects
kvn
parents: 989
diff changeset
96 scavengeRootStateField = type.getJByteField("_scavenge_root_state");
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
97
0
a61af66fc99e Initial load
duke
parents:
diff changeset
98 exceptionOffsetField = type.getCIntegerField("_exception_offset");
a61af66fc99e Initial load
duke
parents:
diff changeset
99 deoptOffsetField = type.getCIntegerField("_deoptimize_offset");
3908
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1748
diff changeset
100 deoptMhOffsetField = type.getCIntegerField("_deoptimize_mh_offset");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
101 origPCOffsetField = type.getCIntegerField("_orig_pc_offset");
a61af66fc99e Initial load
duke
parents:
diff changeset
102 stubOffsetField = type.getCIntegerField("_stub_offset");
1563
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1040
diff changeset
103 oopsOffsetField = type.getCIntegerField("_oops_offset");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 3939
diff changeset
104 metadataOffsetField = type.getCIntegerField("_metadata_offset");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
105 scopesDataOffsetField = type.getCIntegerField("_scopes_data_offset");
a61af66fc99e Initial load
duke
parents:
diff changeset
106 scopesPCsOffsetField = type.getCIntegerField("_scopes_pcs_offset");
a61af66fc99e Initial load
duke
parents:
diff changeset
107 dependenciesOffsetField = type.getCIntegerField("_dependencies_offset");
a61af66fc99e Initial load
duke
parents:
diff changeset
108 handlerTableOffsetField = type.getCIntegerField("_handler_table_offset");
a61af66fc99e Initial load
duke
parents:
diff changeset
109 nulChkTableOffsetField = type.getCIntegerField("_nul_chk_table_offset");
a61af66fc99e Initial load
duke
parents:
diff changeset
110 nmethodEndOffsetField = type.getCIntegerField("_nmethod_end_offset");
a61af66fc99e Initial load
duke
parents:
diff changeset
111 entryPointField = type.getAddressField("_entry_point");
a61af66fc99e Initial load
duke
parents:
diff changeset
112 verifiedEntryPointField = type.getAddressField("_verified_entry_point");
a61af66fc99e Initial load
duke
parents:
diff changeset
113 osrEntryPointField = type.getAddressField("_osr_entry_point");
a61af66fc99e Initial load
duke
parents:
diff changeset
114 lockCountField = type.getJIntField("_lock_count");
a61af66fc99e Initial load
duke
parents:
diff changeset
115 stackTraversalMarkField = type.getCIntegerField("_stack_traversal_mark");
a61af66fc99e Initial load
duke
parents:
diff changeset
116
a61af66fc99e Initial load
duke
parents:
diff changeset
117 pcDescSize = db.lookupType("PcDesc").getSize();
a61af66fc99e Initial load
duke
parents:
diff changeset
118 }
a61af66fc99e Initial load
duke
parents:
diff changeset
119
a61af66fc99e Initial load
duke
parents:
diff changeset
120 public NMethod(Address addr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
121 super(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
122 }
a61af66fc99e Initial load
duke
parents:
diff changeset
123
a61af66fc99e Initial load
duke
parents:
diff changeset
124
a61af66fc99e Initial load
duke
parents:
diff changeset
125 // Accessors
a61af66fc99e Initial load
duke
parents:
diff changeset
126 public Address getAddress() {
a61af66fc99e Initial load
duke
parents:
diff changeset
127 return addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
128 }
a61af66fc99e Initial load
duke
parents:
diff changeset
129
a61af66fc99e Initial load
duke
parents:
diff changeset
130 public Method getMethod() {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 3939
diff changeset
131 return (Method)Metadata.instantiateWrapperFor(methodField.getValue(addr));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
132 }
a61af66fc99e Initial load
duke
parents:
diff changeset
133
a61af66fc99e Initial load
duke
parents:
diff changeset
134 // Type info
a61af66fc99e Initial load
duke
parents:
diff changeset
135 public boolean isNMethod() { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
136 public boolean isJavaMethod() { return !getMethod().isNative(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
137 public boolean isNativeMethod() { return getMethod().isNative(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
138 public boolean isOSRMethod() { return getEntryBCI() != VM.getVM().getInvocationEntryBCI(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
139
a61af66fc99e Initial load
duke
parents:
diff changeset
140 /** Boundaries for different parts */
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1644
diff changeset
141 public Address constantsBegin() { return contentBegin(); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
142 public Address constantsEnd() { return getEntryPoint(); }
3908
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1748
diff changeset
143 public Address instsBegin() { return codeBegin(); }
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1644
diff changeset
144 public Address instsEnd() { return headerBegin().addOffsetTo(getStubOffset()); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
145 public Address exceptionBegin() { return headerBegin().addOffsetTo(getExceptionOffset()); }
3908
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1748
diff changeset
146 public Address deoptHandlerBegin() { return headerBegin().addOffsetTo(getDeoptOffset()); }
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1748
diff changeset
147 public Address deoptMhHandlerBegin() { return headerBegin().addOffsetTo(getDeoptMhOffset()); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
148 public Address stubBegin() { return headerBegin().addOffsetTo(getStubOffset()); }
1563
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1040
diff changeset
149 public Address stubEnd() { return headerBegin().addOffsetTo(getOopsOffset()); }
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1040
diff changeset
150 public Address oopsBegin() { return headerBegin().addOffsetTo(getOopsOffset()); }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 3939
diff changeset
151 public Address oopsEnd() { return headerBegin().addOffsetTo(getMetadataOffset()); }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 3939
diff changeset
152 public Address metadataBegin() { return headerBegin().addOffsetTo(getMetadataOffset()); }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 3939
diff changeset
153 public Address metadataEnd() { return headerBegin().addOffsetTo(getScopesDataOffset()); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
154 public Address scopesDataBegin() { return headerBegin().addOffsetTo(getScopesDataOffset()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
155 public Address scopesDataEnd() { return headerBegin().addOffsetTo(getScopesPCsOffset()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
156 public Address scopesPCsBegin() { return headerBegin().addOffsetTo(getScopesPCsOffset()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
157 public Address scopesPCsEnd() { return headerBegin().addOffsetTo(getDependenciesOffset()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
158 public Address dependenciesBegin() { return headerBegin().addOffsetTo(getDependenciesOffset()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
159 public Address dependenciesEnd() { return headerBegin().addOffsetTo(getHandlerTableOffset()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
160 public Address handlerTableBegin() { return headerBegin().addOffsetTo(getHandlerTableOffset()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
161 public Address handlerTableEnd() { return headerBegin().addOffsetTo(getNulChkTableOffset()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
162 public Address nulChkTableBegin() { return headerBegin().addOffsetTo(getNulChkTableOffset()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
163 public Address nulChkTableEnd() { return headerBegin().addOffsetTo(getNMethodEndOffset()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
164
a61af66fc99e Initial load
duke
parents:
diff changeset
165 public int constantsSize() { return (int) constantsEnd() .minus(constantsBegin()); }
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1644
diff changeset
166 public int instsSize() { return (int) instsEnd() .minus(instsBegin()); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
167 public int stubSize() { return (int) stubEnd() .minus(stubBegin()); }
1563
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1040
diff changeset
168 public int oopsSize() { return (int) oopsEnd() .minus(oopsBegin()); }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 3939
diff changeset
169 public int metadataSize() { return (int) metadataEnd() .minus(metadataBegin()); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
170 public int scopesDataSize() { return (int) scopesDataEnd() .minus(scopesDataBegin()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
171 public int scopesPCsSize() { return (int) scopesPCsEnd() .minus(scopesPCsBegin()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
172 public int dependenciesSize() { return (int) dependenciesEnd().minus(dependenciesBegin()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
173 public int handlerTableSize() { return (int) handlerTableEnd().minus(handlerTableBegin()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
174 public int nulChkTableSize() { return (int) nulChkTableEnd() .minus(nulChkTableBegin()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
175 public int origPCOffset() { return (int) origPCOffsetField.getValue(addr); }
a61af66fc99e Initial load
duke
parents:
diff changeset
176
a61af66fc99e Initial load
duke
parents:
diff changeset
177 public int totalSize() {
a61af66fc99e Initial load
duke
parents:
diff changeset
178 return
a61af66fc99e Initial load
duke
parents:
diff changeset
179 constantsSize() +
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1644
diff changeset
180 instsSize() +
0
a61af66fc99e Initial load
duke
parents:
diff changeset
181 stubSize() +
a61af66fc99e Initial load
duke
parents:
diff changeset
182 scopesDataSize() +
a61af66fc99e Initial load
duke
parents:
diff changeset
183 scopesPCsSize() +
a61af66fc99e Initial load
duke
parents:
diff changeset
184 dependenciesSize() +
a61af66fc99e Initial load
duke
parents:
diff changeset
185 handlerTableSize() +
a61af66fc99e Initial load
duke
parents:
diff changeset
186 nulChkTableSize();
a61af66fc99e Initial load
duke
parents:
diff changeset
187 }
a61af66fc99e Initial load
duke
parents:
diff changeset
188
a61af66fc99e Initial load
duke
parents:
diff changeset
189 public boolean constantsContains (Address addr) { return constantsBegin() .lessThanOrEqual(addr) && constantsEnd() .greaterThan(addr); }
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1644
diff changeset
190 public boolean instsContains (Address addr) { return instsBegin() .lessThanOrEqual(addr) && instsEnd() .greaterThan(addr); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
191 public boolean stubContains (Address addr) { return stubBegin() .lessThanOrEqual(addr) && stubEnd() .greaterThan(addr); }
1563
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1040
diff changeset
192 public boolean oopsContains (Address addr) { return oopsBegin() .lessThanOrEqual(addr) && oopsEnd() .greaterThan(addr); }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 3939
diff changeset
193 public boolean metadataContains (Address addr) { return metadataBegin() .lessThanOrEqual(addr) && metadataEnd() .greaterThan(addr); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
194 public boolean scopesDataContains (Address addr) { return scopesDataBegin() .lessThanOrEqual(addr) && scopesDataEnd() .greaterThan(addr); }
a61af66fc99e Initial load
duke
parents:
diff changeset
195 public boolean scopesPCsContains (Address addr) { return scopesPCsBegin() .lessThanOrEqual(addr) && scopesPCsEnd() .greaterThan(addr); }
a61af66fc99e Initial load
duke
parents:
diff changeset
196 public boolean handlerTableContains(Address addr) { return handlerTableBegin().lessThanOrEqual(addr) && handlerTableEnd().greaterThan(addr); }
a61af66fc99e Initial load
duke
parents:
diff changeset
197 public boolean nulChkTableContains (Address addr) { return nulChkTableBegin() .lessThanOrEqual(addr) && nulChkTableEnd() .greaterThan(addr); }
a61af66fc99e Initial load
duke
parents:
diff changeset
198
3939
f6f3bb0ee072 7088955: add C2 IR support to the SA
never
parents: 3908
diff changeset
199 public int getOopsLength() { return (int) (oopsSize() / VM.getVM().getOopSize()); }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 3939
diff changeset
200 public int getMetadataLength() { return (int) (metadataSize() / VM.getVM().getOopSize()); }
3939
f6f3bb0ee072 7088955: add C2 IR support to the SA
never
parents: 3908
diff changeset
201
0
a61af66fc99e Initial load
duke
parents:
diff changeset
202 /** Entry points */
a61af66fc99e Initial load
duke
parents:
diff changeset
203 public Address getEntryPoint() { return entryPointField.getValue(addr); }
a61af66fc99e Initial load
duke
parents:
diff changeset
204 public Address getVerifiedEntryPoint() { return verifiedEntryPointField.getValue(addr); }
a61af66fc99e Initial load
duke
parents:
diff changeset
205
1563
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1040
diff changeset
206 /** Support for oops in scopes and relocs. Note: index 0 is reserved for null. */
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1040
diff changeset
207 public OopHandle getOopAt(int index) {
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1040
diff changeset
208 if (index == 0) return null;
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1040
diff changeset
209 if (Assert.ASSERTS_ENABLED) {
3939
f6f3bb0ee072 7088955: add C2 IR support to the SA
never
parents: 3908
diff changeset
210 Assert.that(index > 0 && index <= getOopsLength(), "must be a valid non-zero index");
1563
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1040
diff changeset
211 }
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1040
diff changeset
212 return oopsBegin().getOopHandleAt((index - 1) * VM.getVM().getOopSize());
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1040
diff changeset
213 }
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1040
diff changeset
214
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 3939
diff changeset
215 /** Support for metadata in scopes and relocs. Note: index 0 is reserved for null. */
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 3939
diff changeset
216 public Address getMetadataAt(int index) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 3939
diff changeset
217 if (index == 0) return null;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 3939
diff changeset
218 if (Assert.ASSERTS_ENABLED) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 3939
diff changeset
219 Assert.that(index > 0 && index <= getMetadataLength(), "must be a valid non-zero index");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 3939
diff changeset
220 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 3939
diff changeset
221 return metadataBegin().getAddressAt((index - 1) * VM.getVM().getOopSize());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 3939
diff changeset
222 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 3939
diff changeset
223
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 3939
diff changeset
224 public Method getMethodAt(int index) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 3939
diff changeset
225 return (Method)Metadata.instantiateWrapperFor(getMetadataAt(index));
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 3939
diff changeset
226 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 3939
diff changeset
227
0
a61af66fc99e Initial load
duke
parents:
diff changeset
228 // FIXME: add interpreter_entry_point()
a61af66fc99e Initial load
duke
parents:
diff changeset
229 // FIXME: add lazy_interpreter_entry_point() for C2
a61af66fc99e Initial load
duke
parents:
diff changeset
230
a61af66fc99e Initial load
duke
parents:
diff changeset
231 // **********
a61af66fc99e Initial load
duke
parents:
diff changeset
232 // * FIXME: * ADD ACCESS TO FLAGS!!!!
a61af66fc99e Initial load
duke
parents:
diff changeset
233 // **********
a61af66fc99e Initial load
duke
parents:
diff changeset
234 // public boolean isInUse();
a61af66fc99e Initial load
duke
parents:
diff changeset
235 // public boolean isAlive();
a61af66fc99e Initial load
duke
parents:
diff changeset
236 // public boolean isNotEntrant();
a61af66fc99e Initial load
duke
parents:
diff changeset
237 // public boolean isZombie();
a61af66fc99e Initial load
duke
parents:
diff changeset
238
a61af66fc99e Initial load
duke
parents:
diff changeset
239 // ********************************
a61af66fc99e Initial load
duke
parents:
diff changeset
240 // * MAJOR FIXME: MAJOR HACK HERE *
a61af66fc99e Initial load
duke
parents:
diff changeset
241 // ********************************
a61af66fc99e Initial load
duke
parents:
diff changeset
242 public boolean isZombie() { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
243
a61af66fc99e Initial load
duke
parents:
diff changeset
244 // public boolean isUnloaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
245 // public boolean isYoung();
a61af66fc99e Initial load
duke
parents:
diff changeset
246 // public boolean isOld();
a61af66fc99e Initial load
duke
parents:
diff changeset
247 // public int age();
a61af66fc99e Initial load
duke
parents:
diff changeset
248 // public boolean isMarkedForDeoptimization();
a61af66fc99e Initial load
duke
parents:
diff changeset
249 // public boolean isMarkedForUnloading();
a61af66fc99e Initial load
duke
parents:
diff changeset
250 // public boolean isMarkedForReclamation();
a61af66fc99e Initial load
duke
parents:
diff changeset
251 // public int level();
a61af66fc99e Initial load
duke
parents:
diff changeset
252 // public int version();
a61af66fc99e Initial load
duke
parents:
diff changeset
253
a61af66fc99e Initial load
duke
parents:
diff changeset
254 // FIXME: add mutators for above
a61af66fc99e Initial load
duke
parents:
diff changeset
255 // FIXME: add exception cache access?
a61af66fc99e Initial load
duke
parents:
diff changeset
256
a61af66fc99e Initial load
duke
parents:
diff changeset
257 /** On-stack replacement support */
a61af66fc99e Initial load
duke
parents:
diff changeset
258 // FIXME: add mutators
a61af66fc99e Initial load
duke
parents:
diff changeset
259 public int getOSREntryBCI() {
a61af66fc99e Initial load
duke
parents:
diff changeset
260 if (Assert.ASSERTS_ENABLED) {
a61af66fc99e Initial load
duke
parents:
diff changeset
261 Assert.that(getEntryBCI() != VM.getVM().getInvocationEntryBCI(), "wrong kind of nmethod");
a61af66fc99e Initial load
duke
parents:
diff changeset
262 }
a61af66fc99e Initial load
duke
parents:
diff changeset
263 return getEntryBCI();
a61af66fc99e Initial load
duke
parents:
diff changeset
264 }
a61af66fc99e Initial load
duke
parents:
diff changeset
265
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
266 public NMethod getOSRLink() {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
267 return (NMethod) VMObjectFactory.newObject(NMethod.class, osrLinkField.getValue(addr));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
268 }
a61af66fc99e Initial load
duke
parents:
diff changeset
269
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
270 public NMethod getScavengeRootLink() {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
271 return (NMethod) VMObjectFactory.newObject(NMethod.class, scavengeRootLinkField.getValue(addr));
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
272 }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
273
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
274 public int getScavengeRootState() {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
275 return (int) scavengeRootStateField.getValue(addr);
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
276 }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
277
3908
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1748
diff changeset
278 // MethodHandle
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1748
diff changeset
279 public boolean isMethodHandleReturn(Address returnPc) {
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1748
diff changeset
280 // Hard to read a bit fields from Java and it's only there for performance
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1748
diff changeset
281 // so just go directly to the PCDesc
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1748
diff changeset
282 // if (!hasMethodHandleInvokes()) return false;
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1748
diff changeset
283 PCDesc pd = getPCDescAt(returnPc);
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1748
diff changeset
284 if (pd == null)
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1748
diff changeset
285 return false;
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1748
diff changeset
286 return pd.isMethodHandleInvoke();
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1748
diff changeset
287 }
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1748
diff changeset
288
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1748
diff changeset
289 // Deopt
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1748
diff changeset
290 // Return true is the PC is one would expect if the frame is being deopted.
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1748
diff changeset
291 public boolean isDeoptPc (Address pc) { return isDeoptEntry(pc) || isDeoptMhEntry(pc); }
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1748
diff changeset
292 public boolean isDeoptEntry (Address pc) { return pc == deoptHandlerBegin(); }
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1748
diff changeset
293 public boolean isDeoptMhEntry (Address pc) { return pc == deoptMhHandlerBegin(); }
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
294
0
a61af66fc99e Initial load
duke
parents:
diff changeset
295 /** Tells whether frames described by this nmethod can be
a61af66fc99e Initial load
duke
parents:
diff changeset
296 deoptimized. Note: native wrappers cannot be deoptimized. */
a61af66fc99e Initial load
duke
parents:
diff changeset
297 public boolean canBeDeoptimized() { return isJavaMethod(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
298
a61af66fc99e Initial load
duke
parents:
diff changeset
299 // FIXME: add inline cache support
a61af66fc99e Initial load
duke
parents:
diff changeset
300 // FIXME: add flush()
a61af66fc99e Initial load
duke
parents:
diff changeset
301
a61af66fc99e Initial load
duke
parents:
diff changeset
302 public boolean isLockedByVM() { return lockCountField.getValue(addr) > 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
303
a61af66fc99e Initial load
duke
parents:
diff changeset
304 // FIXME: add mark_as_seen_on_stack
a61af66fc99e Initial load
duke
parents:
diff changeset
305 // FIXME: add can_not_entrant_be_converted
a61af66fc99e Initial load
duke
parents:
diff changeset
306
a61af66fc99e Initial load
duke
parents:
diff changeset
307 // FIXME: add GC support
a61af66fc99e Initial load
duke
parents:
diff changeset
308 // void follow_roots_or_mark_for_unloading(bool unloading_occurred, bool& marked_for_unloading);
a61af66fc99e Initial load
duke
parents:
diff changeset
309 // void follow_root_or_mark_for_unloading(oop* root, bool unloading_occurred, bool& marked_for_unloading);
a61af66fc99e Initial load
duke
parents:
diff changeset
310 // void preserve_callee_argument_oops(frame fr, const RegisterMap *reg_map, void f(oop*));
a61af66fc99e Initial load
duke
parents:
diff changeset
311 // void adjust_pointers();
a61af66fc99e Initial load
duke
parents:
diff changeset
312
a61af66fc99e Initial load
duke
parents:
diff changeset
313 /** Finds a PCDesc with real-pc equal to "pc" */
a61af66fc99e Initial load
duke
parents:
diff changeset
314 public PCDesc getPCDescAt(Address pc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
315 // FIXME: consider adding cache like the one down in the VM
a61af66fc99e Initial load
duke
parents:
diff changeset
316 for (Address p = scopesPCsBegin(); p.lessThan(scopesPCsEnd()); p = p.addOffsetTo(pcDescSize)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
317 PCDesc pcDesc = new PCDesc(p);
a61af66fc99e Initial load
duke
parents:
diff changeset
318 if (pcDesc.getRealPC(this).equals(pc)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
319 return pcDesc;
a61af66fc99e Initial load
duke
parents:
diff changeset
320 }
a61af66fc99e Initial load
duke
parents:
diff changeset
321 }
a61af66fc99e Initial load
duke
parents:
diff changeset
322 return null;
a61af66fc99e Initial load
duke
parents:
diff changeset
323 }
a61af66fc99e Initial load
duke
parents:
diff changeset
324
a61af66fc99e Initial load
duke
parents:
diff changeset
325 /** ScopeDesc for an instruction */
a61af66fc99e Initial load
duke
parents:
diff changeset
326 public ScopeDesc getScopeDescAt(Address pc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
327 PCDesc pd = getPCDescAt(pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
328 if (Assert.ASSERTS_ENABLED) {
a61af66fc99e Initial load
duke
parents:
diff changeset
329 Assert.that(pd != null, "scope must be present");
a61af66fc99e Initial load
duke
parents:
diff changeset
330 }
1040
873ec3787992 6892186: SA does not dump debug info for scalar replaced objects
kvn
parents: 989
diff changeset
331 return new ScopeDesc(this, pd.getScopeDecodeOffset(), pd.getObjDecodeOffset(), pd.getReexecute());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
332 }
a61af66fc99e Initial load
duke
parents:
diff changeset
333
a61af66fc99e Initial load
duke
parents:
diff changeset
334 /** This is only for use by the debugging system, and is only
a61af66fc99e Initial load
duke
parents:
diff changeset
335 intended for use in the topmost frame, where we are not
a61af66fc99e Initial load
duke
parents:
diff changeset
336 guaranteed to be at a PC for which we have a PCDesc. It finds
a61af66fc99e Initial load
duke
parents:
diff changeset
337 the PCDesc with realPC closest to the current PC. */
a61af66fc99e Initial load
duke
parents:
diff changeset
338 public PCDesc getPCDescNearDbg(Address pc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
339 PCDesc bestGuessPCDesc = null;
a61af66fc99e Initial load
duke
parents:
diff changeset
340 long bestDistance = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
341 for (Address p = scopesPCsBegin(); p.lessThan(scopesPCsEnd()); p = p.addOffsetTo(pcDescSize)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
342 PCDesc pcDesc = new PCDesc(p);
a61af66fc99e Initial load
duke
parents:
diff changeset
343 // In case pc is null
a61af66fc99e Initial load
duke
parents:
diff changeset
344 long distance = -pcDesc.getRealPC(this).minus(pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
345 if ((bestGuessPCDesc == null) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
346 ((distance >= 0) && (distance < bestDistance))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
347 bestGuessPCDesc = pcDesc;
a61af66fc99e Initial load
duke
parents:
diff changeset
348 bestDistance = distance;
a61af66fc99e Initial load
duke
parents:
diff changeset
349 }
a61af66fc99e Initial load
duke
parents:
diff changeset
350 }
a61af66fc99e Initial load
duke
parents:
diff changeset
351 return bestGuessPCDesc;
a61af66fc99e Initial load
duke
parents:
diff changeset
352 }
a61af66fc99e Initial load
duke
parents:
diff changeset
353
6782
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
354 PCDesc find_pc_desc(long pc, boolean approximate) {
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
355 return find_pc_desc_internal(pc, approximate);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
356 }
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
357
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
358 // Finds a PcDesc with real-pc equal to "pc"
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
359 PCDesc find_pc_desc_internal(long pc, boolean approximate) {
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
360 long base_address = VM.getAddressValue(codeBegin());
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
361 int pc_offset = (int) (pc - base_address);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
362
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
363 // Fallback algorithm: quasi-linear search for the PcDesc
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
364 // Find the last pc_offset less than the given offset.
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
365 // The successor must be the required match, if there is a match at all.
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
366 // (Use a fixed radix to avoid expensive affine pointer arithmetic.)
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
367 Address lower = scopesPCsBegin();
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
368 Address upper = scopesPCsEnd();
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
369 upper = upper.addOffsetTo(-pcDescSize); // exclude final sentinel
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
370 if (lower.greaterThan(upper)) return null; // native method; no PcDescs at all
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
371
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
372 // Take giant steps at first (4096, then 256, then 16, then 1)
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
373 int LOG2_RADIX = 4;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
374 int RADIX = (1 << LOG2_RADIX);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
375 Address mid;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
376 for (int step = (1 << (LOG2_RADIX*3)); step > 1; step >>= LOG2_RADIX) {
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
377 while ((mid = lower.addOffsetTo(step * pcDescSize)).lessThan(upper)) {
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
378 PCDesc m = new PCDesc(mid);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
379 if (m.getPCOffset() < pc_offset) {
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
380 lower = mid;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
381 } else {
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
382 upper = mid;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
383 break;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
384 }
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
385 }
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
386 }
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
387 // Sneak up on the value with a linear search of length ~16.
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
388 while (true) {
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
389 mid = lower.addOffsetTo(pcDescSize);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
390 PCDesc m = new PCDesc(mid);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
391 if (m.getPCOffset() < pc_offset) {
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
392 lower = mid;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
393 } else {
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
394 upper = mid;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
395 break;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
396 }
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
397 }
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
398
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
399 PCDesc u = new PCDesc(upper);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
400 if (match_desc(u, pc_offset, approximate)) {
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
401 return u;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
402 } else {
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
403 return null;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
404 }
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
405 }
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
406
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
407 // ScopeDesc retrieval operation
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
408 PCDesc pc_desc_at(long pc) { return find_pc_desc(pc, false); }
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
409 // pc_desc_near returns the first PCDesc at or after the givne pc.
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
410 PCDesc pc_desc_near(long pc) { return find_pc_desc(pc, true); }
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
411
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
412 // Return a the last scope in (begin..end]
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
413 public ScopeDesc scope_desc_in(long begin, long end) {
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
414 PCDesc p = pc_desc_near(begin+1);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
415 if (p != null && VM.getAddressValue(p.getRealPC(this)) <= end) {
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
416 return new ScopeDesc(this, p.getScopeDecodeOffset(), p.getObjDecodeOffset(), p.getReexecute());
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
417 }
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
418 return null;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
419 }
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
420
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
421 static boolean match_desc(PCDesc pc, int pc_offset, boolean approximate) {
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
422 if (!approximate) {
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
423 return pc.getPCOffset() == pc_offset;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
424 } else {
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
425 PCDesc prev = new PCDesc(pc.getAddress().addOffsetTo(-pcDescSize));
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
426 return prev.getPCOffset() < pc_offset && pc_offset <= pc.getPCOffset();
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
427 }
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
428 }
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 6725
diff changeset
429
0
a61af66fc99e Initial load
duke
parents:
diff changeset
430 /** This is only for use by the debugging system, and is only
a61af66fc99e Initial load
duke
parents:
diff changeset
431 intended for use in the topmost frame, where we are not
a61af66fc99e Initial load
duke
parents:
diff changeset
432 guaranteed to be at a PC for which we have a PCDesc. It finds
a61af66fc99e Initial load
duke
parents:
diff changeset
433 the ScopeDesc closest to the current PC. NOTE that this may
a61af66fc99e Initial load
duke
parents:
diff changeset
434 return NULL for compiled methods which don't have any
a61af66fc99e Initial load
duke
parents:
diff changeset
435 ScopeDescs! */
a61af66fc99e Initial load
duke
parents:
diff changeset
436 public ScopeDesc getScopeDescNearDbg(Address pc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
437 PCDesc pd = getPCDescNearDbg(pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
438 if (pd == null) return null;
1040
873ec3787992 6892186: SA does not dump debug info for scalar replaced objects
kvn
parents: 989
diff changeset
439 return new ScopeDesc(this, pd.getScopeDecodeOffset(), pd.getObjDecodeOffset(), pd.getReexecute());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
440 }
a61af66fc99e Initial load
duke
parents:
diff changeset
441
1040
873ec3787992 6892186: SA does not dump debug info for scalar replaced objects
kvn
parents: 989
diff changeset
442 public Map/*<Address, PCDesc>*/ getSafepoints() {
873ec3787992 6892186: SA does not dump debug info for scalar replaced objects
kvn
parents: 989
diff changeset
443 Map safepoints = new HashMap(); // Map<Address, PCDesc>
0
a61af66fc99e Initial load
duke
parents:
diff changeset
444 sun.jvm.hotspot.debugger.Address p = null;
a61af66fc99e Initial load
duke
parents:
diff changeset
445 for (p = scopesPCsBegin(); p.lessThan(scopesPCsEnd());
a61af66fc99e Initial load
duke
parents:
diff changeset
446 p = p.addOffsetTo(pcDescSize)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
447 PCDesc pcDesc = new PCDesc(p);
a61af66fc99e Initial load
duke
parents:
diff changeset
448 sun.jvm.hotspot.debugger.Address pc = pcDesc.getRealPC(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
449 safepoints.put(pc, pcDesc);
a61af66fc99e Initial load
duke
parents:
diff changeset
450 }
a61af66fc99e Initial load
duke
parents:
diff changeset
451 return safepoints;
a61af66fc99e Initial load
duke
parents:
diff changeset
452 }
a61af66fc99e Initial load
duke
parents:
diff changeset
453
a61af66fc99e Initial load
duke
parents:
diff changeset
454 // FIXME: add getPCOffsetForBCI()
a61af66fc99e Initial load
duke
parents:
diff changeset
455 // FIXME: add embeddedOopAt()
a61af66fc99e Initial load
duke
parents:
diff changeset
456 // FIXME: add isDependentOn()
a61af66fc99e Initial load
duke
parents:
diff changeset
457 // FIXME: add isPatchableAt()
a61af66fc99e Initial load
duke
parents:
diff changeset
458
a61af66fc99e Initial load
duke
parents:
diff changeset
459 /** Support for code generation. Only here for proof-of-concept. */
a61af66fc99e Initial load
duke
parents:
diff changeset
460 public static int getEntryPointOffset() { return (int) entryPointField.getOffset(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
461 public static int getVerifiedEntryPointOffset() { return (int) verifiedEntryPointField.getOffset(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
462 public static int getOSREntryPointOffset() { return (int) osrEntryPointField.getOffset(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
463 public static int getEntryBCIOffset() { return (int) entryBCIField.getOffset(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
464 /** NOTE: renamed from "method_offset_in_bytes" */
a61af66fc99e Initial load
duke
parents:
diff changeset
465 public static int getMethodOffset() { return (int) methodField.getOffset(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
466
a61af66fc99e Initial load
duke
parents:
diff changeset
467 public void print() {
a61af66fc99e Initial load
duke
parents:
diff changeset
468 printOn(System.out);
a61af66fc99e Initial load
duke
parents:
diff changeset
469 }
a61af66fc99e Initial load
duke
parents:
diff changeset
470
1563
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1040
diff changeset
471 protected void printComponentsOn(PrintStream tty) {
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1040
diff changeset
472 // FIXME: add relocation information
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1644
diff changeset
473 tty.println(" content: [" + contentBegin() + ", " + contentEnd() + "), " +
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1644
diff changeset
474 " code: [" + codeBegin() + ", " + codeEnd() + "), " +
1563
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1040
diff changeset
475 " data: [" + dataBegin() + ", " + dataEnd() + "), " +
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1040
diff changeset
476 " oops: [" + oopsBegin() + ", " + oopsEnd() + "), " +
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1040
diff changeset
477 " frame size: " + getFrameSize());
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1040
diff changeset
478 }
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1040
diff changeset
479
0
a61af66fc99e Initial load
duke
parents:
diff changeset
480 public String toString() {
a61af66fc99e Initial load
duke
parents:
diff changeset
481 Method method = getMethod();
a61af66fc99e Initial load
duke
parents:
diff changeset
482 return "NMethod for " +
a61af66fc99e Initial load
duke
parents:
diff changeset
483 method.getMethodHolder().getName().asString() + "." +
a61af66fc99e Initial load
duke
parents:
diff changeset
484 method.getName().asString() + method.getSignature().asString() + "==>n" +
a61af66fc99e Initial load
duke
parents:
diff changeset
485 super.toString();
a61af66fc99e Initial load
duke
parents:
diff changeset
486 }
a61af66fc99e Initial load
duke
parents:
diff changeset
487
a61af66fc99e Initial load
duke
parents:
diff changeset
488 public String flagsToString() {
a61af66fc99e Initial load
duke
parents:
diff changeset
489 // FIXME need access to flags...
a61af66fc99e Initial load
duke
parents:
diff changeset
490 return "";
a61af66fc99e Initial load
duke
parents:
diff changeset
491 }
a61af66fc99e Initial load
duke
parents:
diff changeset
492
a61af66fc99e Initial load
duke
parents:
diff changeset
493 public String getName() {
a61af66fc99e Initial load
duke
parents:
diff changeset
494 Method method = getMethod();
a61af66fc99e Initial load
duke
parents:
diff changeset
495 return "NMethod for " +
a61af66fc99e Initial load
duke
parents:
diff changeset
496 method.getMethodHolder().getName().asString() + "." +
a61af66fc99e Initial load
duke
parents:
diff changeset
497 method.getName().asString() +
a61af66fc99e Initial load
duke
parents:
diff changeset
498 method.getSignature().asString();
a61af66fc99e Initial load
duke
parents:
diff changeset
499 }
a61af66fc99e Initial load
duke
parents:
diff changeset
500
6972
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6782
diff changeset
501 public void dumpReplayData(PrintStream out) {
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6782
diff changeset
502 HashMap h = new HashMap();
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6782
diff changeset
503 for (int i = 1; i < getMetadataLength(); i++) {
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6782
diff changeset
504 Metadata meta = Metadata.instantiateWrapperFor(getMetadataAt(i));
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6782
diff changeset
505 System.err.println(meta);
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6782
diff changeset
506 if (h.get(meta) != null) continue;
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6782
diff changeset
507 h.put(meta, meta);
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6782
diff changeset
508 if (meta instanceof InstanceKlass) {
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6782
diff changeset
509 ((InstanceKlass)meta).dumpReplayData(out);
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6782
diff changeset
510 } else if (meta instanceof Method) {
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6782
diff changeset
511 ((Method)meta).dumpReplayData(out);
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6782
diff changeset
512 MethodData mdo = ((Method)meta).getMethodData();
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6782
diff changeset
513 if (mdo != null) {
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6782
diff changeset
514 mdo.dumpReplayData(out);
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6782
diff changeset
515 }
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6782
diff changeset
516 }
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6782
diff changeset
517 }
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6782
diff changeset
518 Method method = getMethod();
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6782
diff changeset
519 if (h.get(method) == null) {
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6782
diff changeset
520 method.dumpReplayData(out);
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6782
diff changeset
521 MethodData mdo = method.getMethodData();
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6782
diff changeset
522 if (mdo != null) {
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6782
diff changeset
523 mdo.dumpReplayData(out);
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6782
diff changeset
524 }
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6782
diff changeset
525 }
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6782
diff changeset
526 if (h.get(method.getMethodHolder()) == null) {
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6782
diff changeset
527 ((InstanceKlass)method.getMethodHolder()).dumpReplayData(out);
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6782
diff changeset
528 }
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6782
diff changeset
529 Klass holder = method.getMethodHolder();
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6782
diff changeset
530 out.println("compile " + holder.getName().asString() + " " +
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6782
diff changeset
531 OopUtilities.escapeString(method.getName().asString()) + " " +
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6782
diff changeset
532 method.getSignature().asString() + " " +
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6782
diff changeset
533 getEntryBCI());
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6782
diff changeset
534
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6782
diff changeset
535 }
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6782
diff changeset
536
0
a61af66fc99e Initial load
duke
parents:
diff changeset
537 //--------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
538 // Internals only below this point
a61af66fc99e Initial load
duke
parents:
diff changeset
539 //
a61af66fc99e Initial load
duke
parents:
diff changeset
540
a61af66fc99e Initial load
duke
parents:
diff changeset
541 private int getEntryBCI() { return (int) entryBCIField .getValue(addr); }
a61af66fc99e Initial load
duke
parents:
diff changeset
542 private int getExceptionOffset() { return (int) exceptionOffsetField .getValue(addr); }
a61af66fc99e Initial load
duke
parents:
diff changeset
543 private int getDeoptOffset() { return (int) deoptOffsetField .getValue(addr); }
3908
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 1748
diff changeset
544 private int getDeoptMhOffset() { return (int) deoptMhOffsetField .getValue(addr); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
545 private int getStubOffset() { return (int) stubOffsetField .getValue(addr); }
1563
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1040
diff changeset
546 private int getOopsOffset() { return (int) oopsOffsetField .getValue(addr); }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 3939
diff changeset
547 private int getMetadataOffset() { return (int) metadataOffsetField .getValue(addr); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
548 private int getScopesDataOffset() { return (int) scopesDataOffsetField .getValue(addr); }
a61af66fc99e Initial load
duke
parents:
diff changeset
549 private int getScopesPCsOffset() { return (int) scopesPCsOffsetField .getValue(addr); }
a61af66fc99e Initial load
duke
parents:
diff changeset
550 private int getDependenciesOffset() { return (int) dependenciesOffsetField.getValue(addr); }
a61af66fc99e Initial load
duke
parents:
diff changeset
551 private int getHandlerTableOffset() { return (int) handlerTableOffsetField.getValue(addr); }
a61af66fc99e Initial load
duke
parents:
diff changeset
552 private int getNulChkTableOffset() { return (int) nulChkTableOffsetField .getValue(addr); }
a61af66fc99e Initial load
duke
parents:
diff changeset
553 private int getNMethodEndOffset() { return (int) nmethodEndOffsetField .getValue(addr); }
a61af66fc99e Initial load
duke
parents:
diff changeset
554 }