From b5e62311ae12656352d783312b24c599823c56d7 Mon Sep 17 00:00:00 2001 From: Radek Doulik Date: Fri, 26 Sep 2025 18:53:01 +0200 Subject: [PATCH 01/13] Fix unboxing stubs on wasm --- src/coreclr/clrdefinitions.cmake | 2 +- src/coreclr/vm/comdelegate.cpp | 2 ++ src/coreclr/vm/prestub.cpp | 34 +++++++++++++++++++++++--------- 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/src/coreclr/clrdefinitions.cmake b/src/coreclr/clrdefinitions.cmake index faf996c5a8da25..93bc9f63ca7e2c 100644 --- a/src/coreclr/clrdefinitions.cmake +++ b/src/coreclr/clrdefinitions.cmake @@ -60,7 +60,7 @@ if(CLR_CMAKE_TARGET_WIN32 AND CLR_CMAKE_TARGET_ARCH_AMD64) add_compile_definitions(OUT_OF_PROCESS_SETTHREADCONTEXT) endif(CLR_CMAKE_TARGET_WIN32 AND CLR_CMAKE_TARGET_ARCH_AMD64) -if(NOT CLR_CMAKE_TARGET_ARCH_I386) +if(NOT CLR_CMAKE_TARGET_ARCH_I386 AND NOT CLR_CMAKE_TARGET_ARCH_WASM) add_definitions(-DFEATURE_PORTABLE_SHUFFLE_THUNKS) endif() diff --git a/src/coreclr/vm/comdelegate.cpp b/src/coreclr/vm/comdelegate.cpp index 4477aecdc56e47..d2689fe755861b 100644 --- a/src/coreclr/vm/comdelegate.cpp +++ b/src/coreclr/vm/comdelegate.cpp @@ -727,6 +727,8 @@ BOOL GenerateShuffleArray(MethodDesc* pInvoke, MethodDesc *pTargetMeth, SArray(stackSizeDelta); pShuffleEntryArray->Append(entry); +#elif defined (TARGET_WASM) + PORTABILITY_ASSERT("GenerateShuffleArray not implemented for WebAssembly"); #else #error Unsupported architecture #endif diff --git a/src/coreclr/vm/prestub.cpp b/src/coreclr/vm/prestub.cpp index dcd94a0c3b7546..c5b913d5245899 100644 --- a/src/coreclr/vm/prestub.cpp +++ b/src/coreclr/vm/prestub.cpp @@ -1459,7 +1459,7 @@ void MethodDesc::CreateDerivedTargetSigWithExtraParams(MetaSig& msig, SigBuilder #ifdef FEATURE_INSTANTIATINGSTUB_AS_IL -Stub * CreateUnboxingILStubForSharedGenericValueTypeMethods(MethodDesc* pTargetMD) +Stub * CreateUnboxingILStubForValueTypeMethods(MethodDesc* pTargetMD) { CONTRACT(Stub*) @@ -1510,13 +1510,15 @@ Stub * CreateUnboxingILStubForSharedGenericValueTypeMethods(MethodDesc* pTargetM } #endif - // Push the hidden context param - // The context is going to be captured from the thisptr - pCode->EmitLoadThis(); - pCode->EmitLDFLDA(tokRawData); - pCode->EmitLDC(Object::GetOffsetOfFirstField()); - pCode->EmitSUB(); - pCode->EmitLDIND_I(); + if (pTargetMD->RequiresInstMethodTableArg()) { + // Push the hidden context param + // The context is going to be captured from the thisptr + pCode->EmitLoadThis(); + pCode->EmitLDFLDA(tokRawData); + pCode->EmitLDC(Object::GetOffsetOfFirstField()); + pCode->EmitSUB(); + pCode->EmitLDIND_I(); + } #ifndef TARGET_X86 if (msig.HasAsyncContinuation()) @@ -1727,13 +1729,16 @@ Stub * MakeUnboxingStubWorker(MethodDesc *pMD) else #endif { +#ifdef FEATURE_PORTABLE_ENTRYPOINTS + pstub = CreateUnboxingILStubForValueTypeMethods(pUnboxedMD); +#else #ifdef FEATURE_INSTANTIATINGSTUB_AS_IL #ifndef FEATURE_PORTABLE_SHUFFLE_THUNKS if (pUnboxedMD->RequiresInstMethodTableArg()) #endif // !FEATURE_PORTABLE_SHUFFLE_THUNKS { _ASSERTE(pUnboxedMD->RequiresInstMethodTableArg()); - pstub = CreateUnboxingILStubForSharedGenericValueTypeMethods(pUnboxedMD); + pstub = CreateUnboxingILStubForValueTypeMethods(pUnboxedMD); } #ifndef FEATURE_PORTABLE_SHUFFLE_THUNKS else @@ -1746,6 +1751,7 @@ Stub * MakeUnboxingStubWorker(MethodDesc *pMD) pstub = sl.Link(pMD->GetLoaderAllocator()->GetStubHeap(), NEWSTUB_FL_NONE, "UnboxingStub"); } #endif // !FEATURE_PORTABLE_SHUFFLE_THUNKS +#endif // FEATURE_PORTABLE_ENTRYPOINTS } RETURN pstub; } @@ -2261,6 +2267,16 @@ PCODE MethodDesc::DoPrestub(MethodTable *pDispatchingMT, CallerGCMode callerGCMo if (IsUnboxingStub()) { pStub = MakeUnboxingStubWorker(this); + +#if defined(FEATURE_PORTABLE_ENTRYPOINTS) + pCode = pStub->GetEntryPoint(); + delete pStub; + pStub = NULL; + + void* ilStubInterpData = PortableEntryPoint::GetInterpreterData(pCode); + _ASSERTE(ilStubInterpData != NULL); + SetInterpreterCode((InterpByteCodeStart*)ilStubInterpData); +#endif } #if defined(FEATURE_SHARE_GENERIC_CODE) else if (IsInstantiatingStub()) From 88777fa2f3b12eb794623d6a2692688a7bcbc867 Mon Sep 17 00:00:00 2001 From: Radek Doulik Date: Fri, 26 Sep 2025 21:13:42 +0200 Subject: [PATCH 02/13] Apply suggestions from code review Co-authored-by: Jan Kotas Co-authored-by: Aaron Robinson --- src/coreclr/clrdefinitions.cmake | 2 +- src/coreclr/vm/prestub.cpp | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/coreclr/clrdefinitions.cmake b/src/coreclr/clrdefinitions.cmake index 93bc9f63ca7e2c..ef4aa816c15af1 100644 --- a/src/coreclr/clrdefinitions.cmake +++ b/src/coreclr/clrdefinitions.cmake @@ -60,7 +60,7 @@ if(CLR_CMAKE_TARGET_WIN32 AND CLR_CMAKE_TARGET_ARCH_AMD64) add_compile_definitions(OUT_OF_PROCESS_SETTHREADCONTEXT) endif(CLR_CMAKE_TARGET_WIN32 AND CLR_CMAKE_TARGET_ARCH_AMD64) -if(NOT CLR_CMAKE_TARGET_ARCH_I386 AND NOT CLR_CMAKE_TARGET_ARCH_WASM) +if(NOT CLR_CMAKE_TARGET_ARCH_I386 AND NOT FEATURE_PORTABLE_ENTRYPOINTS) add_definitions(-DFEATURE_PORTABLE_SHUFFLE_THUNKS) endif() diff --git a/src/coreclr/vm/prestub.cpp b/src/coreclr/vm/prestub.cpp index c5b913d5245899..67d3af423fafbd 100644 --- a/src/coreclr/vm/prestub.cpp +++ b/src/coreclr/vm/prestub.cpp @@ -1510,7 +1510,8 @@ Stub * CreateUnboxingILStubForValueTypeMethods(MethodDesc* pTargetMD) } #endif - if (pTargetMD->RequiresInstMethodTableArg()) { + if (pTargetMD->RequiresInstMethodTableArg()) + { // Push the hidden context param // The context is going to be captured from the thisptr pCode->EmitLoadThis(); @@ -1730,8 +1731,8 @@ Stub * MakeUnboxingStubWorker(MethodDesc *pMD) #endif { #ifdef FEATURE_PORTABLE_ENTRYPOINTS - pstub = CreateUnboxingILStubForValueTypeMethods(pUnboxedMD); -#else + pstub = CreateUnboxingILStubForValueTypeMethods(pUnboxedMD); +#else // !FEATURE_PORTABLE_ENTRYPOINTS #ifdef FEATURE_INSTANTIATINGSTUB_AS_IL #ifndef FEATURE_PORTABLE_SHUFFLE_THUNKS if (pUnboxedMD->RequiresInstMethodTableArg()) @@ -2276,7 +2277,7 @@ PCODE MethodDesc::DoPrestub(MethodTable *pDispatchingMT, CallerGCMode callerGCMo void* ilStubInterpData = PortableEntryPoint::GetInterpreterData(pCode); _ASSERTE(ilStubInterpData != NULL); SetInterpreterCode((InterpByteCodeStart*)ilStubInterpData); -#endif +#endif // FEATURE_PORTABLE_ENTRYPOINTS } #if defined(FEATURE_SHARE_GENERIC_CODE) else if (IsInstantiatingStub()) From 70cc75d7b3e830d7911f2dd240f0906de974c7dd Mon Sep 17 00:00:00 2001 From: Radek Doulik Date: Fri, 26 Sep 2025 21:21:07 +0200 Subject: [PATCH 03/13] Feedback Remove GenerateShuffleArray and s_pShuffleThunkCache for FEATURE_PORTABLE_ENTRYPOINTS --- src/coreclr/vm/comdelegate.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/coreclr/vm/comdelegate.cpp b/src/coreclr/vm/comdelegate.cpp index d2689fe755861b..db965f43b48259 100644 --- a/src/coreclr/vm/comdelegate.cpp +++ b/src/coreclr/vm/comdelegate.cpp @@ -635,6 +635,7 @@ BOOL GenerateShuffleArrayPortable(MethodDesc* pMethodSrc, MethodDesc *pMethodDst } #endif // FEATURE_PORTABLE_SHUFFLE_THUNKS +#ifndef FEATURE_PORTABLE_ENTRYPOINTS BOOL GenerateShuffleArray(MethodDesc* pInvoke, MethodDesc *pTargetMeth, SArray * pShuffleEntryArray) { STANDARD_VM_CONTRACT; @@ -727,8 +728,6 @@ BOOL GenerateShuffleArray(MethodDesc* pInvoke, MethodDesc *pTargetMeth, SArray(stackSizeDelta); pShuffleEntryArray->Append(entry); -#elif defined (TARGET_WASM) - PORTABILITY_ASSERT("GenerateShuffleArray not implemented for WebAssembly"); #else #error Unsupported architecture #endif @@ -775,8 +774,8 @@ BOOL GenerateShuffleArray(MethodDesc* pInvoke, MethodDesc *pTargetMeth, SArrayGetStubHeap()); +#endif } #ifdef FEATURE_COMINTEROP @@ -915,6 +915,7 @@ static PCODE SetupShuffleThunk(MethodTable * pDelMT, MethodDesc *pTargetMeth) MethodDesc *pMD = pClass->GetInvokeMethod(); +#ifndef FEATURE_PORTABLE_ENTRYPOINTS // We haven't already setup a shuffle thunk, go do it now (which will cache the result automatically). StackSArray rShuffleEntryArray; if (GenerateShuffleArray(pMD, pTargetMeth, &rShuffleEntryArray)) @@ -930,6 +931,7 @@ static PCODE SetupShuffleThunk(MethodTable * pDelMT, MethodDesc *pTargetMeth) pShuffleThunk = pShuffleThunkCache->Canonicalize((const BYTE *)&rShuffleEntryArray[0], "DelegateShuffleThunk"); } else +#endif // !FEATURE_PORTABLE_ENTRYPOINTS { #if defined(TARGET_RISCV64) || defined(TARGET_LOONGARCH64) pShuffleThunk = CreateILDelegateShuffleThunk(pMD, isInstRetBuff); From 87fe2ec86d6372aaac93855315f1e59da50df8e8 Mon Sep 17 00:00:00 2001 From: Radek Doulik Date: Fri, 26 Sep 2025 21:46:29 +0200 Subject: [PATCH 04/13] Feedback Handle all pStubs for FEATURE_PORTABLE_ENTRYPOINTS --- src/coreclr/vm/prestub.cpp | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/coreclr/vm/prestub.cpp b/src/coreclr/vm/prestub.cpp index 67d3af423fafbd..27c24e88dc6296 100644 --- a/src/coreclr/vm/prestub.cpp +++ b/src/coreclr/vm/prestub.cpp @@ -2268,16 +2268,6 @@ PCODE MethodDesc::DoPrestub(MethodTable *pDispatchingMT, CallerGCMode callerGCMo if (IsUnboxingStub()) { pStub = MakeUnboxingStubWorker(this); - -#if defined(FEATURE_PORTABLE_ENTRYPOINTS) - pCode = pStub->GetEntryPoint(); - delete pStub; - pStub = NULL; - - void* ilStubInterpData = PortableEntryPoint::GetInterpreterData(pCode); - _ASSERTE(ilStubInterpData != NULL); - SetInterpreterCode((InterpByteCodeStart*)ilStubInterpData); -#endif // FEATURE_PORTABLE_ENTRYPOINTS } #if defined(FEATURE_SHARE_GENERIC_CODE) else if (IsInstantiatingStub()) @@ -2386,12 +2376,27 @@ PCODE MethodDesc::DoPrestub(MethodTable *pDispatchingMT, CallerGCMode callerGCMo MemoryBarrier(); #endif +#if defined(FEATURE_PORTABLE_ENTRYPOINTS) + if (pStub != NULL) + { + pCode = pStub->GetEntryPoint(); + pStub->DecRef(); + delete pStub; + pStub = NULL; + + void* ilStubInterpData = PortableEntryPoint::GetInterpreterData(pCode); + _ASSERTE(ilStubInterpData != NULL); + SetInterpreterCode((InterpByteCodeStart*)ilStubInterpData); + } +#endif // FEATURE_PORTABLE_ENTRYPOINTS + if (pCode != (PCODE)NULL) { _ASSERTE(!MayHaveEntryPointSlotsToBackpatch()); // This path doesn't lock the MethodDescBackpatchTracker as it should only // happen for jump-stampable or non-versionable methods SetCodeEntryPoint(pCode); } +#ifndef FEATURE_PORTABLE_ENTRYPOINTS else { if (!GetOrCreatePrecode()->SetTargetInterlocked(pStub->GetEntryPoint())) @@ -2414,6 +2419,7 @@ PCODE MethodDesc::DoPrestub(MethodTable *pDispatchingMT, CallerGCMode callerGCMo pStub->DecRef(); } } +#endif // !FEATURE_PORTABLE_ENTRYPOINTS _ASSERTE(!IsPointingToPrestub()); _ASSERTE(HasStableEntryPoint()); From 4c0b8aa58a4a2501c824781a846d5d78f0ab19ce Mon Sep 17 00:00:00 2001 From: Radek Doulik Date: Fri, 26 Sep 2025 21:55:16 +0200 Subject: [PATCH 05/13] Do not double free --- src/coreclr/vm/prestub.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/coreclr/vm/prestub.cpp b/src/coreclr/vm/prestub.cpp index 27c24e88dc6296..57c89c71b11fda 100644 --- a/src/coreclr/vm/prestub.cpp +++ b/src/coreclr/vm/prestub.cpp @@ -2381,7 +2381,6 @@ PCODE MethodDesc::DoPrestub(MethodTable *pDispatchingMT, CallerGCMode callerGCMo { pCode = pStub->GetEntryPoint(); pStub->DecRef(); - delete pStub; pStub = NULL; void* ilStubInterpData = PortableEntryPoint::GetInterpreterData(pCode); From 160dca1ab9d0d4ca91a27702e5ea7ac593a634a2 Mon Sep 17 00:00:00 2001 From: Radek Doulik Date: Fri, 26 Sep 2025 22:01:48 +0200 Subject: [PATCH 06/13] Add thunk for the IL stub --- src/coreclr/vm/wasm/helpers.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/coreclr/vm/wasm/helpers.cpp b/src/coreclr/vm/wasm/helpers.cpp index 3208a2c16b1c56..f6566537bff998 100644 --- a/src/coreclr/vm/wasm/helpers.cpp +++ b/src/coreclr/vm/wasm/helpers.cpp @@ -553,6 +553,13 @@ namespace *(int32_t*)pRet = (*fptr)(ARG_IND(0), ARG(1)); } + void CallFunc_I32_I32IND_I32_I32IND_I32_RetI32(PCODE pcode, int8_t *pArgs, int8_t *pRet) + { + printf("TRACE CallFunc_I32_I32IND_I32_I32IND_I32_RetI32 pcode: %lx arg0: %x arg1: %x arg2: %x\n", pcode, ARG(0), ARG_IND(1), ARG_IND(2)); + int32_t (*fptr)(int32_t, int32_t, int32_t, int32_t, int32_t) = (int32_t (*)(int32_t, int32_t, int32_t, int32_t, int32_t))pcode; + *(int32_t*)pRet = (*fptr)(ARG(0), ARG_IND(1), ARG(2), ARG_IND(3), ARG(4)); + } + void CallFunc_I32IND_I32_I32_I32_I32_I32_RetI32(PCODE pcode, int8_t *pArgs, int8_t *pRet) { int32_t (*fptr)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t) = (int32_t (*)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t))pcode; @@ -690,6 +697,16 @@ namespace return (void*)&CallFunc_I32IND_I32_RetI32; } break; + case 5: + if (args[0] == ConvertType::ToI32 && + args[1] == ConvertType::ToI32Indirect && + args[2] == ConvertType::ToI32 && + args[3] == ConvertType::ToI32Indirect && + args[4] == ConvertType::ToI32) + { + return (void*)&CallFunc_I32_I32IND_I32_I32IND_I32_RetI32; + } + break; case 6: if (args[0] == ConvertType::ToI32Indirect && args[1] == ConvertType::ToI32 && From 17770d59ae5ffd7e6a5fc5898a3a335a45dffe52 Mon Sep 17 00:00:00 2001 From: Radek Doulik Date: Fri, 26 Sep 2025 22:10:00 +0200 Subject: [PATCH 07/13] Update src/coreclr/vm/wasm/helpers.cpp Co-authored-by: Jan Kotas --- src/coreclr/vm/wasm/helpers.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/coreclr/vm/wasm/helpers.cpp b/src/coreclr/vm/wasm/helpers.cpp index f6566537bff998..fd8ae3ffc59623 100644 --- a/src/coreclr/vm/wasm/helpers.cpp +++ b/src/coreclr/vm/wasm/helpers.cpp @@ -555,7 +555,6 @@ namespace void CallFunc_I32_I32IND_I32_I32IND_I32_RetI32(PCODE pcode, int8_t *pArgs, int8_t *pRet) { - printf("TRACE CallFunc_I32_I32IND_I32_I32IND_I32_RetI32 pcode: %lx arg0: %x arg1: %x arg2: %x\n", pcode, ARG(0), ARG_IND(1), ARG_IND(2)); int32_t (*fptr)(int32_t, int32_t, int32_t, int32_t, int32_t) = (int32_t (*)(int32_t, int32_t, int32_t, int32_t, int32_t))pcode; *(int32_t*)pRet = (*fptr)(ARG(0), ARG_IND(1), ARG(2), ARG_IND(3), ARG(4)); } From 48c6e7f74b2e449c7a4e5bbbae9e65ce224562ad Mon Sep 17 00:00:00 2001 From: Radek Doulik Date: Fri, 26 Sep 2025 22:15:46 +0200 Subject: [PATCH 08/13] Update src/coreclr/vm/prestub.cpp Co-authored-by: Jan Kotas --- src/coreclr/vm/prestub.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/coreclr/vm/prestub.cpp b/src/coreclr/vm/prestub.cpp index 57c89c71b11fda..4ac23f0e1cb252 100644 --- a/src/coreclr/vm/prestub.cpp +++ b/src/coreclr/vm/prestub.cpp @@ -2398,6 +2398,16 @@ PCODE MethodDesc::DoPrestub(MethodTable *pDispatchingMT, CallerGCMode callerGCMo #ifndef FEATURE_PORTABLE_ENTRYPOINTS else { +else +{ +#ifdef FEATURE_PORTABLE_ENTRYPOINTS + pCode = pStub->GetEntryPoint(); + pStub->DecRef(); + + void* ilStubInterpData = PortableEntryPoint::GetInterpreterData(pCode); + _ASSERTE(ilStubInterpData != NULL); + SetInterpreterCode((InterpByteCodeStart*)ilStubInterpData); +#else if (!GetOrCreatePrecode()->SetTargetInterlocked(pStub->GetEntryPoint())) { if (pStub->HasExternalEntryPoint()) From 952c1858451d61cfa18fe2125dd5b0463d8a89b4 Mon Sep 17 00:00:00 2001 From: Radek Doulik Date: Fri, 26 Sep 2025 22:20:03 +0200 Subject: [PATCH 09/13] Finish the feedback --- src/coreclr/vm/prestub.cpp | 20 ++------------------ 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/src/coreclr/vm/prestub.cpp b/src/coreclr/vm/prestub.cpp index 4ac23f0e1cb252..dab4dc040f892b 100644 --- a/src/coreclr/vm/prestub.cpp +++ b/src/coreclr/vm/prestub.cpp @@ -2376,30 +2376,14 @@ PCODE MethodDesc::DoPrestub(MethodTable *pDispatchingMT, CallerGCMode callerGCMo MemoryBarrier(); #endif -#if defined(FEATURE_PORTABLE_ENTRYPOINTS) - if (pStub != NULL) - { - pCode = pStub->GetEntryPoint(); - pStub->DecRef(); - pStub = NULL; - - void* ilStubInterpData = PortableEntryPoint::GetInterpreterData(pCode); - _ASSERTE(ilStubInterpData != NULL); - SetInterpreterCode((InterpByteCodeStart*)ilStubInterpData); - } -#endif // FEATURE_PORTABLE_ENTRYPOINTS - if (pCode != (PCODE)NULL) { _ASSERTE(!MayHaveEntryPointSlotsToBackpatch()); // This path doesn't lock the MethodDescBackpatchTracker as it should only // happen for jump-stampable or non-versionable methods SetCodeEntryPoint(pCode); } -#ifndef FEATURE_PORTABLE_ENTRYPOINTS else { -else -{ #ifdef FEATURE_PORTABLE_ENTRYPOINTS pCode = pStub->GetEntryPoint(); pStub->DecRef(); @@ -2407,6 +2391,7 @@ else void* ilStubInterpData = PortableEntryPoint::GetInterpreterData(pCode); _ASSERTE(ilStubInterpData != NULL); SetInterpreterCode((InterpByteCodeStart*)ilStubInterpData); + SetCodeEntryPoint(pCode); #else if (!GetOrCreatePrecode()->SetTargetInterlocked(pStub->GetEntryPoint())) { @@ -2427,13 +2412,12 @@ else // need to free the Stub allocation now. pStub->DecRef(); } - } #endif // !FEATURE_PORTABLE_ENTRYPOINTS + } _ASSERTE(!IsPointingToPrestub()); _ASSERTE(HasStableEntryPoint()); - pCode = DoBackpatch(pMT, pDispatchingMT, FALSE); Return: From 5b7f3425d72df19f1e8411431c30fff1d0eaac41 Mon Sep 17 00:00:00 2001 From: Radek Doulik Date: Fri, 26 Sep 2025 22:26:47 +0200 Subject: [PATCH 10/13] Feedback --- src/coreclr/vm/comdelegate.h | 4 ++++ src/coreclr/vm/wasm/cgencpu.h | 6 ------ 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/coreclr/vm/comdelegate.h b/src/coreclr/vm/comdelegate.h index db3e52f4839a3e..3d33a101b95ba5 100644 --- a/src/coreclr/vm/comdelegate.h +++ b/src/coreclr/vm/comdelegate.h @@ -186,7 +186,11 @@ class ShuffleThunkCache : public StubCacheBase { STANDARD_VM_CONTRACT; +#ifndef FEATURE_PORTABLE_ENTRYPOINTS ((CPUSTUBLINKER*)pstublinker)->EmitShuffleThunk((ShuffleEntry*)pRawStub); +#else + PORTABILITY_ASSERT("Shuffle thunks are not supported with portable entrypoints"); +#endif // !FEATURE_PORTABLE_ENTRYPOINTS return NEWSTUB_FL_SHUFFLE_THUNK; } diff --git a/src/coreclr/vm/wasm/cgencpu.h b/src/coreclr/vm/wasm/cgencpu.h index 0472cd2c2e937e..a11b36cee1625f 100644 --- a/src/coreclr/vm/wasm/cgencpu.h +++ b/src/coreclr/vm/wasm/cgencpu.h @@ -74,12 +74,6 @@ class StubLinkerCPU : public StubLinker { public: static void Init() { /* no-op on wasm */ } - inline void EmitShuffleThunk(struct ShuffleEntry *pShuffleEntryArray) { - _ASSERTE("The EmitShuffleThunk is not implemented on wasm"); - } - inline VOID EmitComputedInstantiatingMethodStub(MethodDesc* pSharedMD, struct ShuffleEntry *pShuffleEntryArray, void* extraArg) { - _ASSERTE("The EmitComputedInstantiatingMethodStub is not implemented on wasm"); - } }; //********************************************************************** From f5483a5da6fa4b99907ac456252b08a978baae2c Mon Sep 17 00:00:00 2001 From: Radek Doulik Date: Fri, 26 Sep 2025 22:31:29 +0200 Subject: [PATCH 11/13] Feedback --- src/coreclr/clrdefinitions.cmake | 4 ---- src/coreclr/inc/switches.h | 4 ++++ 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/coreclr/clrdefinitions.cmake b/src/coreclr/clrdefinitions.cmake index ef4aa816c15af1..b4d311c22b976b 100644 --- a/src/coreclr/clrdefinitions.cmake +++ b/src/coreclr/clrdefinitions.cmake @@ -60,10 +60,6 @@ if(CLR_CMAKE_TARGET_WIN32 AND CLR_CMAKE_TARGET_ARCH_AMD64) add_compile_definitions(OUT_OF_PROCESS_SETTHREADCONTEXT) endif(CLR_CMAKE_TARGET_WIN32 AND CLR_CMAKE_TARGET_ARCH_AMD64) -if(NOT CLR_CMAKE_TARGET_ARCH_I386 AND NOT FEATURE_PORTABLE_ENTRYPOINTS) - add_definitions(-DFEATURE_PORTABLE_SHUFFLE_THUNKS) -endif() - if(CLR_CMAKE_TARGET_UNIX OR NOT CLR_CMAKE_TARGET_ARCH_I386) add_definitions(-DFEATURE_INSTANTIATINGSTUB_AS_IL) endif() diff --git a/src/coreclr/inc/switches.h b/src/coreclr/inc/switches.h index ad9421bb3949ab..3d13af7a1d4be3 100644 --- a/src/coreclr/inc/switches.h +++ b/src/coreclr/inc/switches.h @@ -165,6 +165,10 @@ #define CHAIN_LOOKUP #endif // FEATURE_VIRTUAL_STUB_DISPATCH +#if !defined(FEATURE_PORTABLE_ENTRYPOINTS) && !defined(TARGET_X86) +#define FEATURE_PORTABLE_SHUFFLE_THUNKS +#endif + // If this is uncommented, leaves a file "StubLog_.log" with statistics on the behavior // of stub-based interface dispatch. //#define STUB_LOGGING From 7012a061a7ced24934f000d7de9f2782a7b97fd1 Mon Sep 17 00:00:00 2001 From: Radek Doulik Date: Fri, 26 Sep 2025 22:42:44 +0200 Subject: [PATCH 12/13] Feedback --- src/coreclr/vm/comdelegate.h | 6 ++---- src/coreclr/vm/loaderallocator.cpp | 4 ++++ 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/coreclr/vm/comdelegate.h b/src/coreclr/vm/comdelegate.h index 3d33a101b95ba5..b80e72bae8834c 100644 --- a/src/coreclr/vm/comdelegate.h +++ b/src/coreclr/vm/comdelegate.h @@ -170,6 +170,7 @@ struct ShuffleEntry #include +#ifndef FEATURE_PORTABLE_ENTRYPOINTS class ShuffleThunkCache : public StubCacheBase { public: @@ -186,11 +187,7 @@ class ShuffleThunkCache : public StubCacheBase { STANDARD_VM_CONTRACT; -#ifndef FEATURE_PORTABLE_ENTRYPOINTS ((CPUSTUBLINKER*)pstublinker)->EmitShuffleThunk((ShuffleEntry*)pRawStub); -#else - PORTABILITY_ASSERT("Shuffle thunks are not supported with portable entrypoints"); -#endif // !FEATURE_PORTABLE_ENTRYPOINTS return NEWSTUB_FL_SHUFFLE_THUNK; } @@ -208,5 +205,6 @@ class ShuffleThunkCache : public StubCacheBase return sizeof(ShuffleEntry) * (UINT)(1 + (pse - (ShuffleEntry*)pRawStub)); } }; +#endif // !FEATURE_PORTABLE_ENTRYPOINTS #endif // _COMDELEGATE_H_ diff --git a/src/coreclr/vm/loaderallocator.cpp b/src/coreclr/vm/loaderallocator.cpp index e6a113c62b6334..f33bd9de06e62e 100644 --- a/src/coreclr/vm/loaderallocator.cpp +++ b/src/coreclr/vm/loaderallocator.cpp @@ -1767,6 +1767,7 @@ void AssemblyLoaderAllocator::Init() m_dependentHandleToNativeObjectSetCrst.Init(CrstLeafLock, CRST_UNSAFE_ANYMODE); LoaderAllocator::Init(NULL /*pExecutableHeapMemory*/); +#ifndef FEATURE_PORTABLE_ENTRYPOINTS if (IsCollectible()) { // TODO: the ShuffleThunkCache should really be using the m_pStubHeap, however the unloadability support @@ -1775,6 +1776,7 @@ void AssemblyLoaderAllocator::Init() // https://github.com/dotnet/runtime/issues/55697 tracks this issue. m_pShuffleThunkCache = new ShuffleThunkCache(SystemDomain::GetGlobalLoaderAllocator()->GetExecutableHeap()); } +#endif // !FEATURE_PORTABLE_ENTRYPOINTS } @@ -1786,8 +1788,10 @@ AssemblyLoaderAllocator::~AssemblyLoaderAllocator() m_binderToRelease = NULL; } +#ifndef FEATURE_PORTABLE_ENTRYPOINTS delete m_pShuffleThunkCache; m_pShuffleThunkCache = NULL; +#endif // !FEATURE_PORTABLE_ENTRYPOINTS } void AssemblyLoaderAllocator::RegisterBinder(CustomAssemblyBinder* binderToRelease) From 5e8de556903cce7f4c2274a6ae47d1e7eeedfe44 Mon Sep 17 00:00:00 2001 From: Radek Doulik Date: Fri, 26 Sep 2025 23:00:05 +0200 Subject: [PATCH 13/13] Feedback --- src/coreclr/clrdefinitions.cmake | 4 ---- src/coreclr/inc/switches.h | 4 ++++ 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/coreclr/clrdefinitions.cmake b/src/coreclr/clrdefinitions.cmake index b4d311c22b976b..1b1728ef707cd2 100644 --- a/src/coreclr/clrdefinitions.cmake +++ b/src/coreclr/clrdefinitions.cmake @@ -60,10 +60,6 @@ if(CLR_CMAKE_TARGET_WIN32 AND CLR_CMAKE_TARGET_ARCH_AMD64) add_compile_definitions(OUT_OF_PROCESS_SETTHREADCONTEXT) endif(CLR_CMAKE_TARGET_WIN32 AND CLR_CMAKE_TARGET_ARCH_AMD64) -if(CLR_CMAKE_TARGET_UNIX OR NOT CLR_CMAKE_TARGET_ARCH_I386) - add_definitions(-DFEATURE_INSTANTIATINGSTUB_AS_IL) -endif() - add_compile_definitions(FEATURE_CODE_VERSIONING) add_definitions(-DFEATURE_COLLECTIBLE_TYPES) diff --git a/src/coreclr/inc/switches.h b/src/coreclr/inc/switches.h index 3d13af7a1d4be3..cb258ed46ded3d 100644 --- a/src/coreclr/inc/switches.h +++ b/src/coreclr/inc/switches.h @@ -169,6 +169,10 @@ #define FEATURE_PORTABLE_SHUFFLE_THUNKS #endif +#if defined(TARGET_UNIX) || !defined(TARGET_X86) +#define FEATURE_INSTANTIATINGSTUB_AS_IL +#endif + // If this is uncommented, leaves a file "StubLog_.log" with statistics on the behavior // of stub-based interface dispatch. //#define STUB_LOGGING