@@ -420,7 +420,7 @@ void UnwindInfoTable::AddToUnwindInfoTable(UnwindInfoTable** unwindInfoPtr, PT_R
420420 {
421421 // This cast is justified because only EEJitManager's have the code type above.
422422 EEJitManager* pJitMgr = (EEJitManager*)(pRS->_pjit );
423- JitCodeHeader * pHeader = dac_cast<PTR_JitCodeHeader >(pJitMgr->GetCodeHeaderFromStartAddress (entryPoint));
423+ CodeHeader * pHeader = dac_cast<PTR_CodeHeader >(pJitMgr->GetCodeHeaderFromStartAddress (entryPoint));
424424 for (ULONG i = 0 ; i < pHeader->GetNumberOfUnwindInfos (); i++)
425425 RemoveFromUnwindInfoTable (&pRS->_pUnwindInfoTable , pRS->_range .RangeStart (), pRS->_range .RangeStart () + pHeader->GetUnwindInfo (i)->BeginAddress );
426426 }
@@ -438,7 +438,7 @@ void UnwindInfoTable::AddToUnwindInfoTable(UnwindInfoTable** unwindInfoPtr, PT_R
438438 STANDARD_VM_CONTRACT;
439439 {
440440 // CodeHeapIterator holds the m_CodeHeapCritSec, which ensures code heaps don't get deallocated while being walked
441- EECodeGenManager::CodeHeapIterator heapIterator (NULL );
441+ EECodeGenManager::CodeHeapIterator heapIterator (ExecutionManager::GetEEJitManager (), NULL );
442442
443443 // Currently m_CodeHeapCritSec is given the CRST_UNSAFE_ANYMODE flag which allows it to be taken in a GC_NOTRIGGER
444444 // region but also disallows GC_TRIGGERS. We need GC_TRIGGERS because we take another lock. Ideally we would
@@ -459,7 +459,7 @@ void UnwindInfoTable::AddToUnwindInfoTable(UnwindInfoTable** unwindInfoPtr, PT_R
459459 {
460460 // This cast is justified because only EEJitManager's have the code type above.
461461 EEJitManager* pJitMgr = (EEJitManager*)(pRS->_pjit );
462- JitCodeHeader * pHeader = dac_cast<PTR_JitCodeHeader >(pJitMgr->GetCodeHeaderFromStartAddress (methodEntry));
462+ CodeHeader * pHeader = dac_cast<PTR_CodeHeader >(pJitMgr->GetCodeHeaderFromStartAddress (methodEntry));
463463 int unwindInfoCount = pHeader->GetNumberOfUnwindInfos ();
464464 for (int i = 0 ; i < unwindInfoCount; i++)
465465 AddToUnwindInfoTable (&pRS->_pUnwindInfoTable , pHeader->GetUnwindInfo (i), pRS->_range .RangeStart (), pRS->_range .RangeEndOpen ());
@@ -511,10 +511,10 @@ void UnwindInfoTable::AddToUnwindInfoTable(UnwindInfoTable** unwindInfoPtr, PT_R
511511
512512/* -----------------------------------------------------------------------------
513513 This is a listing of which methods uses which synchronization mechanism
514- in the EEJitManager .
514+ in the EECodeGenManager .
515515//-----------------------------------------------------------------------------
516516
517- Setters of EEJitManager ::m_CodeHeapCritSec
517+ Setters of EECodeGenManager ::m_CodeHeapCritSec
518518-----------------------------------------------
519519allocCode
520520allocGCInfo
@@ -527,7 +527,7 @@ ReleaseReferenceToHeap
527527JitCodeToMethodInfo
528528
529529
530- Need EEJitManager ::m_CodeHeapCritSec to be set
530+ Need EECodeGenManager ::m_CodeHeapCritSec to be set
531531-----------------------------------------------
532532NewCodeHeap
533533allocCodeRaw
@@ -541,8 +541,8 @@ DeleteJitHeapCache
541541
542542
543543#if !defined(DACCESS_COMPILE)
544- EECodeGenManager::CodeHeapIterator::CodeHeapIterator (LoaderAllocator *pLoaderAllocatorFilter)
545- : m_lockHolder(&(ExecutionManager::GetEEJitManager() ->m_CodeHeapCritSec)), m_Iterator(NULL , 0 , NULL , 0 )
544+ EECodeGenManager::CodeHeapIterator::CodeHeapIterator (EECodeGenManager *pJitMgr, LoaderAllocator *pLoaderAllocatorFilter)
545+ : m_lockHolder(&(pJitMgr ->m_CodeHeapCritSec)), m_Iterator(NULL , 0 , NULL , 0 )
546546{
547547 CONTRACTL
548548 {
@@ -554,7 +554,7 @@ EECodeGenManager::CodeHeapIterator::CodeHeapIterator(LoaderAllocator *pLoaderAll
554554
555555 m_pHeapList = NULL ;
556556 m_pLoaderAllocator = pLoaderAllocatorFilter;
557- m_pHeapList = ExecutionManager::GetEEJitManager () ->GetCodeHeapList ();
557+ m_pHeapList = pJitMgr ->GetCodeHeapList ();
558558 if (m_pHeapList)
559559 new (&m_Iterator) MethodSectionIterator ((const void *)m_pHeapList->mapBase , (COUNT_T)m_pHeapList->maxCodeHeapSize , m_pHeapList->pHdrMap , (COUNT_T)HEAP2MAPSIZE (ROUND_UP_TO_PAGE (m_pHeapList->maxCodeHeapSize )));
560560};
@@ -2736,7 +2736,6 @@ void* EECodeGenManager::allocCodeRaw(CodeHeapRequestInfo *pInfo,
27362736 }
27372737 else
27382738 {
2739- // Interpreter-TODO: interpreter and dynamic domain at the same time
27402739 pCodeHeap = (HeapList *)pInfo->m_pAllocator ->m_pLastUsedDynamicCodeHeap ;
27412740 pInfo->m_pAllocator ->m_pLastUsedDynamicCodeHeap = NULL ;
27422741 }
@@ -2842,7 +2841,7 @@ void* EECodeGenManager::allocCodeRaw(CodeHeapRequestInfo *pInfo,
28422841 RETURN (mem);
28432842}
28442843
2845- void EECodeGenManager::allocCode (MethodDesc* pMD, size_t blockSize, size_t reserveForJumpStubs, CorJitAllocMemFlag flag, CodeHeader ** ppCodeHeader, CodeHeader ** ppCodeHeaderRW,
2844+ void EECodeGenManager::allocCode (MethodDesc* pMD, size_t blockSize, size_t reserveForJumpStubs, CorJitAllocMemFlag flag, void ** ppCodeHeader, void ** ppCodeHeaderRW,
28462845 size_t * pAllocatedSize, HeapList** ppCodeHeap
28472846 , BYTE** ppRealHeader
28482847#ifdef FEATURE_EH_FUNCLETS
@@ -2914,9 +2913,9 @@ void EECodeGenManager::allocCode(MethodDesc* pMD, size_t blockSize, size_t reser
29142913 requestInfo.setReserveForJumpStubs (reserveForJumpStubs);
29152914
29162915#ifdef FEATURE_EH_FUNCLETS
2917- realHeaderSize = offsetof (JitRealCodeHeader , unwindInfos[0 ]) + (sizeof (T_RUNTIME_FUNCTION) * nUnwindInfos);
2916+ realHeaderSize = offsetof (RealCodeHeader , unwindInfos[0 ]) + (sizeof (T_RUNTIME_FUNCTION) * nUnwindInfos);
29182917#else
2919- realHeaderSize = sizeof (JitRealCodeHeader );
2918+ realHeaderSize = sizeof (RealCodeHeader );
29202919#endif
29212920 }
29222921
@@ -2944,13 +2943,13 @@ void EECodeGenManager::allocCode(MethodDesc* pMD, size_t blockSize, size_t reser
29442943
29452944 _ASSERTE (IS_ALIGNED (pCode, alignment));
29462945
2947- pCodeHdr = ((JitCodeHeader *)pCode) - 1 ;
2946+ pCodeHdr = ((CodeHeader *)pCode) - 1 ;
29482947
2949- *pAllocatedSize = sizeof (JitCodeHeader ) + totalSize;
2948+ *pAllocatedSize = sizeof (CodeHeader ) + totalSize;
29502949
29512950 if (ExecutableAllocator::IsWXORXEnabled () && !requestInfo.IsInterpreted ())
29522951 {
2953- pCodeHdrRW = (JitCodeHeader *)new BYTE[*pAllocatedSize];
2952+ pCodeHdrRW = (CodeHeader *)new BYTE[*pAllocatedSize];
29542953 }
29552954 else
29562955 {
@@ -2978,7 +2977,7 @@ void EECodeGenManager::allocCode(MethodDesc* pMD, size_t blockSize, size_t reser
29782977#ifdef FEATURE_EH_FUNCLETS
29792978 if (!requestInfo.IsInterpreted ())
29802979 {
2981- ((JitCodeHeader *)pCodeHdrRW)->SetNumberOfUnwindInfos (nUnwindInfos);
2980+ ((CodeHeader *)pCodeHdrRW)->SetNumberOfUnwindInfos (nUnwindInfos);
29822981 }
29832982#endif
29842983
@@ -3165,39 +3164,39 @@ LoaderHeap *EECodeGenManager::GetJitMetaHeap(MethodDesc *pMD)
31653164 return pAllocator->GetLowFrequencyHeap ();
31663165}
31673166
3168- BYTE* EECodeGenManager::allocGCInfo (CodeHeader * pCodeHeader, DWORD blockSize, size_t * pAllocationSize)
3167+ BYTE* EECodeGenManager::allocGCInfo (void * pCodeHeader, DWORD blockSize, size_t * pAllocationSize)
31693168{
31703169 CONTRACTL {
31713170 THROWS;
31723171 GC_NOTRIGGER;
31733172 } CONTRACTL_END;
31743173
3175- MethodDesc* pMD = pCodeHeader-> GetMethodDesc ();
3174+ MethodDesc* pMD = GetMethodDesc (pCodeHeader );
31763175 // sadly for light code gen I need the check in here. We should change GetJitMetaHeap
31773176 if (pMD->IsLCGMethod ())
31783177 {
31793178 CrstHolder ch (&m_CodeHeapCritSec);
3180- pCodeHeader-> SetGCInfo ((BYTE*)(void *)pMD->AsDynamicMethodDesc ()->GetResolver ()->GetJitMetaHeap ()->New (blockSize));
3179+ SetGCInfo (pCodeHeader, (BYTE*)(void *)pMD->AsDynamicMethodDesc ()->GetResolver ()->GetJitMetaHeap ()->New (blockSize));
31813180 }
31823181 else
31833182 {
3184- pCodeHeader-> SetGCInfo ((BYTE*) (void *)GetJitMetaHeap (pMD)->AllocMem (S_SIZE_T (blockSize)));
3183+ SetGCInfo (pCodeHeader, (BYTE*) (void *)GetJitMetaHeap (pMD)->AllocMem (S_SIZE_T (blockSize)));
31853184 }
3186- _ASSERTE (pCodeHeader-> GetGCInfo ()); // AllocMem throws if there's not enough memory
3185+ _ASSERTE (GetGCInfo (pCodeHeader )); // AllocMem throws if there's not enough memory
31873186
31883187 * pAllocationSize = blockSize; // Store the allocation size so we can backout later.
31893188
3190- return (pCodeHeader-> GetGCInfo ());
3189+ return (GetGCInfo (pCodeHeader ));
31913190}
31923191
3193- void * EECodeGenManager::allocEHInfoRaw (CodeHeader * pCodeHeader, DWORD blockSize, size_t * pAllocationSize)
3192+ void * EECodeGenManager::allocEHInfoRaw (void * pCodeHeader, DWORD blockSize, size_t * pAllocationSize)
31943193{
31953194 CONTRACTL {
31963195 THROWS;
31973196 GC_NOTRIGGER;
31983197 } CONTRACTL_END;
31993198
3200- MethodDesc* pMD = pCodeHeader-> GetMethodDesc ();
3199+ MethodDesc* pMD = GetMethodDesc (pCodeHeader );
32013200 void * mem = NULL ;
32023201
32033202 // sadly for light code gen I need the check in here. We should change GetJitMetaHeap
@@ -3218,7 +3217,7 @@ void* EECodeGenManager::allocEHInfoRaw(CodeHeader* pCodeHeader, DWORD blockSize,
32183217}
32193218
32203219
3221- EE_ILEXCEPTION* EECodeGenManager::allocEHInfo (CodeHeader * pCodeHeader, unsigned numClauses, size_t * pAllocationSize)
3220+ EE_ILEXCEPTION* EECodeGenManager::allocEHInfo (void * pCodeHeader, unsigned numClauses, size_t * pAllocationSize)
32223221{
32233222 CONTRACTL {
32243223 THROWS;
@@ -3234,10 +3233,10 @@ EE_ILEXCEPTION* EECodeGenManager::allocEHInfo(CodeHeader* pCodeHeader, unsigned
32343233
32353234 BYTE *EHInfo = (BYTE*)allocEHInfoRaw (pCodeHeader, blockSize, pAllocationSize);
32363235
3237- pCodeHeader-> SetEHInfo ((EE_ILEXCEPTION*) (EHInfo + sizeof (size_t )));
3238- pCodeHeader-> GetEHInfo ()->Init (numClauses);
3236+ SetEHInfo (pCodeHeader, (EE_ILEXCEPTION*) (EHInfo + sizeof (size_t )));
3237+ GetEHInfo (pCodeHeader )->Init (numClauses);
32393238 *((size_t *)EHInfo) = numClauses;
3240- return (pCodeHeader-> GetEHInfo ());
3239+ return (GetEHInfo (pCodeHeader ));
32413240}
32423241
32433242JumpStubBlockHeader * EEJitManager::allocJumpStubBlock (MethodDesc* pMD, DWORD numJumps,
@@ -3432,19 +3431,19 @@ void EEJitManager::UnpublishUnwindInfoForMethod(TADDR codeStart)
34323431#endif // defined(TARGET_AMD64)
34333432}
34343433
3435- void EECodeGenManager::RemoveJitData (CodeHeader * pCHdr, size_t GCinfo_len, size_t EHinfo_len)
3434+ void EECodeGenManager::RemoveJitData (void * pCHdr, size_t GCinfo_len, size_t EHinfo_len)
34363435{
34373436 CONTRACTL {
34383437 NOTHROW;
34393438 GC_TRIGGERS;
34403439 } CONTRACTL_END;
34413440
3442- MethodDesc* pMD = pCHdr-> GetMethodDesc ();
3441+ MethodDesc* pMD = GetMethodDesc (pCHdr );
34433442
3444- if (pMD->IsLCGMethod ()) {
3445-
3446- void * codeStart = (pCHdr + 1 );
3443+ void * codeStart = (void *)GetCodeStartAddress (pCHdr);
34473444
3445+ if (pMD->IsLCGMethod ())
3446+ {
34483447 {
34493448 CrstHolder ch (&m_CodeHeapCritSec);
34503449
@@ -3473,7 +3472,7 @@ void EECodeGenManager::RemoveJitData(CodeHeader * pCHdr, size_t GCinfo_len, size
34733472 HeapList *pHp = GetCodeHeapList ();
34743473
34753474 while (pHp && ((pHp->startAddress > (TADDR)pCHdr) ||
3476- (pHp->endAddress < (TADDR)pCHdr + sizeof (CodeHeader) )))
3475+ (pHp->endAddress < (TADDR)codeStart )))
34773476 {
34783477 pHp = pHp->GetNext ();
34793478 }
@@ -3484,16 +3483,16 @@ void EECodeGenManager::RemoveJitData(CodeHeader * pCHdr, size_t GCinfo_len, size
34843483 if (pHp == NULL )
34853484 return ;
34863485
3487- NibbleMapDeleteUnlocked (pHp, (TADDR)(pCHdr + 1 ) );
3486+ NibbleMapDeleteUnlocked (pHp, (TADDR)codeStart );
34883487 }
34893488
34903489 // Backout the GCInfo
34913490 if (GCinfo_len > 0 ) {
3492- GetJitMetaHeap (pMD)->BackoutMem (pCHdr-> GetGCInfo (), GCinfo_len);
3491+ GetJitMetaHeap (pMD)->BackoutMem (GetGCInfo (pCHdr ), GCinfo_len);
34933492 }
34943493
34953494 // Backout the EHInfo
3496- BYTE *EHInfo = (BYTE *)pCHdr-> GetEHInfo ();
3495+ BYTE *EHInfo = (BYTE *)GetEHInfo (pCHdr );
34973496 if (EHInfo) {
34983497 EHInfo -= sizeof (size_t );
34993498
@@ -3709,9 +3708,9 @@ void ExecutionManager::CleanupCodeHeaps()
37093708 _ASSERTE (IsAtProcessExit () || (GCHeapUtilities::IsGCInProgress () && ::IsGCThread ()));
37103709
37113710 GetEEJitManager ()->CleanupCodeHeaps ();
3712- #ifdef FEATURE_INTERPRETER
3711+ #ifdef FEATURE_INTERPRETER
37133712 GetInterpreterJitManager ()->CleanupCodeHeaps ();
3714- #endif // FEATURE_INTERPRETER
3713+ #endif // FEATURE_INTERPRETER
37153714}
37163715
37173716void EECodeGenManager::CleanupCodeHeaps ()
@@ -3991,6 +3990,58 @@ void CodeHeader::EnumMemoryRegions(CLRDataEnumMemoryFlags flags, IJitManager* pJ
39913990 }
39923991}
39933992
3993+ void EEJitManager::EnumMemoryRegions (void * pCodeHeader, CLRDataEnumMemoryFlags flags, IJitManager* pJitMan)
3994+ {
3995+ CONTRACTL
3996+ {
3997+ NOTHROW;
3998+ GC_NOTRIGGER;
3999+ SUPPORTS_DAC;
4000+ }
4001+ CONTRACTL_END;
4002+
4003+ DAC_ENUM_DTHIS ();
4004+
4005+ PTR_CodeHeader pCH = dac_cast<PTR_CodeHeader>(pCodeHeader);
4006+ pCH->EnumMemoryRegions (flags, pJitMan);
4007+ }
4008+
4009+ void InterpreterCodeHeader::EnumMemoryRegions (CLRDataEnumMemoryFlags flags, IJitManager* pJitMan)
4010+ {
4011+ CONTRACTL
4012+ {
4013+ NOTHROW;
4014+ GC_NOTRIGGER;
4015+ SUPPORTS_DAC;
4016+ }
4017+ CONTRACTL_END;
4018+
4019+ DAC_ENUM_DTHIS ();
4020+
4021+ this ->pRealCodeHeader .EnumMem ();
4022+
4023+ if (this ->GetDebugInfo () != NULL )
4024+ {
4025+ CompressDebugInfo::EnumMemoryRegions (flags, this ->GetDebugInfo (), FALSE /* hasFlagByte */ );
4026+ }
4027+ }
4028+
4029+ void InterpreterJitManager::EnumMemoryRegions (void * pCodeHeader, CLRDataEnumMemoryFlags flags, IJitManager* pJitMan)
4030+ {
4031+ CONTRACTL
4032+ {
4033+ NOTHROW;
4034+ GC_NOTRIGGER;
4035+ SUPPORTS_DAC;
4036+ }
4037+ CONTRACTL_END;
4038+
4039+ DAC_ENUM_DTHIS ();
4040+
4041+ PTR_InterpreterCodeHeader pCH = dac_cast<PTR_InterpreterCodeHeader>(pCodeHeader);
4042+ pCH->EnumMemoryRegions (flags, pJitMan);
4043+ }
4044+
39944045// -----------------------------------------------------------------------------
39954046// Enumerate for minidumps.
39964047// -----------------------------------------------------------------------------
@@ -4351,7 +4402,7 @@ PTR_RUNTIME_FUNCTION EEJitManager::LazyGetFunctionEntry(EECodeInfo * pCodeInfo)
43514402 return NULL ;
43524403 }
43534404
4354- JitCodeHeader * pHeader = dac_cast<PTR_JitCodeHeader >(GetCodeHeader (pCodeInfo->GetMethodToken ()));
4405+ CodeHeader * pHeader = dac_cast<PTR_CodeHeader >(GetCodeHeader (pCodeInfo->GetMethodToken ()));
43554406
43564407 DWORD address = RUNTIME_FUNCTION__BeginAddress (pHeader->GetUnwindInfo (0 )) + pCodeInfo->GetRelOffset ();
43574408
@@ -4382,7 +4433,7 @@ DWORD EEJitManager::GetFuncletStartOffsets(const METHODTOKEN& MethodToken, DWORD
43824433 }
43834434 CONTRACTL_END;
43844435
4385- JitCodeHeader * pCH = dac_cast<PTR_JitCodeHeader >(GetCodeHeader (MethodToken));
4436+ CodeHeader * pCH = dac_cast<PTR_CodeHeader >(GetCodeHeader (MethodToken));
43864437 TADDR moduleBase = JitTokenToModuleBase (MethodToken);
43874438
43884439 _ASSERTE (pCH->GetNumberOfUnwindInfos () >= 1 );
@@ -5152,6 +5203,9 @@ void ExecutionManager::Unload(LoaderAllocator *pLoaderAllocator)
51525203 }
51535204
51545205 GetEEJitManager ()->Unload (pLoaderAllocator);
5206+ #ifdef FEATURE_INTERPRETER
5207+ GetInterpreterJitManager ()->Unload (pLoaderAllocator);
5208+ #endif // FEATURE_INTERPRETER
51555209}
51565210
51575211// This method is used by the JIT and the runtime for PreStubs. It will return
0 commit comments