summaryrefslogtreecommitdiff
path: root/src/vm/amd64/cgenamd64.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/vm/amd64/cgenamd64.cpp')
-rw-r--r--src/vm/amd64/cgenamd64.cpp18
1 files changed, 14 insertions, 4 deletions
diff --git a/src/vm/amd64/cgenamd64.cpp b/src/vm/amd64/cgenamd64.cpp
index 25e0ba4aaa..79f05d24cd 100644
--- a/src/vm/amd64/cgenamd64.cpp
+++ b/src/vm/amd64/cgenamd64.cpp
@@ -880,10 +880,20 @@ EXTERN_C PCODE VirtualMethodFixupWorker(TransitionBlock * pTransitionBlock, CORC
INSTALL_MANAGED_EXCEPTION_DISPATCHER;
INSTALL_UNWIND_AND_CONTINUE_HANDLER_NO_PROBE;
- // Skip fixup precode jump for better perf
- PCODE pDirectTarget = Precode::TryToSkipFixupPrecode(pCode);
- if (pDirectTarget != NULL)
- pCode = pDirectTarget;
+ if (pMD->IsVersionableWithVtableSlotBackpatch())
+ {
+ // The entry point for this method needs to be versionable, so use a FuncPtrStub similarly to what is done in
+ // MethodDesc::GetMultiCallableAddrOfCode()
+ GCX_COOP();
+ pCode = pMD->GetLoaderAllocator()->GetFuncPtrStubs()->GetFuncPtrStub(pMD);
+ }
+ else
+ {
+ // Skip fixup precode jump for better perf
+ PCODE pDirectTarget = Precode::TryToSkipFixupPrecode(pCode);
+ if (pDirectTarget != NULL)
+ pCode = pDirectTarget;
+ }
INT64 oldValue = *(INT64*)pThunk;
BYTE* pOldValue = (BYTE*)&oldValue;