Skip to content

Commit 9fc72c4

Browse files
committed
Make the code headers independent
Make the jit and interpreter code headers independent
1 parent f6b975c commit 9fc72c4

10 files changed

+413
-123
lines changed

src/coreclr/debug/daccess/enummem.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,9 @@ HRESULT ClrDataAccess::EnumMemDumpJitManagerInfo(IN CLRDataEnumMemoryFlags flags
318318

319319
if (flags == CLRDATA_ENUM_MEM_HEAP2)
320320
{
321-
EEJitManager* managerPtr = ExecutionManager::GetEEJitManager();
321+
EECodeGenManager* managerPtr = ExecutionManager::GetEEJitManager();
322+
managerPtr->EnumMemoryRegions(flags);
323+
managerPtr = ExecutionManager::GetInterpreterJitManager();
322324
managerPtr->EnumMemoryRegions(flags);
323325
}
324326

src/coreclr/debug/daccess/fntableaccess.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ static NTSTATUS OutOfProcessFindHeader(ReadMemoryFunction fpReadMemory,PVOID pUs
137137
return STATUS_SUCCESS;
138138
}
139139

140-
#define CODE_HEADER FakeJitRealCodeHeader
140+
#define CODE_HEADER RealCodeHeader
141141
#define ResolveCodeHeader(pHeader) \
142142
if (pHeader) \
143143
{ \

src/coreclr/debug/daccess/fntableaccess.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ typedef struct _FakeHpRealCodeHdr
5555
LPVOID hdrMDesc; // changed from MethodDesc*
5656
DWORD nUnwindInfos;
5757
T_RUNTIME_FUNCTION unwindInfos[0];
58-
} FakeJitRealCodeHeader;
58+
} FakeRealCodeHeader;
5959

6060
typedef struct _FakeHpCodeHdr
6161
{
@@ -85,8 +85,8 @@ class CheckDuplicatedStructLayouts
8585
CHECK_OFFSET(HeapList, pHdrMap);
8686

8787
#if !defined(TARGET_X86)
88-
CHECK_OFFSET(JitRealCodeHeader, nUnwindInfos);
89-
CHECK_OFFSET(JitRealCodeHeader, unwindInfos);
88+
CHECK_OFFSET(RealCodeHeader, nUnwindInfos);
89+
CHECK_OFFSET(RealCodeHeader, unwindInfos);
9090
#endif // !TARGET_X86
9191

9292
#undef CHECK_OFFSET

src/coreclr/vm/codeman.cpp

+96-42
Original file line numberDiff line numberDiff line change
@@ -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
-----------------------------------------------
519519
allocCode
520520
allocGCInfo
@@ -527,7 +527,7 @@ ReleaseReferenceToHeap
527527
JitCodeToMethodInfo
528528
529529
530-
Need EEJitManager::m_CodeHeapCritSec to be set
530+
Need EECodeGenManager::m_CodeHeapCritSec to be set
531531
-----------------------------------------------
532532
NewCodeHeap
533533
allocCodeRaw
@@ -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

32433242
JumpStubBlockHeader * 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

37173716
void 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

Comments
 (0)