From 319455ae00b98928484de9c623f7248acbd87b4e Mon Sep 17 00:00:00 2001 From: David Wrighton Date: Wed, 17 Dec 2025 15:37:32 -0800 Subject: [PATCH 1/3] [clr-interp] Enable rejit in the interpreter - Rely on resetting the interpreter code pointer to trigger the existing rejit/prestub logic to fill in any gaps we have. --- src/coreclr/vm/codeversion.cpp | 6 +++++- src/coreclr/vm/method.cpp | 8 ++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/coreclr/vm/codeversion.cpp b/src/coreclr/vm/codeversion.cpp index d880cd3e5290f4..c497e2d9818116 100644 --- a/src/coreclr/vm/codeversion.cpp +++ b/src/coreclr/vm/codeversion.cpp @@ -1980,7 +1980,11 @@ HRESULT CodeVersionManager::PublishNativeCodeVersion(MethodDesc* pMethod, Native pMethod, nativeCodeVersion.GetVersionId())); - #ifdef FEATURE_TIERED_COMPILATION +#ifdef FEATURE_INTERPRETER + // When we hit the Precode that should fixup any issues with an unset interpreter code pointer. This is notably most important in ReJIT scenarios + pMethod->ClearInterpreterCodePointer(); +#endif +#ifdef FEATURE_TIERED_COMPILATION bool wasSet = CallCountingManager::SetCodeEntryPoint(nativeCodeVersion, pCode, false, nullptr); _ASSERTE(wasSet); #else diff --git a/src/coreclr/vm/method.cpp b/src/coreclr/vm/method.cpp index 0fe5e1a7a5817a..98b4cb9caaa8e1 100644 --- a/src/coreclr/vm/method.cpp +++ b/src/coreclr/vm/method.cpp @@ -3233,6 +3233,10 @@ void MethodDesc::ResetCodeEntryPoint() WRAPPER_NO_CONTRACT; _ASSERTE(IsVersionable()); +#ifdef FEATURE_INTERPRETER + ClearInterpreterCodePointer(); +#endif + if (MayHaveEntryPointSlotsToBackpatch()) { BackpatchToResetEntryPointSlots(); @@ -3265,6 +3269,10 @@ void MethodDesc::ResetCodeEntryPointForEnC() return; } +#ifdef FEATURE_INTERPRETER + ClearInterpreterCodePointer(); +#endif + LOG((LF_ENC, LL_INFO100000, "MD::RCEPFENC: this:%p - %s::%s\n", this, m_pszDebugClassName, m_pszDebugMethodName)); #ifndef FEATURE_PORTABLE_ENTRYPOINTS LOG((LF_ENC, LL_INFO100000, "MD::RCEPFENC: HasPrecode():%s, HasNativeCodeSlot():%s\n", From 7c2c90f5ed67c27c20452c2312faa6760d9cf955 Mon Sep 17 00:00:00 2001 From: David Wrighton Date: Wed, 17 Dec 2025 15:38:35 -0800 Subject: [PATCH 2/3] Adjust spacing to match existing logic --- src/coreclr/vm/codeversion.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/coreclr/vm/codeversion.cpp b/src/coreclr/vm/codeversion.cpp index c497e2d9818116..07461028001d4b 100644 --- a/src/coreclr/vm/codeversion.cpp +++ b/src/coreclr/vm/codeversion.cpp @@ -1980,11 +1980,11 @@ HRESULT CodeVersionManager::PublishNativeCodeVersion(MethodDesc* pMethod, Native pMethod, nativeCodeVersion.GetVersionId())); -#ifdef FEATURE_INTERPRETER + #ifdef FEATURE_INTERPRETER // When we hit the Precode that should fixup any issues with an unset interpreter code pointer. This is notably most important in ReJIT scenarios pMethod->ClearInterpreterCodePointer(); -#endif -#ifdef FEATURE_TIERED_COMPILATION + #endif + #ifdef FEATURE_TIERED_COMPILATION bool wasSet = CallCountingManager::SetCodeEntryPoint(nativeCodeVersion, pCode, false, nullptr); _ASSERTE(wasSet); #else From 215042f72cbe066b1201470c0411f1a3448fc6b7 Mon Sep 17 00:00:00 2001 From: David Wrighton Date: Thu, 18 Dec 2025 13:13:58 -0800 Subject: [PATCH 3/3] Apply suggestions from code review Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/coreclr/vm/codeversion.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/coreclr/vm/codeversion.cpp b/src/coreclr/vm/codeversion.cpp index 07461028001d4b..d8ce701e499898 100644 --- a/src/coreclr/vm/codeversion.cpp +++ b/src/coreclr/vm/codeversion.cpp @@ -1980,11 +1980,11 @@ HRESULT CodeVersionManager::PublishNativeCodeVersion(MethodDesc* pMethod, Native pMethod, nativeCodeVersion.GetVersionId())); - #ifdef FEATURE_INTERPRETER +#ifdef FEATURE_INTERPRETER // When we hit the Precode that should fixup any issues with an unset interpreter code pointer. This is notably most important in ReJIT scenarios pMethod->ClearInterpreterCodePointer(); - #endif - #ifdef FEATURE_TIERED_COMPILATION +#endif +#ifdef FEATURE_TIERED_COMPILATION bool wasSet = CallCountingManager::SetCodeEntryPoint(nativeCodeVersion, pCode, false, nullptr); _ASSERTE(wasSet); #else