Mercurial > hg > truffle
comparison agent/src/share/classes/sun/jvm/hotspot/code/NMethod.java @ 1579:e9ff18c4ace7
Merge
author | jrose |
---|---|
date | Wed, 02 Jun 2010 22:45:42 -0700 |
parents | c18cbe5936b8 1a5913bf5e19 |
children | 2a47bd84841f |
comparison
equal
deleted
inserted
replaced
1562:dfe27f03244a | 1579:e9ff18c4ace7 |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 2000, 2009, Oracle and/or its affiliates. All rights reserved. | 2 * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | 4 * |
5 * This code is free software; you can redistribute it and/or modify it | 5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as | 6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
47 /** Offsets for different nmethod parts */ | 47 /** Offsets for different nmethod parts */ |
48 private static CIntegerField exceptionOffsetField; | 48 private static CIntegerField exceptionOffsetField; |
49 private static CIntegerField deoptOffsetField; | 49 private static CIntegerField deoptOffsetField; |
50 private static CIntegerField origPCOffsetField; | 50 private static CIntegerField origPCOffsetField; |
51 private static CIntegerField stubOffsetField; | 51 private static CIntegerField stubOffsetField; |
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; |
54 private static CIntegerField dependenciesOffsetField; | 55 private static CIntegerField dependenciesOffsetField; |
55 private static CIntegerField handlerTableOffsetField; | 56 private static CIntegerField handlerTableOffsetField; |
56 private static CIntegerField nulChkTableOffsetField; | 57 private static CIntegerField nulChkTableOffsetField; |
96 | 97 |
97 exceptionOffsetField = type.getCIntegerField("_exception_offset"); | 98 exceptionOffsetField = type.getCIntegerField("_exception_offset"); |
98 deoptOffsetField = type.getCIntegerField("_deoptimize_offset"); | 99 deoptOffsetField = type.getCIntegerField("_deoptimize_offset"); |
99 origPCOffsetField = type.getCIntegerField("_orig_pc_offset"); | 100 origPCOffsetField = type.getCIntegerField("_orig_pc_offset"); |
100 stubOffsetField = type.getCIntegerField("_stub_offset"); | 101 stubOffsetField = type.getCIntegerField("_stub_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"); |
103 dependenciesOffsetField = type.getCIntegerField("_dependencies_offset"); | 105 dependenciesOffsetField = type.getCIntegerField("_dependencies_offset"); |
104 handlerTableOffsetField = type.getCIntegerField("_handler_table_offset"); | 106 handlerTableOffsetField = type.getCIntegerField("_handler_table_offset"); |
105 nulChkTableOffsetField = type.getCIntegerField("_nul_chk_table_offset"); | 107 nulChkTableOffsetField = type.getCIntegerField("_nul_chk_table_offset"); |
139 public Address codeBegin() { return getEntryPoint(); } | 141 public Address codeBegin() { return getEntryPoint(); } |
140 public Address codeEnd() { return headerBegin().addOffsetTo(getStubOffset()); } | 142 public Address codeEnd() { 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 deoptBegin() { return headerBegin().addOffsetTo(getDeoptOffset()); } |
143 public Address stubBegin() { return headerBegin().addOffsetTo(getStubOffset()); } | 145 public Address stubBegin() { return headerBegin().addOffsetTo(getStubOffset()); } |
144 public Address stubEnd() { return headerBegin().addOffsetTo(getScopesDataOffset()); } | 146 public Address stubEnd() { return headerBegin().addOffsetTo(getOopsOffset()); } |
147 public Address oopsBegin() { return headerBegin().addOffsetTo(getOopsOffset()); } | |
148 public Address oopsEnd() { return headerBegin().addOffsetTo(getScopesDataOffset()); } | |
145 public Address scopesDataBegin() { return headerBegin().addOffsetTo(getScopesDataOffset()); } | 149 public Address scopesDataBegin() { return headerBegin().addOffsetTo(getScopesDataOffset()); } |
146 public Address scopesDataEnd() { return headerBegin().addOffsetTo(getScopesPCsOffset()); } | 150 public Address scopesDataEnd() { return headerBegin().addOffsetTo(getScopesPCsOffset()); } |
147 public Address scopesPCsBegin() { return headerBegin().addOffsetTo(getScopesPCsOffset()); } | 151 public Address scopesPCsBegin() { return headerBegin().addOffsetTo(getScopesPCsOffset()); } |
148 public Address scopesPCsEnd() { return headerBegin().addOffsetTo(getDependenciesOffset()); } | 152 public Address scopesPCsEnd() { return headerBegin().addOffsetTo(getDependenciesOffset()); } |
149 public Address dependenciesBegin() { return headerBegin().addOffsetTo(getDependenciesOffset()); } | 153 public Address dependenciesBegin() { return headerBegin().addOffsetTo(getDependenciesOffset()); } |
154 public Address nulChkTableEnd() { return headerBegin().addOffsetTo(getNMethodEndOffset()); } | 158 public Address nulChkTableEnd() { return headerBegin().addOffsetTo(getNMethodEndOffset()); } |
155 | 159 |
156 public int constantsSize() { return (int) constantsEnd() .minus(constantsBegin()); } | 160 public int constantsSize() { return (int) constantsEnd() .minus(constantsBegin()); } |
157 public int codeSize() { return (int) codeEnd() .minus(codeBegin()); } | 161 public int codeSize() { return (int) codeEnd() .minus(codeBegin()); } |
158 public int stubSize() { return (int) stubEnd() .minus(stubBegin()); } | 162 public int stubSize() { return (int) stubEnd() .minus(stubBegin()); } |
163 public int oopsSize() { return (int) oopsEnd() .minus(oopsBegin()); } | |
159 public int scopesDataSize() { return (int) scopesDataEnd() .minus(scopesDataBegin()); } | 164 public int scopesDataSize() { return (int) scopesDataEnd() .minus(scopesDataBegin()); } |
160 public int scopesPCsSize() { return (int) scopesPCsEnd() .minus(scopesPCsBegin()); } | 165 public int scopesPCsSize() { return (int) scopesPCsEnd() .minus(scopesPCsBegin()); } |
161 public int dependenciesSize() { return (int) dependenciesEnd().minus(dependenciesBegin()); } | 166 public int dependenciesSize() { return (int) dependenciesEnd().minus(dependenciesBegin()); } |
162 public int handlerTableSize() { return (int) handlerTableEnd().minus(handlerTableBegin()); } | 167 public int handlerTableSize() { return (int) handlerTableEnd().minus(handlerTableBegin()); } |
163 public int nulChkTableSize() { return (int) nulChkTableEnd() .minus(nulChkTableBegin()); } | 168 public int nulChkTableSize() { return (int) nulChkTableEnd() .minus(nulChkTableBegin()); } |
176 } | 181 } |
177 | 182 |
178 public boolean constantsContains (Address addr) { return constantsBegin() .lessThanOrEqual(addr) && constantsEnd() .greaterThan(addr); } | 183 public boolean constantsContains (Address addr) { return constantsBegin() .lessThanOrEqual(addr) && constantsEnd() .greaterThan(addr); } |
179 public boolean codeContains (Address addr) { return codeBegin() .lessThanOrEqual(addr) && codeEnd() .greaterThan(addr); } | 184 public boolean codeContains (Address addr) { return codeBegin() .lessThanOrEqual(addr) && codeEnd() .greaterThan(addr); } |
180 public boolean stubContains (Address addr) { return stubBegin() .lessThanOrEqual(addr) && stubEnd() .greaterThan(addr); } | 185 public boolean stubContains (Address addr) { return stubBegin() .lessThanOrEqual(addr) && stubEnd() .greaterThan(addr); } |
186 public boolean oopsContains (Address addr) { return oopsBegin() .lessThanOrEqual(addr) && oopsEnd() .greaterThan(addr); } | |
181 public boolean scopesDataContains (Address addr) { return scopesDataBegin() .lessThanOrEqual(addr) && scopesDataEnd() .greaterThan(addr); } | 187 public boolean scopesDataContains (Address addr) { return scopesDataBegin() .lessThanOrEqual(addr) && scopesDataEnd() .greaterThan(addr); } |
182 public boolean scopesPCsContains (Address addr) { return scopesPCsBegin() .lessThanOrEqual(addr) && scopesPCsEnd() .greaterThan(addr); } | 188 public boolean scopesPCsContains (Address addr) { return scopesPCsBegin() .lessThanOrEqual(addr) && scopesPCsEnd() .greaterThan(addr); } |
183 public boolean handlerTableContains(Address addr) { return handlerTableBegin().lessThanOrEqual(addr) && handlerTableEnd().greaterThan(addr); } | 189 public boolean handlerTableContains(Address addr) { return handlerTableBegin().lessThanOrEqual(addr) && handlerTableEnd().greaterThan(addr); } |
184 public boolean nulChkTableContains (Address addr) { return nulChkTableBegin() .lessThanOrEqual(addr) && nulChkTableEnd() .greaterThan(addr); } | 190 public boolean nulChkTableContains (Address addr) { return nulChkTableBegin() .lessThanOrEqual(addr) && nulChkTableEnd() .greaterThan(addr); } |
185 | 191 |
186 /** Entry points */ | 192 /** Entry points */ |
187 public Address getEntryPoint() { return entryPointField.getValue(addr); } | 193 public Address getEntryPoint() { return entryPointField.getValue(addr); } |
188 public Address getVerifiedEntryPoint() { return verifiedEntryPointField.getValue(addr); } | 194 public Address getVerifiedEntryPoint() { return verifiedEntryPointField.getValue(addr); } |
195 | |
196 /** Support for oops in scopes and relocs. Note: index 0 is reserved for null. */ | |
197 public OopHandle getOopAt(int index) { | |
198 if (index == 0) return null; | |
199 if (Assert.ASSERTS_ENABLED) { | |
200 Assert.that(index > 0 && index <= oopsSize(), "must be a valid non-zero index"); | |
201 } | |
202 return oopsBegin().getOopHandleAt((index - 1) * VM.getVM().getOopSize()); | |
203 } | |
189 | 204 |
190 // FIXME: add interpreter_entry_point() | 205 // FIXME: add interpreter_entry_point() |
191 // FIXME: add lazy_interpreter_entry_point() for C2 | 206 // FIXME: add lazy_interpreter_entry_point() for C2 |
192 | 207 |
193 // ********** | 208 // ********** |
336 | 351 |
337 public void print() { | 352 public void print() { |
338 printOn(System.out); | 353 printOn(System.out); |
339 } | 354 } |
340 | 355 |
356 protected void printComponentsOn(PrintStream tty) { | |
357 // FIXME: add relocation information | |
358 tty.println(" instructions: [" + instructionsBegin() + ", " + instructionsEnd() + "), " + | |
359 " data: [" + dataBegin() + ", " + dataEnd() + "), " + | |
360 " oops: [" + oopsBegin() + ", " + oopsEnd() + "), " + | |
361 " frame size: " + getFrameSize()); | |
362 } | |
363 | |
341 public String toString() { | 364 public String toString() { |
342 Method method = getMethod(); | 365 Method method = getMethod(); |
343 return "NMethod for " + | 366 return "NMethod for " + |
344 method.getMethodHolder().getName().asString() + "." + | 367 method.getMethodHolder().getName().asString() + "." + |
345 method.getName().asString() + method.getSignature().asString() + "==>n" + | 368 method.getName().asString() + method.getSignature().asString() + "==>n" + |
365 | 388 |
366 private int getEntryBCI() { return (int) entryBCIField .getValue(addr); } | 389 private int getEntryBCI() { return (int) entryBCIField .getValue(addr); } |
367 private int getExceptionOffset() { return (int) exceptionOffsetField .getValue(addr); } | 390 private int getExceptionOffset() { return (int) exceptionOffsetField .getValue(addr); } |
368 private int getDeoptOffset() { return (int) deoptOffsetField .getValue(addr); } | 391 private int getDeoptOffset() { return (int) deoptOffsetField .getValue(addr); } |
369 private int getStubOffset() { return (int) stubOffsetField .getValue(addr); } | 392 private int getStubOffset() { return (int) stubOffsetField .getValue(addr); } |
393 private int getOopsOffset() { return (int) oopsOffsetField .getValue(addr); } | |
370 private int getScopesDataOffset() { return (int) scopesDataOffsetField .getValue(addr); } | 394 private int getScopesDataOffset() { return (int) scopesDataOffsetField .getValue(addr); } |
371 private int getScopesPCsOffset() { return (int) scopesPCsOffsetField .getValue(addr); } | 395 private int getScopesPCsOffset() { return (int) scopesPCsOffsetField .getValue(addr); } |
372 private int getDependenciesOffset() { return (int) dependenciesOffsetField.getValue(addr); } | 396 private int getDependenciesOffset() { return (int) dependenciesOffsetField.getValue(addr); } |
373 private int getHandlerTableOffset() { return (int) handlerTableOffsetField.getValue(addr); } | 397 private int getHandlerTableOffset() { return (int) handlerTableOffsetField.getValue(addr); } |
374 private int getNulChkTableOffset() { return (int) nulChkTableOffsetField .getValue(addr); } | 398 private int getNulChkTableOffset() { return (int) nulChkTableOffsetField .getValue(addr); } |