@@ -420,7 +420,7 @@ void UnwindInfoTable::AddToUnwindInfoTable(UnwindInfoTable** unwindInfoPtr, PT_R
420
420
{
421
421
// This cast is justified because only EEJitManager's have the code type above.
422
422
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));
424
424
for (ULONG i = 0 ; i < pHeader->GetNumberOfUnwindInfos (); i++)
425
425
RemoveFromUnwindInfoTable (&pRS->_pUnwindInfoTable , pRS->_range .RangeStart (), pRS->_range .RangeStart () + pHeader->GetUnwindInfo (i)->BeginAddress );
426
426
}
@@ -438,7 +438,7 @@ void UnwindInfoTable::AddToUnwindInfoTable(UnwindInfoTable** unwindInfoPtr, PT_R
438
438
STANDARD_VM_CONTRACT;
439
439
{
440
440
// 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 );
442
442
443
443
// Currently m_CodeHeapCritSec is given the CRST_UNSAFE_ANYMODE flag which allows it to be taken in a GC_NOTRIGGER
444
444
// 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
459
459
{
460
460
// This cast is justified because only EEJitManager's have the code type above.
461
461
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));
463
463
int unwindInfoCount = pHeader->GetNumberOfUnwindInfos ();
464
464
for (int i = 0 ; i < unwindInfoCount; i++)
465
465
AddToUnwindInfoTable (&pRS->_pUnwindInfoTable , pHeader->GetUnwindInfo (i), pRS->_range .RangeStart (), pRS->_range .RangeEndOpen ());
@@ -511,10 +511,10 @@ void UnwindInfoTable::AddToUnwindInfoTable(UnwindInfoTable** unwindInfoPtr, PT_R
511
511
512
512
/* -----------------------------------------------------------------------------
513
513
This is a listing of which methods uses which synchronization mechanism
514
- in the EEJitManager .
514
+ in the EECodeGenManager .
515
515
//-----------------------------------------------------------------------------
516
516
517
- Setters of EEJitManager ::m_CodeHeapCritSec
517
+ Setters of EECodeGenManager ::m_CodeHeapCritSec
518
518
-----------------------------------------------
519
519
allocCode
520
520
allocGCInfo
@@ -527,7 +527,7 @@ ReleaseReferenceToHeap
527
527
JitCodeToMethodInfo
528
528
529
529
530
- Need EEJitManager ::m_CodeHeapCritSec to be set
530
+ Need EECodeGenManager ::m_CodeHeapCritSec to be set
531
531
-----------------------------------------------
532
532
NewCodeHeap
533
533
allocCodeRaw
@@ -541,8 +541,8 @@ DeleteJitHeapCache
541
541
542
542
543
543
#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 )
546
546
{
547
547
CONTRACTL
548
548
{
@@ -554,7 +554,7 @@ EECodeGenManager::CodeHeapIterator::CodeHeapIterator(LoaderAllocator *pLoaderAll
554
554
555
555
m_pHeapList = NULL ;
556
556
m_pLoaderAllocator = pLoaderAllocatorFilter;
557
- m_pHeapList = ExecutionManager::GetEEJitManager () ->GetCodeHeapList ();
557
+ m_pHeapList = pJitMgr ->GetCodeHeapList ();
558
558
if (m_pHeapList)
559
559
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 )));
560
560
};
@@ -2736,7 +2736,6 @@ void* EECodeGenManager::allocCodeRaw(CodeHeapRequestInfo *pInfo,
2736
2736
}
2737
2737
else
2738
2738
{
2739
- // Interpreter-TODO: interpreter and dynamic domain at the same time
2740
2739
pCodeHeap = (HeapList *)pInfo->m_pAllocator ->m_pLastUsedDynamicCodeHeap ;
2741
2740
pInfo->m_pAllocator ->m_pLastUsedDynamicCodeHeap = NULL ;
2742
2741
}
@@ -2842,7 +2841,7 @@ void* EECodeGenManager::allocCodeRaw(CodeHeapRequestInfo *pInfo,
2842
2841
RETURN (mem);
2843
2842
}
2844
2843
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,
2846
2845
size_t * pAllocatedSize, HeapList** ppCodeHeap
2847
2846
, BYTE** ppRealHeader
2848
2847
#ifdef FEATURE_EH_FUNCLETS
@@ -2914,9 +2913,9 @@ void EECodeGenManager::allocCode(MethodDesc* pMD, size_t blockSize, size_t reser
2914
2913
requestInfo.setReserveForJumpStubs (reserveForJumpStubs);
2915
2914
2916
2915
#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);
2918
2917
#else
2919
- realHeaderSize = sizeof (JitRealCodeHeader );
2918
+ realHeaderSize = sizeof (RealCodeHeader );
2920
2919
#endif
2921
2920
}
2922
2921
@@ -2944,13 +2943,13 @@ void EECodeGenManager::allocCode(MethodDesc* pMD, size_t blockSize, size_t reser
2944
2943
2945
2944
_ASSERTE (IS_ALIGNED (pCode, alignment));
2946
2945
2947
- pCodeHdr = ((JitCodeHeader *)pCode) - 1 ;
2946
+ pCodeHdr = ((CodeHeader *)pCode) - 1 ;
2948
2947
2949
- *pAllocatedSize = sizeof (JitCodeHeader ) + totalSize;
2948
+ *pAllocatedSize = sizeof (CodeHeader ) + totalSize;
2950
2949
2951
2950
if (ExecutableAllocator::IsWXORXEnabled () && !requestInfo.IsInterpreted ())
2952
2951
{
2953
- pCodeHdrRW = (JitCodeHeader *)new BYTE[*pAllocatedSize];
2952
+ pCodeHdrRW = (CodeHeader *)new BYTE[*pAllocatedSize];
2954
2953
}
2955
2954
else
2956
2955
{
@@ -2978,7 +2977,7 @@ void EECodeGenManager::allocCode(MethodDesc* pMD, size_t blockSize, size_t reser
2978
2977
#ifdef FEATURE_EH_FUNCLETS
2979
2978
if (!requestInfo.IsInterpreted ())
2980
2979
{
2981
- ((JitCodeHeader *)pCodeHdrRW)->SetNumberOfUnwindInfos (nUnwindInfos);
2980
+ ((CodeHeader *)pCodeHdrRW)->SetNumberOfUnwindInfos (nUnwindInfos);
2982
2981
}
2983
2982
#endif
2984
2983
@@ -3165,39 +3164,39 @@ LoaderHeap *EECodeGenManager::GetJitMetaHeap(MethodDesc *pMD)
3165
3164
return pAllocator->GetLowFrequencyHeap ();
3166
3165
}
3167
3166
3168
- BYTE* EECodeGenManager::allocGCInfo (CodeHeader * pCodeHeader, DWORD blockSize, size_t * pAllocationSize)
3167
+ BYTE* EECodeGenManager::allocGCInfo (void * pCodeHeader, DWORD blockSize, size_t * pAllocationSize)
3169
3168
{
3170
3169
CONTRACTL {
3171
3170
THROWS;
3172
3171
GC_NOTRIGGER;
3173
3172
} CONTRACTL_END;
3174
3173
3175
- MethodDesc* pMD = pCodeHeader-> GetMethodDesc ();
3174
+ MethodDesc* pMD = GetMethodDesc (pCodeHeader );
3176
3175
// sadly for light code gen I need the check in here. We should change GetJitMetaHeap
3177
3176
if (pMD->IsLCGMethod ())
3178
3177
{
3179
3178
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));
3181
3180
}
3182
3181
else
3183
3182
{
3184
- pCodeHeader-> SetGCInfo ((BYTE*) (void *)GetJitMetaHeap (pMD)->AllocMem (S_SIZE_T (blockSize)));
3183
+ SetGCInfo (pCodeHeader, (BYTE*) (void *)GetJitMetaHeap (pMD)->AllocMem (S_SIZE_T (blockSize)));
3185
3184
}
3186
- _ASSERTE (pCodeHeader-> GetGCInfo ()); // AllocMem throws if there's not enough memory
3185
+ _ASSERTE (GetGCInfo (pCodeHeader )); // AllocMem throws if there's not enough memory
3187
3186
3188
3187
* pAllocationSize = blockSize; // Store the allocation size so we can backout later.
3189
3188
3190
- return (pCodeHeader-> GetGCInfo ());
3189
+ return (GetGCInfo (pCodeHeader ));
3191
3190
}
3192
3191
3193
- void * EECodeGenManager::allocEHInfoRaw (CodeHeader * pCodeHeader, DWORD blockSize, size_t * pAllocationSize)
3192
+ void * EECodeGenManager::allocEHInfoRaw (void * pCodeHeader, DWORD blockSize, size_t * pAllocationSize)
3194
3193
{
3195
3194
CONTRACTL {
3196
3195
THROWS;
3197
3196
GC_NOTRIGGER;
3198
3197
} CONTRACTL_END;
3199
3198
3200
- MethodDesc* pMD = pCodeHeader-> GetMethodDesc ();
3199
+ MethodDesc* pMD = GetMethodDesc (pCodeHeader );
3201
3200
void * mem = NULL ;
3202
3201
3203
3202
// 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,
3218
3217
}
3219
3218
3220
3219
3221
- EE_ILEXCEPTION* EECodeGenManager::allocEHInfo (CodeHeader * pCodeHeader, unsigned numClauses, size_t * pAllocationSize)
3220
+ EE_ILEXCEPTION* EECodeGenManager::allocEHInfo (void * pCodeHeader, unsigned numClauses, size_t * pAllocationSize)
3222
3221
{
3223
3222
CONTRACTL {
3224
3223
THROWS;
@@ -3234,10 +3233,10 @@ EE_ILEXCEPTION* EECodeGenManager::allocEHInfo(CodeHeader* pCodeHeader, unsigned
3234
3233
3235
3234
BYTE *EHInfo = (BYTE*)allocEHInfoRaw (pCodeHeader, blockSize, pAllocationSize);
3236
3235
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);
3239
3238
*((size_t *)EHInfo) = numClauses;
3240
- return (pCodeHeader-> GetEHInfo ());
3239
+ return (GetEHInfo (pCodeHeader ));
3241
3240
}
3242
3241
3243
3242
JumpStubBlockHeader * EEJitManager::allocJumpStubBlock (MethodDesc* pMD, DWORD numJumps,
@@ -3432,19 +3431,19 @@ void EEJitManager::UnpublishUnwindInfoForMethod(TADDR codeStart)
3432
3431
#endif // defined(TARGET_AMD64)
3433
3432
}
3434
3433
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)
3436
3435
{
3437
3436
CONTRACTL {
3438
3437
NOTHROW;
3439
3438
GC_TRIGGERS;
3440
3439
} CONTRACTL_END;
3441
3440
3442
- MethodDesc* pMD = pCHdr-> GetMethodDesc ();
3441
+ MethodDesc* pMD = GetMethodDesc (pCHdr );
3443
3442
3444
- if (pMD->IsLCGMethod ()) {
3445
-
3446
- void * codeStart = (pCHdr + 1 );
3443
+ void * codeStart = (void *)GetCodeStartAddress (pCHdr);
3447
3444
3445
+ if (pMD->IsLCGMethod ())
3446
+ {
3448
3447
{
3449
3448
CrstHolder ch (&m_CodeHeapCritSec);
3450
3449
@@ -3473,7 +3472,7 @@ void EECodeGenManager::RemoveJitData(CodeHeader * pCHdr, size_t GCinfo_len, size
3473
3472
HeapList *pHp = GetCodeHeapList ();
3474
3473
3475
3474
while (pHp && ((pHp->startAddress > (TADDR)pCHdr) ||
3476
- (pHp->endAddress < (TADDR)pCHdr + sizeof (CodeHeader) )))
3475
+ (pHp->endAddress < (TADDR)codeStart )))
3477
3476
{
3478
3477
pHp = pHp->GetNext ();
3479
3478
}
@@ -3484,16 +3483,16 @@ void EECodeGenManager::RemoveJitData(CodeHeader * pCHdr, size_t GCinfo_len, size
3484
3483
if (pHp == NULL )
3485
3484
return ;
3486
3485
3487
- NibbleMapDeleteUnlocked (pHp, (TADDR)(pCHdr + 1 ) );
3486
+ NibbleMapDeleteUnlocked (pHp, (TADDR)codeStart );
3488
3487
}
3489
3488
3490
3489
// Backout the GCInfo
3491
3490
if (GCinfo_len > 0 ) {
3492
- GetJitMetaHeap (pMD)->BackoutMem (pCHdr-> GetGCInfo (), GCinfo_len);
3491
+ GetJitMetaHeap (pMD)->BackoutMem (GetGCInfo (pCHdr ), GCinfo_len);
3493
3492
}
3494
3493
3495
3494
// Backout the EHInfo
3496
- BYTE *EHInfo = (BYTE *)pCHdr-> GetEHInfo ();
3495
+ BYTE *EHInfo = (BYTE *)GetEHInfo (pCHdr );
3497
3496
if (EHInfo) {
3498
3497
EHInfo -= sizeof (size_t );
3499
3498
@@ -3709,9 +3708,9 @@ void ExecutionManager::CleanupCodeHeaps()
3709
3708
_ASSERTE (IsAtProcessExit () || (GCHeapUtilities::IsGCInProgress () && ::IsGCThread ()));
3710
3709
3711
3710
GetEEJitManager ()->CleanupCodeHeaps ();
3712
- #ifdef FEATURE_INTERPRETER
3711
+ #ifdef FEATURE_INTERPRETER
3713
3712
GetInterpreterJitManager ()->CleanupCodeHeaps ();
3714
- #endif // FEATURE_INTERPRETER
3713
+ #endif // FEATURE_INTERPRETER
3715
3714
}
3716
3715
3717
3716
void EECodeGenManager::CleanupCodeHeaps ()
@@ -3991,6 +3990,58 @@ void CodeHeader::EnumMemoryRegions(CLRDataEnumMemoryFlags flags, IJitManager* pJ
3991
3990
}
3992
3991
}
3993
3992
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
+
3994
4045
// -----------------------------------------------------------------------------
3995
4046
// Enumerate for minidumps.
3996
4047
// -----------------------------------------------------------------------------
@@ -4351,7 +4402,7 @@ PTR_RUNTIME_FUNCTION EEJitManager::LazyGetFunctionEntry(EECodeInfo * pCodeInfo)
4351
4402
return NULL ;
4352
4403
}
4353
4404
4354
- JitCodeHeader * pHeader = dac_cast<PTR_JitCodeHeader >(GetCodeHeader (pCodeInfo->GetMethodToken ()));
4405
+ CodeHeader * pHeader = dac_cast<PTR_CodeHeader >(GetCodeHeader (pCodeInfo->GetMethodToken ()));
4355
4406
4356
4407
DWORD address = RUNTIME_FUNCTION__BeginAddress (pHeader->GetUnwindInfo (0 )) + pCodeInfo->GetRelOffset ();
4357
4408
@@ -4382,7 +4433,7 @@ DWORD EEJitManager::GetFuncletStartOffsets(const METHODTOKEN& MethodToken, DWORD
4382
4433
}
4383
4434
CONTRACTL_END;
4384
4435
4385
- JitCodeHeader * pCH = dac_cast<PTR_JitCodeHeader >(GetCodeHeader (MethodToken));
4436
+ CodeHeader * pCH = dac_cast<PTR_CodeHeader >(GetCodeHeader (MethodToken));
4386
4437
TADDR moduleBase = JitTokenToModuleBase (MethodToken);
4387
4438
4388
4439
_ASSERTE (pCH->GetNumberOfUnwindInfos () >= 1 );
@@ -5152,6 +5203,9 @@ void ExecutionManager::Unload(LoaderAllocator *pLoaderAllocator)
5152
5203
}
5153
5204
5154
5205
GetEEJitManager ()->Unload (pLoaderAllocator);
5206
+ #ifdef FEATURE_INTERPRETER
5207
+ GetInterpreterJitManager ()->Unload (pLoaderAllocator);
5208
+ #endif // FEATURE_INTERPRETER
5155
5209
}
5156
5210
5157
5211
// This method is used by the JIT and the runtime for PreStubs. It will return
0 commit comments