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); }