Search in sources :

Example 1 with LineNumber

use of com.ibm.j9ddr.vm29.j9.walkers.LineNumber 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;
}
Also used : LocalVariableTable(com.ibm.j9ddr.vm29.j9.walkers.LocalVariableTable) J9MethodDebugInfoPointer(com.ibm.j9ddr.vm29.pointer.generated.J9MethodDebugInfoPointer) LocalVariableTableIterator(com.ibm.j9ddr.vm29.j9.walkers.LocalVariableTableIterator) U8Pointer(com.ibm.j9ddr.vm29.pointer.U8Pointer) J9LineNumberPointer(com.ibm.j9ddr.vm29.pointer.generated.J9LineNumberPointer)

Example 2 with LineNumber

use of com.ibm.j9ddr.vm29.j9.walkers.LineNumber 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);
            }
        }
    }
}
Also used : LocalVariableTable(com.ibm.j9ddr.vm29.j9.walkers.LocalVariableTable) J9MethodDebugInfoPointer(com.ibm.j9ddr.vm29.pointer.generated.J9MethodDebugInfoPointer) LineNumberIterator(com.ibm.j9ddr.vm29.j9.walkers.LineNumberIterator) LocalVariableTableIterator(com.ibm.j9ddr.vm29.j9.walkers.LocalVariableTableIterator) U8Pointer(com.ibm.j9ddr.vm29.pointer.U8Pointer) LineNumber(com.ibm.j9ddr.vm29.j9.walkers.LineNumber)

Aggregations

LocalVariableTable (com.ibm.j9ddr.vm29.j9.walkers.LocalVariableTable)2 LocalVariableTableIterator (com.ibm.j9ddr.vm29.j9.walkers.LocalVariableTableIterator)2 U8Pointer (com.ibm.j9ddr.vm29.pointer.U8Pointer)2 J9MethodDebugInfoPointer (com.ibm.j9ddr.vm29.pointer.generated.J9MethodDebugInfoPointer)2 LineNumber (com.ibm.j9ddr.vm29.j9.walkers.LineNumber)1 LineNumberIterator (com.ibm.j9ddr.vm29.j9.walkers.LineNumberIterator)1 J9LineNumberPointer (com.ibm.j9ddr.vm29.pointer.generated.J9LineNumberPointer)1