Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
9 changes: 9 additions & 0 deletions src/coreclr/clrfeatures.cmake
Original file line number Diff line number Diff line change
@@ -1,3 +1,12 @@
# riscv64 and loongarch64 do not have a separate CID-only asm stub layer yet.
# Forcing FEATURE_DYNAMIC_CODE_COMPILED on keeps the feature matrix consistent with
# the top-level build and avoids unresolved CID/VSD stub symbols at link time.
if (NOT DEFINED FEATURE_DYNAMIC_CODE_COMPILED)
if (CLR_CMAKE_TARGET_ARCH_RISCV64 OR CLR_CMAKE_TARGET_ARCH_LOONGARCH64)
set(FEATURE_DYNAMIC_CODE_COMPILED 1)
endif()
endif()

if (FEATURE_DYNAMIC_CODE_COMPILED)
set(FEATURE_TIERED_COMPILATION 1)
set(FEATURE_REJIT 1)
Expand Down
2 changes: 2 additions & 0 deletions src/coreclr/vm/loongarch64/asmconstants.h
Original file line number Diff line number Diff line change
Expand Up @@ -171,10 +171,12 @@ ASMCONSTANTS_C_ASSERT(SIZEOF__FixupPrecode == sizeof(FixupPrecode));
ASMCONSTANTS_C_ASSERT(MethodDesc_ALIGNMENT_SHIFT == MethodDesc::ALIGNMENT_SHIFT);
ASMCONSTANTS_C_ASSERT((1<<FixupPrecode_ALIGNMENT_SHIFT_1) == sizeof(FixupPrecode));

#ifdef FEATURE_VIRTUAL_STUB_DISPATCH
#define ResolveCacheElem__target 0x10
#define ResolveCacheElem__pNext 0x18
ASMCONSTANTS_C_ASSERT(ResolveCacheElem__target == offsetof(ResolveCacheElem, target));
ASMCONSTANTS_C_ASSERT(ResolveCacheElem__pNext == offsetof(ResolveCacheElem, pNext));
#endif // FEATURE_VIRTUAL_STUB_DISPATCH

#define OFFSETOF__DynamicStaticsInfo__m_pMethodTable 0x10
ASMCONSTANTS_C_ASSERT(OFFSETOF__DynamicStaticsInfo__m_pMethodTable
Expand Down
2 changes: 2 additions & 0 deletions src/coreclr/vm/loongarch64/asmhelpers.S
Original file line number Diff line number Diff line change
Expand Up @@ -530,6 +530,7 @@ NESTED_END TheUMEntryPrestub, _TEXT

GenerateRedirectedStubWithFrame RedirectForThreadAbort, ThrowControlForThread

#ifdef FEATURE_VIRTUAL_STUB_DISPATCH
// ------------------------------------------------------------------
// ResolveWorkerChainLookupAsmStub
//
Expand Down Expand Up @@ -618,6 +619,7 @@ NESTED_ENTRY ResolveWorkerAsmStub, _TEXT, NoHandler

EPILOG_BRANCH_REG $t4
NESTED_END ResolveWorkerAsmStub, _TEXT
#endif // FEATURE_VIRTUAL_STUB_DISPATCH

#ifdef FEATURE_HIJACK
// ------------------------------------------------------------------
Expand Down
49 changes: 35 additions & 14 deletions src/coreclr/vm/loongarch64/stubs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -631,26 +631,44 @@ AdjustContextForVirtualStub(

PCODE f_IP = GetIP(pContext);

StubCodeBlockKind sk = RangeSectionStubManager::GetStubKind(f_IP);

if (sk == STUB_CODE_BLOCK_VSD_DISPATCH_STUB)
bool isVirtualStubNullCheck = false;
#ifdef FEATURE_CACHED_INTERFACE_DISPATCH
if (VirtualCallStubManager::isCachedInterfaceDispatchStubAVLocation(f_IP))
{
if (*PTR_DWORD(f_IP - 4) != DISPATCH_STUB_FIRST_DWORD)
{
_ASSERTE(!"AV in DispatchStub at unknown instruction");
return FALSE;
}
isVirtualStubNullCheck = true;
}
else
if (sk == STUB_CODE_BLOCK_VSD_RESOLVE_STUB)
#endif // FEATURE_CACHED_INTERFACE_DISPATCH
#ifdef FEATURE_VIRTUAL_STUB_DISPATCH
if (!isVirtualStubNullCheck)
{
if (*PTR_DWORD(f_IP) != RESOLVE_STUB_FIRST_DWORD)
StubCodeBlockKind sk = RangeSectionStubManager::GetStubKind(f_IP);

if (sk == STUB_CODE_BLOCK_VSD_DISPATCH_STUB)
{
if (*PTR_DWORD(f_IP - 4) != DISPATCH_STUB_FIRST_DWORD)
{
_ASSERTE(!"AV in DispatchStub at unknown instruction");
}
else
{
isVirtualStubNullCheck = true;
}
}
else if (sk == STUB_CODE_BLOCK_VSD_RESOLVE_STUB)
{
_ASSERTE(!"AV in ResolveStub at unknown instruction");
return FALSE;
if (*PTR_DWORD(f_IP) != RESOLVE_STUB_FIRST_DWORD)
{
_ASSERTE(!"AV in ResolveStub at unknown instruction");
}
else
{
isVirtualStubNullCheck = true;
}
}
}
else
#endif // FEATURE_VIRTUAL_STUB_DISPATCH

if (!isVirtualStubNullCheck)
{
return FALSE;
}
Expand Down Expand Up @@ -972,6 +990,8 @@ void StubLinkerCPU::EmitCallManagedMethod(MethodDesc *pMD, BOOL fTailCall)
// Allocation of dynamic helpers
//

#ifndef FEATURE_STUBPRECODE_DYNAMIC_HELPERS

#define DYNAMIC_HELPER_ALIGNMENT sizeof(TADDR)

#define BEGIN_DYNAMIC_HELPER_EMIT_WORKER(size) \
Expand Down Expand Up @@ -1456,6 +1476,7 @@ PCODE DynamicHelpers::CreateDictionaryLookupHelper(LoaderAllocator * pAllocator,
END_DYNAMIC_HELPER_EMIT();
}
}
#endif // FEATURE_STUBPRECODE_DYNAMIC_HELPERS
#endif // FEATURE_READYTORUN

#endif // #ifndef DACCESS_COMPILE
2 changes: 2 additions & 0 deletions src/coreclr/vm/riscv64/asmconstants.h
Original file line number Diff line number Diff line change
Expand Up @@ -169,10 +169,12 @@ ASMCONSTANTS_C_ASSERT(FaultingExceptionFrame__m_fFilterExecuted == offsetof(Faul
ASMCONSTANTS_C_ASSERT(SIZEOF__FixupPrecode == sizeof(FixupPrecode));
ASMCONSTANTS_C_ASSERT(MethodDesc_ALIGNMENT_SHIFT == MethodDesc::ALIGNMENT_SHIFT);

#ifdef FEATURE_VIRTUAL_STUB_DISPATCH
#define ResolveCacheElem__target 0x10
#define ResolveCacheElem__pNext 0x18
ASMCONSTANTS_C_ASSERT(ResolveCacheElem__target == offsetof(ResolveCacheElem, target));
ASMCONSTANTS_C_ASSERT(ResolveCacheElem__pNext == offsetof(ResolveCacheElem, pNext));
#endif // FEATURE_VIRTUAL_STUB_DISPATCH

#define OFFSETOF__DynamicStaticsInfo__m_pMethodTable 0x10
ASMCONSTANTS_C_ASSERT(OFFSETOF__DynamicStaticsInfo__m_pMethodTable
Expand Down
2 changes: 2 additions & 0 deletions src/coreclr/vm/riscv64/asmhelpers.S
Original file line number Diff line number Diff line change
Expand Up @@ -409,6 +409,7 @@ NESTED_END TheUMEntryPrestub, _TEXT

GenerateRedirectedStubWithFrame RedirectForThreadAbort, ThrowControlForThread

#ifdef FEATURE_VIRTUAL_STUB_DISPATCH
// ------------------------------------------------------------------
// ResolveWorkerChainLookupAsmStub
//
Expand Down Expand Up @@ -496,6 +497,7 @@ NESTED_ENTRY ResolveWorkerAsmStub, _TEXT, NoHandler

EPILOG_BRANCH_REG t4
NESTED_END ResolveWorkerAsmStub, _TEXT
#endif // FEATURE_VIRTUAL_STUB_DISPATCH

#ifdef FEATURE_HIJACK
// ------------------------------------------------------------------
Expand Down
49 changes: 35 additions & 14 deletions src/coreclr/vm/riscv64/stubs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -579,26 +579,44 @@ AdjustContextForVirtualStub(

PCODE f_IP = GetIP(pContext);

StubCodeBlockKind sk = RangeSectionStubManager::GetStubKind(f_IP);

if (sk == STUB_CODE_BLOCK_VSD_DISPATCH_STUB)
bool isVirtualStubNullCheck = false;
#ifdef FEATURE_CACHED_INTERFACE_DISPATCH
if (VirtualCallStubManager::isCachedInterfaceDispatchStubAVLocation(f_IP))
{
if (*PTR_DWORD(f_IP - 4) != DISPATCH_STUB_FIRST_DWORD)
{
_ASSERTE(!"AV in DispatchStub at unknown instruction");
return FALSE;
}
isVirtualStubNullCheck = true;
}
else
if (sk == STUB_CODE_BLOCK_VSD_RESOLVE_STUB)
#endif // FEATURE_CACHED_INTERFACE_DISPATCH
#ifdef FEATURE_VIRTUAL_STUB_DISPATCH
if (!isVirtualStubNullCheck)
{
if (*PTR_DWORD(f_IP) != RESOLVE_STUB_FIRST_DWORD)
StubCodeBlockKind sk = RangeSectionStubManager::GetStubKind(f_IP);

if (sk == STUB_CODE_BLOCK_VSD_DISPATCH_STUB)
{
if (*PTR_DWORD(f_IP - 4) != DISPATCH_STUB_FIRST_DWORD)
{
_ASSERTE(!"AV in DispatchStub at unknown instruction");
}
else
{
isVirtualStubNullCheck = true;
}
}
else if (sk == STUB_CODE_BLOCK_VSD_RESOLVE_STUB)
{
_ASSERTE(!"AV in ResolveStub at unknown instruction");
return FALSE;
if (*PTR_DWORD(f_IP) != RESOLVE_STUB_FIRST_DWORD)
{
_ASSERTE(!"AV in ResolveStub at unknown instruction");
}
else
{
isVirtualStubNullCheck = true;
}
}
}
else
#endif // FEATURE_VIRTUAL_STUB_DISPATCH

if (!isVirtualStubNullCheck)
{
return FALSE;
}
Expand Down Expand Up @@ -1007,6 +1025,8 @@ void StubLinkerCPU::EmitCallManagedMethod(MethodDesc *pMD, BOOL fTailCall)
//
// Allocation of dynamic helpers
//
#ifndef FEATURE_STUBPRECODE_DYNAMIC_HELPERS

#define DYNAMIC_HELPER_ALIGNMENT sizeof(TADDR)

#define BEGIN_DYNAMIC_HELPER_EMIT_WORKER(size) \
Expand Down Expand Up @@ -1494,6 +1514,7 @@ PCODE DynamicHelpers::CreateDictionaryLookupHelper(LoaderAllocator * pAllocator,
END_DYNAMIC_HELPER_EMIT();
}
}
#endif // FEATURE_STUBPRECODE_DYNAMIC_HELPERS
#endif // FEATURE_READYTORUN


Expand Down
2 changes: 2 additions & 0 deletions src/coreclr/vm/riscv64/thunktemplates.S
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ LEAF_ENTRY FixupPrecodeCode
jr t1
LEAF_END_MARKED FixupPrecodeCode

#ifdef FEATURE_TIERED_COMPILATION
LEAF_ENTRY CallCountingStubCode
auipc t2, 0x4
ld t3, (CallCountingStubData__RemainingCallCountCell)(t2)
Expand All @@ -36,3 +37,4 @@ LOCAL_LABEL(CountReachedZero):
ld t1, (CallCountingStubData__TargetForThresholdReached)(t2)
jr t1
LEAF_END_MARKED CallCountingStubCode
#endif // FEATURE_TIERED_COMPILATION
Loading