Search in sources :

Example 1 with J9ROMMethodHandleRefPointer

use of com.ibm.j9ddr.vm29.pointer.generated.J9ROMMethodHandleRefPointer in project openj9 by eclipse.

the class J9BCUtil method dumpCallSiteData.

/**
 * This method is Java implementation of rdump.c#dumpCallSiteData function.
 * This method is called when dumping a ROMClass.
 * This method has only affect for invokedDynamic stuff,
 * for other ROMClasses, there wont be anything to print since their callsite and bsm count are zero.
 *
 * @param out PrintStream to print the user info to the console
 * @param romClass ROMClass address in the dump file.
 *
 * @throws CorruptDataException
 */
private static void dumpCallSiteData(PrintStream out, J9ROMClassPointer romClass) throws CorruptDataException {
    int HEX_RADIX = 16;
    long callSiteCount = romClass.callSiteCount().longValue();
    long bsmCount = romClass.bsmCount().longValue();
    SelfRelativePointer callSiteData = SelfRelativePointer.cast(romClass.callSiteData());
    U16Pointer bsmIndices = U16Pointer.cast(callSiteData.addOffset(4 * callSiteCount));
    if (0 != callSiteCount) {
        out.println(String.format("  Call Sites (%d):\n", callSiteCount));
        for (int i = 0; i < callSiteCount; i++) {
            J9ROMNameAndSignaturePointer nameAndSig = J9ROMNameAndSignaturePointer.cast(callSiteData.add(i).get());
            out.println("    Name: " + J9UTF8Helper.stringValue(nameAndSig.name()));
            out.println("    Signature: " + J9UTF8Helper.stringValue(nameAndSig.signature()));
            out.println("    Bootstrap Method Index: " + bsmIndices.at(i).longValue());
            out.println();
        }
    }
    if (0 != bsmCount) {
        J9ROMConstantPoolItemPointer constantPool = ConstantPoolHelpers.J9_ROM_CP_FROM_ROM_CLASS(romClass);
        U32Pointer cpShapeDescription = romClass.cpShapeDescription();
        U16Pointer bsmDataCursor = bsmIndices.add(callSiteCount);
        out.println(String.format("  Bootstrap Methods (%d):", bsmCount));
        for (int i = 0; i < bsmCount; i++) {
            J9ROMMethodHandleRefPointer methodHandleRef = J9ROMMethodHandleRefPointer.cast(constantPool.add(bsmDataCursor.at(0).longValue()));
            bsmDataCursor = bsmDataCursor.add(1);
            /* methodRef will be either a field or a method ref - they both have the same shape so we can pretend it is always a methodref */
            J9ROMMethodRefPointer methodRef = J9ROMMethodRefPointer.cast(constantPool.add(methodHandleRef.methodOrFieldRefIndex().longValue()));
            J9ROMClassRefPointer classRef = J9ROMClassRefPointer.cast(constantPool.add(methodRef.classRefCPIndex().longValue()));
            J9ROMNameAndSignaturePointer nameAndSig = methodRef.nameAndSignature();
            long bsmArgumentCount = bsmDataCursor.at(0).longValue();
            bsmDataCursor = bsmDataCursor.add(1);
            out.println("    Name: " + J9UTF8Helper.stringValue(classRef.name()) + "." + J9UTF8Helper.stringValue(nameAndSig.name()));
            out.println("    Signature: " + J9UTF8Helper.stringValue(nameAndSig.signature()));
            out.println(String.format("    Bootstrap Method Arguments (%d):", bsmArgumentCount));
            for (; 0 != bsmArgumentCount; bsmArgumentCount--) {
                long argCPIndex = bsmDataCursor.at(0).longValue();
                bsmDataCursor = bsmDataCursor.add(1);
                J9ROMConstantPoolItemPointer item = constantPool.add(argCPIndex);
                long shapeDesc = ConstantPoolHelpers.J9_CP_TYPE(cpShapeDescription, (int) argCPIndex);
                if (shapeDesc == J9CPTYPE_CLASS) {
                    J9ROMClassRefPointer romClassRef = J9ROMClassRefPointer.cast(item);
                    out.println("      Class: " + J9UTF8Helper.stringValue(romClassRef.name()));
                } else if (shapeDesc == J9CPTYPE_STRING) {
                    J9ROMStringRefPointer romStringRef = J9ROMStringRefPointer.cast(item);
                    out.println("      String: " + J9UTF8Helper.stringValue(romStringRef.utf8Data()));
                } else if (shapeDesc == J9CPTYPE_INT) {
                    J9ROMSingleSlotConstantRefPointer singleSlotConstantRef = J9ROMSingleSlotConstantRefPointer.cast(item);
                    out.println("      Int: " + singleSlotConstantRef.data().getHexValue());
                } else if (shapeDesc == J9CPTYPE_FLOAT) {
                    J9ROMSingleSlotConstantRefPointer singleSlotConstantRef = J9ROMSingleSlotConstantRefPointer.cast(item);
                    FloatPointer floatPtr = FloatPointer.cast(singleSlotConstantRef.dataEA());
                    out.println("      Float: " + floatPtr.getHexValue() + " (" + floatPtr.floatAt(0) + ")");
                } else if (shapeDesc == J9CPTYPE_LONG) {
                    String hexValue = "";
                    if (J9BuildFlags.env_littleEndian) {
                        hexValue += item.slot2().getHexValue();
                        hexValue += item.slot1().getHexValue().substring(2);
                    } else {
                        hexValue += item.slot1().getHexValue();
                        hexValue += item.slot2().getHexValue().substring(2);
                    }
                    long longValue = Long.parseLong(hexValue.substring(2), HEX_RADIX);
                    out.println("      Long: " + hexValue + "(" + longValue + ")");
                } else if (shapeDesc == J9CPTYPE_DOUBLE) {
                    String hexValue = "";
                    if (J9BuildFlags.env_littleEndian) {
                        hexValue += item.slot2().getHexValue();
                        hexValue += item.slot1().getHexValue().substring(2);
                    } else {
                        hexValue += item.slot1().getHexValue();
                        hexValue += item.slot2().getHexValue().substring(2);
                    }
                    long longValue = Long.parseLong(hexValue.substring(2), HEX_RADIX);
                    double doubleValue = Double.longBitsToDouble(longValue);
                    out.println("      Double: " + hexValue + "(" + Double.toString(doubleValue) + ")");
                } else if (shapeDesc == J9CPTYPE_FIELD) {
                    J9ROMFieldRefPointer romFieldRef = J9ROMFieldRefPointer.cast(item);
                    classRef = J9ROMClassRefPointer.cast(constantPool.add(romFieldRef.classRefCPIndex()));
                    nameAndSig = romFieldRef.nameAndSignature();
                    out.println("      Field: " + J9UTF8Helper.stringValue(classRef.name()) + "." + J9UTF8Helper.stringValue(nameAndSig.name()) + " " + J9UTF8Helper.stringValue(nameAndSig.signature()));
                } else if ((shapeDesc == J9CPTYPE_INSTANCE_METHOD) || (shapeDesc == J9CPTYPE_STATIC_METHOD) || (shapeDesc == J9CPTYPE_HANDLE_METHOD) || (shapeDesc == J9CPTYPE_INTERFACE_METHOD)) {
                    J9ROMMethodRefPointer romMethodRef = J9ROMMethodRefPointer.cast(item);
                    classRef = J9ROMClassRefPointer.cast(constantPool.add(romMethodRef.classRefCPIndex()));
                    nameAndSig = romMethodRef.nameAndSignature();
                    out.println("      Method: " + J9UTF8Helper.stringValue(classRef.name()) + "." + J9UTF8Helper.stringValue(nameAndSig.name()) + " " + J9UTF8Helper.stringValue(nameAndSig.signature()));
                } else if (shapeDesc == J9CPTYPE_METHOD_TYPE) {
                    J9ROMMethodTypeRefPointer romMethodTypeRef = J9ROMMethodTypeRefPointer.cast(item);
                    out.println("      Method Type: " + J9UTF8Helper.stringValue(J9UTF8Pointer.cast(romMethodTypeRef.signature())));
                } else if (shapeDesc == J9CPTYPE_METHODHANDLE) {
                    methodHandleRef = J9ROMMethodHandleRefPointer.cast(item);
                    methodRef = J9ROMMethodRefPointer.cast(constantPool.add(methodHandleRef.methodOrFieldRefIndex()));
                    classRef = J9ROMClassRefPointer.cast(constantPool.add(methodRef.classRefCPIndex()));
                    nameAndSig = methodRef.nameAndSignature();
                    out.print("      Method Handle: " + J9UTF8Helper.stringValue(classRef.name()) + "." + J9UTF8Helper.stringValue(nameAndSig.name()));
                    long methodType = methodHandleRef.handleTypeAndCpType().rightShift((int) J9DescriptionCpTypeShift).longValue();
                    if ((methodType == MH_REF_GETFIELD) || (methodType == MH_REF_PUTFIELD) || (methodType == MH_REF_GETSTATIC) || (methodType == MH_REF_PUTSTATIC)) {
                        out.print(" ");
                    }
                    out.println(J9UTF8Helper.stringValue(nameAndSig.signature()));
                } else {
                    out.println("      <unknown type>");
                }
            }
        }
    }
}
Also used : J9ROMMethodRefPointer(com.ibm.j9ddr.vm29.pointer.generated.J9ROMMethodRefPointer) J9ROMFieldRefPointer(com.ibm.j9ddr.vm29.pointer.generated.J9ROMFieldRefPointer) J9ROMClassRefPointer(com.ibm.j9ddr.vm29.pointer.generated.J9ROMClassRefPointer) J9ROMMethodHandleRefPointer(com.ibm.j9ddr.vm29.pointer.generated.J9ROMMethodHandleRefPointer) J9ROMSingleSlotConstantRefPointer(com.ibm.j9ddr.vm29.pointer.generated.J9ROMSingleSlotConstantRefPointer) SelfRelativePointer(com.ibm.j9ddr.vm29.pointer.SelfRelativePointer) J9ROMStringRefPointer(com.ibm.j9ddr.vm29.pointer.generated.J9ROMStringRefPointer) J9ROMMethodTypeRefPointer(com.ibm.j9ddr.vm29.pointer.generated.J9ROMMethodTypeRefPointer) U16Pointer(com.ibm.j9ddr.vm29.pointer.U16Pointer) J9ROMNameAndSignaturePointer(com.ibm.j9ddr.vm29.pointer.generated.J9ROMNameAndSignaturePointer) J9ROMConstantPoolItemPointer(com.ibm.j9ddr.vm29.pointer.generated.J9ROMConstantPoolItemPointer) FloatPointer(com.ibm.j9ddr.vm29.pointer.FloatPointer) U32Pointer(com.ibm.j9ddr.vm29.pointer.U32Pointer)

Example 2 with J9ROMMethodHandleRefPointer

use of com.ibm.j9ddr.vm29.pointer.generated.J9ROMMethodHandleRefPointer in project openj9 by eclipse.

the class RomClassWalker method allSlotsInConstantPoolDo.

private void allSlotsInConstantPoolDo() throws CorruptDataException {
    J9ROMConstantPoolItemPointer constantPool;
    int index;
    U32Pointer cpShapeDescription;
    int constPoolCount;
    constantPool = J9ROMClassHelper.constantPool(romClass);
    cpShapeDescription = romClass.cpShapeDescription();
    if (cpShapeDescription.isNull()) {
        return;
    }
    constPoolCount = romClass.romConstantPoolCount().intValue();
    PointerPointer cpEntry = PointerPointer.cast(J9ROMClassHelper.constantPool(romClass));
    // The spaces at the end of "Constant Pool" are important since the
    // regions are sorted
    // by address and size, but when they are equal they are sorted by
    // longest name and "Constant Pool" has to come first
    classWalkerCallback.addSection(clazz, constantPool, constPoolCount * U64.SIZEOF, "constantPool              ", true);
    for (index = 0; index < constPoolCount; index++) {
        long shapeDesc = ConstantPoolHelpers.J9_CP_TYPE(cpShapeDescription, index);
        if (shapeDesc == J9CPTYPE_CLASS) {
            J9ROMStringRefPointer ref = J9ROMStringRefPointer.cast(cpEntry);
            classWalkerCallback.addSlot(clazz, SlotType.J9_ROM_UTF8, ref.utf8DataEA(), "cpFieldUtf8");
            classWalkerCallback.addSlot(clazz, SlotType.J9_U32, ref.cpTypeEA(), "cpFieldType");
        } else if ((shapeDesc == J9CPTYPE_STRING) || (shapeDesc == J9CPTYPE_ANNOTATION_UTF8)) {
            J9ROMStringRefPointer ref = J9ROMStringRefPointer.cast(cpEntry);
            classWalkerCallback.addSlot(clazz, SlotType.J9_ROM_UTF8, ref.utf8DataEA(), "cpFieldUtf8");
            classWalkerCallback.addSlot(clazz, SlotType.J9_U32, ref.cpTypeEA(), "cpFieldType");
        } else if (shapeDesc == J9CPTYPE_INT) {
            J9ROMConstantPoolItemPointer ref = J9ROMConstantPoolItemPointer.cast(cpEntry);
            classWalkerCallback.addSlot(clazz, SlotType.J9_U32, ref.slot1EA(), "cpFieldInt");
            classWalkerCallback.addSlot(clazz, SlotType.J9_U32, ref.slot2EA(), "cpFieldIntUnused");
        } else if (shapeDesc == J9CPTYPE_FLOAT) {
            J9ROMConstantPoolItemPointer ref = J9ROMConstantPoolItemPointer.cast(cpEntry);
            classWalkerCallback.addSlot(clazz, SlotType.J9_U32, ref.slot1EA(), "cpFieldFloat");
            classWalkerCallback.addSlot(clazz, SlotType.J9_U32, ref.slot2EA(), "cpFieldFloatUnused");
        } else if (shapeDesc == J9CPTYPE_LONG) {
            classWalkerCallback.addSlot(clazz, SlotType.J9_I64, I64Pointer.cast(cpEntry), "cpField8");
        } else if (shapeDesc == J9CPTYPE_DOUBLE) {
            classWalkerCallback.addSlot(clazz, SlotType.J9_I64, I64Pointer.cast(cpEntry), "cpField8");
        } else if (shapeDesc == J9CPTYPE_FIELD) {
            J9ROMFieldRefPointer ref = J9ROMFieldRefPointer.cast(cpEntry);
            classWalkerCallback.addSlot(clazz, SlotType.J9_SRPNAS, ref.nameAndSignatureEA(), "cpFieldNAS");
            classWalkerCallback.addSlot(clazz, SlotType.J9_U32, ref.classRefCPIndexEA(), "cpFieldClassRef");
        } else if ((shapeDesc == J9CPTYPE_HANDLE_METHOD) || (shapeDesc == J9CPTYPE_STATIC_METHOD) || (shapeDesc == J9CPTYPE_INSTANCE_METHOD) || (shapeDesc == J9CPTYPE_INTERFACE_METHOD)) {
            J9ROMMethodRefPointer ref = J9ROMMethodRefPointer.cast(cpEntry);
            classWalkerCallback.addSlot(clazz, SlotType.J9_SRPNAS, ref.nameAndSignatureEA(), "cpFieldNAS");
            classWalkerCallback.addSlot(clazz, SlotType.J9_U32, ref.classRefCPIndexEA(), "cpFieldClassRef");
        } else if (shapeDesc == J9CPTYPE_METHOD_TYPE) {
            J9ROMMethodTypeRefPointer ref = J9ROMMethodTypeRefPointer.cast(cpEntry);
            classWalkerCallback.addSlot(clazz, SlotType.J9_ROM_UTF8, ref.signatureEA(), "signature");
            classWalkerCallback.addSlot(clazz, SlotType.J9_U32, ref.cpTypeEA(), "cpType");
        } else if (shapeDesc == J9CPTYPE_METHODHANDLE) {
            J9ROMMethodHandleRefPointer ref = J9ROMMethodHandleRefPointer.cast(cpEntry);
            classWalkerCallback.addSlot(clazz, SlotType.J9_U32, ref.methodOrFieldRefIndexEA(), "methodOrFieldRefIndex");
            classWalkerCallback.addSlot(clazz, SlotType.J9_U32, ref.handleTypeAndCpTypeEA(), "handleTypeAndCpType");
        } else if ((shapeDesc == J9CPTYPE_UNUSED) || (shapeDesc == J9CPTYPE_UNUSED8)) {
            classWalkerCallback.addSlot(clazz, SlotType.J9_I64, I64Pointer.cast(cpEntry), "cpFieldUnused");
        }
        cpEntry = cpEntry.addOffset(J9ROMConstantPoolItem.SIZEOF);
    }
}
Also used : J9ROMFieldRefPointer(com.ibm.j9ddr.vm29.pointer.generated.J9ROMFieldRefPointer) J9ROMMethodRefPointer(com.ibm.j9ddr.vm29.pointer.generated.J9ROMMethodRefPointer) J9ROMConstantPoolItemPointer(com.ibm.j9ddr.vm29.pointer.generated.J9ROMConstantPoolItemPointer) PointerPointer(com.ibm.j9ddr.vm29.pointer.PointerPointer) J9ROMMethodHandleRefPointer(com.ibm.j9ddr.vm29.pointer.generated.J9ROMMethodHandleRefPointer) J9ROMStringRefPointer(com.ibm.j9ddr.vm29.pointer.generated.J9ROMStringRefPointer) J9ROMMethodTypeRefPointer(com.ibm.j9ddr.vm29.pointer.generated.J9ROMMethodTypeRefPointer) U32Pointer(com.ibm.j9ddr.vm29.pointer.U32Pointer)

Aggregations

U32Pointer (com.ibm.j9ddr.vm29.pointer.U32Pointer)2 J9ROMConstantPoolItemPointer (com.ibm.j9ddr.vm29.pointer.generated.J9ROMConstantPoolItemPointer)2 J9ROMFieldRefPointer (com.ibm.j9ddr.vm29.pointer.generated.J9ROMFieldRefPointer)2 J9ROMMethodHandleRefPointer (com.ibm.j9ddr.vm29.pointer.generated.J9ROMMethodHandleRefPointer)2 J9ROMMethodRefPointer (com.ibm.j9ddr.vm29.pointer.generated.J9ROMMethodRefPointer)2 J9ROMMethodTypeRefPointer (com.ibm.j9ddr.vm29.pointer.generated.J9ROMMethodTypeRefPointer)2 J9ROMStringRefPointer (com.ibm.j9ddr.vm29.pointer.generated.J9ROMStringRefPointer)2 FloatPointer (com.ibm.j9ddr.vm29.pointer.FloatPointer)1 PointerPointer (com.ibm.j9ddr.vm29.pointer.PointerPointer)1 SelfRelativePointer (com.ibm.j9ddr.vm29.pointer.SelfRelativePointer)1 U16Pointer (com.ibm.j9ddr.vm29.pointer.U16Pointer)1 J9ROMClassRefPointer (com.ibm.j9ddr.vm29.pointer.generated.J9ROMClassRefPointer)1 J9ROMNameAndSignaturePointer (com.ibm.j9ddr.vm29.pointer.generated.J9ROMNameAndSignaturePointer)1 J9ROMSingleSlotConstantRefPointer (com.ibm.j9ddr.vm29.pointer.generated.J9ROMSingleSlotConstantRefPointer)1