Skip to content

Commit a7bd51e

Browse files
authored
Avoid CORINFO_..._HANDLEs in JIT helper signatures (#116675)
CORINFO_..._HANDLEs are meant to be JIT/EE interface abstraction. Using them in JIT helper signatures causes confusion.
1 parent 8c22d9e commit a7bd51e

File tree

6 files changed

+42
-77
lines changed

6 files changed

+42
-77
lines changed

src/coreclr/vm/appdomainnative.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ extern "C" void QCALLTYPE String_IsInterned(QCall::StringHandleOnStack str)
129129
END_QCALL;
130130
}
131131

132-
extern "C" STRINGREF* QCALLTYPE String_StrCns(UINT32 rid, CORINFO_MODULE_HANDLE scopeHnd)
132+
extern "C" STRINGREF* QCALLTYPE String_StrCns(UINT32 rid, Module* pModule)
133133
{
134134
QCALL_CONTRACT;
135135

@@ -138,7 +138,7 @@ extern "C" STRINGREF* QCALLTYPE String_StrCns(UINT32 rid, CORINFO_MODULE_HANDLE
138138
BEGIN_QCALL;
139139

140140
// Retrieve the handle to the CLR string object.
141-
hndStr = ConstructStringLiteral(scopeHnd, RidToToken(rid, mdtString));
141+
hndStr = pModule->ResolveStringRef(RidToToken(rid, mdtString));
142142

143143
END_QCALL;
144144

src/coreclr/vm/appdomainnative.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
#include "qcall.h"
1818

19-
extern "C" STRINGREF* QCALLTYPE String_StrCns(UINT32 rid, CORINFO_MODULE_HANDLE scopeHnd);
19+
extern "C" STRINGREF* QCALLTYPE String_StrCns(UINT32 rid, Module* pModule);
2020
extern "C" void QCALLTYPE String_Intern(QCall::StringHandleOnStack str);
2121
extern "C" void QCALLTYPE String_IsInterned(QCall::StringHandleOnStack str);
2222

src/coreclr/vm/interpexec.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ CallStubHeader *CreateNativeToInterpreterCallStub(InterpMethod* pInterpMethod)
116116

117117
typedef void* (*HELPER_FTN_PP)(void*);
118118
typedef void* (*HELPER_FTN_BOX_UNBOX)(MethodTable*, void*);
119-
typedef Object* (*HELPER_FTN_NEWARR)(CORINFO_CLASS_HANDLE, intptr_t);
119+
typedef Object* (*HELPER_FTN_NEWARR)(MethodTable*, intptr_t);
120120
typedef void* (*HELPER_FTN_PP_2)(void*, void*);
121121

122122
InterpThreadContext::InterpThreadContext()
@@ -131,9 +131,9 @@ InterpThreadContext::~InterpThreadContext()
131131
free(pStackStart);
132132
}
133133

134-
CORINFO_GENERIC_HANDLE GenericHandleWorkerCore(MethodDesc * pMD, MethodTable * pMT, LPVOID signature, DWORD dictionaryIndexAndSlot, Module* pModule);
134+
DictionaryEntry GenericHandleWorkerCore(MethodDesc * pMD, MethodTable * pMT, LPVOID signature, DWORD dictionaryIndexAndSlot, Module* pModule);
135135

136-
CORINFO_GENERIC_HANDLE GenericHandleCommon(MethodDesc * pMD, MethodTable * pMT, LPVOID signature)
136+
void* GenericHandleCommon(MethodDesc * pMD, MethodTable * pMT, LPVOID signature)
137137
{
138138
CONTRACTL
139139
{
@@ -1706,7 +1706,7 @@ void InterpExecMethod(InterpreterFrame *pInterpreterFrame, InterpMethodContextFr
17061706
if (length < 0)
17071707
COMPlusThrow(kArgumentOutOfRangeException);
17081708

1709-
CORINFO_CLASS_HANDLE arrayClsHnd = (CORINFO_CLASS_HANDLE)pMethod->pDataItems[ip[3]];
1709+
MethodTable* arrayClsHnd = (MethodTable*)pMethod->pDataItems[ip[3]];
17101710
HELPER_FTN_NEWARR helper = GetPossiblyIndirectHelper<HELPER_FTN_NEWARR>(pMethod->pDataItems[ip[4]]);
17111711

17121712
Object* arr = helper(arrayClsHnd, (intptr_t)length);
@@ -1979,7 +1979,7 @@ do { \
19791979
}
19801980
#define DO_GENERIC_LOOKUP(mdParam, mtParam) \
19811981
CORINFO_RUNTIME_LOOKUP *pLookup = (CORINFO_RUNTIME_LOOKUP*)pMethod->pDataItems[ip[3]]; \
1982-
CORINFO_GENERIC_HANDLE result = 0; \
1982+
void* result = 0; \
19831983
\
19841984
assert(!pLookup->indirectFirstOffset); \
19851985
assert(!pLookup->indirectSecondOffset); \
@@ -2007,9 +2007,9 @@ do { \
20072007
result = GenericHandleCommon(mdParam, mtParam, pLookup->signature); \
20082008
break; \
20092009
} \
2010-
result = (CORINFO_GENERIC_HANDLE)lookup; \
2010+
result = lookup; \
20112011
} while (0); \
2012-
LOCAL_VAR(dreg, CORINFO_GENERIC_HANDLE) = result; \
2012+
LOCAL_VAR(dreg, void*) = result; \
20132013
ip += 4;
20142014

20152015
case INTOP_GENERICLOOKUP_THIS:

src/coreclr/vm/jithelpers.cpp

Lines changed: 27 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -490,7 +490,7 @@ BOOL ObjIsInstanceOf(Object* pObject, TypeHandle toTypeHnd, BOOL throwCastExcept
490490
return ObjIsInstanceOfCore(pObject, toTypeHnd, throwCastException);
491491
}
492492

493-
extern "C" BOOL QCALLTYPE IsInstanceOf_NoCacheLookup(CORINFO_CLASS_HANDLE type, BOOL throwCastException, QCall::ObjectHandleOnStack objOnStack)
493+
extern "C" BOOL QCALLTYPE IsInstanceOf_NoCacheLookup(EnregisteredTypeHandle type, BOOL throwCastException, QCall::ObjectHandleOnStack objOnStack)
494494
{
495495
QCALL_CONTRACT;
496496
BOOL result = FALSE;
@@ -499,55 +499,33 @@ extern "C" BOOL QCALLTYPE IsInstanceOf_NoCacheLookup(CORINFO_CLASS_HANDLE type,
499499

500500
GCX_COOP();
501501

502-
TypeHandle clsHnd(type);
503-
result = ObjIsInstanceOfCore(OBJECTREFToObject(objOnStack.Get()), clsHnd, throwCastException);
502+
result = ObjIsInstanceOfCore(OBJECTREFToObject(objOnStack.Get()), TypeHandle::FromPtr(type), throwCastException);
504503

505504
END_QCALL;
506505

507506
return result;
508507
}
509508

510-
//========================================================================
511-
//
512-
// STRING HELPERS
513-
//
514-
//========================================================================
515-
516-
/*********************************************************************/
517-
STRINGREF* ConstructStringLiteral(CORINFO_MODULE_HANDLE scopeHnd, mdToken metaTok, void** ppPinnedString)
518-
{
519-
STANDARD_VM_CONTRACT;
520-
521-
_ASSERTE(TypeFromToken(metaTok) == mdtString);
522-
Module* module = GetModule(scopeHnd);
523-
return module->ResolveStringRef(metaTok, ppPinnedString);
524-
}
525-
526-
527509
//========================================================================
528510
//
529511
// VALUETYPE/BYREF HELPERS
530512
//
531513
//========================================================================
532514
/*************************************************************/
533-
HCIMPL2(BOOL, JIT_IsInstanceOfException, CORINFO_CLASS_HANDLE type, Object* obj)
515+
HCIMPL2(BOOL, JIT_IsInstanceOfException, EnregisteredTypeHandle type, Object* obj)
534516
{
535517
FCALL_CONTRACT;
536-
TypeHandle clsHnd(type);
537-
return ExceptionIsOfRightType(clsHnd, obj->GetTypeHandle());
518+
return ExceptionIsOfRightType(TypeHandle::FromPtr(type), obj->GetTypeHandle());
538519
}
539520
HCIMPLEND
540521

541-
extern "C" void QCALLTYPE ThrowInvalidCastException(CORINFO_CLASS_HANDLE pSourceType, CORINFO_CLASS_HANDLE pTargetType)
522+
extern "C" void QCALLTYPE ThrowInvalidCastException(EnregisteredTypeHandle pSourceType, EnregisteredTypeHandle pTargetType)
542523
{
543524
QCALL_CONTRACT;
544525

545526
BEGIN_QCALL;
546527

547-
TypeHandle targetType(pTargetType);
548-
TypeHandle sourceType(pSourceType);
549-
550-
COMPlusThrowInvalidCastException(sourceType, targetType);
528+
COMPlusThrowInvalidCastException(TypeHandle::FromPtr(pSourceType), TypeHandle::FromPtr(pTargetType));
551529

552530
END_QCALL;
553531
}
@@ -558,11 +536,11 @@ extern "C" void QCALLTYPE ThrowInvalidCastException(CORINFO_CLASS_HANDLE pSource
558536
//
559537
//========================================================================
560538

561-
CORINFO_GENERIC_HANDLE GenericHandleWorkerCore(MethodDesc * pMD, MethodTable * pMT, LPVOID signature, DWORD dictionaryIndexAndSlot, Module* pModule)
539+
DictionaryEntry GenericHandleWorkerCore(MethodDesc * pMD, MethodTable * pMT, LPVOID signature, DWORD dictionaryIndexAndSlot, Module* pModule)
562540
{
563541
STANDARD_VM_CONTRACT;
564542

565-
CORINFO_GENERIC_HANDLE result = NULL;
543+
DictionaryEntry result = NULL;
566544

567545
_ASSERTE(pMT != NULL || pMD != NULL);
568546
_ASSERTE(pMT == NULL || pMD == NULL);
@@ -610,7 +588,7 @@ CORINFO_GENERIC_HANDLE GenericHandleWorkerCore(MethodDesc * pMD, MethodTable * p
610588
}
611589

612590
DictionaryEntry * pSlot;
613-
result = (CORINFO_GENERIC_HANDLE)Dictionary::PopulateEntry(pMD, pDeclaringMT, signature, FALSE, &pSlot, dictionaryIndexAndSlot, pModule);
591+
result = Dictionary::PopulateEntry(pMD, pDeclaringMT, signature, FALSE, &pSlot, dictionaryIndexAndSlot, pModule);
614592

615593
if (pMT != NULL && pDeclaringMT != pMT)
616594
{
@@ -629,11 +607,11 @@ CORINFO_GENERIC_HANDLE GenericHandleWorkerCore(MethodDesc * pMD, MethodTable * p
629607
return result;
630608
}
631609

632-
extern "C" CORINFO_GENERIC_HANDLE QCALLTYPE GenericHandleWorker(MethodDesc * pMD, MethodTable * pMT, LPVOID signature, DWORD dictionaryIndexAndSlot, Module* pModule)
610+
extern "C" void* QCALLTYPE GenericHandleWorker(MethodDesc * pMD, MethodTable * pMT, LPVOID signature, DWORD dictionaryIndexAndSlot, Module* pModule)
633611
{
634612
QCALL_CONTRACT;
635613

636-
CORINFO_GENERIC_HANDLE result = NULL;
614+
void* result = NULL;
637615

638616
BEGIN_QCALL;
639617

@@ -702,14 +680,14 @@ void FlushVirtualFunctionPointerCaches()
702680
// static method signature (i.e. might be for a superclass of classHnd)
703681

704682
// slow helper to call from the fast one
705-
extern "C" void* QCALLTYPE ResolveVirtualFunctionPointer(QCall::ObjectHandleOnStack obj,
706-
CORINFO_CLASS_HANDLE classHnd,
707-
CORINFO_METHOD_HANDLE methodHnd)
683+
extern "C" PCODE QCALLTYPE ResolveVirtualFunctionPointer(QCall::ObjectHandleOnStack obj,
684+
EnregisteredTypeHandle classHnd,
685+
MethodDesc* pStaticMD)
708686
{
709687
QCALL_CONTRACT;
710688

711689
// The address of the method that's returned.
712-
CORINFO_MethodPtr addr = NULL;
690+
PCODE addr = (PCODE)NULL;
713691

714692
BEGIN_QCALL;
715693

@@ -736,8 +714,7 @@ extern "C" void* QCALLTYPE ResolveVirtualFunctionPointer(QCall::ObjectHandleOnSt
736714

737715
// This is the static method descriptor describing the call.
738716
// It is not the destination of the call, which we must compute.
739-
MethodDesc* pStaticMD = (MethodDesc*) methodHnd;
740-
TypeHandle staticTH(classHnd);
717+
TypeHandle staticTH = TypeHandle::FromPtr(classHnd);
741718

742719
if (staticTH.IsNull())
743720
{
@@ -759,14 +736,14 @@ extern "C" void* QCALLTYPE ResolveVirtualFunctionPointer(QCall::ObjectHandleOnSt
759736
// as we have no good scheme for reporting an actionable error here.
760737
if (!pStaticMD->IsVtableMethod())
761738
{
762-
addr = (CORINFO_MethodPtr) pStaticMD->GetMultiCallableAddrOfCode();
739+
addr = pStaticMD->GetMultiCallableAddrOfCode();
763740
_ASSERTE(addr);
764741
}
765742
else
766743
{
767744
// This is the new way of resolving a virtual call, including generic virtual methods.
768745
// The code is now also used by reflection, remoting etc.
769-
addr = (CORINFO_MethodPtr) pStaticMD->GetMultiCallableAddrOfVirtualizedCode(&objRef, staticTH);
746+
addr = pStaticMD->GetMultiCallableAddrOfVirtualizedCode(&objRef, staticTH);
770747
_ASSERTE(addr);
771748
}
772749

@@ -786,18 +763,16 @@ HCIMPLEND
786763

787764
// Helper for synchronized static methods in shared generics code
788765
#include <optsmallperfcritical.h>
789-
HCIMPL1(CORINFO_CLASS_HANDLE, JIT_GetClassFromMethodParam, CORINFO_METHOD_HANDLE methHnd_)
766+
HCIMPL1(EnregisteredTypeHandle, JIT_GetClassFromMethodParam, MethodDesc* pMD)
790767
CONTRACTL {
791768
FCALL_CHECK;
792-
PRECONDITION(methHnd_ != NULL);
769+
PRECONDITION(pMD != NULL);
793770
} CONTRACTL_END;
794771

795-
MethodDesc * pMD = (MethodDesc*) methHnd_;
796-
797772
MethodTable * pMT = pMD->GetMethodTable();
798773
_ASSERTE(!pMT->IsSharedByGenericInstantiations());
799774

800-
return((CORINFO_CLASS_HANDLE)pMT);
775+
return pMT;
801776
HCIMPLEND
802777
#include <optdefault.h>
803778

@@ -2161,7 +2136,7 @@ HCIMPL2(void, JIT_DelegateProfile64, Object *obj, ICorJitInfo::HandleHistogram64
21612136
}
21622137
HCIMPLEND
21632138

2164-
HCIMPL3(void, JIT_VTableProfile32, Object* obj, CORINFO_METHOD_HANDLE baseMethod, ICorJitInfo::HandleHistogram32* methodProfile)
2139+
HCIMPL3(void, JIT_VTableProfile32, Object* obj, MethodDesc* pBaseMD, ICorJitInfo::HandleHistogram32* methodProfile)
21652140
{
21662141
FCALL_CONTRACT;
21672142

@@ -2174,8 +2149,6 @@ HCIMPL3(void, JIT_VTableProfile32, Object* obj, CORINFO_METHOD_HANDLE baseMethod
21742149
return;
21752150
}
21762151

2177-
MethodDesc* pBaseMD = GetMethod(baseMethod);
2178-
21792152
// Method better be virtual
21802153
_ASSERTE(pBaseMD->IsVirtual());
21812154

@@ -2209,7 +2182,7 @@ HCIMPL3(void, JIT_VTableProfile32, Object* obj, CORINFO_METHOD_HANDLE baseMethod
22092182
}
22102183
HCIMPLEND
22112184

2212-
HCIMPL3(void, JIT_VTableProfile64, Object* obj, CORINFO_METHOD_HANDLE baseMethod, ICorJitInfo::HandleHistogram64* methodProfile)
2185+
HCIMPL3(void, JIT_VTableProfile64, Object* obj, MethodDesc* pBaseMD, ICorJitInfo::HandleHistogram64* methodProfile)
22132186
{
22142187
FCALL_CONTRACT;
22152188

@@ -2222,8 +2195,6 @@ HCIMPL3(void, JIT_VTableProfile64, Object* obj, CORINFO_METHOD_HANDLE baseMethod
22222195
return;
22232196
}
22242197

2225-
MethodDesc* pBaseMD = GetMethod(baseMethod);
2226-
22272198
// Method better be virtual
22282199
_ASSERTE(pBaseMD->IsVirtual());
22292200

@@ -2412,11 +2383,10 @@ NOINLINE static void JIT_ReversePInvokeEnterRare2(ReversePInvokeFrame* frame, vo
24122383
// We may not have a managed thread set up in JIT_ReversePInvokeEnter, and the GC mode may be incorrect.
24132384
// On x86, SEH handlers are set up and torn down explicitly, so we avoid using dynamic contracts.
24142385
// This method uses the correct calling convention and argument layout manually, without relying on standard macros or contracts.
2415-
HCIMPL3_RAW(void, JIT_ReversePInvokeEnterTrackTransitions, ReversePInvokeFrame* frame, CORINFO_METHOD_HANDLE handle, void* secretArg)
2386+
HCIMPL3_RAW(void, JIT_ReversePInvokeEnterTrackTransitions, ReversePInvokeFrame* frame, MethodDesc* pMD, void* secretArg)
24162387
{
2417-
_ASSERTE(frame != NULL && handle != NULL);
2388+
_ASSERTE(frame != NULL && pMD != NULL);
24182389

2419-
MethodDesc* pMD = GetMethod(handle);
24202390
if (pMD->IsILStub() && secretArg != NULL)
24212391
{
24222392
pMD = ((UMEntryThunkData*)secretArg)->m_pMD;
@@ -2445,14 +2415,14 @@ HCIMPL3_RAW(void, JIT_ReversePInvokeEnterTrackTransitions, ReversePInvokeFrame*
24452415
{
24462416
// If we're in an IL stub, we want to trace the address of the target method,
24472417
// not the next instruction in the stub.
2448-
JIT_ReversePInvokeEnterRare2(frame, _ReturnAddress(), GetMethod(handle)->IsILStub() ? ((UMEntryThunkData*)secretArg)->m_pUMEntryThunk : (UMEntryThunk*)NULL);
2418+
JIT_ReversePInvokeEnterRare2(frame, _ReturnAddress(), pMD->IsILStub() ? ((UMEntryThunkData*)secretArg)->m_pUMEntryThunk : (UMEntryThunk*)NULL);
24492419
}
24502420
}
24512421
else
24522422
{
24532423
// If we're in an IL stub, we want to trace the address of the target method,
24542424
// not the next instruction in the stub.
2455-
JIT_ReversePInvokeEnterRare(frame, _ReturnAddress(), GetMethod(handle)->IsILStub() ? ((UMEntryThunkData*)secretArg)->m_pUMEntryThunk : (UMEntryThunk*)NULL);
2425+
JIT_ReversePInvokeEnterRare(frame, _ReturnAddress(), pMD->IsILStub() ? ((UMEntryThunkData*)secretArg)->m_pUMEntryThunk : (UMEntryThunk*)NULL);
24562426
}
24572427

24582428
#if defined(TARGET_X86) && defined(TARGET_WINDOWS)

src/coreclr/vm/jitinterface.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12104,13 +12104,13 @@ InfoAccessType CEECodeGenInfo::constructStringLiteral(CORINFO_MODULE_HANDLE scop
1210412104
}
1210512105
else
1210612106
{
12107-
// If ConstructStringLiteral returns a pinned reference we can return it by value (IAT_VALUE)
12108-
void* ppPinnedString = nullptr;
12109-
STRINGREF* ptr = ConstructStringLiteral(scopeHnd, metaTok, &ppPinnedString);
12107+
// If ResolveStringRef returns a pinned reference we can return it by value (IAT_VALUE)
12108+
void* pPinnedString = nullptr;
12109+
STRINGREF* ptr = ((Module*)scopeHnd)->ResolveStringRef(metaTok, &pPinnedString);
1211012110

12111-
if (ppPinnedString != nullptr)
12111+
if (pPinnedString != nullptr)
1211212112
{
12113-
*ppValue = ppPinnedString;
12113+
*ppValue = pPinnedString;
1211412114
result = IAT_VALUE;
1211512115
}
1211612116
else

src/coreclr/vm/jitinterface.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1030,11 +1030,6 @@ BOOL OnGcCoverageInterrupt(PT_CONTEXT regs);
10301030
void DoGcStress (PT_CONTEXT regs, NativeCodeVersion nativeCodeVersion);
10311031
#endif //HAVE_GCCOVER
10321032

1033-
// ppPinnedString: If the string is pinned (e.g. allocated in frozen heap),
1034-
// the pointer to the pinned string is returned in *ppPinnedPointer. ppPinnedPointer == nullptr
1035-
// means that the caller does not care whether the string is pinned or not.
1036-
STRINGREF* ConstructStringLiteral(CORINFO_MODULE_HANDLE scopeHnd, mdToken metaTok, void** ppPinnedString = nullptr);
1037-
10381033
BOOL ObjIsInstanceOf(Object *pObject, TypeHandle toTypeHnd, BOOL throwCastException = FALSE);
10391034

10401035
class InlinedCallFrame;

0 commit comments

Comments
 (0)