Search in sources :

Example 11 with J9ROMFieldShapePointer

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

the class J9ROMFieldShapeHelper method romFieldSizeOf.

public static UDATA romFieldSizeOf(J9ROMFieldShapePointer fieldShapePointer) throws CorruptDataException {
    long size = J9ROMFieldShape.SIZEOF;
    U32 modifiers = fieldShapePointer.modifiers();
    if ((modifiers.anyBitsIn(J9FieldFlagConstant))) {
        size += ((modifiers.allBitsIn(J9FieldSizeDouble)) ? U64.SIZEOF : U32.SIZEOF);
    }
    if (modifiers.anyBitsIn(J9FieldFlagHasGenericSignature)) {
        size += U32.SIZEOF;
    }
    if (modifiers.anyBitsIn(J9FieldFlagHasFieldAnnotations)) {
        long bytesToPad = 0;
        // long annotationSize = U32Pointer.cast(address + size).at(0).longValue();
        long annotationSize = U32Pointer.cast(fieldShapePointer.addOffset(size)).at(0).longValue();
        /* add the length of annotation data */
        size += annotationSize;
        /* add the size of the size of the annotation data */
        size += U32.SIZEOF;
        bytesToPad = U32.SIZEOF - (annotationSize % U32.SIZEOF);
        if (U32.SIZEOF == bytesToPad) {
            bytesToPad = 0;
        }
        /* add the padding */
        size += bytesToPad;
    }
    if (modifiers.anyBitsIn(J9FieldFlagHasTypeAnnotations)) {
        long bytesToPad = 0;
        long annotationSize = U32Pointer.cast(fieldShapePointer.addOffset(size)).at(0).longValue();
        /* add the length of annotation data */
        size += annotationSize;
        /* add the size of the size of the annotation data */
        size += U32.SIZEOF;
        bytesToPad = U32.SIZEOF - (annotationSize % U32.SIZEOF);
        if (U32.SIZEOF == bytesToPad) {
            bytesToPad = 0;
        }
        /* add the padding */
        size += bytesToPad;
    }
    return new UDATA(size);
}
Also used : UDATA(com.ibm.j9ddr.vm29.types.UDATA) U32(com.ibm.j9ddr.vm29.types.U32)

Example 12 with J9ROMFieldShapePointer

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

the class RomClassWalker method allSlotsInROMFieldsSectionDo.

private void allSlotsInROMFieldsSectionDo() throws CorruptDataException {
    J9ROMFieldShapeIterator iterator = new J9ROMFieldShapeIterator(romClass.romFields(), romClass.romFieldCount());
    int size = 0;
    while (iterator.hasNext()) {
        J9ROMFieldShapePointer currentField = (J9ROMFieldShapePointer) iterator.next();
        int fieldLength = allSlotsInROMFieldDo(currentField);
        if (0 == fieldLength) {
            /* Range validation failed on the field, break early. */
            break;
        }
        size += fieldLength;
    }
    classWalkerCallback.addSection(clazz, romClass.romFields(), size, "fields", true);
}
Also used : J9ROMFieldShapeIterator(com.ibm.j9ddr.vm29.j9.J9ROMFieldShapeIterator) J9ROMFieldShapePointer(com.ibm.j9ddr.vm29.pointer.generated.J9ROMFieldShapePointer)

Example 13 with J9ROMFieldShapePointer

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

the class CheckEngine method checkClassStatics.

private int checkClassStatics(J9ClassPointer clazz) {
    int result = J9MODRON_GCCHK_RC_OK;
    try {
        boolean validationRequired = true;
        if (J9ClassHelper.isSwappedOut(clazz)) {
            /* if class has been hot swapped (J9AccClassHotSwappedOut bit is set) in Fast HCR,
				 * the ramStatics of the existing class may be reused.  The J9ClassReusedStatics
				 * bit in J9Class->extendedClassFlags will be set if that's the case.
				 * In Extended HCR mode ramStatics might be not NULL and must be valid
				 * NOTE: If class is hot swapped and the value in ramStatics is NULL it is valid 
				 * to have the correspondent ROM Class value in objectStaticCount field greater then 0
				 */
            if (J9ClassHelper.isArrayClass(clazz)) {
                /* j9arrayclass should not be hot swapped */
                result = J9MODRON_GCCHK_RC_CLASS_HOT_SWAPPED_FOR_ARRAY;
                CheckError error = new CheckError(clazz, _cycle, _currentCheck, "Class ", result, _cycle.nextErrorCount());
                _reporter.report(error);
                return result;
            }
            if (J9ClassHelper.areExtensionsEnabled()) {
                /* This is Extended HSR mode so hot swapped class might have NULL in ramStatics field */
                if (clazz.ramStatics().isNull()) {
                    validationRequired = false;
                }
            }
            try {
                /* This case can also occur when running -Xint with extensions enabled */
                if (J9ClassHelper.extendedClassFlags(clazz).allBitsIn(J9JavaClassFlags.J9ClassReusedStatics)) {
                    validationRequired = false;
                }
            } catch (NoSuchFieldError e) {
            /* Flag must be missing from the core. */
            }
        }
        if (validationRequired) {
            // J9ClassLoaderPointer classLoader = clazz.classLoader();
            J9ROMClassPointer romClazz = clazz.romClass();
            UDATA numberOfReferences = new UDATA(0);
            PointerPointer sectionStart = PointerPointer.NULL;
            PointerPointer sectionEnd = PointerPointer.NULL;
            /*
				 * Note: we have no special recognition for J9ArrayClass here
				 * J9ArrayClass does not have a ramStatics field but something else at this place
				 * so direct check (NULL != clazz->ramStatics) would not be correct,
				 * however romClazz->objectStaticCount must be 0 for this case
				 */
            if (!romClazz.objectStaticCount().eq(0)) {
                sectionStart = PointerPointer.cast(clazz.ramStatics());
                sectionEnd = sectionStart.add(romClazz.objectStaticCount());
            }
            /* Iterate all fields of ROM Class looking to statics fields pointed to java objects */
            Iterator<J9ObjectFieldOffset> objectFieldOffsetIterator = J9ObjectFieldOffsetIterator.J9ObjectFieldOffsetIteratorFor(clazz, J9ClassHelper.superclass(clazz), new U32(J9VM_FIELD_OFFSET_WALK_INCLUDE_STATIC | J9VM_FIELD_OFFSET_WALK_ONLY_OBJECT_SLOTS));
            while (objectFieldOffsetIterator.hasNext()) {
                J9ObjectFieldOffset fieldOffset = objectFieldOffsetIterator.next();
                // J9ROMFieldShapePointer field = fieldOffset.getField();
                numberOfReferences = numberOfReferences.add(1);
                /* get address of next field */
                PointerPointer address = sectionStart.addOffset(fieldOffset.getOffsetOrAddress());
                /* an address must be in gc scan range */
                if (!(address.gte(sectionStart) && address.lt(sectionEnd))) {
                    result = J9MODRON_GCCHK_RC_CLASS_STATICS_REFERENCE_IS_NOT_IN_SCANNING_RANGE;
                    CheckError error = new CheckError(clazz, address, _cycle, _currentCheck, "Class ", result, _cycle.nextErrorCount());
                    _reporter.report(error);
                }
            /* check only if we have an object */
            // TODO kmt : can't easily implement this part of the check
            // J9Class* classToCast = vm->internalVMFunctions->internalFindClassUTF8(currentThread, toSearchString, toSearchLength, classLoader, J9_FINDCLASS_FLAG_EXISTING_ONLY);
            // if ((NULL == classToCast) || (0 == instanceOfOrCheckCast(J9GC_J9OBJECT_CLAZZ(*address), classToCast))) {
            // The issue is that we can't simply call "internalFindClassUTF8" in DDR.
            // We could guess at the behaviour of the ClassLoader, but that makes
            // distingushing a real problem from a weird ClassLoader delegation
            // model difficult.
            }
            if (!numberOfReferences.eq(romClazz.objectStaticCount())) {
                result = J9MODRON_GCCHK_RC_CLASS_STATICS_WRONG_NUMBER_OF_REFERENCES;
                CheckError error = new CheckError(clazz, _cycle, _currentCheck, "Class ", result, _cycle.nextErrorCount());
                _reporter.report(error);
            }
        }
    } catch (CorruptDataException e) {
        // TODO : cde should be part of the error
        CheckError error = new CheckError(clazz, _cycle, _currentCheck, "Class ", J9MODRON_GCCHK_RC_CORRUPT_DATA_EXCEPTION, _cycle.nextErrorCount());
        _reporter.report(error);
    }
    return result;
}
Also used : UDATA(com.ibm.j9ddr.vm29.types.UDATA) PointerPointer(com.ibm.j9ddr.vm29.pointer.PointerPointer) U32(com.ibm.j9ddr.vm29.types.U32) J9ROMClassPointer(com.ibm.j9ddr.vm29.pointer.generated.J9ROMClassPointer) J9ObjectFieldOffset(com.ibm.j9ddr.vm29.j9.J9ObjectFieldOffset) CorruptDataException(com.ibm.j9ddr.CorruptDataException)

Aggregations

J9ROMFieldShapePointer (com.ibm.j9ddr.vm29.pointer.generated.J9ROMFieldShapePointer)9 U32 (com.ibm.j9ddr.vm29.types.U32)9 UDATA (com.ibm.j9ddr.vm29.types.UDATA)5 J9ObjectFieldOffset (com.ibm.j9ddr.vm29.j9.J9ObjectFieldOffset)3 J9ROMFieldShapeIterator (com.ibm.j9ddr.vm29.j9.J9ROMFieldShapeIterator)3 U32Pointer (com.ibm.j9ddr.vm29.pointer.U32Pointer)3 CorruptDataException (com.ibm.j9ddr.CorruptDataException)2 UDATAPointer (com.ibm.j9ddr.vm29.pointer.UDATAPointer)2 J9ROMClassPointer (com.ibm.j9ddr.vm29.pointer.generated.J9ROMClassPointer)2 J9ROMMethodPointer (com.ibm.j9ddr.vm29.pointer.generated.J9ROMMethodPointer)2 J9UTF8Pointer (com.ibm.j9ddr.vm29.pointer.generated.J9UTF8Pointer)2 DDRInteractiveCommandException (com.ibm.j9ddr.tools.ddrinteractive.DDRInteractiveCommandException)1 AbstractPointer (com.ibm.j9ddr.vm29.pointer.AbstractPointer)1 BoolPointer (com.ibm.j9ddr.vm29.pointer.BoolPointer)1 DoublePointer (com.ibm.j9ddr.vm29.pointer.DoublePointer)1 FloatPointer (com.ibm.j9ddr.vm29.pointer.FloatPointer)1 I16Pointer (com.ibm.j9ddr.vm29.pointer.I16Pointer)1 I32Pointer (com.ibm.j9ddr.vm29.pointer.I32Pointer)1 I64Pointer (com.ibm.j9ddr.vm29.pointer.I64Pointer)1 I8Pointer (com.ibm.j9ddr.vm29.pointer.I8Pointer)1