Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Flatten non-static NullRestricted fields #18173

Merged
merged 1 commit into from
Sep 21, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
6 changes: 6 additions & 0 deletions runtime/oti/j9.h
Original file line number Diff line number Diff line change
Expand Up @@ -339,6 +339,11 @@ static const struct { \
#define J9_IS_FIELD_FLATTENED(fieldClazz, romFieldShape) \
(J9_IS_J9CLASS_FLATTENED(fieldClazz) && \
(J9_ARE_NO_BITS_SET((romFieldShape)->modifiers, J9AccVolatile) || (J9CLASS_UNPADDED_INSTANCE_SIZE(fieldClazz) <= sizeof(U_64))))
/* This will replace J9_IS_FIELD_FLATTENED when QTypes are removed. J9_IS_J9CLASS_FLATTENED will return false since the current check requires a primitive value type. */
#define J9_IS_NULL_RESTRICTED_FIELD_FLATTENED(fieldClazz, romFieldShape) \
(J9_ARE_ALL_BITS_SET((romFieldShape)->modifiers, J9FieldFlagIsNullRestricted) && \
J9_IS_J9CLASS_FLATTENED(fieldClazz) && \
(J9_ARE_NO_BITS_SET((romFieldShape)->modifiers, J9AccVolatile) || (J9CLASS_UNPADDED_INSTANCE_SIZE(fieldClazz) <= sizeof(U_64))))
#define J9_VALUETYPE_FLATTENED_SIZE(clazz) (J9CLASS_HAS_4BYTE_PREPADDING((clazz)) ? ((clazz)->totalInstanceSize - sizeof(U_32)) : (clazz)->totalInstanceSize)
#define IS_REF_OR_VAL_SIGNATURE(firstChar) ('L' == (firstChar) || 'Q' == (firstChar))
#define IS_QTYPE(firstChar) ('Q' == (firstChar))
Expand All @@ -347,6 +352,7 @@ static const struct { \
#define J9_IS_J9CLASS_PRIMITIVE_VALUETYPE(clazz) FALSE
#define J9_IS_J9CLASS_FLATTENED(clazz) FALSE
#define J9_IS_FIELD_FLATTENED(fieldClazz, romFieldShape) FALSE
#define J9_IS_NULL_RESTRICTED_FIELD_FLATTENED(fieldClazz, romFieldShape) FALSE
#define J9_VALUETYPE_FLATTENED_SIZE(clazz)((UDATA) 0) /* It is not possible for this macro to be used since we always check J9_IS_J9CLASS_FLATTENED before ever using it. */
#define IS_REF_OR_VAL_SIGNATURE(firstChar) ('L' == (firstChar))
#define IS_QTYPE(firstChar) FALSE
Expand Down
58 changes: 41 additions & 17 deletions runtime/vm/createramclass.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2006,9 +2006,47 @@ loadFlattenableFieldValueClasses(J9VMThread *currentThread, J9ClassLoader *class
*valueTypeFlags |= J9ClassLargestAlignmentConstraintDouble;
break;
case 'L':
*valueTypeFlags |= (J9ClassLargestAlignmentConstraintReference | J9ClassHasReferences);
eligibleForFastSubstitutability = false;
{
if (J9_ARE_ALL_BITS_SET(modifiers, J9FieldFlagIsNullRestricted)) {
J9Class *valueClass = internalFindClassUTF8(currentThread, signatureChars + 1, signatureLength - 2, classLoader, classPreloadFlags);
if (NULL == valueClass) {
result = FALSE;
goto done;
} else {
theresa-m marked this conversation as resolved.
Show resolved Hide resolved
J9ROMClass *valueROMClass = valueClass->romClass;

/* A NullRestricted field must be in a value class with an
* ImplicitCreation attribute. The attribute must have the ACC_DEFAULT flag set.
* Static fields will be checked during class preparation.
*/
if (J9_ARE_NO_BITS_SET(valueROMClass->modifiers, J9AccValueType)
|| J9_ARE_NO_BITS_SET(valueROMClass->optionalFlags, J9_ROMCLASS_OPTINFO_IMPLICITCREATION_ATTRIBUTE)
|| J9_ARE_NO_BITS_SET(getImplicitCreationFlags(valueROMClass), J9AccImplicitCreateHasDefaultValue)
) {
setCurrentExceptionForBadClass(currentThread, J9ROMCLASS_CLASSNAME(romClass), J9VMCONSTANTPOOL_JAVALANGINCOMPATIBLECLASSCHANGEERROR,
J9NLS_VM_NULLRESTRICTED_MUST_BE_IN_DEFAULT_IMPLICITCREATION_VALUE_CLASS);
}

if (!J9_IS_NULL_RESTRICTED_FIELD_FLATTENED(valueClass, field)) {
*valueTypeFlags |= (J9ClassContainsUnflattenedFlattenables | J9ClassHasReferences);
eligibleForFastSubstitutability = false;
} else if (J9_ARE_NO_BITS_SET(valueClass->classFlags, J9ClassCanSupportFastSubstitutability)) {
eligibleForFastSubstitutability = false;
}

J9FlattenedClassCacheEntry *entry = J9_VM_FCC_ENTRY_FROM_FCC(flattenedClassCache, flattenableFieldCount);
entry->clazz = valueClass;
entry->field = field;
entry->offset = UDATA_MAX;
flattenableFieldCount += 1;
}
*valueTypeFlags |= (valueClass->classFlags & (J9ClassLargestAlignmentConstraintDouble | J9ClassLargestAlignmentConstraintReference | J9ClassHasReferences));
} else {
*valueTypeFlags |= (J9ClassLargestAlignmentConstraintReference | J9ClassHasReferences);
eligibleForFastSubstitutability = false;
}
break;
}
case 'F':
eligibleForFastSubstitutability = false;
break;
Expand Down Expand Up @@ -2059,7 +2097,7 @@ checkFlattenableFieldValueClasses(J9VMThread *currentThread, J9ClassLoader *clas
J9ROMFieldShape *field = romFieldsStartDo(romClass, &fieldWalkState);
BOOLEAN result = TRUE;

/* iterate over fields and load classes of fields marked as QTypes */
/* iterate over fields and load classes of fields marked as QTypes or NullRestricted */
while (NULL != field) {
const U_32 modifiers = field->modifiers;
J9UTF8 *signature = J9ROMFIELDSHAPE_SIGNATURE(field);
Expand All @@ -2083,20 +2121,6 @@ checkFlattenableFieldValueClasses(J9VMThread *currentThread, J9ClassLoader *clas
result = FALSE;
break;
}

/* A NullRestricted field must be in a value class with an
* ImplicitCreation attribute. The attribute must have the ACC_DEFAULT flag set.
* Static fields will be checked during class preparation.
*/
if (J9_ARE_ALL_BITS_SET(modifiers, J9FieldFlagIsNullRestricted)) {
if (J9_ARE_NO_BITS_SET(valueROMClass->modifiers, J9AccValueType)
|| J9_ARE_NO_BITS_SET(valueROMClass->optionalFlags, J9_ROMCLASS_OPTINFO_IMPLICITCREATION_ATTRIBUTE)
|| J9_ARE_NO_BITS_SET(getImplicitCreationFlags(valueROMClass), J9AccImplicitCreateHasDefaultValue)
) {
setCurrentExceptionForBadClass(currentThread, J9ROMCLASS_CLASSNAME(romClass), J9VMCONSTANTPOOL_JAVALANGINCOMPATIBLECLASSCHANGEERROR,
J9NLS_VM_NULLRESTRICTED_MUST_BE_IN_DEFAULT_IMPLICITCREATION_VALUE_CLASS);
}
}
}
}
field = romFieldsNextDo(&fieldWalkState);
Expand Down