44 private static JByteField scavengeRootStateField; |
44 private static JByteField scavengeRootStateField; |
45 |
45 |
46 /** Offsets for different nmethod parts */ |
46 /** Offsets for different nmethod parts */ |
47 private static CIntegerField exceptionOffsetField; |
47 private static CIntegerField exceptionOffsetField; |
48 private static CIntegerField deoptOffsetField; |
48 private static CIntegerField deoptOffsetField; |
|
49 private static CIntegerField deoptMhOffsetField; |
49 private static CIntegerField origPCOffsetField; |
50 private static CIntegerField origPCOffsetField; |
50 private static CIntegerField stubOffsetField; |
51 private static CIntegerField stubOffsetField; |
51 private static CIntegerField oopsOffsetField; |
52 private static CIntegerField oopsOffsetField; |
52 private static CIntegerField scopesDataOffsetField; |
53 private static CIntegerField scopesDataOffsetField; |
53 private static CIntegerField scopesPCsOffsetField; |
54 private static CIntegerField scopesPCsOffsetField; |
93 scavengeRootLinkField = type.getAddressField("_scavenge_root_link"); |
94 scavengeRootLinkField = type.getAddressField("_scavenge_root_link"); |
94 scavengeRootStateField = type.getJByteField("_scavenge_root_state"); |
95 scavengeRootStateField = type.getJByteField("_scavenge_root_state"); |
95 |
96 |
96 exceptionOffsetField = type.getCIntegerField("_exception_offset"); |
97 exceptionOffsetField = type.getCIntegerField("_exception_offset"); |
97 deoptOffsetField = type.getCIntegerField("_deoptimize_offset"); |
98 deoptOffsetField = type.getCIntegerField("_deoptimize_offset"); |
|
99 deoptMhOffsetField = type.getCIntegerField("_deoptimize_mh_offset"); |
98 origPCOffsetField = type.getCIntegerField("_orig_pc_offset"); |
100 origPCOffsetField = type.getCIntegerField("_orig_pc_offset"); |
99 stubOffsetField = type.getCIntegerField("_stub_offset"); |
101 stubOffsetField = type.getCIntegerField("_stub_offset"); |
100 oopsOffsetField = type.getCIntegerField("_oops_offset"); |
102 oopsOffsetField = type.getCIntegerField("_oops_offset"); |
101 scopesDataOffsetField = type.getCIntegerField("_scopes_data_offset"); |
103 scopesDataOffsetField = type.getCIntegerField("_scopes_data_offset"); |
102 scopesPCsOffsetField = type.getCIntegerField("_scopes_pcs_offset"); |
104 scopesPCsOffsetField = type.getCIntegerField("_scopes_pcs_offset"); |
134 public boolean isOSRMethod() { return getEntryBCI() != VM.getVM().getInvocationEntryBCI(); } |
136 public boolean isOSRMethod() { return getEntryBCI() != VM.getVM().getInvocationEntryBCI(); } |
135 |
137 |
136 /** Boundaries for different parts */ |
138 /** Boundaries for different parts */ |
137 public Address constantsBegin() { return contentBegin(); } |
139 public Address constantsBegin() { return contentBegin(); } |
138 public Address constantsEnd() { return getEntryPoint(); } |
140 public Address constantsEnd() { return getEntryPoint(); } |
139 public Address instsBegin() { return codeBegin(); } |
141 public Address instsBegin() { return codeBegin(); } |
140 public Address instsEnd() { return headerBegin().addOffsetTo(getStubOffset()); } |
142 public Address instsEnd() { return headerBegin().addOffsetTo(getStubOffset()); } |
141 public Address exceptionBegin() { return headerBegin().addOffsetTo(getExceptionOffset()); } |
143 public Address exceptionBegin() { return headerBegin().addOffsetTo(getExceptionOffset()); } |
142 public Address deoptBegin() { return headerBegin().addOffsetTo(getDeoptOffset()); } |
144 public Address deoptHandlerBegin() { return headerBegin().addOffsetTo(getDeoptOffset()); } |
|
145 public Address deoptMhHandlerBegin() { return headerBegin().addOffsetTo(getDeoptMhOffset()); } |
143 public Address stubBegin() { return headerBegin().addOffsetTo(getStubOffset()); } |
146 public Address stubBegin() { return headerBegin().addOffsetTo(getStubOffset()); } |
144 public Address stubEnd() { return headerBegin().addOffsetTo(getOopsOffset()); } |
147 public Address stubEnd() { return headerBegin().addOffsetTo(getOopsOffset()); } |
145 public Address oopsBegin() { return headerBegin().addOffsetTo(getOopsOffset()); } |
148 public Address oopsBegin() { return headerBegin().addOffsetTo(getOopsOffset()); } |
146 public Address oopsEnd() { return headerBegin().addOffsetTo(getScopesDataOffset()); } |
149 public Address oopsEnd() { return headerBegin().addOffsetTo(getScopesDataOffset()); } |
147 public Address scopesDataBegin() { return headerBegin().addOffsetTo(getScopesDataOffset()); } |
150 public Address scopesDataBegin() { return headerBegin().addOffsetTo(getScopesDataOffset()); } |
248 |
251 |
249 public int getScavengeRootState() { |
252 public int getScavengeRootState() { |
250 return (int) scavengeRootStateField.getValue(addr); |
253 return (int) scavengeRootStateField.getValue(addr); |
251 } |
254 } |
252 |
255 |
|
256 // MethodHandle |
|
257 public boolean isMethodHandleReturn(Address returnPc) { |
|
258 // Hard to read a bit fields from Java and it's only there for performance |
|
259 // so just go directly to the PCDesc |
|
260 // if (!hasMethodHandleInvokes()) return false; |
|
261 PCDesc pd = getPCDescAt(returnPc); |
|
262 if (pd == null) |
|
263 return false; |
|
264 return pd.isMethodHandleInvoke(); |
|
265 } |
|
266 |
|
267 // Deopt |
|
268 // Return true is the PC is one would expect if the frame is being deopted. |
|
269 public boolean isDeoptPc (Address pc) { return isDeoptEntry(pc) || isDeoptMhEntry(pc); } |
|
270 public boolean isDeoptEntry (Address pc) { return pc == deoptHandlerBegin(); } |
|
271 public boolean isDeoptMhEntry (Address pc) { return pc == deoptMhHandlerBegin(); } |
253 |
272 |
254 /** Tells whether frames described by this nmethod can be |
273 /** Tells whether frames described by this nmethod can be |
255 deoptimized. Note: native wrappers cannot be deoptimized. */ |
274 deoptimized. Note: native wrappers cannot be deoptimized. */ |
256 public boolean canBeDeoptimized() { return isJavaMethod(); } |
275 public boolean canBeDeoptimized() { return isJavaMethod(); } |
257 |
276 |
386 // |
405 // |
387 |
406 |
388 private int getEntryBCI() { return (int) entryBCIField .getValue(addr); } |
407 private int getEntryBCI() { return (int) entryBCIField .getValue(addr); } |
389 private int getExceptionOffset() { return (int) exceptionOffsetField .getValue(addr); } |
408 private int getExceptionOffset() { return (int) exceptionOffsetField .getValue(addr); } |
390 private int getDeoptOffset() { return (int) deoptOffsetField .getValue(addr); } |
409 private int getDeoptOffset() { return (int) deoptOffsetField .getValue(addr); } |
|
410 private int getDeoptMhOffset() { return (int) deoptMhOffsetField .getValue(addr); } |
391 private int getStubOffset() { return (int) stubOffsetField .getValue(addr); } |
411 private int getStubOffset() { return (int) stubOffsetField .getValue(addr); } |
392 private int getOopsOffset() { return (int) oopsOffsetField .getValue(addr); } |
412 private int getOopsOffset() { return (int) oopsOffsetField .getValue(addr); } |
393 private int getScopesDataOffset() { return (int) scopesDataOffsetField .getValue(addr); } |
413 private int getScopesDataOffset() { return (int) scopesDataOffsetField .getValue(addr); } |
394 private int getScopesPCsOffset() { return (int) scopesPCsOffsetField .getValue(addr); } |
414 private int getScopesPCsOffset() { return (int) scopesPCsOffsetField .getValue(addr); } |
395 private int getDependenciesOffset() { return (int) dependenciesOffsetField.getValue(addr); } |
415 private int getDependenciesOffset() { return (int) dependenciesOffsetField.getValue(addr); } |