Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/coreclr/clrdefinitions.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -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 FEATURE_PORTABLE_ENTRYPOINTS)
add_definitions(-DFEATURE_PORTABLE_SHUFFLE_THUNKS)
endif()

Expand Down
2 changes: 2 additions & 0 deletions src/coreclr/vm/comdelegate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -727,6 +727,8 @@ BOOL GenerateShuffleArray(MethodDesc* pInvoke, MethodDesc *pTargetMeth, SArray<S
entry.stacksizedelta = static_cast<UINT16>(stackSizeDelta);
pShuffleEntryArray->Append(entry);

#elif defined (TARGET_WASM)
PORTABILITY_ASSERT("GenerateShuffleArray not implemented for WebAssembly");
#else
#error Unsupported architecture
#endif
Expand Down
35 changes: 26 additions & 9 deletions src/coreclr/vm/prestub.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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*)
Expand Down Expand Up @@ -1510,13 +1510,16 @@ 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())
Expand Down Expand Up @@ -1727,13 +1730,16 @@ Stub * MakeUnboxingStubWorker(MethodDesc *pMD)
else
#endif
{
#ifdef FEATURE_PORTABLE_ENTRYPOINTS
pstub = CreateUnboxingILStubForValueTypeMethods(pUnboxedMD);
#else // !FEATURE_PORTABLE_ENTRYPOINTS
#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
Expand All @@ -1746,6 +1752,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;
}
Expand Down Expand Up @@ -2261,6 +2268,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 // FEATURE_PORTABLE_ENTRYPOINTS
}
#if defined(FEATURE_SHARE_GENERIC_CODE)
else if (IsInstantiatingStub())
Expand Down
Loading