use of com.ibm.j9ddr.vm29.j9.walkers.LocalVariableTableIterator in project openj9 by eclipse.
the class RomClassWalker method allSlotsInMethodDebugInfoDo.
long allSlotsInMethodDebugInfoDo(U32Pointer cursor) throws CorruptDataException {
J9MethodDebugInfoPointer methodDebugInfo;
U8Pointer currentLineNumberPtr;
/* if data is out of line, then the size of the data inline in the method is a single SRP in sizeof(U_32 increments), currently assuming J9SRP is U_32 aligned*/
long inlineSize = SelfRelativePointer.SIZEOF / U32.SIZEOF;
long sectionSizeBytes = 0;
boolean inlineDebugExtension = (1 == (cursor.at(0).intValue() & 1));
/* check for low tag to indicate inline or out of line debug information */
if (inlineDebugExtension) {
methodDebugInfo = J9MethodDebugInfoPointer.cast(cursor);
/* set the inline size to stored size in terms of U_32
* NOTE: stored size is aligned on a U32
* tag bit will be dropped by the '/' operation */
inlineSize = cursor.at(0).intValue() / U32.SIZEOF;
sectionSizeBytes = inlineSize * U32.SIZEOF;
} else {
methodDebugInfo = J9MethodDebugInfoPointer.cast(SelfRelativePointer.cast(cursor).get());
if (AlgorithmVersion.getVersionOf("VM_LINE_NUMBER_TABLE_VERSION").getAlgorithmVersion() < 1) {
sectionSizeBytes = J9MethodDebugInfo.SIZEOF + (J9MethodDebugInfoHelper.getLineNumberCount(methodDebugInfo).intValue() * U32.SIZEOF);
} else {
sectionSizeBytes = J9MethodDebugInfo.SIZEOF + J9MethodDebugInfoHelper.getLineNumberCompressedSize(methodDebugInfo).intValue();
/* When out of line debug information, align on U_16 */
sectionSizeBytes = (sectionSizeBytes + U16.SIZEOF - 1) & ~(U16.SIZEOF - 1);
}
}
if (!inlineDebugExtension) {
if (inlineSize == 1) {
classWalkerCallback.addSlot(clazz, SlotType.J9_SRP, cursor, "SRP to DebugInfo");
classWalkerCallback.addSection(clazz, cursor, inlineSize * U32.SIZEOF, "methodDebugInfo out of line", true);
}
}
classWalkerCallback.addSlot(clazz, SlotType.J9_SRP, methodDebugInfo.srpToVarInfoEA(), "SizeOfDebugInfo(low tagged)");
if (AlgorithmVersion.getVersionOf("VM_LINE_NUMBER_TABLE_VERSION").getAlgorithmVersion() < 1) {
classWalkerCallback.addSlot(clazz, SlotType.J9_U32, methodDebugInfo.lineNumberCountEA(), "lineNumberCount");
classWalkerCallback.addSlot(clazz, SlotType.J9_U32, methodDebugInfo.varInfoCountEA(), "varInfoCount");
J9LineNumberPointer lineNumberPtr = J9MethodDebugInfoHelper.getLineNumberTableForROMClass(methodDebugInfo);
if (lineNumberPtr.notNull()) {
for (int j = 0; j < methodDebugInfo.lineNumberCount().intValue(); j++, lineNumberPtr = lineNumberPtr.add(1)) {
// FIXME : Silo
// classWalkerCallback.addSlot(clazz, SlotType.J9_U16, lineNumberPtr.offsetLocationEA(), "offsetLocation");
classWalkerCallback.addSlot(clazz, SlotType.J9_U16, lineNumberPtr.lineNumberEA(), "lineNumber");
}
}
} else {
classWalkerCallback.addSlot(clazz, SlotType.J9_U32, methodDebugInfo.lineNumberCountEA(), "lineNumberCount(encoded)");
classWalkerCallback.addSlot(clazz, SlotType.J9_U32, methodDebugInfo.varInfoCountEA(), "varInfoCount");
if (methodDebugInfo.lineNumberCount().allBitsIn(1)) {
classWalkerCallback.addSlot(clazz, SlotType.J9_U32, U32Pointer.cast(methodDebugInfo.add(1)), "compressed line number size");
}
currentLineNumberPtr = J9MethodDebugInfoHelper.getCompressedLineNumberTableForROMClassV1(methodDebugInfo);
if (currentLineNumberPtr.notNull()) {
for (int j = 0; j < J9MethodDebugInfoHelper.getLineNumberCompressedSize(methodDebugInfo).intValue(); j++) {
classWalkerCallback.addSlot(clazz, SlotType.J9_U8, currentLineNumberPtr, "pc, lineNumber compressed");
currentLineNumberPtr = currentLineNumberPtr.add(1);
}
}
}
U8Pointer variableTable = OptInfo.getV1VariableTableForMethodDebugInfo(methodDebugInfo);
if (variableTable.notNull()) {
LocalVariableTableIterator variableInfoValuesIterator = LocalVariableTableIterator.localVariableTableIteratorFor(methodDebugInfo);
U8Pointer start = variableInfoValuesIterator.getLocalVariableTablePtr();
while (variableInfoValuesIterator.hasNext()) {
LocalVariableTable values = variableInfoValuesIterator.next();
// Need to walk the name and signature to add them to the UTF8 section
classWalkerCallback.addSlot(clazz, SlotType.J9_UTF8, values.getName(), "name");
classWalkerCallback.addSlot(clazz, SlotType.J9_UTF8, values.getSignature(), "getSignature");
if (values.getGenericSignature().notNull()) {
classWalkerCallback.addSlot(clazz, SlotType.J9_UTF8, values.getGenericSignature(), "getGenericSignature");
}
}
U8Pointer end = variableInfoValuesIterator.getLocalVariableTablePtr();
int localVariableSectionSize = end.sub(start).intValue();
for (int j = 0; j < localVariableSectionSize; j++) {
classWalkerCallback.addSlot(clazz, SlotType.J9_U8, start, "variableInfo compressed");
start = start.add(1);
}
classWalkerCallback.addSection(clazz, variableTable, localVariableSectionSize, "variableInfo" + (inlineDebugExtension ? " Inline" : ""), inlineDebugExtension);
}
classWalkerCallback.addSection(clazz, methodDebugInfo, sectionSizeBytes, "methodDebugInfo" + (inlineDebugExtension ? " Inline" : ""), inlineDebugExtension);
return inlineSize;
}
use of com.ibm.j9ddr.vm29.j9.walkers.LocalVariableTableIterator in project openj9 by eclipse.
the class J9BCUtil method dumpMethodDebugInfo.
private static void dumpMethodDebugInfo(PrintStream out, J9ROMClassPointer romClass, J9ROMMethodPointer romMethod, long flags) throws CorruptDataException {
J9MethodDebugInfoPointer methodInfo;
if ((flags & J9BCTranslationData.BCT_StripDebugAttributes) == 0) {
methodInfo = getMethodDebugInfoFromROMMethod(romMethod);
if (!methodInfo.isNull()) {
out.append(nl);
out.append(" Debug Info:");
out.append(nl);
out.append(String.format(" Line Number Table (%d):", J9MethodDebugInfoHelper.getLineNumberCount(methodInfo).intValue()));
out.append(nl);
LineNumberIterator lineNumberIterator = LineNumberIterator.lineNumberIteratorFor(methodInfo);
while (lineNumberIterator.hasNext()) {
LineNumber lineNumber = lineNumberIterator.next();
if (null == lineNumber) {
out.append(" Bad compressed data \n");
U8Pointer currentLineNumberPtr = lineNumberIterator.getLineNumberTablePtr();
int sizeLeft = J9MethodDebugInfoHelper.getLineNumberCompressedSize(methodInfo).sub((currentLineNumberPtr.sub(J9MethodDebugInfoHelper.getLineNumberTableForROMClass(methodInfo)))).intValue();
while (0 < sizeLeft--) {
out.append(" " + currentLineNumberPtr.at(0));
out.append(nl);
currentLineNumberPtr = currentLineNumberPtr.add(1);
}
break;
} else {
out.append(String.format(" Line: %5d PC: %5d", lineNumber.getLineNumber().longValue(), lineNumber.getLocation().longValue()));
out.append(nl);
}
}
out.append(nl);
out.append(String.format(" Variables (%d):", methodInfo.varInfoCount().longValue()));
out.append(nl);
LocalVariableTableIterator variableInfoValuesIterator = LocalVariableTableIterator.localVariableTableIteratorFor(methodInfo);
while (variableInfoValuesIterator.hasNext()) {
LocalVariableTable values = variableInfoValuesIterator.next();
out.append(String.format(" Slot: %d", values.getSlotNumber().intValue()));
out.append(nl);
out.append(String.format(" Visibility Start: %d", values.getStartVisibility().intValue()));
out.append(nl);
out.append(String.format(" Visibility End: %d", values.getStartVisibility().intValue() + values.getVisibilityLength().intValue()));
out.append(nl);
out.append(String.format(" Visibility Length: %d", values.getVisibilityLength().intValue()));
out.append(nl);
out.append(" Name: ");
if ((null != values.getName()) && (!values.getName().isNull())) {
out.append(String.format("%s", J9UTF8Helper.stringValue(values.getName())));
} else {
out.append("None");
}
out.append(nl);
out.append(" Signature: ");
if ((null != values.getSignature()) && (!values.getSignature().isNull())) {
out.append(String.format("%s", J9UTF8Helper.stringValue(values.getSignature())));
} else {
out.append("None");
}
out.append(nl);
out.append(" Generic Signature: ");
if ((null != values.getGenericSignature()) && (!values.getGenericSignature().isNull())) {
out.append(String.format("%s", J9UTF8Helper.stringValue(values.getGenericSignature())));
} else {
out.append("None");
}
out.append(nl);
}
}
}
}
Aggregations