Skip to content

Commit 2e77d32

Browse files
Collapse the recent ILStub generation patterns into a helper (#115673)
1 parent 29638e8 commit 2e77d32

File tree

7 files changed

+118
-224
lines changed

7 files changed

+118
-224
lines changed

src/coreclr/vm/asyncthunks.cpp

Lines changed: 3 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -53,34 +53,8 @@ bool MethodDesc::TryGenerateAsyncThunk(DynamicResolver** resolver, COR_ILMETHOD_
5353
ilResolver->SetStubTargetMethodDesc(pAsyncOtherVariant);
5454

5555
// Generate all IL associated data for JIT
56-
{
57-
UINT maxStack;
58-
size_t cbCode = sl.Link(&maxStack);
59-
DWORD cbSig = sl.GetLocalSigSize();
60-
61-
COR_ILMETHOD_DECODER* pILHeader = ilResolver->AllocGeneratedIL(cbCode, cbSig, maxStack);
62-
BYTE* pbBuffer = (BYTE*)pILHeader->Code;
63-
BYTE* pbLocalSig = (BYTE*)pILHeader->LocalVarSig;
64-
_ASSERTE(cbSig == pILHeader->cbLocalVarSig);
65-
66-
size_t numEH = sl.GetNumEHClauses();
67-
if (numEH > 0)
68-
{
69-
sl.WriteEHClauses(ilResolver->AllocEHSect(numEH));
70-
}
71-
72-
sl.GenerateCode(pbBuffer, cbCode);
73-
sl.GetLocalSig(pbLocalSig, cbSig);
74-
75-
// Store the token lookup map
76-
ilResolver->SetTokenLookupMap(sl.GetTokenLookupMap());
77-
ilResolver->SetJitFlags(CORJIT_FLAGS(CORJIT_FLAGS::CORJIT_FLAG_IL_STUB));
78-
79-
*resolver = (DynamicResolver*)ilResolver;
80-
*methodILDecoder = pILHeader;
81-
}
82-
83-
ilResolver.SuppressRelease();
56+
*methodILDecoder = ilResolver->FinalizeILStub(&sl);
57+
*resolver = ilResolver.Extract();
8458
return true;
8559
}
8660

@@ -564,7 +538,7 @@ void MethodDesc::EmitAsyncMethodThunk(MethodDesc* pAsyncOtherVariant, MetaSig& m
564538
getIsCompletedToken = GetTokenForGenericTypeMethodCallWithAsyncReturnType(pCode, mdIsCompleted);
565539
getResultToken = GetTokenForGenericTypeMethodCallWithAsyncReturnType(pCode, mdGetResult);
566540
}
567-
else
541+
else
568542
{
569543
getAwaiterToken = pCode->GetToken(mdGetAwaiter);
570544
getIsCompletedToken = pCode->GetToken(mdIsCompleted);

src/coreclr/vm/dllimport.cpp

Lines changed: 2 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6483,27 +6483,8 @@ bool GenerateCopyConstructorHelper(MethodDesc* ftn, DynamicResolver** ppResolver
64836483
pCode->EmitRET();
64846484

64856485
// Generate all IL associated data for JIT
6486-
{
6487-
UINT maxStack;
6488-
size_t cbCode = sl.Link(&maxStack);
6489-
DWORD cbSig = sl.GetLocalSigSize();
6490-
6491-
COR_ILMETHOD_DECODER* pILHeader = ilResolver->AllocGeneratedIL(cbCode, cbSig, maxStack);
6492-
BYTE* pbBuffer = (BYTE*)pILHeader->Code;
6493-
BYTE* pbLocalSig = (BYTE*)pILHeader->LocalVarSig;
6494-
_ASSERTE(cbSig == pILHeader->cbLocalVarSig);
6495-
sl.GenerateCode(pbBuffer, cbCode);
6496-
sl.GetLocalSig(pbLocalSig, cbSig);
6497-
6498-
// Store the token lookup map
6499-
ilResolver->SetTokenLookupMap(sl.GetTokenLookupMap());
6500-
ilResolver->SetJitFlags(CORJIT_FLAGS(CORJIT_FLAGS::CORJIT_FLAG_IL_STUB));
6501-
6502-
*ppResolver = (DynamicResolver*)ilResolver;
6503-
*ppHeader = pILHeader;
6504-
}
6505-
6506-
ilResolver.SuppressRelease();
6486+
*ppHeader = ilResolver->FinalizeILStub(&sl);
6487+
*ppResolver = ilResolver.Extract();
65076488
return true;
65086489
}
65096490

src/coreclr/vm/ilstubcache.cpp

Lines changed: 1 addition & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -97,33 +97,9 @@ MethodDesc* ILStubCache::CreateAndLinkNewILStubMethodDesc(LoaderAllocator* pAllo
9797

9898
pResolver->SetStubMethodDesc(pStubMD);
9999

100-
101-
{
102-
UINT maxStack;
103-
size_t cbCode = pStubLinker->Link(&maxStack);
104-
DWORD cbSig = pStubLinker->GetLocalSigSize();
105-
106-
COR_ILMETHOD_DECODER * pILHeader = pResolver->AllocGeneratedIL(cbCode, cbSig, maxStack);
107-
BYTE * pbBuffer = (BYTE *)pILHeader->Code;
108-
BYTE * pbLocalSig = (BYTE *)pILHeader->LocalVarSig;
109-
_ASSERTE(cbSig == pILHeader->cbLocalVarSig);
110-
111-
size_t numEH = pStubLinker->GetNumEHClauses();
112-
if (numEH > 0)
113-
{
114-
pStubLinker->WriteEHClauses(pResolver->AllocEHSect(numEH));
115-
}
116-
117-
pStubLinker->GenerateCode(pbBuffer, cbCode);
118-
pStubLinker->GetLocalSig(pbLocalSig, cbSig);
119-
120-
pResolver->SetJitFlags(CORJIT_FLAGS(CORJIT_FLAGS::CORJIT_FLAG_IL_STUB));
121-
}
122-
123-
pResolver->SetTokenLookupMap(pStubLinker->GetTokenLookupMap());
100+
pResolver->FinalizeILStub(pStubLinker);
124101

125102
RETURN pStubMD;
126-
127103
}
128104

129105

src/coreclr/vm/ilstubresolver.cpp

Lines changed: 91 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -282,74 +282,101 @@ void ILStubResolver::GetEHInfo(unsigned EHnumber, CORINFO_EH_CLAUSE* clause)
282282
clause->FilterOffset = ehInfo->GetFilterOffset();
283283
}
284284

285-
void ILStubResolver::SetStubMethodDesc(MethodDesc* pStubMD)
285+
//---------------------------------------------------------------------------------------
286+
//
287+
ILStubResolver::ILStubResolver() :
288+
m_pCompileTimeState(dac_cast<PTR_CompileTimeState>(ILNotYetGenerated)),
289+
m_pStubMD(dac_cast<PTR_MethodDesc>(nullptr)),
290+
m_pStubTargetMD(dac_cast<PTR_MethodDesc>(nullptr)),
291+
m_jitFlags(),
292+
m_loaderHeap(dac_cast<PTR_LoaderHeap>(nullptr))
286293
{
287294
LIMITED_METHOD_CONTRACT;
288-
m_pStubMD = PTR_MethodDesc(pStubMD);
289295
}
290296

291-
void ILStubResolver::SetStubTargetMethodDesc(MethodDesc* pStubTargetMD)
297+
bool ILStubResolver::IsCompiled()
292298
{
293299
LIMITED_METHOD_CONTRACT;
294-
m_pStubTargetMD = PTR_MethodDesc(pStubTargetMD);
300+
return (dac_cast<TADDR>(m_pCompileTimeState) == ILGeneratedAndFreed);
295301
}
296302

297-
298-
//---------------------------------------------------------------------------------------
299-
//
300-
void
301-
ILStubResolver::SetStubTargetMethodSig(
302-
PCCOR_SIGNATURE pStubTargetMethodSig,
303-
DWORD cbStubTargetSigLength)
303+
bool ILStubResolver::IsILGenerated()
304304
{
305-
CONTRACTL
306-
{
307-
STANDARD_VM_CHECK;
308-
PRECONDITION(CheckPointer(m_pCompileTimeState));
309-
}
310-
CONTRACTL_END;
305+
LIMITED_METHOD_CONTRACT;
306+
return (dac_cast<TADDR>(m_pCompileTimeState) != ILNotYetGenerated);
307+
}
311308

312-
NewArrayHolder<BYTE> pNewSig = new BYTE[cbStubTargetSigLength];
309+
MethodDesc* ILStubResolver::GetStubMethodDesc()
310+
{
311+
LIMITED_METHOD_CONTRACT;
312+
return m_pStubMD;
313+
}
313314

314-
memcpyNoGCRefs((void *)pNewSig, pStubTargetMethodSig, cbStubTargetSigLength);
315+
MethodDesc* ILStubResolver::GetStubTargetMethodDesc()
316+
{
317+
LIMITED_METHOD_CONTRACT;
318+
return m_pStubTargetMD;
319+
}
315320

316-
m_pCompileTimeState->m_StubTargetMethodSig = SigPointer(pNewSig, cbStubTargetSigLength);
317-
pNewSig.SuppressRelease();
321+
COR_ILMETHOD_DECODER* ILStubResolver::GetILHeader()
322+
{
323+
LIMITED_METHOD_CONTRACT;
324+
_ASSERTE(m_pCompileTimeState != NULL);
325+
return &m_pCompileTimeState->m_ILHeader;
318326
}
319327

320-
//---------------------------------------------------------------------------------------
321-
//
322-
MethodDesc *
323-
ILStubResolver::GetStubTargetMethodDesc()
328+
#ifndef DACCESS_COMPILE
329+
void ILStubResolver::SetLoaderHeap(PTR_LoaderHeap pLoaderHeap)
324330
{
325331
LIMITED_METHOD_CONTRACT;
326-
return m_pStubTargetMD;
332+
m_loaderHeap = pLoaderHeap;
327333
}
328334

329-
MethodDesc* ILStubResolver::GetStubMethodDesc()
335+
void ILStubResolver::SetTokenLookupMap(TokenLookupMap* pMap)
336+
{
337+
STANDARD_VM_CONTRACT;
338+
_ASSERTE(m_pCompileTimeState != NULL);
339+
340+
// run copy ctor
341+
new (&m_pCompileTimeState->m_tokenLookupMap) TokenLookupMap(pMap);
342+
}
343+
344+
void ILStubResolver::SetJitFlags(CORJIT_FLAGS jitFlags)
330345
{
331346
LIMITED_METHOD_CONTRACT;
332-
return m_pStubMD;
347+
m_jitFlags = jitFlags;
333348
}
334349

335-
ILStubResolver::ILStubResolver() :
336-
m_pCompileTimeState(dac_cast<PTR_CompileTimeState>(ILNotYetGenerated)),
337-
m_pStubMD(dac_cast<PTR_MethodDesc>(nullptr)),
338-
m_pStubTargetMD(dac_cast<PTR_MethodDesc>(nullptr)),
339-
m_jitFlags(),
340-
m_loaderHeap(dac_cast<PTR_LoaderHeap>(nullptr))
350+
void ILStubResolver::SetStubMethodDesc(MethodDesc* pStubMD)
341351
{
342352
LIMITED_METHOD_CONTRACT;
353+
m_pStubMD = PTR_MethodDesc(pStubMD);
354+
}
343355

356+
void ILStubResolver::SetStubTargetMethodDesc(MethodDesc* pStubTargetMD)
357+
{
358+
LIMITED_METHOD_CONTRACT;
359+
m_pStubTargetMD = PTR_MethodDesc(pStubTargetMD);
344360
}
345361

346-
void ILStubResolver::SetLoaderHeap(PTR_LoaderHeap pLoaderHeap)
362+
void ILStubResolver::SetStubTargetMethodSig(
363+
PCCOR_SIGNATURE pStubTargetMethodSig,
364+
DWORD cbStubTargetSigLength)
347365
{
348-
m_loaderHeap = pLoaderHeap;
366+
STANDARD_VM_CONTRACT;
367+
_ASSERTE(m_pCompileTimeState != NULL);
368+
369+
NewArrayHolder<BYTE> pNewSig = new BYTE[cbStubTargetSigLength];
370+
371+
memcpyNoGCRefs((void *)pNewSig, pStubTargetMethodSig, cbStubTargetSigLength);
372+
373+
m_pCompileTimeState->m_StubTargetMethodSig = SigPointer(pNewSig, cbStubTargetSigLength);
374+
pNewSig.SuppressRelease();
349375
}
350376

351377
static COR_ILMETHOD_DECODER CreateILHeader(size_t cbCode, UINT maxStack, BYTE* pNewILCodeBuffer, BYTE* pNewLocalSig, DWORD cbLocalSig)
352378
{
379+
LIMITED_METHOD_CONTRACT;
353380
COR_ILMETHOD_DECODER ilHeader{};
354381
ilHeader.CodeSize = (DWORD)cbCode;
355382
ilHeader.MaxStack = maxStack;
@@ -359,17 +386,13 @@ static COR_ILMETHOD_DECODER CreateILHeader(size_t cbCode, UINT maxStack, BYTE* p
359386
return ilHeader;
360387
}
361388

362-
//---------------------------------------------------------------------------------------
363-
//
364-
COR_ILMETHOD_DECODER *
365-
ILStubResolver::AllocGeneratedIL(
389+
COR_ILMETHOD_DECODER* ILStubResolver::AllocGeneratedIL(
366390
size_t cbCode,
367391
DWORD cbLocalSig,
368392
UINT maxStack)
369393
{
370394
STANDARD_VM_CONTRACT;
371395

372-
#if !defined(DACCESS_COMPILE)
373396
_ASSERTE(0 != cbCode);
374397

375398
// Perform a single allocation for all needed memory
@@ -410,27 +433,37 @@ ILStubResolver::AllocGeneratedIL(
410433
newMemory.SuppressRelease();
411434
return pILHeader;
412435

413-
#else // DACCESS_COMPILE
414-
DacNotImpl();
415-
return NULL;
416-
417-
#endif // DACCESS_COMPILE
418436
} // ILStubResolver::AllocGeneratedIL
419437

420-
//---------------------------------------------------------------------------------------
421-
//
422-
COR_ILMETHOD_DECODER* ILStubResolver::GetILHeader()
438+
COR_ILMETHOD_DECODER* ILStubResolver::FinalizeILStub(ILStubLinker* sl)
423439
{
424-
CONTRACTL
440+
STANDARD_VM_CONTRACT;
441+
_ASSERTE(!IsILGenerated());
442+
_ASSERTE(sl != NULL);
443+
444+
UINT maxStack;
445+
size_t cbCode = sl->Link(&maxStack);
446+
DWORD cbSig = sl->GetLocalSigSize();
447+
448+
COR_ILMETHOD_DECODER* pILHeader = AllocGeneratedIL(cbCode, cbSig, maxStack);
449+
BYTE* pbBuffer = (BYTE*)pILHeader->Code;
450+
BYTE* pbLocalSig = (BYTE*)pILHeader->LocalVarSig;
451+
_ASSERTE(cbSig == pILHeader->cbLocalVarSig);
452+
453+
size_t numEH = sl->GetNumEHClauses();
454+
if (numEH > 0)
425455
{
426-
MODE_ANY;
427-
THROWS;
428-
GC_NOTRIGGER;
429-
PRECONDITION(CheckPointer(m_pCompileTimeState));
456+
sl->WriteEHClauses(AllocEHSect(numEH));
430457
}
431-
CONTRACTL_END;
432458

433-
return &m_pCompileTimeState->m_ILHeader;
459+
sl->GenerateCode(pbBuffer, cbCode);
460+
sl->GetLocalSig(pbLocalSig, cbSig);
461+
462+
// Store the token lookup map
463+
SetTokenLookupMap(sl->GetTokenLookupMap());
464+
SetJitFlags(CORJIT_FLAGS(CORJIT_FLAGS::CORJIT_FLAG_IL_STUB));
465+
466+
return pILHeader;
434467
}
435468

436469
COR_ILMETHOD_SECT_EH* ILStubResolver::AllocEHSect(size_t nClauses)
@@ -448,6 +481,7 @@ COR_ILMETHOD_SECT_EH* ILStubResolver::AllocEHSect(size_t nClauses)
448481
m_pCompileTimeState->m_ILHeader.EH = m_pCompileTimeState->m_pEHSect;
449482
return m_pCompileTimeState->m_pEHSect;
450483
}
484+
#endif // !DACCESS_COMPILE
451485

452486
bool ILStubResolver::UseLoaderHeap()
453487
{
@@ -506,40 +540,6 @@ ILStubResolver::ClearCompileTimeState(CompileTimeStatePtrSpecialValues newState)
506540
InterlockedExchangeT(&m_pCompileTimeState, dac_cast<PTR_CompileTimeState>((TADDR)newState));
507541
} // ILStubResolver::ClearCompileTimeState
508542

509-
//---------------------------------------------------------------------------------------
510-
//
511-
void
512-
ILStubResolver::SetTokenLookupMap(
513-
TokenLookupMap * pMap)
514-
{
515-
CONTRACTL
516-
{
517-
STANDARD_VM_CHECK;
518-
PRECONDITION(CheckPointer(m_pCompileTimeState));
519-
}
520-
CONTRACTL_END;
521-
522-
// run copy ctor
523-
new (&m_pCompileTimeState->m_tokenLookupMap) TokenLookupMap(pMap);
524-
}
525-
526-
bool ILStubResolver::IsCompiled()
527-
{
528-
LIMITED_METHOD_CONTRACT;
529-
return (dac_cast<TADDR>(m_pCompileTimeState) == ILGeneratedAndFreed);
530-
}
531-
532-
bool ILStubResolver::IsILGenerated()
533-
{
534-
return (dac_cast<TADDR>(m_pCompileTimeState) != ILNotYetGenerated);
535-
}
536-
537-
void ILStubResolver::SetJitFlags(CORJIT_FLAGS jitFlags)
538-
{
539-
LIMITED_METHOD_CONTRACT;
540-
m_jitFlags = jitFlags;
541-
}
542-
543543
// static
544544
void ILStubResolver::StubGenFailed(ILStubResolver* pResolver)
545545
{
@@ -558,4 +558,4 @@ void ILStubResolver::StubGenFailed(ILStubResolver* pResolver)
558558
}
559559

560560
pResolver->ClearCompileTimeState(ILNotYetGenerated);
561-
}
561+
}

0 commit comments

Comments
 (0)