annotate agent/src/share/classes/sun/jvm/hotspot/oops/Method.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 18fb7da42534
children b2dbd323c668
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
6123
2fe087c3e814 7172967: Eliminate constMethod's _method backpointer to methodOop.
jiangli
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: 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.oops;
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.code.*;
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.interpreter.*;
a61af66fc99e Initial load
duke
parents:
diff changeset
32 import sun.jvm.hotspot.memory.*;
a61af66fc99e Initial load
duke
parents:
diff changeset
33 import sun.jvm.hotspot.runtime.*;
a61af66fc99e Initial load
duke
parents:
diff changeset
34 import sun.jvm.hotspot.types.*;
a61af66fc99e Initial load
duke
parents:
diff changeset
35 import sun.jvm.hotspot.utilities.*;
a61af66fc99e Initial load
duke
parents:
diff changeset
36
a61af66fc99e Initial load
duke
parents:
diff changeset
37 // A Method represents a Java method
a61af66fc99e Initial load
duke
parents:
diff changeset
38
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
39 public class Method extends Metadata {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
40 static {
a61af66fc99e Initial load
duke
parents:
diff changeset
41 VM.registerVMInitializedObserver(new Observer() {
a61af66fc99e Initial load
duke
parents:
diff changeset
42 public void update(Observable o, Object data) {
a61af66fc99e Initial load
duke
parents:
diff changeset
43 initialize(VM.getVM().getTypeDataBase());
a61af66fc99e Initial load
duke
parents:
diff changeset
44 }
a61af66fc99e Initial load
duke
parents:
diff changeset
45 });
a61af66fc99e Initial load
duke
parents:
diff changeset
46 }
a61af66fc99e Initial load
duke
parents:
diff changeset
47
a61af66fc99e Initial load
duke
parents:
diff changeset
48 private static synchronized void initialize(TypeDataBase db) throws WrongTypeException {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
49 Type type = db.lookupType("Method");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
50 constMethod = type.getAddressField("_constMethod");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
51 methodData = type.getAddressField("_method_data");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
52 methodSize = new CIntField(type.getCIntegerField("_method_size"), 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
53 maxStack = new CIntField(type.getCIntegerField("_max_stack"), 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
54 maxLocals = new CIntField(type.getCIntegerField("_max_locals"), 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
55 sizeOfParameters = new CIntField(type.getCIntegerField("_size_of_parameters"), 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
56 accessFlags = new CIntField(type.getCIntegerField("_access_flags"), 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
57 code = type.getAddressField("_code");
a61af66fc99e Initial load
duke
parents:
diff changeset
58 vtableIndex = new CIntField(type.getCIntegerField("_vtable_index"), 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
59 if (!VM.getVM().isCore()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
60 invocationCounter = new CIntField(type.getCIntegerField("_invocation_counter"), 0);
3939
f6f3bb0ee072 7088955: add C2 IR support to the SA
never
parents: 3838
diff changeset
61 backedgeCounter = new CIntField(type.getCIntegerField("_backedge_counter"), 0);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
62 }
a61af66fc99e Initial load
duke
parents:
diff changeset
63 bytecodeOffset = type.getSize();
a61af66fc99e Initial load
duke
parents:
diff changeset
64
3939
f6f3bb0ee072 7088955: add C2 IR support to the SA
never
parents: 3838
diff changeset
65 interpreterThrowoutCountField = new CIntField(type.getCIntegerField("_interpreter_throwout_count"), 0);
f6f3bb0ee072 7088955: add C2 IR support to the SA
never
parents: 3838
diff changeset
66 interpreterInvocationCountField = new CIntField(type.getCIntegerField("_interpreter_invocation_count"), 0);
f6f3bb0ee072 7088955: add C2 IR support to the SA
never
parents: 3838
diff changeset
67
0
a61af66fc99e Initial load
duke
parents:
diff changeset
68 /*
a61af66fc99e Initial load
duke
parents:
diff changeset
69 interpreterEntry = type.getAddressField("_interpreter_entry");
a61af66fc99e Initial load
duke
parents:
diff changeset
70 fromCompiledCodeEntryPoint = type.getAddressField("_from_compiled_code_entry_point");
a61af66fc99e Initial load
duke
parents:
diff changeset
71
a61af66fc99e Initial load
duke
parents:
diff changeset
72 */
a61af66fc99e Initial load
duke
parents:
diff changeset
73 objectInitializerName = null;
a61af66fc99e Initial load
duke
parents:
diff changeset
74 classInitializerName = null;
a61af66fc99e Initial load
duke
parents:
diff changeset
75 }
a61af66fc99e Initial load
duke
parents:
diff changeset
76
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
77 public Method(Address addr) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
78 super(addr);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
79 }
a61af66fc99e Initial load
duke
parents:
diff changeset
80
a61af66fc99e Initial load
duke
parents:
diff changeset
81 public boolean isMethod() { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
82
a61af66fc99e Initial load
duke
parents:
diff changeset
83 // Fields
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
84 private static AddressField constMethod;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
85 private static AddressField methodData;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
86 private static CIntField methodSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
87 private static CIntField maxStack;
a61af66fc99e Initial load
duke
parents:
diff changeset
88 private static CIntField maxLocals;
a61af66fc99e Initial load
duke
parents:
diff changeset
89 private static CIntField sizeOfParameters;
a61af66fc99e Initial load
duke
parents:
diff changeset
90 private static CIntField accessFlags;
a61af66fc99e Initial load
duke
parents:
diff changeset
91 private static CIntField vtableIndex;
a61af66fc99e Initial load
duke
parents:
diff changeset
92 private static CIntField invocationCounter;
3939
f6f3bb0ee072 7088955: add C2 IR support to the SA
never
parents: 3838
diff changeset
93 private static CIntField backedgeCounter;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
94 private static long bytecodeOffset;
a61af66fc99e Initial load
duke
parents:
diff changeset
95
a61af66fc99e Initial load
duke
parents:
diff changeset
96 private static AddressField code;
a61af66fc99e Initial load
duke
parents:
diff changeset
97
3939
f6f3bb0ee072 7088955: add C2 IR support to the SA
never
parents: 3838
diff changeset
98 private static CIntField interpreterThrowoutCountField;
f6f3bb0ee072 7088955: add C2 IR support to the SA
never
parents: 3838
diff changeset
99 private static CIntField interpreterInvocationCountField;
f6f3bb0ee072 7088955: add C2 IR support to the SA
never
parents: 3838
diff changeset
100
0
a61af66fc99e Initial load
duke
parents:
diff changeset
101 // constant method names - <init>, <clinit>
a61af66fc99e Initial load
duke
parents:
diff changeset
102 // Initialized lazily to avoid initialization ordering dependencies between Method and SymbolTable
a61af66fc99e Initial load
duke
parents:
diff changeset
103 private static Symbol objectInitializerName;
a61af66fc99e Initial load
duke
parents:
diff changeset
104 private static Symbol classInitializerName;
a61af66fc99e Initial load
duke
parents:
diff changeset
105 private static Symbol objectInitializerName() {
a61af66fc99e Initial load
duke
parents:
diff changeset
106 if (objectInitializerName == null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
107 objectInitializerName = VM.getVM().getSymbolTable().probe("<init>");
a61af66fc99e Initial load
duke
parents:
diff changeset
108 }
a61af66fc99e Initial load
duke
parents:
diff changeset
109 return objectInitializerName;
a61af66fc99e Initial load
duke
parents:
diff changeset
110 }
a61af66fc99e Initial load
duke
parents:
diff changeset
111 private static Symbol classInitializerName() {
a61af66fc99e Initial load
duke
parents:
diff changeset
112 if (classInitializerName == null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
113 classInitializerName = VM.getVM().getSymbolTable().probe("<clinit>");
a61af66fc99e Initial load
duke
parents:
diff changeset
114 }
a61af66fc99e Initial load
duke
parents:
diff changeset
115 return classInitializerName;
a61af66fc99e Initial load
duke
parents:
diff changeset
116 }
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 private static AddressCField interpreterEntry;
a61af66fc99e Initial load
duke
parents:
diff changeset
121 private static AddressCField fromCompiledCodeEntryPoint;
a61af66fc99e Initial load
duke
parents:
diff changeset
122 */
a61af66fc99e Initial load
duke
parents:
diff changeset
123
a61af66fc99e Initial load
duke
parents:
diff changeset
124 // Accessors for declared fields
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
125 public ConstMethod getConstMethod() {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
126 Address addr = constMethod.getValue(getAddress());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
127 return (ConstMethod) VMObjectFactory.newObject(ConstMethod.class, addr);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
128 }
6123
2fe087c3e814 7172967: Eliminate constMethod's _method backpointer to methodOop.
jiangli
parents: 3939
diff changeset
129 public ConstantPool getConstants() {
2fe087c3e814 7172967: Eliminate constMethod's _method backpointer to methodOop.
jiangli
parents: 3939
diff changeset
130 return getConstMethod().getConstants();
2fe087c3e814 7172967: Eliminate constMethod's _method backpointer to methodOop.
jiangli
parents: 3939
diff changeset
131 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
132 public MethodData getMethodData() {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
133 Address addr = methodData.getValue(getAddress());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
134 return (MethodData) VMObjectFactory.newObject(MethodData.class, addr);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
135 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
136 /** WARNING: this is in words, not useful in this system; use getObjectSize() instead */
a61af66fc99e Initial load
duke
parents:
diff changeset
137 public long getMethodSize() { return methodSize.getValue(this); }
a61af66fc99e Initial load
duke
parents:
diff changeset
138 public long getMaxStack() { return maxStack.getValue(this); }
a61af66fc99e Initial load
duke
parents:
diff changeset
139 public long getMaxLocals() { return maxLocals.getValue(this); }
a61af66fc99e Initial load
duke
parents:
diff changeset
140 public long getSizeOfParameters() { return sizeOfParameters.getValue(this); }
a61af66fc99e Initial load
duke
parents:
diff changeset
141 public long getNameIndex() { return getConstMethod().getNameIndex(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
142 public long getSignatureIndex() { return getConstMethod().getSignatureIndex(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
143 public long getGenericSignatureIndex() { return getConstMethod().getGenericSignatureIndex(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
144 public long getAccessFlags() { return accessFlags.getValue(this); }
a61af66fc99e Initial load
duke
parents:
diff changeset
145 public long getCodeSize() { return getConstMethod().getCodeSize(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
146 public long getVtableIndex() { return vtableIndex.getValue(this); }
a61af66fc99e Initial load
duke
parents:
diff changeset
147 public long getInvocationCounter() {
a61af66fc99e Initial load
duke
parents:
diff changeset
148 if (Assert.ASSERTS_ENABLED) {
a61af66fc99e Initial load
duke
parents:
diff changeset
149 Assert.that(!VM.getVM().isCore(), "must not be used in core build");
a61af66fc99e Initial load
duke
parents:
diff changeset
150 }
a61af66fc99e Initial load
duke
parents:
diff changeset
151 return invocationCounter.getValue(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
152 }
3939
f6f3bb0ee072 7088955: add C2 IR support to the SA
never
parents: 3838
diff changeset
153 public long getBackedgeCounter() {
f6f3bb0ee072 7088955: add C2 IR support to the SA
never
parents: 3838
diff changeset
154 if (Assert.ASSERTS_ENABLED) {
f6f3bb0ee072 7088955: add C2 IR support to the SA
never
parents: 3838
diff changeset
155 Assert.that(!VM.getVM().isCore(), "must not be used in core build");
f6f3bb0ee072 7088955: add C2 IR support to the SA
never
parents: 3838
diff changeset
156 }
f6f3bb0ee072 7088955: add C2 IR support to the SA
never
parents: 3838
diff changeset
157 return backedgeCounter.getValue(this);
f6f3bb0ee072 7088955: add C2 IR support to the SA
never
parents: 3838
diff changeset
158 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
159
a61af66fc99e Initial load
duke
parents:
diff changeset
160 // get associated compiled native method, if available, else return null.
a61af66fc99e Initial load
duke
parents:
diff changeset
161 public NMethod getNativeMethod() {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
162 Address addr = code.getValue(getAddress());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
163 return (NMethod) VMObjectFactory.newObject(NMethod.class, addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
164 }
a61af66fc99e Initial load
duke
parents:
diff changeset
165
a61af66fc99e Initial load
duke
parents:
diff changeset
166 // Convenience routine
a61af66fc99e Initial load
duke
parents:
diff changeset
167 public AccessFlags getAccessFlagsObj() {
a61af66fc99e Initial load
duke
parents:
diff changeset
168 return new AccessFlags(getAccessFlags());
a61af66fc99e Initial load
duke
parents:
diff changeset
169 }
a61af66fc99e Initial load
duke
parents:
diff changeset
170
a61af66fc99e Initial load
duke
parents:
diff changeset
171 /** Get a bytecode or breakpoint at the given bci */
a61af66fc99e Initial load
duke
parents:
diff changeset
172 public int getBytecodeOrBPAt(int bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
173 return getConstMethod().getBytecodeOrBPAt(bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
174 }
a61af66fc99e Initial load
duke
parents:
diff changeset
175
a61af66fc99e Initial load
duke
parents:
diff changeset
176 /** Fetch the original non-breakpoint bytecode at the specified
a61af66fc99e Initial load
duke
parents:
diff changeset
177 bci. It is required that there is currently a bytecode at this
a61af66fc99e Initial load
duke
parents:
diff changeset
178 bci. */
a61af66fc99e Initial load
duke
parents:
diff changeset
179 public int getOrigBytecodeAt(int bci) {
6940
18fb7da42534 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 6725
diff changeset
180 BreakpointInfo bp = getMethodHolder().getBreakpoints();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
181 for (; bp != null; bp = bp.getNext()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
182 if (bp.match(this, bci)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
183 return bp.getOrigBytecode();
a61af66fc99e Initial load
duke
parents:
diff changeset
184 }
a61af66fc99e Initial load
duke
parents:
diff changeset
185 }
a61af66fc99e Initial load
duke
parents:
diff changeset
186 System.err.println("Requested bci " + bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
187 for (; bp != null; bp = bp.getNext()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
188 System.err.println("Breakpoint at bci " + bp.getBCI() + ", bytecode " +
a61af66fc99e Initial load
duke
parents:
diff changeset
189 bp.getOrigBytecode());
a61af66fc99e Initial load
duke
parents:
diff changeset
190 }
a61af66fc99e Initial load
duke
parents:
diff changeset
191 Assert.that(false, "Should not reach here");
a61af66fc99e Initial load
duke
parents:
diff changeset
192 return -1; // not reached
a61af66fc99e Initial load
duke
parents:
diff changeset
193 }
a61af66fc99e Initial load
duke
parents:
diff changeset
194
a61af66fc99e Initial load
duke
parents:
diff changeset
195 public byte getBytecodeByteArg(int bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
196 return getConstMethod().getBytecodeByteArg(bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
197 }
a61af66fc99e Initial load
duke
parents:
diff changeset
198
a61af66fc99e Initial load
duke
parents:
diff changeset
199 /** Fetches a 16-bit big-endian ("Java ordered") value from the
a61af66fc99e Initial load
duke
parents:
diff changeset
200 bytecode stream */
a61af66fc99e Initial load
duke
parents:
diff changeset
201 public short getBytecodeShortArg(int bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
202 return getConstMethod().getBytecodeShortArg(bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
203 }
a61af66fc99e Initial load
duke
parents:
diff changeset
204
3838
6a991dcb52bb 7012081: JSR 292: SA-JDI can't read MH/MT/Indy ConstantPool entries
never
parents: 2426
diff changeset
205 /** Fetches a 16-bit native ordered value from the
6a991dcb52bb 7012081: JSR 292: SA-JDI can't read MH/MT/Indy ConstantPool entries
never
parents: 2426
diff changeset
206 bytecode stream */
6a991dcb52bb 7012081: JSR 292: SA-JDI can't read MH/MT/Indy ConstantPool entries
never
parents: 2426
diff changeset
207 public short getNativeShortArg(int bci) {
6a991dcb52bb 7012081: JSR 292: SA-JDI can't read MH/MT/Indy ConstantPool entries
never
parents: 2426
diff changeset
208 return getConstMethod().getNativeShortArg(bci);
6a991dcb52bb 7012081: JSR 292: SA-JDI can't read MH/MT/Indy ConstantPool entries
never
parents: 2426
diff changeset
209 }
6a991dcb52bb 7012081: JSR 292: SA-JDI can't read MH/MT/Indy ConstantPool entries
never
parents: 2426
diff changeset
210
0
a61af66fc99e Initial load
duke
parents:
diff changeset
211 /** Fetches a 32-bit big-endian ("Java ordered") value from the
a61af66fc99e Initial load
duke
parents:
diff changeset
212 bytecode stream */
a61af66fc99e Initial load
duke
parents:
diff changeset
213 public int getBytecodeIntArg(int bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
214 return getConstMethod().getBytecodeIntArg(bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
215 }
a61af66fc99e Initial load
duke
parents:
diff changeset
216
3838
6a991dcb52bb 7012081: JSR 292: SA-JDI can't read MH/MT/Indy ConstantPool entries
never
parents: 2426
diff changeset
217 /** Fetches a 32-bit native ordered value from the
6a991dcb52bb 7012081: JSR 292: SA-JDI can't read MH/MT/Indy ConstantPool entries
never
parents: 2426
diff changeset
218 bytecode stream */
6a991dcb52bb 7012081: JSR 292: SA-JDI can't read MH/MT/Indy ConstantPool entries
never
parents: 2426
diff changeset
219 public int getNativeIntArg(int bci) {
6a991dcb52bb 7012081: JSR 292: SA-JDI can't read MH/MT/Indy ConstantPool entries
never
parents: 2426
diff changeset
220 return getConstMethod().getNativeIntArg(bci);
6a991dcb52bb 7012081: JSR 292: SA-JDI can't read MH/MT/Indy ConstantPool entries
never
parents: 2426
diff changeset
221 }
6a991dcb52bb 7012081: JSR 292: SA-JDI can't read MH/MT/Indy ConstantPool entries
never
parents: 2426
diff changeset
222
0
a61af66fc99e Initial load
duke
parents:
diff changeset
223 public byte[] getByteCode() {
a61af66fc99e Initial load
duke
parents:
diff changeset
224 return getConstMethod().getByteCode();
a61af66fc99e Initial load
duke
parents:
diff changeset
225 }
a61af66fc99e Initial load
duke
parents:
diff changeset
226
a61af66fc99e Initial load
duke
parents:
diff changeset
227 /*
a61af66fc99e Initial load
duke
parents:
diff changeset
228 public Address getCode() { return codeField.getValue(this); }
a61af66fc99e Initial load
duke
parents:
diff changeset
229 public Address getInterpreterEntry() { return interpreterEntryField.getValue(this); }
a61af66fc99e Initial load
duke
parents:
diff changeset
230 public Address getFromCompiledCodeEntryPoint() { return fromCompiledCodeEntryPointField.getValue(this); }
a61af66fc99e Initial load
duke
parents:
diff changeset
231 */
a61af66fc99e Initial load
duke
parents:
diff changeset
232 // Accessors
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1552
diff changeset
233 public Symbol getName() { return getConstants().getSymbolAt(getNameIndex()); }
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1552
diff changeset
234 public Symbol getSignature() { return getConstants().getSymbolAt(getSignatureIndex()); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
235 public Symbol getGenericSignature() {
a61af66fc99e Initial load
duke
parents:
diff changeset
236 long index = getGenericSignatureIndex();
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1552
diff changeset
237 return (index != 0L) ? getConstants().getSymbolAt(index) : null;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
238 }
a61af66fc99e Initial load
duke
parents:
diff changeset
239
a61af66fc99e Initial load
duke
parents:
diff changeset
240 // Method holder (the Klass holding this method)
6940
18fb7da42534 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 6725
diff changeset
241 public InstanceKlass getMethodHolder() { return getConstants().getPoolHolder(); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
242
a61af66fc99e Initial load
duke
parents:
diff changeset
243 // Access flags
a61af66fc99e Initial load
duke
parents:
diff changeset
244 public boolean isPublic() { return getAccessFlagsObj().isPublic(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
245 public boolean isPrivate() { return getAccessFlagsObj().isPrivate(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
246 public boolean isProtected() { return getAccessFlagsObj().isProtected(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
247 public boolean isPackagePrivate() { AccessFlags af = getAccessFlagsObj();
a61af66fc99e Initial load
duke
parents:
diff changeset
248 return (!af.isPublic() && !af.isPrivate() && !af.isProtected()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
249 public boolean isStatic() { return getAccessFlagsObj().isStatic(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
250 public boolean isFinal() { return getAccessFlagsObj().isFinal(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
251 public boolean isSynchronized() { return getAccessFlagsObj().isSynchronized(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
252 public boolean isBridge() { return getAccessFlagsObj().isBridge(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
253 public boolean isVarArgs() { return getAccessFlagsObj().isVarArgs(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
254 public boolean isNative() { return getAccessFlagsObj().isNative(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
255 public boolean isAbstract() { return getAccessFlagsObj().isAbstract(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
256 public boolean isStrict() { return getAccessFlagsObj().isStrict(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
257 public boolean isSynthetic() { return getAccessFlagsObj().isSynthetic(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
258
a61af66fc99e Initial load
duke
parents:
diff changeset
259 public boolean isConstructor() {
a61af66fc99e Initial load
duke
parents:
diff changeset
260 return (!isStatic()) && getName().equals(objectInitializerName());
a61af66fc99e Initial load
duke
parents:
diff changeset
261 }
a61af66fc99e Initial load
duke
parents:
diff changeset
262
a61af66fc99e Initial load
duke
parents:
diff changeset
263 public boolean isStaticInitializer() {
a61af66fc99e Initial load
duke
parents:
diff changeset
264 return isStatic() && getName().equals(classInitializerName());
a61af66fc99e Initial load
duke
parents:
diff changeset
265 }
a61af66fc99e Initial load
duke
parents:
diff changeset
266
a61af66fc99e Initial load
duke
parents:
diff changeset
267 public boolean isObsolete() {
a61af66fc99e Initial load
duke
parents:
diff changeset
268 return getAccessFlagsObj().isObsolete();
a61af66fc99e Initial load
duke
parents:
diff changeset
269 }
a61af66fc99e Initial load
duke
parents:
diff changeset
270
a61af66fc99e Initial load
duke
parents:
diff changeset
271 public OopMapCacheEntry getMaskFor(int bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
272 OopMapCacheEntry entry = new OopMapCacheEntry();
a61af66fc99e Initial load
duke
parents:
diff changeset
273 entry.fill(this, bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
274 return entry;
a61af66fc99e Initial load
duke
parents:
diff changeset
275 }
a61af66fc99e Initial load
duke
parents:
diff changeset
276
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
277 public long getSize() {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
278 return getMethodSize();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
279 }
a61af66fc99e Initial load
duke
parents:
diff changeset
280
a61af66fc99e Initial load
duke
parents:
diff changeset
281 public void printValueOn(PrintStream tty) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
282 tty.print("Method " + getName().asString() + getSignature().asString() + "@" + getAddress());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
283 }
a61af66fc99e Initial load
duke
parents:
diff changeset
284
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
285 public void iterateFields(MetadataVisitor visitor) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
286 visitor.doCInt(methodSize, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
287 visitor.doCInt(maxStack, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
288 visitor.doCInt(maxLocals, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
289 visitor.doCInt(sizeOfParameters, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
290 visitor.doCInt(accessFlags, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
291 }
a61af66fc99e Initial load
duke
parents:
diff changeset
292
a61af66fc99e Initial load
duke
parents:
diff changeset
293 public boolean hasLineNumberTable() {
a61af66fc99e Initial load
duke
parents:
diff changeset
294 return getConstMethod().hasLineNumberTable();
a61af66fc99e Initial load
duke
parents:
diff changeset
295 }
a61af66fc99e Initial load
duke
parents:
diff changeset
296
a61af66fc99e Initial load
duke
parents:
diff changeset
297 public int getLineNumberFromBCI(int bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
298 return getConstMethod().getLineNumberFromBCI(bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
299 }
a61af66fc99e Initial load
duke
parents:
diff changeset
300
a61af66fc99e Initial load
duke
parents:
diff changeset
301 public LineNumberTableElement[] getLineNumberTable() {
a61af66fc99e Initial load
duke
parents:
diff changeset
302 return getConstMethod().getLineNumberTable();
a61af66fc99e Initial load
duke
parents:
diff changeset
303 }
a61af66fc99e Initial load
duke
parents:
diff changeset
304
a61af66fc99e Initial load
duke
parents:
diff changeset
305 public boolean hasLocalVariableTable() {
a61af66fc99e Initial load
duke
parents:
diff changeset
306 return getConstMethod().hasLocalVariableTable();
a61af66fc99e Initial load
duke
parents:
diff changeset
307 }
a61af66fc99e Initial load
duke
parents:
diff changeset
308
a61af66fc99e Initial load
duke
parents:
diff changeset
309 /** Should only be called if table is present */
a61af66fc99e Initial load
duke
parents:
diff changeset
310 public LocalVariableTableElement[] getLocalVariableTable() {
a61af66fc99e Initial load
duke
parents:
diff changeset
311 return getConstMethod().getLocalVariableTable();
a61af66fc99e Initial load
duke
parents:
diff changeset
312 }
a61af66fc99e Initial load
duke
parents:
diff changeset
313
a61af66fc99e Initial load
duke
parents:
diff changeset
314 public Symbol getLocalVariableName(int bci, int slot) {
a61af66fc99e Initial load
duke
parents:
diff changeset
315 if (! hasLocalVariableTable()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
316 return null;
a61af66fc99e Initial load
duke
parents:
diff changeset
317 }
a61af66fc99e Initial load
duke
parents:
diff changeset
318
a61af66fc99e Initial load
duke
parents:
diff changeset
319 LocalVariableTableElement[] locals = getLocalVariableTable();
a61af66fc99e Initial load
duke
parents:
diff changeset
320 for (int l = 0; l < locals.length; l++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
321 LocalVariableTableElement local = locals[l];
a61af66fc99e Initial load
duke
parents:
diff changeset
322 if ((bci >= local.getStartBCI()) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
323 (bci < (local.getStartBCI() + local.getLength())) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
324 slot == local.getSlot()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
325 return getConstants().getSymbolAt(local.getNameCPIndex());
a61af66fc99e Initial load
duke
parents:
diff changeset
326 }
a61af66fc99e Initial load
duke
parents:
diff changeset
327 }
a61af66fc99e Initial load
duke
parents:
diff changeset
328
a61af66fc99e Initial load
duke
parents:
diff changeset
329 return null;
a61af66fc99e Initial load
duke
parents:
diff changeset
330 }
a61af66fc99e Initial load
duke
parents:
diff changeset
331
6213
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6123
diff changeset
332 public boolean hasExceptionTable() {
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6123
diff changeset
333 return getConstMethod().hasExceptionTable();
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6123
diff changeset
334 }
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6123
diff changeset
335
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6123
diff changeset
336 public ExceptionTableElement[] getExceptionTable() {
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6123
diff changeset
337 return getConstMethod().getExceptionTable();
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6123
diff changeset
338 }
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6123
diff changeset
339
0
a61af66fc99e Initial load
duke
parents:
diff changeset
340 public boolean hasCheckedExceptions() {
a61af66fc99e Initial load
duke
parents:
diff changeset
341 return getConstMethod().hasCheckedExceptions();
a61af66fc99e Initial load
duke
parents:
diff changeset
342 }
a61af66fc99e Initial load
duke
parents:
diff changeset
343
a61af66fc99e Initial load
duke
parents:
diff changeset
344 /** Should only be called if table is present */
a61af66fc99e Initial load
duke
parents:
diff changeset
345 public CheckedExceptionElement[] getCheckedExceptions() {
a61af66fc99e Initial load
duke
parents:
diff changeset
346 return getConstMethod().getCheckedExceptions();
a61af66fc99e Initial load
duke
parents:
diff changeset
347 }
a61af66fc99e Initial load
duke
parents:
diff changeset
348
a61af66fc99e Initial load
duke
parents:
diff changeset
349 /** Returns name and signature in external form for debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
350 purposes */
a61af66fc99e Initial load
duke
parents:
diff changeset
351 public String externalNameAndSignature() {
a61af66fc99e Initial load
duke
parents:
diff changeset
352 final StringBuffer buf = new StringBuffer();
a61af66fc99e Initial load
duke
parents:
diff changeset
353 buf.append(getMethodHolder().getName().asString());
a61af66fc99e Initial load
duke
parents:
diff changeset
354 buf.append(".");
a61af66fc99e Initial load
duke
parents:
diff changeset
355 buf.append(getName().asString());
a61af66fc99e Initial load
duke
parents:
diff changeset
356 buf.append("(");
a61af66fc99e Initial load
duke
parents:
diff changeset
357 new SignatureConverter(getSignature(), buf).iterateParameters();
a61af66fc99e Initial load
duke
parents:
diff changeset
358 buf.append(")");
a61af66fc99e Initial load
duke
parents:
diff changeset
359 return buf.toString().replace('/', '.');
a61af66fc99e Initial load
duke
parents:
diff changeset
360 }
6972
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
361
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
362 public void dumpReplayData(PrintStream out) {
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
363 NMethod nm = getNativeMethod();
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
364 int code_size = 0;
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
365 if (nm != null) {
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
366 code_size = (int)nm.codeEnd().minus(nm.getVerifiedEntryPoint());
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
367 }
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
368 Klass holder = getMethodHolder();
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
369 out.println("ciMethod " +
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
370 holder.getName().asString() + " " +
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
371 OopUtilities.escapeString(getName().asString()) + " " +
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
372 getSignature().asString() + " " +
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
373 getInvocationCounter() + " " +
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
374 getBackedgeCounter() + " " +
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
375 interpreterInvocationCount() + " " +
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
376 interpreterThrowoutCount() + " " +
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
377 code_size);
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
378 }
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
379
3939
f6f3bb0ee072 7088955: add C2 IR support to the SA
never
parents: 3838
diff changeset
380 public int interpreterThrowoutCount() {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
381 return (int) interpreterThrowoutCountField.getValue(this);
3939
f6f3bb0ee072 7088955: add C2 IR support to the SA
never
parents: 3838
diff changeset
382 }
f6f3bb0ee072 7088955: add C2 IR support to the SA
never
parents: 3838
diff changeset
383
f6f3bb0ee072 7088955: add C2 IR support to the SA
never
parents: 3838
diff changeset
384 public int interpreterInvocationCount() {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
385 return (int) interpreterInvocationCountField.getValue(this);
3939
f6f3bb0ee072 7088955: add C2 IR support to the SA
never
parents: 3838
diff changeset
386 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
387 }