Skip to content

Commit 3638df4

Browse files
authored
Merge pull request #20373 from dsouzai/aotmhResolved
Add SVM AOT support for resolved invokeHandle/invokeDynamic dispatch
2 parents d7f653d + 9a7438f commit 3638df4

26 files changed

Lines changed: 1103 additions & 64 deletions

doc/compiler/aot/RelocationRecords.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,3 +137,7 @@ exact type of the API class for each relocation kind can be found in
137137
|`TR_CatchBlockCounter`|Relocates the address of the catch block counter in the `TR_PersistentMethodInfo` of the method being compiled.|
138138
|`TR_StartPC`|Relocates the startPC of the method being compiled. Only implemented and used on Power.|
139139
|`TR_MethodEnterExitHookAddress`|Relocates the address of the method enter or exit hook.|
140+
|`TR_ValidateDynamicMethodFromCallsiteIndex`|Validates the target method of an `invokeDynamic` invocation.|
141+
|`TR_ValidateHandleMethodFromCPIndex`|Validates the target method of an `invokeHandle` invocation.|
142+
|`TR_CallsiteTableEntryAddress`|Relocates the callsite table entry address.|
143+
|`TR_MethodTypeTableEntryAddress`|Relocates the method type table entry address.|

runtime/bcutil/ROMClassBuilder.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -283,8 +283,14 @@ ROMClassBuilder::handleAnonClassName(J9CfrClassFile *classfile, ROMClassCreation
283283
* Performance can be much worse (compared to shared cache turned off).
284284
*/
285285
if (isLambdaFormClassName(originalStringBytes, originalStringLength, NULL/*deterministicPrefixLength*/)) {
286-
context->addFindClassFlags(J9_FINDCLASS_FLAG_DO_NOT_SHARE);
287286
context->addFindClassFlags(J9_FINDCLASS_FLAG_LAMBDAFORM);
287+
#if defined(J9VM_OPT_SHARED_CLASSES)
288+
if ((NULL != _javaVM) && (NULL != _javaVM->sharedClassConfig)) {
289+
if (J9_ARE_NO_BITS_SET(_javaVM->sharedClassConfig->runtimeFlags2, J9SHR_RUNTIMEFLAG2_SHARE_LAMBDAFORM)) {
290+
context->addFindClassFlags(J9_FINDCLASS_FLAG_DO_NOT_SHARE);
291+
}
292+
}
293+
#endif /* defined(J9VM_OPT_SHARED_CLASSES) */
288294
}
289295

290296
#if JAVA_SPEC_VERSION >= 15

runtime/compiler/codegen/J9AheadOfTimeCompile.cpp

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1349,6 +1349,67 @@ J9::AheadOfTimeCompile::initializeCommonAOTRelocationHeader(TR::IteratedExternal
13491349
}
13501350
break;
13511351

1352+
case TR_ValidateDynamicMethodFromCallsiteIndex:
1353+
{
1354+
auto *dmciRecord = reinterpret_cast<TR_RelocationRecordValidateDynamicMethodFromCallsiteIndex *>(reloRecord);
1355+
1356+
TR::DynamicMethodFromCallsiteIndexRecord *svmRecord = reinterpret_cast<TR::DynamicMethodFromCallsiteIndexRecord *>(relocation->getTargetAddress());
1357+
1358+
dmciRecord->setMethodID(reloTarget, symValManager->getSymbolIDFromValue(svmRecord->_method));
1359+
dmciRecord->setCallerID(reloTarget, symValManager->getSymbolIDFromValue(svmRecord->_caller));
1360+
dmciRecord->setCallsiteIndex(reloTarget, svmRecord->_callsiteIndex);
1361+
dmciRecord->setAppendixObjectNull(reloTarget, svmRecord->_appendixObjectNull);
1362+
dmciRecord->setDefiningClassID(reloTarget, symValManager->getSymbolIDFromValue(svmRecord->_definingClass));
1363+
dmciRecord->setMethodIndex(reloTarget, fej9->getMethodIndexInClass(svmRecord->_definingClass, svmRecord->_method));
1364+
}
1365+
break;
1366+
1367+
case TR_ValidateHandleMethodFromCPIndex:
1368+
{
1369+
auto *hmciRecord = reinterpret_cast<TR_RelocationRecordValidateHandleMethodFromCPIndex *>(reloRecord);
1370+
1371+
TR::HandleMethodFromCPIndex *svmRecord = reinterpret_cast<TR::HandleMethodFromCPIndex *>(relocation->getTargetAddress());
1372+
1373+
hmciRecord->setMethodID(reloTarget, symValManager->getSymbolIDFromValue(svmRecord->_method));
1374+
hmciRecord->setCallerID(reloTarget, symValManager->getSymbolIDFromValue(svmRecord->_caller));
1375+
hmciRecord->setCpIndex(reloTarget, svmRecord->_cpIndex);
1376+
hmciRecord->setAppendixObjectNull(reloTarget, svmRecord->_appendixObjectNull);
1377+
hmciRecord->setDefiningClassID(reloTarget, symValManager->getSymbolIDFromValue(svmRecord->_definingClass));
1378+
hmciRecord->setMethodIndex(reloTarget, fej9->getMethodIndexInClass(svmRecord->_definingClass, svmRecord->_method));
1379+
}
1380+
break;
1381+
1382+
case TR_CallsiteTableEntryAddress:
1383+
{
1384+
auto *cteaRecord = reinterpret_cast<TR_RelocationRecordCallsiteTableEntryAddress *>(reloRecord);
1385+
1386+
TR::SymbolReference *symRef = reinterpret_cast<TR::SymbolReference *>(relocation->getTargetAddress());
1387+
uint8_t flags = static_cast<uint8_t>(reinterpret_cast<uintptr_t>(relocation->getTargetAddress2()));
1388+
1389+
TR_OpaqueMethodBlock *method = symRef->getOwningMethod(comp)->getNonPersistentIdentifier();
1390+
1391+
cteaRecord->setReloFlags(reloTarget, flags);
1392+
cteaRecord->setMethodID(reloTarget, symValManager->getSymbolIDFromValue(method));
1393+
cteaRecord->setCallsiteIndex(reloTarget, symRef->getSymbol()->getStaticSymbol()->getCallSiteIndex());
1394+
}
1395+
break;
1396+
1397+
1398+
case TR_MethodTypeTableEntryAddress:
1399+
{
1400+
auto *mteaRecord = reinterpret_cast<TR_RelocationRecordMethodTypeTableEntryAddress *>(reloRecord);
1401+
1402+
TR::SymbolReference *symRef = reinterpret_cast<TR::SymbolReference *>(relocation->getTargetAddress());
1403+
uint8_t flags = static_cast<uint8_t>(reinterpret_cast<uintptr_t>(relocation->getTargetAddress2()));
1404+
1405+
TR_OpaqueMethodBlock *method = symRef->getOwningMethod(comp)->getNonPersistentIdentifier();
1406+
1407+
mteaRecord->setReloFlags(reloTarget, flags);
1408+
mteaRecord->setMethodID(reloTarget, symValManager->getSymbolIDFromValue(method));
1409+
mteaRecord->setCpIndex(reloTarget, symRef->getSymbol()->getStaticSymbol()->getMethodTypeIndex());
1410+
}
1411+
break;
1412+
13521413
default:
13531414
TR_ASSERT(false, "Unknown relo type %d!\n", kind);
13541415
comp->failCompilation<J9::AOTRelocationRecordGenerationFailure>("Unknown relo type %d!\n", kind);
@@ -2292,6 +2353,78 @@ J9::AheadOfTimeCompile::dumpRelocationHeaderData(uint8_t *cursor, bool isVerbose
22922353
}
22932354
break;
22942355

2356+
case TR_ValidateDynamicMethodFromCallsiteIndex:
2357+
{
2358+
auto *dmciRecord = reinterpret_cast<TR_RelocationRecordValidateDynamicMethodFromCallsiteIndex *>(reloRecord);
2359+
2360+
self()->traceRelocationOffsets(startOfOffsets, offsetSize, endOfCurrentRecord, orderedPair);
2361+
if (isVerbose)
2362+
{
2363+
traceMsg(
2364+
self()->comp(),
2365+
"\n Validate Dynamic Method From Callsite Index: methodID=%d, callerID=%d, callsiteIndex=%d, appendixObjectNull=%s, definingClassID=%d, methodIndex=%d ",
2366+
(uint32_t)dmciRecord->methodID(reloTarget),
2367+
(uint32_t)dmciRecord->callerID(reloTarget),
2368+
dmciRecord->callsiteIndex(reloTarget),
2369+
dmciRecord->appendixObjectNull(reloTarget) ? "true" : "false",
2370+
(uint32_t)dmciRecord->definingClassID(reloTarget),
2371+
dmciRecord->methodIndex(reloTarget));
2372+
}
2373+
}
2374+
break;
2375+
2376+
case TR_ValidateHandleMethodFromCPIndex:
2377+
{
2378+
auto *hmciRecord = reinterpret_cast<TR_RelocationRecordValidateHandleMethodFromCPIndex *>(reloRecord);
2379+
2380+
self()->traceRelocationOffsets(startOfOffsets, offsetSize, endOfCurrentRecord, orderedPair);
2381+
if (isVerbose)
2382+
{
2383+
traceMsg(
2384+
self()->comp(),
2385+
"\n Validate Handle Method From CP Index: methodID=%d, callerID=%d, cpIndex=%d, appendixObjectNull=%s, definingClassID=%d, methodIndex=%d ",
2386+
(uint32_t)hmciRecord->methodID(reloTarget),
2387+
(uint32_t)hmciRecord->callerID(reloTarget),
2388+
hmciRecord->cpIndex(reloTarget),
2389+
hmciRecord->appendixObjectNull(reloTarget) ? "true" : "false",
2390+
(uint32_t)hmciRecord->definingClassID(reloTarget),
2391+
hmciRecord->methodIndex(reloTarget));
2392+
}
2393+
}
2394+
break;
2395+
2396+
case TR_CallsiteTableEntryAddress:
2397+
{
2398+
auto *cteaRecord = reinterpret_cast<TR_RelocationRecordCallsiteTableEntryAddress *>(reloRecord);
2399+
2400+
self()->traceRelocationOffsets(startOfOffsets, offsetSize, endOfCurrentRecord, orderedPair);
2401+
if (isVerbose)
2402+
{
2403+
traceMsg(
2404+
self()->comp(),
2405+
"\n Callsite Table Entry Address: methodID=%d, callsiteIndex=%d ",
2406+
(uint32_t)cteaRecord->methodID(reloTarget),
2407+
cteaRecord->callsiteIndex(reloTarget));
2408+
}
2409+
}
2410+
break;
2411+
2412+
case TR_MethodTypeTableEntryAddress:
2413+
{
2414+
auto *mteaRecord = reinterpret_cast<TR_RelocationRecordMethodTypeTableEntryAddress *>(reloRecord);
2415+
2416+
self()->traceRelocationOffsets(startOfOffsets, offsetSize, endOfCurrentRecord, orderedPair);
2417+
if (isVerbose)
2418+
{
2419+
traceMsg(
2420+
self()->comp(),
2421+
"\n Method Type Table Entry Address: methodID=%d, cpIndex=%d ",
2422+
(uint32_t)mteaRecord->methodID(reloTarget),
2423+
mteaRecord->cpIndex(reloTarget));
2424+
}
2425+
}
2426+
break;
2427+
22952428
default:
22962429
TR_ASSERT_FATAL(false, "dumpRelocationHeaderData: unknown relo kind %d\n", kind);
22972430
}

runtime/compiler/control/JITClientCompilationThread.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -486,6 +486,11 @@ handleServerMessage(JITServer::ClientStream *client, TR_J9VM *fe, JITServer::Mes
486486
// These offsets are initialized later on
487487
vmInfo._vmtargetOffset = 0;
488488
vmInfo._vmindexOffset = 0;
489+
auto sharedCacheConfig = fe->sharedCache() ? fe->sharedCache()->sharedCacheConfig() : NULL;
490+
if (sharedCacheConfig)
491+
vmInfo._shareLambdaForm = J9_ARE_ALL_BITS_SET(sharedCacheConfig->runtimeFlags2, J9SHR_RUNTIMEFLAG2_SHARE_LAMBDAFORM);
492+
else
493+
vmInfo._shareLambdaForm = false;
489494
#endif /* defined(J9VM_OPT_OPENJDK_METHODHANDLE) */
490495
}
491496

@@ -1915,6 +1920,18 @@ handleServerMessage(JITServer::ClientStream *client, TR_J9VM *fe, JITServer::Mes
19151920
client->write(response, mirror->isFieldFlattened(comp, cpIndex, isStatic));
19161921
}
19171922
break;
1923+
case MessageType::ResolvedMethod_getTargetMethodFromMemberName:
1924+
{
1925+
auto recv = client->getRecvData<TR_ResolvedJ9Method *, uintptr_t *>();
1926+
TR_ResolvedJ9Method *owningMethod = std::get<0>(recv);
1927+
uintptr_t * invokeCacheArray = std::get<1>(recv);
1928+
1929+
bool isInvokeCacheAppendixNull;
1930+
TR_OpaqueMethodBlock *targetMethod = owningMethod->getTargetMethodFromMemberName(invokeCacheArray, &isInvokeCacheAppendixNull);
1931+
1932+
client->write(response, targetMethod, isInvokeCacheAppendixNull);
1933+
}
1934+
break;
19181935
case MessageType::ResolvedRelocatableMethod_createResolvedRelocatableJ9Method:
19191936
{
19201937
auto recv = client->getRecvData<TR_ResolvedJ9Method *, J9Method *, int32_t, uint32_t>();

runtime/compiler/env/J9SharedCache.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -448,6 +448,8 @@ class TR_J9SharedCache : public TR_SharedCache
448448

449449
virtual J9SharedClassCacheDescriptor *getCacheDescriptorList();
450450

451+
J9SharedClassConfig *sharedCacheConfig() { return _sharedCacheConfig; }
452+
451453
protected:
452454
static bool disclaim(const uint8_t *start, const uint8_t *end, UDATA pageSize, bool trace);
453455

@@ -503,7 +505,6 @@ class TR_J9SharedCache : public TR_SharedCache
503505

504506
J9JITConfig *jitConfig() { return _jitConfig; }
505507
J9JavaVM *javaVM() { return _javaVM; }
506-
J9SharedClassConfig *sharedCacheConfig() { return _sharedCacheConfig; }
507508

508509
TR_AOTStats *aotStats() { return _aotStats; }
509510

runtime/compiler/env/j9method.cpp

Lines changed: 74 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1294,6 +1294,30 @@ TR_ResolvedRelocatableJ9Method::isUnresolvedMethodHandle(I_32 cpIndex)
12941294
return true;
12951295
}
12961296

1297+
bool
1298+
TR_ResolvedRelocatableJ9Method::isUnresolvedCallSiteTableEntry(int32_t callSiteIndex)
1299+
{
1300+
bool unresolved = true;
1301+
J9JavaVM * javaVM = fej9()->_jitConfig->javaVM;
1302+
if (J9_ARE_ALL_BITS_SET(javaVM->sharedClassConfig->runtimeFlags2, J9SHR_RUNTIMEFLAG2_SHARE_LAMBDAFORM))
1303+
{
1304+
unresolved = TR_ResolvedJ9Method::isUnresolvedCallSiteTableEntry(callSiteIndex);
1305+
}
1306+
return unresolved;
1307+
}
1308+
1309+
bool
1310+
TR_ResolvedRelocatableJ9Method::isUnresolvedMethodTypeTableEntry(int32_t cpIndex)
1311+
{
1312+
bool unresolved = true;
1313+
J9JavaVM * javaVM = fej9()->_jitConfig->javaVM;
1314+
if (J9_ARE_ALL_BITS_SET(javaVM->sharedClassConfig->runtimeFlags2, J9SHR_RUNTIMEFLAG2_SHARE_LAMBDAFORM))
1315+
{
1316+
unresolved = TR_ResolvedJ9Method::isUnresolvedMethodTypeTableEntry(cpIndex);
1317+
}
1318+
return unresolved;
1319+
}
1320+
12971321
TR_ResolvedMethod *
12981322
TR_ResolvedRelocatableJ9Method::getResolvedPossiblyPrivateVirtualMethod(
12991323
TR::Compilation *comp,
@@ -6970,6 +6994,20 @@ TR_ResolvedJ9Method::handleUnresolvedVirtualMethodInCP(int32_t cpIndex, bool * u
69706994
{
69716995
}
69726996

6997+
TR_OpaqueMethodBlock *
6998+
TR_ResolvedJ9Method::getTargetMethodFromMemberName(uintptr_t * invokeCacheArray, bool * isInvokeCacheAppendixNull)
6999+
{
7000+
TR::VMAccessCriticalSection getTargetMethodCS(fej9());
7001+
TR_OpaqueMethodBlock *targetJ9MethodBlock = fej9()->targetMethodFromMemberName((uintptr_t) fej9()->getReferenceElement(*invokeCacheArray, JSR292_invokeCacheArrayMemberNameIndex));
7002+
// if the callSite table entry / method type table entry is resolved,
7003+
// we can check if the appendix object is null,
7004+
// in which case the appendix object must not be pushed to stack
7005+
auto appendixObject = fej9()->getReferenceElement(*invokeCacheArray, JSR292_invokeCacheArrayAppendixIndex);
7006+
if (isInvokeCacheAppendixNull && !appendixObject)
7007+
*isInvokeCacheAppendixNull = true;
7008+
return targetJ9MethodBlock;
7009+
}
7010+
69737011
TR_ResolvedMethod *
69747012
TR_ResolvedJ9Method::getResolvedDynamicMethod(TR::Compilation * comp, I_32 callSiteIndex, bool * unresolvedInCP, bool * isInvokeCacheAppendixNull)
69757013
{
@@ -7006,13 +7044,12 @@ TR_ResolvedJ9Method::getResolvedDynamicMethod(TR::Compilation * comp, I_32 callS
70067044
J9UTF8 *signature = J9ROMNAMEANDSIGNATURE_SIGNATURE(nameAndSig);
70077045

70087046
#if defined(J9VM_OPT_OPENJDK_METHODHANDLE)
7009-
if (isInvokeCacheAppendixNull)
7010-
*isInvokeCacheAppendixNull = false;
7047+
bool invokeCacheAppendixNull = false;
70117048

70127049
if (!isUnresolvedEntry)
70137050
{
7014-
TR_OpaqueMethodBlock * targetJ9MethodBlock = NULL;
70157051
uintptr_t * invokeCacheArray = (uintptr_t *) callSiteTableEntryAddress(callSiteIndex);
7052+
70167053
// invokedynamic resolution can either result in a valid entry in the corresponding CallSite table slot if successful,
70177054
// or an exception object otherwise. The CallSite table entry is a two-element array containing the MemberName
70187055
// and appendix objects necessary for constructing a resolved invokedynamic adapter method call.
@@ -7023,14 +7060,21 @@ TR_ResolvedJ9Method::getResolvedDynamicMethod(TR::Compilation * comp, I_32 callS
70237060
comp->failCompilation<TR::CompilationException>("Invalid CallSite table entry for invokedynamic");
70247061
}
70257062

7063+
TR_OpaqueMethodBlock * targetJ9MethodBlock = getTargetMethodFromMemberName(invokeCacheArray, &invokeCacheAppendixNull);
7064+
7065+
if (comp->compileRelocatableCode())
70267066
{
7027-
TR::VMAccessCriticalSection getResolvedDynamicMethod(fej9());
7028-
targetJ9MethodBlock = fej9()->targetMethodFromMemberName((uintptr_t) fej9()->getReferenceElement(*invokeCacheArray, JSR292_invokeCacheArrayMemberNameIndex)); // this will not work in AOT or JITServer
7029-
// if the callSite table entry is resolved, we can check if the appendix object is null,
7030-
// in which case the appendix object must not be pushed to stack
7031-
uintptr_t appendixObject = (uintptr_t) fej9()->getReferenceElement(*invokeCacheArray, JSR292_invokeCacheArrayAppendixIndex);
7032-
if (isInvokeCacheAppendixNull && !appendixObject) *isInvokeCacheAppendixNull = true;
7067+
bool valid =
7068+
comp->getSymbolValidationManager()->addDynamicMethodFromCallsiteIndex(
7069+
targetJ9MethodBlock,
7070+
getNonPersistentIdentifier(),
7071+
callSiteIndex,
7072+
invokeCacheAppendixNull);
7073+
7074+
if (!valid)
7075+
comp->failCompilation<J9::AOTHasInvokeHandle>("Failed to add validation record for resolved dynamic method %p", targetJ9MethodBlock);
70337076
}
7077+
70347078
result = fej9()->createResolvedMethod(comp->trMemory(), targetJ9MethodBlock, this);
70357079
}
70367080
else
@@ -7044,6 +7088,9 @@ TR_ResolvedJ9Method::getResolvedDynamicMethod(TR::Compilation * comp, I_32 callS
70447088
char * linkToStaticSignature = _fe->getSignatureForLinkToStaticForInvokeDynamic(comp, signature, signatureLength);
70457089
result = _fe->createResolvedMethodWithSignature(comp->trMemory(), dummyInvoke, NULL, linkToStaticSignature, signatureLength, this);
70467090
}
7091+
7092+
if (isInvokeCacheAppendixNull)
7093+
*isInvokeCacheAppendixNull = invokeCacheAppendixNull;
70477094
#else
70487095
TR_OpaqueMethodBlock *dummyInvokeExact = _fe->getMethodFromName("java/lang/invoke/MethodHandle", "invokeExact", JSR292_invokeExactSig);
70497096
result = _fe->createResolvedMethodWithSignature(comp->trMemory(), dummyInvokeExact, NULL, utf8Data(signature), J9UTF8_LENGTH(signature), this);
@@ -7081,19 +7128,27 @@ TR_ResolvedJ9Method::getResolvedHandleMethod(TR::Compilation * comp, I_32 cpInde
70817128
#if defined(J9VM_OPT_OPENJDK_METHODHANDLE)
70827129
J9UTF8 *signature = J9ROMNAMEANDSIGNATURE_SIGNATURE(nameAndSig);
70837130

7084-
if (isInvokeCacheAppendixNull)
7085-
*isInvokeCacheAppendixNull = false;
7131+
bool invokeCacheAppendixNull = false;
70867132

70877133
if (!isUnresolvedEntry)
70887134
{
70897135
uintptr_t * invokeCacheArray = (uintptr_t *) methodTypeTableEntryAddress(cpIndex);
7090-
TR_OpaqueMethodBlock * targetJ9MethodBlock = NULL;
7136+
7137+
TR_OpaqueMethodBlock * targetJ9MethodBlock = getTargetMethodFromMemberName(invokeCacheArray, &invokeCacheAppendixNull);
7138+
7139+
if (comp->compileRelocatableCode())
70917140
{
7092-
TR::VMAccessCriticalSection getResolvedHandleMethod(fej9());
7093-
targetJ9MethodBlock = fej9()->targetMethodFromMemberName((uintptr_t) fej9()->getReferenceElement(*invokeCacheArray, JSR292_invokeCacheArrayMemberNameIndex)); // this will not work in AOT or JITServer
7094-
uintptr_t appendixObject = (uintptr_t) fej9()->getReferenceElement(*invokeCacheArray, JSR292_invokeCacheArrayAppendixIndex);
7095-
if (isInvokeCacheAppendixNull && !appendixObject) *isInvokeCacheAppendixNull = true;
7141+
bool valid =
7142+
comp->getSymbolValidationManager()->addHandleMethodFromCPIndex(
7143+
targetJ9MethodBlock,
7144+
getNonPersistentIdentifier(),
7145+
cpIndex,
7146+
invokeCacheAppendixNull);
7147+
7148+
if (!valid)
7149+
comp->failCompilation<J9::AOTHasInvokeHandle>("Failed to add validation record for resolved handle method %p", targetJ9MethodBlock);
70967150
}
7151+
70977152
result = fej9()->createResolvedMethod(comp->trMemory(), targetJ9MethodBlock, this);
70987153
}
70997154
else
@@ -7107,6 +7162,9 @@ TR_ResolvedJ9Method::getResolvedHandleMethod(TR::Compilation * comp, I_32 cpInde
71077162
char * linkToStaticSignature = _fe->getSignatureForLinkToStaticForInvokeHandle(comp, signature, signatureLength);
71087163
result = _fe->createResolvedMethodWithSignature(comp->trMemory(), dummyInvoke, NULL, linkToStaticSignature, signatureLength, this);
71097164
}
7165+
7166+
if (isInvokeCacheAppendixNull)
7167+
*isInvokeCacheAppendixNull = invokeCacheAppendixNull;
71107168
#else
71117169

71127170
TR_OpaqueMethodBlock *dummyInvokeExact = _fe->getMethodFromName("java/lang/invoke/MethodHandle", "invokeExact", JSR292_invokeExactSig);

0 commit comments

Comments
 (0)