Skip to content

Commit 77f153d

Browse files
authored
Merge pull request #20592 from luke-li-2003/ServerCacheReflectClass
Cache Client's Reflect Class Pointers at JITServer
2 parents 038df36 + 326a800 commit 77f153d

File tree

11 files changed

+208
-36
lines changed

11 files changed

+208
-36
lines changed

runtime/compiler/control/JITClientCompilationThread.cpp

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -555,6 +555,16 @@ handleServerMessage(JITServer::ClientStream *client, TR_J9VM *fe, JITServer::Mes
555555
#else
556556
vmInfo._isNonPortableRestoreMode = false;
557557
#endif /* defined(J9VM_OPT_CRIU_SUPPORT) */
558+
vmInfo._voidReflectClassPtr = javaVM->voidReflectClass;
559+
vmInfo._booleanReflectClassPtr = javaVM->booleanReflectClass;
560+
vmInfo._charReflectClassPtr = javaVM->charReflectClass;
561+
vmInfo._floatReflectClassPtr = javaVM->floatReflectClass;
562+
vmInfo._doubleReflectClassPtr = javaVM->doubleReflectClass;
563+
vmInfo._byteReflectClassPtr = javaVM->byteReflectClass;
564+
vmInfo._shortReflectClassPtr = javaVM->shortReflectClass;
565+
vmInfo._intReflectClassPtr = javaVM->intReflectClass;
566+
vmInfo._longReflectClassPtr = javaVM->longReflectClass;
567+
558568
client->write(response, vmInfo, listOfCacheDescriptors, comp->getPersistentInfo()->getJITServerAOTCacheName());
559569
}
560570
break;
@@ -2885,6 +2895,41 @@ handleServerMessage(JITServer::ClientStream *client, TR_J9VM *fe, JITServer::Mes
28852895
client->write(response, knownObjectTableDumpInfoList);
28862896
}
28872897
break;
2898+
case MessageType::KnownObjectTable_getOpaqueClass:
2899+
{
2900+
TR::KnownObjectTable::Index knotIndex =
2901+
std::get<0>(client->getRecvData<TR::KnownObjectTable::Index>());
2902+
2903+
uintptr_t clazz = 0;
2904+
{
2905+
TR::VMAccessCriticalSection getJ9ClassFromKnownObjectIndex(fe);
2906+
2907+
uintptr_t javaLangClass = knot->getPointer(knotIndex);
2908+
clazz = (uintptr_t)fe->getInt64Field(javaLangClass, "vmRef");
2909+
}
2910+
2911+
client->write(response, clazz);
2912+
}
2913+
break;
2914+
case MessageType::KnownObjectTable_getVectorBitSize:
2915+
{
2916+
TR::KnownObjectTable::Index knotIndex =
2917+
std::get<0>(client->getRecvData<TR::KnownObjectTable::Index>());
2918+
2919+
int32_t vectorBitSize = 0;
2920+
{
2921+
TR::VMAccessCriticalSection getVBSFromKnownObjectIndex(fe);
2922+
2923+
uintptr_t vectorSpeciesLocation = knot->getPointer(knotIndex);
2924+
uintptr_t vectorShapeLocation = fe->getReferenceField(vectorSpeciesLocation,
2925+
"vectorShape",
2926+
"Ljdk/incubator/vector/VectorShape;");
2927+
vectorBitSize = fe->getInt32Field(vectorShapeLocation, "vectorBitSize");
2928+
}
2929+
2930+
client->write(response, vectorBitSize);
2931+
}
2932+
break;
28882933
case MessageType::AOTCache_getROMClassBatch:
28892934
{
28902935
auto recv = client->getRecvData<std::vector<J9Class *>>();

runtime/compiler/env/VMJ9.cpp

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1307,11 +1307,13 @@ TR_J9VMBase::getReferenceElement(uintptr_t objectPointer, intptr_t elementIndex)
13071307
return (uintptr_t)J9JAVAARRAYOFOBJECT_LOAD(vmThread(), objectPointer, elementIndex);
13081308
}
13091309

1310-
TR_arrayTypeCode TR_J9VMBase::getPrimitiveArrayTypeCode(TR_OpaqueClassBlock* clazz)
1310+
TR_arrayTypeCode
1311+
TR_J9VMBase::getPrimitiveArrayTypeCode(TR_OpaqueClassBlock* clazz)
13111312
{
13121313
TR_ASSERT(isPrimitiveClass(clazz), "Expect primitive class in TR_J9VMBase::getPrimitiveArrayType");
13131314

13141315
J9Class* j9clazz = (J9Class*)clazz;
1316+
13151317
if (j9clazz == jitConfig->javaVM->booleanReflectClass)
13161318
return atype_boolean;
13171319
else if (j9clazz == jitConfig->javaVM->charReflectClass)
@@ -1335,6 +1337,31 @@ TR_arrayTypeCode TR_J9VMBase::getPrimitiveArrayTypeCode(TR_OpaqueClassBlock* cla
13351337
}
13361338
}
13371339

1340+
TR::DataType
1341+
TR_J9VMBase::getClassPrimitiveDataType(TR_OpaqueClassBlock* clazz)
1342+
{
1343+
J9Class *j9class = TR::Compiler->cls.convertClassOffsetToClassPtr(clazz);
1344+
if (!j9class)
1345+
return TR::NoType;
1346+
1347+
J9JavaVM *vm = getJ9JITConfig()->javaVM;
1348+
1349+
if (j9class == vm->floatReflectClass)
1350+
return TR::Float;
1351+
else if (j9class == vm->doubleReflectClass)
1352+
return TR::Double;
1353+
else if (j9class == vm->byteReflectClass)
1354+
return TR::Int8;
1355+
else if (j9class == vm->shortReflectClass)
1356+
return TR::Int16;
1357+
else if (j9class == vm->intReflectClass)
1358+
return TR::Int32;
1359+
else if (j9class == vm->longReflectClass)
1360+
return TR::Int64;
1361+
else
1362+
return TR::NoType;
1363+
}
1364+
13381365
TR_OpaqueClassBlock *
13391366
TR_J9VMBase::getClassFromJavaLangClass(uintptr_t objectPointer)
13401367
{

runtime/compiler/env/VMJ9.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -669,6 +669,7 @@ class TR_J9VMBase : public TR_FrontEnd
669669

670670
virtual TR_OpaqueClassBlock *getClassFromJavaLangClass(uintptr_t objectPointer);
671671
virtual TR_arrayTypeCode getPrimitiveArrayTypeCode(TR_OpaqueClassBlock* clazz);
672+
virtual TR::DataType getClassPrimitiveDataType(TR_OpaqueClassBlock* clazz);
672673
virtual TR_OpaqueClassBlock * getSystemClassFromClassName(const char * name, int32_t length, bool callSiteVettedForAOT=false) { return 0; }
673674
virtual TR_OpaqueClassBlock * getByteArrayClass();
674675

runtime/compiler/env/VMJ9Server.cpp

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2616,6 +2616,65 @@ TR_J9ServerVM::isOffHeapAllocationEnabled()
26162616
return vmInfo->_isOffHeapAllocationEnabled;
26172617
}
26182618

2619+
2620+
TR_arrayTypeCode
2621+
TR_J9ServerVM::getPrimitiveArrayTypeCode(TR_OpaqueClassBlock* clazz)
2622+
{
2623+
TR_ASSERT(isPrimitiveClass(clazz), "Expect primitive class in TR_J9VMBase::getPrimitiveArrayType");
2624+
2625+
J9Class* j9clazz = (J9Class*)clazz;
2626+
2627+
auto stream = _compInfoPT->getStream();
2628+
auto vmInfo = _compInfoPT->getClientData()->getOrCacheVMInfo(stream);
2629+
if (j9clazz == vmInfo->_booleanReflectClassPtr)
2630+
return atype_boolean;
2631+
else if (j9clazz == vmInfo->_charReflectClassPtr)
2632+
return atype_char;
2633+
else if (j9clazz == vmInfo->_floatReflectClassPtr)
2634+
return atype_float;
2635+
else if (j9clazz == vmInfo->_doubleReflectClassPtr)
2636+
return atype_double;
2637+
else if (j9clazz == vmInfo->_byteReflectClassPtr)
2638+
return atype_byte;
2639+
else if (j9clazz == vmInfo->_shortReflectClassPtr)
2640+
return atype_short;
2641+
else if (j9clazz == vmInfo->_intReflectClassPtr)
2642+
return atype_int;
2643+
else if (j9clazz == vmInfo->_longReflectClassPtr)
2644+
return atype_long;
2645+
else
2646+
{
2647+
TR_ASSERT(false, "TR_arrayTypeCode is not defined for the j9clazz");
2648+
return (TR_arrayTypeCode)0;
2649+
}
2650+
}
2651+
2652+
TR::DataType
2653+
TR_J9ServerVM::getClassPrimitiveDataType(TR_OpaqueClassBlock* clazz)
2654+
{
2655+
J9Class *j9class = TR::Compiler->cls.convertClassOffsetToClassPtr(clazz);
2656+
2657+
if (!j9class) return TR::NoType;
2658+
2659+
auto vmInfo = _compInfoPT->getClientData()->getOrCacheVMInfo(_compInfoPT->getStream());
2660+
2661+
if (j9class == vmInfo->_floatReflectClassPtr)
2662+
return TR::Float;
2663+
else if (j9class == vmInfo->_doubleReflectClassPtr)
2664+
return TR::Double;
2665+
else if (j9class == vmInfo->_byteReflectClassPtr)
2666+
return TR::Int8;
2667+
else if (j9class == vmInfo->_shortReflectClassPtr)
2668+
return TR::Int16;
2669+
else if (j9class == vmInfo->_intReflectClassPtr)
2670+
return TR::Int32;
2671+
else if (j9class == vmInfo->_longReflectClassPtr)
2672+
return TR::Int64;
2673+
else
2674+
return TR::NoType;
2675+
}
2676+
2677+
26192678
bool
26202679
TR_J9SharedCacheServerVM::isClassLibraryMethod(TR_OpaqueMethodBlock *method, bool vettedForAOT)
26212680
{

runtime/compiler/env/VMJ9Server.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,9 @@ class TR_J9ServerVM: public TR_J9VM
265265
virtual bool isIndexableDataAddrPresent() override;
266266
virtual bool isOffHeapAllocationEnabled() override;
267267

268+
virtual TR_arrayTypeCode getPrimitiveArrayTypeCode(TR_OpaqueClassBlock* clazz) override;
269+
virtual TR::DataType getClassPrimitiveDataType(TR_OpaqueClassBlock* clazz) override;
270+
268271
private:
269272
bool instanceOfOrCheckCastHelper(J9Class *instanceClass, J9Class* castClass, bool cacheUpdate);
270273
bool checkCHTableIfClassInfoExistsAndHasBeenExtended(TR_OpaqueClassBlock *clazz, bool &bClassHasBeenExtended);

runtime/compiler/net/CommunicationStream.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ class CommunicationStream
128128
// likely to lose an increment when merging/rebasing/etc.
129129
//
130130
static const uint8_t MAJOR_NUMBER = 1;
131-
static const uint16_t MINOR_NUMBER = 71; // ID:1QMsN16q0acJzn1qRQHY
131+
static const uint16_t MINOR_NUMBER = 72; // ID: PB545sJS3QOBXIIPV5JZ
132132
static const uint8_t PATCH_NUMBER = 0;
133133
static uint32_t CONFIGURATION_FLAGS;
134134

runtime/compiler/net/MessageTypes.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,8 @@ const char *messageNames[] =
259259
"KnownObjectTable_createSymRefWithKnownObject",
260260
"KnownObjectTable_getReferenceField",
261261
"KnownObjectTable_getKnownObjectTableDumpInfo",
262+
"KnownObjectTable_getOpaqueClass",
263+
"KnownObjectTable_getVectorBitSize",
262264
"AOTCache_getROMClassBatch",
263265
"AOTCacheMap_request",
264266
"AOTCacheMap_reply"

runtime/compiler/net/MessageTypes.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,12 +284,17 @@ enum MessageType : uint16_t
284284
KnownObjectTable_createSymRefWithKnownObject,
285285
KnownObjectTable_getReferenceField,
286286
KnownObjectTable_getKnownObjectTableDumpInfo,
287+
// for getting a J9Class from KnownObjectTable
288+
KnownObjectTable_getOpaqueClass,
289+
// for getting a vectorBitSize from KnownObjectTable
290+
KnownObjectTable_getVectorBitSize,
287291

288292
AOTCache_getROMClassBatch,
289293

290294
AOTCacheMap_request,
291295
AOTCacheMap_reply,
292296

297+
293298
MessageType_MAXTYPE
294299
};
295300
extern const char *messageNames[];

runtime/compiler/optimizer/VectorAPIExpansion.cpp

Lines changed: 52 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -637,21 +637,41 @@ TR_VectorAPIExpansion::getVectorSizeFromVectorSpecies(TR::Node *vectorSpeciesNod
637637
{
638638
if (vSpeciesSymRef->hasKnownObjectIndex())
639639
{
640-
TR_J9VMBase *fej9 = (TR_J9VMBase *)(comp()->fe());
641-
TR::VMAccessCriticalSection getVectorSizeFromVectorSpeciesSection(fej9);
640+
int32_t vectorBitSize = 0;
641+
#if defined(J9VM_OPT_JITSERVER)
642+
if (comp()->isOutOfProcessCompilation()) /* In server mode */
643+
{
644+
auto stream = comp()->getStream();
645+
stream->write(JITServer::MessageType::KnownObjectTable_getVectorBitSize,
646+
vSpeciesSymRef->getKnownObjectIndex());
647+
vectorBitSize = std::get<0>(stream->read<int32_t>());
648+
}
649+
else
650+
#endif /* defined(J9VM_OPT_JITSERVER) */
651+
{
652+
TR_J9VMBase *fej9 = (TR_J9VMBase *)(comp()->fe());
653+
654+
TR::VMAccessCriticalSection getVectorSizeFromVectorSpeciesSection(fej9);
655+
656+
uintptr_t vectorSpeciesLocation =
657+
comp()->getKnownObjectTable()->getPointer(vSpeciesSymRef->getKnownObjectIndex());
658+
uintptr_t vectorShapeLocation =
659+
fej9->getReferenceField(vectorSpeciesLocation,
660+
"vectorShape",
661+
"Ljdk/incubator/vector/VectorShape;");
662+
vectorBitSize = fej9->getInt32Field(vectorShapeLocation, "vectorBitSize");
663+
}
664+
642665

643-
uintptr_t vectorSpeciesLocation = comp()->getKnownObjectTable()->getPointer(vSpeciesSymRef->getKnownObjectIndex());
644-
uintptr_t vectorShapeLocation = fej9->getReferenceField(vectorSpeciesLocation, "vectorShape", "Ljdk/incubator/vector/VectorShape;");
645-
int32_t vectorBitSize = fej9->getInt32Field(vectorShapeLocation, "vectorBitSize");
646666
return (vec_sz_t)vectorBitSize;
647667
}
648668
}
649669
return vec_len_unknown;
650670
}
651671

652672

653-
J9Class *
654-
TR_VectorAPIExpansion::getJ9ClassFromClassNode(TR::Compilation *comp, TR::Node *classNode)
673+
TR_OpaqueClassBlock *
674+
TR_VectorAPIExpansion::getOpaqueClassBlockFromClassNode(TR::Compilation *comp, TR::Node *classNode)
655675
{
656676
if (!classNode->getOpCode().hasSymbolReference())
657677
return NULL;
@@ -671,14 +691,27 @@ TR_VectorAPIExpansion::getJ9ClassFromClassNode(TR::Compilation *comp, TR::Node *
671691

672692
if (knownObjectIndex != TR::KnownObjectTable::UNKNOWN)
673693
{
674-
TR_J9VMBase *fej9 = comp->fej9();
694+
TR_OpaqueClassBlock *clazz = NULL;
695+
#if defined(J9VM_OPT_JITSERVER)
696+
if (comp->isOutOfProcessCompilation()) /* In server mode */
697+
{
698+
auto stream = comp->getStream();
699+
stream->write(JITServer::MessageType::KnownObjectTable_getOpaqueClass,
700+
symRef->getKnownObjectIndex());
701+
clazz = (TR_OpaqueClassBlock *)std::get<0>(stream->read<uintptr_t>());
702+
}
703+
else
704+
#endif /* defined(J9VM_OPT_JITSERVER) */
705+
{
706+
TR_J9VMBase *fej9 = comp->fej9();
675707

676-
TR::VMAccessCriticalSection getDataTypeFromClassNodeSection(fej9);
708+
TR::VMAccessCriticalSection getDataTypeFromClassNodeSection(fej9);
677709

678-
uintptr_t javaLangClass = comp->getKnownObjectTable()->getPointer(knownObjectIndex);
679-
J9Class *j9class = (J9Class *)(intptr_t)fej9->getInt64Field(javaLangClass, "vmRef");
710+
uintptr_t javaLangClass = comp->getKnownObjectTable()->getPointer(knownObjectIndex);
711+
clazz = (TR_OpaqueClassBlock *)(intptr_t)fej9->getInt64Field(javaLangClass, "vmRef");
712+
}
680713

681-
return j9class;
714+
return clazz;
682715
}
683716

684717
return NULL;
@@ -688,38 +721,24 @@ TR_VectorAPIExpansion::getJ9ClassFromClassNode(TR::Compilation *comp, TR::Node *
688721
TR::DataType
689722
TR_VectorAPIExpansion::getDataTypeFromClassNode(TR::Compilation *comp, TR::Node *classNode)
690723
{
691-
J9Class *j9class = getJ9ClassFromClassNode(comp, classNode);
724+
TR_OpaqueClassBlock *clazz = getOpaqueClassBlockFromClassNode(comp, classNode);
692725

693-
if (!j9class) return TR::NoType;
726+
if (!clazz) return TR::NoType;
694727

695728
TR_J9VMBase *fej9 = comp->fej9();
696-
J9JavaVM *vm = fej9->getJ9JITConfig()->javaVM;
697-
698-
if (j9class == vm->floatReflectClass)
699-
return TR::Float;
700-
else if (j9class == vm->doubleReflectClass)
701-
return TR::Double;
702-
else if (j9class == vm->byteReflectClass)
703-
return TR::Int8;
704-
else if (j9class == vm->shortReflectClass)
705-
return TR::Int16;
706-
else if (j9class == vm->intReflectClass)
707-
return TR::Int32;
708-
else if (j9class == vm->longReflectClass)
709-
return TR::Int64;
710-
else
711-
return TR::NoType;
729+
return fej9->getClassPrimitiveDataType(clazz);
712730
}
713731

714732

715733
TR_VectorAPIExpansion::vapiObjType
716734
TR_VectorAPIExpansion::getObjectTypeFromClassNode(TR::Compilation *comp, TR::Node *classNode)
717735
{
718-
J9Class *j9class = getJ9ClassFromClassNode(comp, classNode);
736+
TR_OpaqueClassBlock *clazz = getOpaqueClassBlockFromClassNode(comp, classNode);
719737

720-
if (!j9class) return Unknown;
738+
if (!clazz) return Unknown;
721739

722-
J9UTF8 *className = J9ROMCLASS_CLASSNAME(j9class->romClass);
740+
J9ROMClass *romClass = TR::Compiler->cls.romClassOf(clazz);
741+
J9UTF8 *className = J9ROMCLASS_CLASSNAME(romClass);
723742
int32_t length = J9UTF8_LENGTH(className);
724743
char *classNameChars = (char*)J9UTF8_DATA(className);
725744

runtime/compiler/optimizer/VectorAPIExpansion.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -584,7 +584,8 @@ class TR_VectorAPIExpansion : public TR::Optimization
584584
* \param classNode
585585
* Node that loads \c java/lang/Class
586586
*/
587-
static J9Class *getJ9ClassFromClassNode(TR::Compilation *comp, TR::Node *classNode);
587+
static TR_OpaqueClassBlock *getOpaqueClassBlockFromClassNode(TR::Compilation *comp,
588+
TR::Node *classNode);
588589

589590

590591
/** \brief

0 commit comments

Comments
 (0)