Skip to content

Commit 6ac72bd

Browse files
committed
Add JITServer support for LambdaForm methods inlining
This commit adds support for changes introduced in #12162. New interpreter emulator code that requires holding VM access while accessing object on the heap is wrapped in front-end calls enabling it to be done safely on JITServer. Signed-off-by: Dmitry Ten <Dmitry.Ten@ibm.com>
1 parent eef164d commit 6ac72bd

File tree

8 files changed

+34
-25
lines changed

8 files changed

+34
-25
lines changed

Diff for: runtime/compiler/control/JITClientCompilationThread.cpp

+7
Original file line numberDiff line numberDiff line change
@@ -492,6 +492,13 @@ handleServerMessage(JITServer::ClientStream *client, TR_J9VM *fe, JITServer::Mes
492492
client->write(response, fe->getObjectClassAt(objectAddress));
493493
}
494494
break;
495+
case MessageType::VM_getObjectClassFromKnownObjectIndex:
496+
{
497+
auto recv = client->getRecvData<TR::KnownObjectTable::Index>();
498+
auto idx = std::get<0>(recv);
499+
client->write(response, fe->getObjectClassFromKnownObjectIndex(comp, idx));
500+
}
501+
break;
495502
case MessageType::VM_getStaticReferenceFieldAtAddress:
496503
{
497504
TR::VMAccessCriticalSection getStaticReferenceFieldAtAddress(fe);

Diff for: runtime/compiler/env/VMJ9.cpp

+10
Original file line numberDiff line numberDiff line change
@@ -1125,6 +1125,16 @@ TR_J9VMBase::getObjectClassAt(uintptr_t objectAddress)
11251125
return getObjectClass(getStaticReferenceFieldAtAddress(objectAddress));
11261126
}
11271127

1128+
TR_OpaqueClassBlock *
1129+
TR_J9VMBase::getObjectClassFromKnownObjectIndex(TR::Compilation *comp, TR::KnownObjectTable::Index idx)
1130+
{
1131+
TR::VMAccessCriticalSection getObjectClassFromKnownObjectIndex(comp, TR::VMAccessCriticalSection::tryToAcquireVMAccess);
1132+
TR_OpaqueClassBlock *clazz = NULL;
1133+
if (getObjectClassFromKnownObjectIndex.hasVMAccess())
1134+
clazz = getObjectClass(comp->getKnownObjectTable()->getPointer(idx));
1135+
return clazz;
1136+
}
1137+
11281138
uintptr_t
11291139
TR_J9VMBase::getStaticReferenceFieldAtAddress(uintptr_t fieldAddress)
11301140
{

Diff for: runtime/compiler/env/VMJ9.h

+1
Original file line numberDiff line numberDiff line change
@@ -534,6 +534,7 @@ class TR_J9VMBase : public TR_FrontEnd
534534

535535
virtual TR_OpaqueClassBlock *getObjectClass(uintptr_t objectPointer);
536536
virtual TR_OpaqueClassBlock *getObjectClassAt(uintptr_t objectAddress);
537+
virtual TR_OpaqueClassBlock *getObjectClassFromKnownObjectIndex(TR::Compilation *comp, TR::KnownObjectTable::Index idx);
537538
virtual uintptr_t getReferenceFieldAt(uintptr_t objectPointer, uintptr_t offsetFromHeader);
538539
virtual uintptr_t getVolatileReferenceFieldAt(uintptr_t objectPointer, uintptr_t offsetFromHeader);
539540
virtual uintptr_t getReferenceFieldAtAddress(uintptr_t fieldAddress);

Diff for: runtime/compiler/env/VMJ9Server.cpp

+8
Original file line numberDiff line numberDiff line change
@@ -853,6 +853,14 @@ TR_J9ServerVM::getObjectClassAt(uintptr_t objectAddress)
853853
return std::get<0>(stream->read<TR_OpaqueClassBlock *>());
854854
}
855855

856+
TR_OpaqueClassBlock *
857+
TR_J9ServerVM::getObjectClassFromKnownObjectIndex(TR::Compilation *comp, TR::KnownObjectTable::Index idx)
858+
{
859+
JITServer::ServerStream *stream = _compInfoPT->getMethodBeingCompiled()->_stream;
860+
stream->write(JITServer::MessageType::VM_getObjectClassFromKnownObjectIndex, idx);
861+
return std::get<0>(stream->read<TR_OpaqueClassBlock *>());
862+
}
863+
856864
uintptr_t
857865
TR_J9ServerVM::getStaticReferenceFieldAtAddress(uintptr_t fieldAddress)
858866
{

Diff for: runtime/compiler/env/VMJ9Server.hpp

+1
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ class TR_J9ServerVM: public TR_J9VM
103103
virtual uint32_t getAllocationSize(TR::StaticSymbol *classSym, TR_OpaqueClassBlock *clazz) override;
104104
virtual TR_OpaqueClassBlock * getObjectClass(uintptr_t objectPointer) override;
105105
virtual TR_OpaqueClassBlock * getObjectClassAt(uintptr_t objectAddress) override;
106+
virtual TR_OpaqueClassBlock *getObjectClassFromKnownObjectIndex(TR::Compilation *comp, TR::KnownObjectTable::Index idx) override;
106107
virtual uintptr_t getStaticReferenceFieldAtAddress(uintptr_t fieldAddress) override;
107108

108109
virtual bool stackWalkerMaySkipFrames(TR_OpaqueMethodBlock *method, TR_OpaqueClassBlock *clazz) override;

Diff for: runtime/compiler/net/CommunicationStream.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ class CommunicationStream
9999
ClientMessage _cMsg;
100100

101101
static const uint8_t MAJOR_NUMBER = 1;
102-
static const uint16_t MINOR_NUMBER = 24;
102+
static const uint16_t MINOR_NUMBER = 25;
103103
static const uint8_t PATCH_NUMBER = 0;
104104
static uint32_t CONFIGURATION_FLAGS;
105105

Diff for: runtime/compiler/net/MessageTypes.hpp

+2
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ enum MessageType : uint16_t
120120
VM_getMethods,
121121
VM_getObjectClass,
122122
VM_getObjectClassAt,
123+
VM_getObjectClassFromKnownObjectIndex,
123124
VM_stackWalkerMaySkipFrames,
124125
VM_getStringUTF8Length,
125126
VM_classInitIsFinished,
@@ -363,6 +364,7 @@ static const char *messageNames[] =
363364
"VM_getMethods",
364365
"VM_getObjectClass",
365366
"VM_getObjectClassAt",
367+
"VM_getObjectClassFromKnownObjectIndex",
366368
"VM_stackWalkerMaySkipFrames",
367369
"VM_getStringUTF8Length",
368370
"VM_classInitIsFinished",

Diff for: runtime/compiler/optimizer/InterpreterEmulator.cpp

+4-24
Original file line numberDiff line numberDiff line change
@@ -62,21 +62,7 @@ KnownObjOperand::getClass()
6262
if (!knot || knot->isNull(knownObjIndex))
6363
return NULL;
6464

65-
#if defined(J9VM_OPT_JITSERVER)
66-
// TODO: add JITServer support
67-
if (comp->isOutOfProcessCompilation())
68-
return NULL;
69-
else
70-
#endif
71-
{
72-
TR::VMAccessCriticalSection KnownObjOperandCriticalSection(comp,
73-
TR::VMAccessCriticalSection::tryToAcquireVMAccess);
74-
75-
if (KnownObjOperandCriticalSection.hasVMAccess())
76-
{
77-
_clazz = TR::Compiler->cls.objectClass(comp, knot->getPointer(knownObjIndex));
78-
}
79-
}
65+
_clazz = comp->fej9()->getObjectClassFromKnownObjectIndex(comp, knownObjIndex);
8066

8167
return _clazz;
8268
}
@@ -868,10 +854,7 @@ InterpreterEmulator::getReturnValue(TR_ResolvedMethod *callee)
868854
TR::KnownObjectTable *knot = comp()->getKnownObjectTable();
869855
if (knot && mhIndex != TR::KnownObjectTable::UNKNOWN && !knot->isNull(mhIndex))
870856
{
871-
TR::VMAccessCriticalSection dereferenceKnownObjectField(comp()->fej9());
872-
uintptr_t mhObjectAddress = knot->getPointer(mhIndex);
873-
uintptr_t memberAddress = comp()->fej9()->getReferenceField(mhObjectAddress, "member", "Ljava/lang/invoke/MemberName;");
874-
TR::KnownObjectTable::Index memberIndex = knot->getOrCreateIndex(memberAddress);
857+
TR::KnownObjectTable::Index memberIndex = comp()->fej9()->getMemberNameFieldKnotIndexFromMethodHandleKnotIndex(comp(), mhIndex, "member");
875858
debugTrace(tracer(), "Known internal member name koi %d\n", memberIndex);
876859
result = new (trStackMemory()) KnownObjOperand(memberIndex);
877860
}
@@ -885,10 +868,7 @@ InterpreterEmulator::getReturnValue(TR_ResolvedMethod *callee)
885868
TR::KnownObjectTable *knot = comp()->getKnownObjectTable();
886869
if (knot && mhIndex != TR::KnownObjectTable::UNKNOWN && !knot->isNull(mhIndex))
887870
{
888-
TR::VMAccessCriticalSection dereferenceKnownObjectField(comp()->fej9());
889-
uintptr_t mhObjectAddress = knot->getPointer(mhIndex);
890-
uintptr_t memberNameObject = comp()->fej9()->getReferenceField(mhObjectAddress, "initMethod", "Ljava/lang/invoke/MemberName;");
891-
TR::KnownObjectTable::Index memberIndex = knot->getOrCreateIndex(memberNameObject);
871+
TR::KnownObjectTable::Index memberIndex = comp()->fej9()->getMemberNameFieldKnotIndexFromMethodHandleKnotIndex(comp(), mhIndex, "initMethod");
892872
debugTrace(tracer(), "Known internal member name koi %d\n", memberIndex);
893873
result = new (trStackMemory()) KnownObjOperand(memberIndex);
894874
}
@@ -1131,7 +1111,7 @@ InterpreterEmulator::visitInvokedynamic()
11311111
#if defined(J9VM_OPT_OPENJDK_METHODHANDLE)
11321112
if (owningMethod->isUnresolvedCallSiteTableEntry(callSiteIndex)
11331113
|| comp()->compileRelocatableCode()
1134-
) return; // do nothing if unresolved, is AOT or JITServer compilation
1114+
) return; // do nothing if unresolved, is AOT compilation
11351115
uintptr_t * invokeCacheArray = (uintptr_t *) owningMethod->callSiteTableEntryAddress(callSiteIndex);
11361116
updateKnotAndCreateCallSiteUsingInvokeCacheArray(owningMethod, invokeCacheArray, -1);
11371117
#else

0 commit comments

Comments
 (0)