Skip to content

Commit dfd85cc

Browse files
davidwrightonpull[bot]
authored andcommitted
Remove support for non-indirect code headers (#100351)
- We use indirect code headers on all platforms (except for Windows X86, which has no particular reason to not use them) - Indirect code headers are required to support funclet style codegen, but work just fine in all cases. - This removes one of the ways in which Windows X86 is different from all other platforms
1 parent df839d5 commit dfd85cc

File tree

12 files changed

+4
-145
lines changed

12 files changed

+4
-145
lines changed

src/coreclr/debug/daccess/fntableaccess.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,8 @@
1616
#ifndef TARGET_UNIX
1717
#define DEBUGSUPPORT_STUBS_HAVE_UNWIND_INFO
1818
#endif // !TARGET_UNIX
19-
20-
#ifndef USE_INDIRECT_CODEHEADER
21-
#define USE_INDIRECT_CODEHEADER
22-
#endif // USE_INDIRECT_CODEHEADER
2319
#endif
2420

25-
2621
struct FakeEEJitManager
2722
{
2823
LPVOID __VFN_table;

src/coreclr/inc/nibblemapmacros.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626

2727
#if defined(HOST_64BIT)
2828
// TODO: bump up the windows CODE_ALIGN to 16 and iron out any nibble map bugs that exist.
29-
// TODO: there is something wrong with USE_INDIRECT_CODEHEADER with CODE_ALIGN=16
3029
# define CODE_ALIGN 4
3130
# define LOG2_CODE_ALIGN 2
3231
#else

src/coreclr/vm/amd64/cgencpu.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,6 @@ EXTERN_C void FastCallFinalizeWorker(Object *obj, PCODE funcPtr);
4848
#define SIZEOF_LOAD_AND_JUMP_THUNK 22 // # bytes to mov r10, X; jmp Z
4949
#define SIZEOF_LOAD2_AND_JUMP_THUNK 32 // # bytes to mov r10, X; mov r11, Y; jmp Z
5050

51-
// Also in CorCompile.h, FnTableAccess.h
52-
#define USE_INDIRECT_CODEHEADER // use CodeHeader, RealCodeHeader construct
53-
5451
#define HAS_NDIRECT_IMPORT_PRECODE 1
5552
#define HAS_FIXUP_PRECODE 1
5653

src/coreclr/vm/arm/cgencpu.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,6 @@ EXTERN_C void checkStack(void);
7575

7676
#define HAS_NDIRECT_IMPORT_PRECODE 1
7777

78-
#define USE_INDIRECT_CODEHEADER
79-
80-
8178
EXTERN_C void getFPReturn(int fpSize, INT64 *pRetVal);
8279
EXTERN_C void setFPReturn(int fpSize, INT64 retVal);
8380

src/coreclr/vm/arm64/cgencpu.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,6 @@ extern PCODE GetPreStubEntryPoint();
6060

6161
#define HAS_NDIRECT_IMPORT_PRECODE 1
6262

63-
#define USE_INDIRECT_CODEHEADER
64-
6563
#define HAS_FIXUP_PRECODE 1
6664

6765
// ThisPtrRetBufPrecode one is necessary for closed delegates over static methods with return buffer

src/coreclr/vm/codeman.cpp

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2812,9 +2812,7 @@ void* EEJitManager::allocCodeRaw(CodeHeapRequestInfo *pInfo,
28122812

28132813
void EEJitManager::allocCode(MethodDesc* pMD, size_t blockSize, size_t reserveForJumpStubs, CorJitAllocMemFlag flag, CodeHeader** ppCodeHeader, CodeHeader** ppCodeHeaderRW,
28142814
size_t* pAllocatedSize, HeapList** ppCodeHeap
2815-
#ifdef USE_INDIRECT_CODEHEADER
28162815
, BYTE** ppRealHeader
2817-
#endif
28182816
#ifdef FEATURE_EH_FUNCLETS
28192817
, UINT nUnwindInfos
28202818
#endif
@@ -2867,8 +2865,11 @@ void EEJitManager::allocCode(MethodDesc* pMD, size_t blockSize, size_t reserveFo
28672865
#endif
28682866
requestInfo.setReserveForJumpStubs(reserveForJumpStubs);
28692867

2870-
#if defined(USE_INDIRECT_CODEHEADER)
2868+
#ifdef FEATURE_EH_FUNCLETS
28712869
SIZE_T realHeaderSize = offsetof(RealCodeHeader, unwindInfos[0]) + (sizeof(T_RUNTIME_FUNCTION) * nUnwindInfos);
2870+
#else
2871+
SIZE_T realHeaderSize = sizeof(RealCodeHeader);
2872+
#endif
28722873

28732874
// if this is a LCG method then we will be allocating the RealCodeHeader
28742875
// following the code so that the code block can be removed easily by
@@ -2878,7 +2879,6 @@ void EEJitManager::allocCode(MethodDesc* pMD, size_t blockSize, size_t reserveFo
28782879
totalSize = ALIGN_UP(totalSize, sizeof(void*)) + realHeaderSize;
28792880
static_assert_no_msg(CODE_SIZE_ALIGN >= sizeof(void*));
28802881
}
2881-
#endif // USE_INDIRECT_CODEHEADER
28822882

28832883
// Scope the lock
28842884
{
@@ -2908,7 +2908,6 @@ void EEJitManager::allocCode(MethodDesc* pMD, size_t blockSize, size_t reserveFo
29082908
pCodeHdrRW = pCodeHdr;
29092909
}
29102910

2911-
#ifdef USE_INDIRECT_CODEHEADER
29122911
if (requestInfo.IsDynamicDomain())
29132912
{
29142913
// Set the real code header to the writeable mapping so that we can set its members via the CodeHeader methods below
@@ -2922,7 +2921,6 @@ void EEJitManager::allocCode(MethodDesc* pMD, size_t blockSize, size_t reserveFo
29222921
BYTE* pRealHeader = (BYTE*)(void*)pMD->GetLoaderAllocator()->GetLowFrequencyHeap()->AllocMem(S_SIZE_T(realHeaderSize));
29232922
pCodeHdrRW->SetRealCodeHeader(pRealHeader);
29242923
}
2925-
#endif
29262924

29272925
pCodeHdrRW->SetDebugInfo(NULL);
29282926
pCodeHdrRW->SetEHInfo(NULL);
@@ -2932,7 +2930,6 @@ void EEJitManager::allocCode(MethodDesc* pMD, size_t blockSize, size_t reserveFo
29322930
pCodeHdrRW->SetNumberOfUnwindInfos(nUnwindInfos);
29332931
#endif
29342932

2935-
#ifdef USE_INDIRECT_CODEHEADER
29362933
if (requestInfo.IsDynamicDomain())
29372934
{
29382935
*ppRealHeader = (BYTE*)pCode + ALIGN_UP(blockSize, sizeof(void*));
@@ -2941,7 +2938,6 @@ void EEJitManager::allocCode(MethodDesc* pMD, size_t blockSize, size_t reserveFo
29412938
{
29422939
*ppRealHeader = NULL;
29432940
}
2944-
#endif // USE_INDIRECT_CODEHEADER
29452941
}
29462942

29472943
*ppCodeHeader = pCodeHdr;
@@ -3878,9 +3874,7 @@ void CodeHeader::EnumMemoryRegions(CLRDataEnumMemoryFlags flags, IJitManager* pJ
38783874

38793875
DAC_ENUM_DTHIS();
38803876

3881-
#ifdef USE_INDIRECT_CODEHEADER
38823877
this->pRealCodeHeader.EnumMem();
3883-
#endif // USE_INDIRECT_CODEHEADER
38843878

38853879
#ifdef FEATURE_ON_STACK_REPLACEMENT
38863880
BOOL hasFlagByte = TRUE;

src/coreclr/vm/codeman.h

Lines changed: 0 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -69,10 +69,6 @@ Module Name:
6969
#include "gcinfo.h"
7070
#include "eexcp.h"
7171

72-
#if defined(FEATURE_EH_FUNCLETS) && !defined(USE_INDIRECT_CODEHEADER)
73-
#error "FEATURE_EH_FUNCLETS requires USE_INDIRECT_CODEHEADER"
74-
#endif // FEATURE_EH_FUNCLETS && !USE_INDIRECT_CODEHEADER
75-
7672
class MethodDesc;
7773
class ICorJitCompiler;
7874
class IJitManager;
@@ -125,20 +121,10 @@ enum StubCodeBlockKind : int
125121
// Today CodeHeader is used by the EEJitManager.
126122
// The GCInfo version is always current GCINFO_VERSION in this header.
127123

128-
#ifdef USE_INDIRECT_CODEHEADER
129124
typedef DPTR(struct _hpRealCodeHdr) PTR_RealCodeHeader;
130125
typedef DPTR(struct _hpCodeHdr) PTR_CodeHeader;
131126

132-
#else // USE_INDIRECT_CODEHEADER
133-
typedef DPTR(struct _hpCodeHdr) PTR_CodeHeader;
134-
135-
#endif // USE_INDIRECT_CODEHEADER
136-
137-
#ifdef USE_INDIRECT_CODEHEADER
138127
typedef struct _hpRealCodeHdr
139-
#else // USE_INDIRECT_CODEHEADER
140-
typedef struct _hpCodeHdr
141-
#endif // USE_INDIRECT_CODEHEADER
142128
{
143129
public:
144130
PTR_BYTE phdrDebugInfo;
@@ -160,95 +146,9 @@ typedef struct _hpCodeHdr
160146
#endif // FEATURE_EH_FUNCLETS
161147

162148
public:
163-
#ifndef USE_INDIRECT_CODEHEADER
164-
//
165-
// Note: that the JITted code follows immediately after the MethodDesc*
166-
//
167-
PTR_BYTE GetDebugInfo()
168-
{
169-
SUPPORTS_DAC;
170-
171-
return phdrDebugInfo;
172-
}
173-
PTR_EE_ILEXCEPTION GetEHInfo()
174-
{
175-
return phdrJitEHInfo;
176-
}
177-
PTR_BYTE GetGCInfo()
178-
{
179-
SUPPORTS_DAC;
180-
return phdrJitGCInfo;
181-
}
182-
PTR_MethodDesc GetMethodDesc()
183-
{
184-
SUPPORTS_DAC;
185-
return phdrMDesc;
186-
}
187-
#if defined(FEATURE_GDBJIT)
188-
VOID* GetCalledMethods()
189-
{
190-
SUPPORTS_DAC;
191-
return pCalledMethods;
192-
}
193-
#endif
194-
TADDR GetCodeStartAddress()
195-
{
196-
SUPPORTS_DAC;
197-
return dac_cast<TADDR>(dac_cast<PTR_CodeHeader>(this) + 1);
198-
}
199-
StubCodeBlockKind GetStubCodeBlockKind()
200-
{
201-
SUPPORTS_DAC;
202-
return (StubCodeBlockKind)dac_cast<TADDR>(phdrMDesc);
203-
}
204-
BOOL IsStubCodeBlock()
205-
{
206-
SUPPORTS_DAC;
207-
// Note that it is important for this comparison to be unsigned
208-
return dac_cast<TADDR>(phdrMDesc) <= (TADDR)STUB_CODE_BLOCK_LAST;
209-
}
210-
211-
void SetDebugInfo(PTR_BYTE pDI)
212-
{
213-
phdrDebugInfo = pDI;
214-
}
215-
void SetEHInfo(PTR_EE_ILEXCEPTION pEH)
216-
{
217-
phdrJitEHInfo = pEH;
218-
}
219-
void SetGCInfo(PTR_BYTE pGC)
220-
{
221-
phdrJitGCInfo = pGC;
222-
}
223-
void SetMethodDesc(PTR_MethodDesc pMD)
224-
{
225-
phdrMDesc = pMD;
226-
}
227-
#if defined(FEATURE_GDBJIT)
228-
void SetCalledMethods(VOID* pCM)
229-
{
230-
pCalledMethods = pCM;
231-
}
232-
#endif
233-
void SetStubCodeBlockKind(StubCodeBlockKind kind)
234-
{
235-
phdrMDesc = (PTR_MethodDesc)kind;
236-
}
237-
#endif // !USE_INDIRECT_CODEHEADER
238-
239149
// if we're using the indirect codeheaders then all enumeration is done by the code header
240-
#ifndef USE_INDIRECT_CODEHEADER
241-
#ifdef DACCESS_COMPILE
242-
void EnumMemoryRegions(CLRDataEnumMemoryFlags flags, IJitManager* pJitMan);
243-
#endif // DACCESS_COMPILE
244-
#endif // USE_INDIRECT_CODEHEADER
245-
#ifdef USE_INDIRECT_CODEHEADER
246150
} RealCodeHeader;
247-
#else // USE_INDIRECT_CODEHEADER
248-
} CodeHeader;
249-
#endif // USE_INDIRECT_CODEHEADER
250151

251-
#ifdef USE_INDIRECT_CODEHEADER
252152
typedef struct _hpCodeHdr
253153
{
254154
PTR_RealCodeHeader pRealCodeHeader;
@@ -355,7 +255,6 @@ typedef struct _hpCodeHdr
355255
#endif // DACCESS_COMPILE
356256

357257
} CodeHeader;
358-
#endif // USE_INDIRECT_CODEHEADER
359258

360259

361260
//-----------------------------------------------------------------------------
@@ -1871,9 +1770,7 @@ class EEJitManager : public IJitManager
18711770

18721771
void allocCode(MethodDesc* pFD, size_t blockSize, size_t reserveForJumpStubs, CorJitAllocMemFlag flag, CodeHeader** ppCodeHeader, CodeHeader** ppCodeHeaderRW,
18731772
size_t* pAllocatedSize, HeapList** ppCodeHeap
1874-
#ifdef USE_INDIRECT_CODEHEADER
18751773
, BYTE** ppRealHeader
1876-
#endif
18771774
#ifdef FEATURE_EH_FUNCLETS
18781775
, UINT nUnwindInfos
18791776
#endif

src/coreclr/vm/i386/cgencpu.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,6 @@ EXTERN_C void SinglecastDelegateInvokeStub();
5151
#define JUMP_ALLOCATE_SIZE 8 // # bytes to allocate for a jump instruction
5252
#define BACK_TO_BACK_JUMP_ALLOCATE_SIZE 8 // # bytes to allocate for a back to back jump instruction
5353

54-
#ifdef FEATURE_EH_FUNCLETS
55-
#define USE_INDIRECT_CODEHEADER
56-
#endif // FEATURE_EH_FUNCLETS
57-
5854
#define HAS_COMPACT_ENTRYPOINTS 1
5955

6056
// Needed for PInvoke inlining in ngened images

src/coreclr/vm/jitinterface.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10855,14 +10855,12 @@ void CEEJitInfo::WriteCodeBytes()
1085510855
{
1085610856
LIMITED_METHOD_CONTRACT;
1085710857

10858-
#ifdef USE_INDIRECT_CODEHEADER
1085910858
if (m_pRealCodeHeader != NULL)
1086010859
{
1086110860
// Restore the read only version of the real code header
1086210861
m_CodeHeaderRW->SetRealCodeHeader(m_pRealCodeHeader);
1086310862
m_pRealCodeHeader = NULL;
1086410863
}
10865-
#endif // USE_INDIRECT_CODEHEADER
1086610864

1086710865
if (m_CodeHeaderRW != m_CodeHeader)
1086810866
{
@@ -12247,9 +12245,7 @@ void CEEJitInfo::allocMem (AllocMemArgs *pArgs)
1224712245
}
1224812246

1224912247
m_jitManager->allocCode(m_pMethodBeingCompiled, totalSize.Value(), GetReserveForJumpStubs(), pArgs->flag, &m_CodeHeader, &m_CodeHeaderRW, &m_codeWriteBufferSize, &m_pCodeHeap
12250-
#ifdef USE_INDIRECT_CODEHEADER
1225112248
, &m_pRealCodeHeader
12252-
#endif
1225312249
#ifdef FEATURE_EH_FUNCLETS
1225412250
, m_totalUnwindInfos
1225512251
#endif

src/coreclr/vm/jitinterface.h

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -688,9 +688,7 @@ class CEEJitInfo : public CEEInfo
688688
m_CodeHeaderRW = NULL;
689689

690690
m_codeWriteBufferSize = 0;
691-
#ifdef USE_INDIRECT_CODEHEADER
692691
m_pRealCodeHeader = NULL;
693-
#endif
694692
m_pCodeHeap = NULL;
695693

696694
if (m_pOffsetMapping != NULL)
@@ -801,9 +799,7 @@ class CEEJitInfo : public CEEInfo
801799
m_CodeHeader(NULL),
802800
m_CodeHeaderRW(NULL),
803801
m_codeWriteBufferSize(0),
804-
#ifdef USE_INDIRECT_CODEHEADER
805802
m_pRealCodeHeader(NULL),
806-
#endif
807803
m_pCodeHeap(NULL),
808804
m_ILHeader(header),
809805
#ifdef FEATURE_EH_FUNCLETS
@@ -951,9 +947,7 @@ protected :
951947
CodeHeader* m_CodeHeader; // descriptor for JITTED code - read/execute address
952948
CodeHeader* m_CodeHeaderRW; // descriptor for JITTED code - code write scratch buffer address
953949
size_t m_codeWriteBufferSize;
954-
#ifdef USE_INDIRECT_CODEHEADER
955950
BYTE* m_pRealCodeHeader;
956-
#endif
957951
HeapList* m_pCodeHeap;
958952
COR_ILMETHOD_DECODER * m_ILHeader; // the code header as exist in the file
959953
#ifdef FEATURE_EH_FUNCLETS

0 commit comments

Comments
 (0)