Skip to content

Commit 66dfe94

Browse files
committed
Add new precode type for interpreter
1 parent d7c56e7 commit 66dfe94

File tree

6 files changed

+72
-95
lines changed

6 files changed

+72
-95
lines changed

src/coreclr/inc/utilcode.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3969,7 +3969,4 @@ struct SpinConstants
39693969

39703970
extern SpinConstants g_SpinConstants;
39713971

3972-
// This value is or-ed to the code address as a marker to indicate it is an address of the interpreter IR bytecode
3973-
static const size_t InterpretedCodeAddressFlag = 2;
3974-
39753972
#endif // __UtilCode_h__

src/coreclr/vm/jitinterface.cpp

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13143,11 +13143,6 @@ PCODE UnsafeJitFunction(PrepareCodeConfig* config,
1314313143
ret |= THUMB_CODE;
1314413144
#endif
1314513145

13146-
if (config->IsInterpreterCode())
13147-
{
13148-
ret |= InterpretedCodeAddressFlag;
13149-
}
13150-
1315113146
// We are done
1315213147
break;
1315313148
}

src/coreclr/vm/method.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3044,7 +3044,7 @@ void MethodDesc::TrySetInitialCodeEntryPointForVersionableMethod(
30443044
else
30453045
{
30463046
_ASSERTE(IsVersionableWithPrecode());
3047-
GetOrCreatePrecode()->SetTargetInterlocked(entryPoint, TRUE /* fOnlyRedirectFromPrestub */, (entryPoint & InterpretedCodeAddressFlag) /* fInterpreter */);
3047+
GetOrCreatePrecode()->SetTargetInterlocked(entryPoint, TRUE /* fOnlyRedirectFromPrestub */);
30483048
}
30493049
}
30503050

src/coreclr/vm/precode.cpp

Lines changed: 26 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -182,56 +182,25 @@ PCODE Precode::TryToSkipFixupPrecode(PCODE addr)
182182
return 0;
183183
}
184184

185-
#ifdef FEATURE_INTERPRETER
186-
static TADDR GetMethodDescFromPrecodeData(TADDR methodDesc)
187-
{
188-
LIMITED_METHOD_CONTRACT;
189-
if ((methodDesc & InterpretedCodeAddressFlag) == 0)
190-
{
191-
return methodDesc;
192-
}
193-
194-
PTR_CodeHeader pCodeHeader = PTR_CodeHeader(EEJitManager::GetCodeHeaderFromStartAddress(methodDesc & ~InterpretedCodeAddressFlag));
195-
return dac_cast<TADDR>(pCodeHeader->GetMethodDesc());
196-
}
185+
#ifndef DACCESS_COMPILE
197186

198-
static PCODE GetTargetFromPrecodeData(TADDR methodDesc, PCODE target)
187+
InterpreterPrecode* Precode::AllocateInterpreterPrecode(PCODE byteCode,
188+
LoaderAllocator * pLoaderAllocator,
189+
AllocMemTracker * pamTracker)
199190
{
200-
LIMITED_METHOD_CONTRACT;
201-
if ((methodDesc & InterpretedCodeAddressFlag) == 0)
191+
CONTRACTL
202192
{
203-
return target;
193+
THROWS;
194+
GC_NOTRIGGER;
195+
MODE_ANY;
204196
}
197+
CONTRACTL_END;
205198

206-
return dac_cast<PCODE>(methodDesc);
207-
}
208-
209-
TADDR FixupPrecode::GetMethodDesc()
210-
{
211-
LIMITED_METHOD_CONTRACT;
212-
return GetMethodDescFromPrecodeData(dac_cast<TADDR>(GetData()->MethodDesc));
213-
}
214-
215-
PCODE FixupPrecode::GetTarget()
216-
{
217-
LIMITED_METHOD_DAC_CONTRACT;
218-
return GetTargetFromPrecodeData(dac_cast<TADDR>(GetData()->MethodDesc), GetData()->Target);
219-
}
220-
221-
TADDR StubPrecode::GetMethodDesc()
222-
{
223-
LIMITED_METHOD_CONTRACT;
224-
return GetMethodDescFromPrecodeData(dac_cast<TADDR>(GetData()->MethodDesc));
225-
}
226-
227-
PCODE StubPrecode::GetTarget()
228-
{
229-
LIMITED_METHOD_DAC_CONTRACT;
230-
return GetTargetFromPrecodeData(dac_cast<TADDR>(GetData()->MethodDesc), GetData()->Target);
199+
SIZE_T size = sizeof(InterpreterPrecode);
200+
InterpreterPrecode* pPrecode = (InterpreterPrecode*)pamTracker->Track(pLoaderAllocator->GetNewStubPrecodeHeap()->AllocAlignedMem(size, 1));
201+
pPrecode->Init(pPrecode, byteCode);
202+
return pPrecode;
231203
}
232-
#endif // FEATURE_INTERPRETER
233-
234-
#ifndef DACCESS_COMPILE
235204

236205
Precode* Precode::Allocate(PrecodeType t, MethodDesc* pMD,
237206
LoaderAllocator * pLoaderAllocator,
@@ -327,7 +296,7 @@ void Precode::ResetTargetInterlocked()
327296
// interlocked operation above (see ClrFlushInstructionCache())
328297
}
329298

330-
BOOL Precode::SetTargetInterlocked(PCODE target, BOOL fOnlyRedirectFromPrestub, BOOL fInterpreter)
299+
BOOL Precode::SetTargetInterlocked(PCODE target, BOOL fOnlyRedirectFromPrestub)
331300
{
332301
WRAPPER_NO_CONTRACT;
333302
_ASSERTE(!IsPointingToPrestub(target));
@@ -342,18 +311,17 @@ BOOL Precode::SetTargetInterlocked(PCODE target, BOOL fOnlyRedirectFromPrestub,
342311
switch (precodeType)
343312
{
344313
case PRECODE_STUB:
345-
ret = AsStubPrecode()->SetTargetInterlocked(target, expected, fInterpreter);
314+
ret = AsStubPrecode()->SetTargetInterlocked(target, expected);
346315
break;
347316

348317
#ifdef HAS_FIXUP_PRECODE
349318
case PRECODE_FIXUP:
350-
ret = AsFixupPrecode()->SetTargetInterlocked(target, expected, fInterpreter);
319+
ret = AsFixupPrecode()->SetTargetInterlocked(target, expected);
351320
break;
352321
#endif // HAS_FIXUP_PRECODE
353322

354323
#ifdef HAS_THISPTR_RETBUF_PRECODE
355324
case PRECODE_THISPTR_RETBUF:
356-
_ASSERTE(!fInterpreter);
357325
ret = AsThisPtrRetBufPrecode()->SetTargetInterlocked(target, expected);
358326
ClrFlushInstructionCache(this, sizeof(ThisPtrRetBufPrecode), /* hasCodeExecutedBefore */ true);
359327
break;
@@ -533,6 +501,16 @@ BOOL StubPrecode::IsStubPrecodeByASM(PCODE addr)
533501
#endif // TARGET_X86
534502
}
535503

504+
void InterpreterPrecode::Init(InterpreterPrecode* pPrecodeRX, TADDR byteCodeAddr)
505+
{
506+
WRAPPER_NO_CONTRACT;
507+
InterpreterPrecodeData *pStubData = GetData();
508+
509+
pStubData->Target = (PCODE)InterpreterStub;
510+
pStubData->ByteCodeAddr = byteCodeAddr;
511+
pStubData->Type = InterpreterPrecode::Type;
512+
}
513+
536514
#ifdef HAS_NDIRECT_IMPORT_PRECODE
537515

538516
void NDirectImportPrecode::Init(NDirectImportPrecode* pPrecodeRX, MethodDesc* pMD, LoaderAllocator *pLoaderAllocator)

src/coreclr/vm/precode.h

Lines changed: 39 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ struct InvalidPrecode
7676

7777
struct StubPrecodeData
7878
{
79-
TADDR MethodDesc; // MethodDesc pointer or interpreted code address or-ed with the InterpretedCodeAddressFlag
79+
TADDR MethodDesc;
8080
PCODE Target;
8181
BYTE Type;
8282
};
@@ -133,26 +133,18 @@ struct StubPrecode
133133
}
134134

135135
TADDR GetMethodDesc()
136-
#ifdef FEATURE_INTERPRETER
137-
;
138-
#else
139136
{
140137
LIMITED_METHOD_DAC_CONTRACT;
141138

142139
return dac_cast<TADDR>(GetData()->MethodDesc);
143140
}
144-
#endif
145141

146142
PCODE GetTarget()
147-
#ifdef FEATURE_INTERPRETER
148-
;
149-
#else
150143
{
151144
LIMITED_METHOD_DAC_CONTRACT;
152145

153146
return GetData()->Target;
154147
}
155-
#endif
156148

157149
BYTE GetType()
158150
{
@@ -175,7 +167,7 @@ struct StubPrecode
175167
InterlockedExchangeT<PCODE>(&pData->Target, GetPreStubEntryPoint());
176168
}
177169

178-
BOOL SetTargetInterlocked(TADDR target, TADDR expected, BOOL fInterpreter)
170+
BOOL SetTargetInterlocked(TADDR target, TADDR expected)
179171
{
180172
CONTRACTL
181173
{
@@ -184,12 +176,6 @@ struct StubPrecode
184176
}
185177
CONTRACTL_END;
186178

187-
#ifdef FEATURE_INTERPRETER
188-
if (fInterpreter)
189-
{
190-
target = (PCODE)InterpreterStub;
191-
}
192-
#endif
193179
StubPrecodeData *pData = GetData();
194180
return InterlockedCompareExchangeT<PCODE>(&pData->Target, (PCODE)target, (PCODE)expected) == expected;
195181
}
@@ -222,13 +208,42 @@ typedef DPTR(NDirectImportPrecode) PTR_NDirectImportPrecode;
222208

223209
#endif // HAS_NDIRECT_IMPORT_PRECODE
224210

211+
struct InterpreterPrecodeData
212+
{
213+
TADDR ByteCodeAddr;
214+
PCODE Target;
215+
BYTE Type;
216+
};
217+
218+
typedef DPTR(InterpreterPrecodeData) PTR_InterpreterPrecodeData;
219+
220+
struct InterpreterPrecode
221+
{
222+
static const int Type = 0x06;
223+
224+
BYTE m_code[StubPrecode::CodeSize];
225+
226+
void Init(InterpreterPrecode* pPrecodeRX, TADDR byteCodeAddr);
227+
228+
PTR_InterpreterPrecodeData GetData() const
229+
{
230+
LIMITED_METHOD_CONTRACT;
231+
return dac_cast<PTR_InterpreterPrecodeData>(dac_cast<TADDR>(this) + GetStubCodePageSize());
232+
}
233+
234+
PCODE GetEntryPoint()
235+
{
236+
LIMITED_METHOD_CONTRACT;
237+
return PINSTRToPCODE(dac_cast<TADDR>(this));
238+
}
239+
};
225240

226241
#ifdef HAS_FIXUP_PRECODE
227242

228243
struct FixupPrecodeData
229244
{
230245
PCODE Target;
231-
TADDR MethodDesc; // MethodDesc pointer or interpreted code address or-ed with the InterpretedCodeAddressFlag
246+
TADDR MethodDesc;
232247
PCODE PrecodeFixupThunk;
233248
};
234249

@@ -289,23 +304,15 @@ struct FixupPrecode
289304
}
290305

291306
TADDR GetMethodDesc()
292-
#ifdef FEATURE_INTERPRETER
293-
;
294-
#else
295307
{
296308
return (TADDR)GetData()->MethodDesc;
297309
}
298-
#endif
299310

300311
PCODE GetTarget()
301-
#ifdef FEATURE_INTERPRETER
302-
;
303-
#else
304312
{
305313
LIMITED_METHOD_DAC_CONTRACT;
306314
return GetData()->Target;
307315
}
308-
#endif
309316

310317
PCODE *GetTargetSlot()
311318
{
@@ -331,7 +338,7 @@ struct FixupPrecode
331338
InterlockedExchangeT<PCODE>(&GetData()->Target, target);
332339
}
333340

334-
BOOL SetTargetInterlocked(TADDR target, TADDR expected, BOOL fInterpreter)
341+
BOOL SetTargetInterlocked(TADDR target, TADDR expected)
335342
{
336343
CONTRACTL
337344
{
@@ -340,15 +347,6 @@ struct FixupPrecode
340347
}
341348
CONTRACTL_END;
342349

343-
#ifdef FEATURE_INTERPRETER
344-
if (fInterpreter)
345-
{
346-
_ASSERTE(IS_ALIGNED(&GetData()->PrecodeFixupThunk, sizeof(SIZE_T)));
347-
_ASSERTE((PCODE)GetData()->Target == ((PCODE)this + FixupCodeOffset));
348-
PCODE oldTarget = (PCODE)GetData()->PrecodeFixupThunk;
349-
return InterlockedCompareExchangeT<PCODE>(&GetData()->PrecodeFixupThunk, (PCODE)InterpreterStub, (PCODE)oldTarget) == (PCODE)oldTarget;
350-
}
351-
#endif
352350
PCODE oldTarget = (PCODE)GetData()->Target;
353351
if (oldTarget != ((PCODE)this + FixupCodeOffset))
354352
{
@@ -381,6 +379,7 @@ typedef DPTR(class Precode) PTR_Precode;
381379
enum PrecodeType {
382380
PRECODE_INVALID = InvalidPrecode::Type,
383381
PRECODE_STUB = StubPrecode::Type,
382+
PRECODE_INTERPRETER = InterpreterPrecode::Type,
384383
#ifdef HAS_NDIRECT_IMPORT_PRECODE
385384
PRECODE_NDIRECT_IMPORT = NDirectImportPrecode::Type,
386385
#endif // HAS_NDIRECT_IMPORT_PRECODE
@@ -568,11 +567,15 @@ class Precode {
568567

569568
static Precode* Allocate(PrecodeType t, MethodDesc* pMD,
570569
LoaderAllocator *pLoaderAllocator, AllocMemTracker *pamTracker);
570+
571+
static InterpreterPrecode* AllocateInterpreterPrecode(PCODE byteCode,
572+
LoaderAllocator * pLoaderAllocator, AllocMemTracker * pamTracker);
573+
571574
void Init(Precode* pPrecodeRX, PrecodeType t, MethodDesc* pMD, LoaderAllocator *pLoaderAllocator);
572575

573576
#ifndef DACCESS_COMPILE
574577
void ResetTargetInterlocked();
575-
BOOL SetTargetInterlocked(PCODE target, BOOL fOnlyRedirectFromPrestub = TRUE, BOOL fInterpreter = FALSE);
578+
BOOL SetTargetInterlocked(PCODE target, BOOL fOnlyRedirectFromPrestub = TRUE);
576579

577580
// Reset precode to point to prestub
578581
void Reset();

src/coreclr/vm/prestub.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -426,9 +426,14 @@ PCODE MethodDesc::PrepareILBasedCode(PrepareCodeConfig* pConfig)
426426
LOG((LF_CLASSLOADER, LL_INFO1000000,
427427
" In PrepareILBasedCode, calling JitCompileCode\n"));
428428
pCode = JitCompileCode(pConfig);
429+
429430
if (pConfig->IsInterpreterCode())
430431
{
431-
pCode |= InterpretedCodeAddressFlag;
432+
AllocMemTracker amt;
433+
InterpreterPrecode* pPrecode = Precode::AllocateInterpreterPrecode(pCode, GetLoaderAllocator(), &amt);
434+
amt.SuppressRelease();
435+
pCode = PINSTRToPCODE(pPrecode->GetEntryPoint());
436+
SetNativeCodeInterlocked(pCode);
432437
}
433438
}
434439
else
@@ -2691,7 +2696,6 @@ extern "C" PCODE STDCALL PreStubWorker(TransitionBlock* pTransitionBlock, Method
26912696
#ifdef FEATURE_INTERPRETER
26922697
extern "C" void STDCALL ExecuteInterpretedMethod(TransitionBlock* pTransitionBlock, TADDR byteCodeAddr)
26932698
{
2694-
byteCodeAddr &= ~InterpretedCodeAddressFlag;
26952699
CodeHeader* pCodeHeader = EEJitManager::GetCodeHeaderFromStartAddress(byteCodeAddr);
26962700

26972701
EEJitManager *pManager = ExecutionManager::GetEEJitManager();

0 commit comments

Comments
 (0)