Skip to content

Commit

Permalink
Merge pull request #4695 from jdmpapin/svm.fieldref
Browse files Browse the repository at this point in the history
Avoid unnecessary SVM records for field references
  • Loading branch information
Irwin D'Souza authored Feb 12, 2019
2 parents 065a853 + c4b210c commit 87f128a
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 3 deletions.
48 changes: 45 additions & 3 deletions runtime/compiler/runtime/SymbolValidationManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -569,6 +569,39 @@ TR::SymbolValidationManager::addMethodRecord(TR::MethodValidationRecord *record)
return true;
}

bool
TR::SymbolValidationManager::skipFieldRefClassRecord(
TR_OpaqueClassBlock *definingClass,
TR_OpaqueClassBlock *beholder,
uint32_t cpIndex)
{
// If the beholder refers to one of its own fields, or to a field of a
// well-known class, and if it does so by naming the class that declares the
// field (not a subclass), then no record is necessary.
if (definingClass == beholder || isWellKnownClass(definingClass))
{
J9Class *beholderJ9Class = reinterpret_cast<J9Class*>(beholder);
J9ConstantPool *ramCP = J9_CP_FROM_CLASS(beholderJ9Class);
J9ROMConstantPoolItem *romCP = ramCP->romConstantPool;
J9ROMFieldRef *romFieldRef = (J9ROMFieldRef *)&romCP[cpIndex];
J9ROMClassRef *romClassRef = (J9ROMClassRef *)&romCP[romFieldRef->classRefCPIndex];
J9UTF8 *classRefNameUtf8 = J9ROMCLASSREF_NAME(romClassRef);
int classRefLen = J9UTF8_LENGTH(classRefNameUtf8);
uint8_t *classRefName = J9UTF8_DATA(classRefNameUtf8);

J9Class *definingJ9Class = reinterpret_cast<J9Class*>(definingClass);
J9UTF8 *definingClassNameUtf8 = J9ROMCLASS_CLASSNAME(definingJ9Class->romClass);
int definingClassLen = J9UTF8_LENGTH(definingClassNameUtf8);
uint8_t *definingClassName = J9UTF8_DATA(definingClassNameUtf8);

if (classRefLen == definingClassLen
&& !memcmp(classRefName, definingClassName, classRefLen))
return true;
}

return false;
}

bool
TR::SymbolValidationManager::addClassByNameRecord(TR_OpaqueClassBlock *clazz, TR_OpaqueClassBlock *beholder)
{
Expand Down Expand Up @@ -616,15 +649,21 @@ TR::SymbolValidationManager::addDefiningClassFromCPRecord(TR_OpaqueClassBlock *c
{
TR_OpaqueClassBlock *beholder = reinterpret_cast<TR_OpaqueClassBlock *>(J9_CLASS_FROM_CP(constantPoolOfBeholder));
SVM_ASSERT_ALREADY_VALIDATED(this, beholder);
return addClassRecord(clazz, new (_region) DefiningClassFromCPRecord(clazz, beholder, cpIndex, isStatic));
if (skipFieldRefClassRecord(clazz, beholder, cpIndex))
return true;
else
return addClassRecord(clazz, new (_region) DefiningClassFromCPRecord(clazz, beholder, cpIndex, isStatic));
}

bool
TR::SymbolValidationManager::addStaticClassFromCPRecord(TR_OpaqueClassBlock *clazz, J9ConstantPool *constantPoolOfBeholder, uint32_t cpIndex)
{
TR_OpaqueClassBlock *beholder = reinterpret_cast<TR_OpaqueClassBlock *>(J9_CLASS_FROM_CP(constantPoolOfBeholder));
SVM_ASSERT_ALREADY_VALIDATED(this, beholder);
return addClassRecord(clazz, new (_region) StaticClassFromCPRecord(clazz, beholder, cpIndex));
if (skipFieldRefClassRecord(clazz, beholder, cpIndex))
return true;
else
return addClassRecord(clazz, new (_region) StaticClassFromCPRecord(clazz, beholder, cpIndex));
}

bool
Expand Down Expand Up @@ -684,7 +723,10 @@ TR::SymbolValidationManager::addDeclaringClassFromFieldOrStaticRecord(TR_OpaqueC
{
TR_OpaqueClassBlock *beholder = reinterpret_cast<TR_OpaqueClassBlock *>(J9_CLASS_FROM_CP(constantPoolOfBeholder));
SVM_ASSERT_ALREADY_VALIDATED(this, beholder);
return addClassRecord(clazz, new (_region) DeclaringClassFromFieldOrStaticRecord(clazz, beholder, cpIndex));
if (skipFieldRefClassRecord(clazz, beholder, cpIndex))
return true;
else
return addClassRecord(clazz, new (_region) DeclaringClassFromFieldOrStaticRecord(clazz, beholder, cpIndex));
}

bool
Expand Down
1 change: 1 addition & 0 deletions runtime/compiler/runtime/SymbolValidationManager.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -781,6 +781,7 @@ class SymbolValidationManager
bool addClassRecordWithChain(TR::ClassValidationRecordWithChain *record);
void addMultipleArrayRecords(TR_OpaqueClassBlock *clazz, int arrayDims);
bool addMethodRecord(TR::MethodValidationRecord *record);
bool skipFieldRefClassRecord(TR_OpaqueClassBlock *definingClass, TR_OpaqueClassBlock *beholder, uint32_t cpIndex);

bool validateSymbol(uint16_t idToBeValidated, void *validSymbol, TR::SymbolType type);
bool validateSymbol(uint16_t idToBeValidated, TR_OpaqueClassBlock *clazz);
Expand Down

0 comments on commit 87f128a

Please sign in to comment.