Skip to content

Commit

Permalink
Fix build on non-x64 platforms and add FP nonvol regs
Browse files Browse the repository at this point in the history
  • Loading branch information
janvorli committed Mar 25, 2024
1 parent 1ccb05f commit d7b63b5
Show file tree
Hide file tree
Showing 8 changed files with 126 additions and 10 deletions.
1 change: 1 addition & 0 deletions src/coreclr/inc/regdisp.h
Original file line number Diff line number Diff line change
Expand Up @@ -426,6 +426,7 @@ inline void FillContextPointers(PT_KNONVOLATILE_CONTEXT_POINTERS pCtxPtrs, PT_CO
{
*(&pCtxPtrs->R4 + i) = (&pCtx->R4 + i);
}
*(&pCtxPtrs->Lr) = &pCtx->Lr;
#elif defined(TARGET_X86) // TARGET_ARM
for (int i = 0; i < 7; i++)
{
Expand Down
15 changes: 15 additions & 0 deletions src/coreclr/vm/amd64/cgencpu.h
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,9 @@ struct REGDISPLAY;

#define NUM_CALLEE_SAVED_REGISTERS 6

// No floating point callee saved registers on Unix AMD64
#define ENUM_FP_CALLEE_SAVED_REGISTERS()

#else // UNIX_AMD64_ABI

#define ENUM_ARGUMENT_REGISTERS() \
Expand All @@ -212,6 +215,18 @@ struct REGDISPLAY;

#define NUM_CALLEE_SAVED_REGISTERS 8

#define ENUM_FP_CALLEE_SAVED_REGISTERS() \
CALLEE_SAVED_REGISTER(Xmm6) \
CALLEE_SAVED_REGISTER(Xmm7) \
CALLEE_SAVED_REGISTER(Xmm8) \
CALLEE_SAVED_REGISTER(Xmm9) \
CALLEE_SAVED_REGISTER(Xmm10) \
CALLEE_SAVED_REGISTER(Xmm11) \
CALLEE_SAVED_REGISTER(Xmm12) \
CALLEE_SAVED_REGISTER(Xmm13) \
CALLEE_SAVED_REGISTER(Xmm14) \
CALLEE_SAVED_REGISTER(Xmm15)

#endif // UNIX_AMD64_ABI

typedef DPTR(struct ArgumentRegisters) PTR_ArgumentRegisters;
Expand Down
21 changes: 21 additions & 0 deletions src/coreclr/vm/arm/cgencpu.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,27 @@
#define RESOLVE_STUB_THIRD_WORD 0xb460
#define LOOKUP_STUB_FIRST_WORD 0xf8df

#define ENUM_CALLEE_SAVED_REGISTERS() \
CALLEE_SAVED_REGISTER(R4) \
CALLEE_SAVED_REGISTER(R5) \
CALLEE_SAVED_REGISTER(R6) \
CALLEE_SAVED_REGISTER(R7) \
CALLEE_SAVED_REGISTER(R8) \
CALLEE_SAVED_REGISTER(R9) \
CALLEE_SAVED_REGISTER(R10) \
CALLEE_SAVED_REGISTER(R11) \
CALLEE_SAVED_REGISTER(Lr)

#define ENUM_FP_CALLEE_SAVED_REGISTERS() \
CALLEE_SAVED_REGISTER(D8) \
CALLEE_SAVED_REGISTER(D9) \
CALLEE_SAVED_REGISTER(D10) \
CALLEE_SAVED_REGISTER(D11) \
CALLEE_SAVED_REGISTER(D12) \
CALLEE_SAVED_REGISTER(D13) \
CALLEE_SAVED_REGISTER(D14) \
CALLEE_SAVED_REGISTER(D15)

class MethodDesc;
class FramedMethodFrame;
class Module;
Expand Down
24 changes: 24 additions & 0 deletions src/coreclr/vm/arm64/cgencpu.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,30 @@
#define USE_REDIRECT_FOR_GCSTRESS
#endif // TARGET_UNIX

#define ENUM_CALLEE_SAVED_REGISTERS() \
CALLEE_SAVED_REGISTER(Fp) \
CALLEE_SAVED_REGISTER(Lr) \
CALLEE_SAVED_REGISTER(X29) \
CALLEE_SAVED_REGISTER(X30) \
CALLEE_SAVED_REGISTER(X19) \
CALLEE_SAVED_REGISTER(X20) \
CALLEE_SAVED_REGISTER(X21) \
CALLEE_SAVED_REGISTER(X22) \
CALLEE_SAVED_REGISTER(X23) \
CALLEE_SAVED_REGISTER(X24) \
CALLEE_SAVED_REGISTER(X25) \
CALLEE_SAVED_REGISTER(X26)

#define ENUM_FP_CALLEE_SAVED_REGISTERS() \
CALLEE_SAVED_REGISTER(D8) \
CALLEE_SAVED_REGISTER(D9) \
CALLEE_SAVED_REGISTER(D10) \
CALLEE_SAVED_REGISTER(D11) \
CALLEE_SAVED_REGISTER(D12) \
CALLEE_SAVED_REGISTER(D13) \
CALLEE_SAVED_REGISTER(D14) \
CALLEE_SAVED_REGISTER(D15)

EXTERN_C void getFPReturn(int fpSize, INT64 *pRetVal);
EXTERN_C void setFPReturn(int fpSize, INT64 retVal);

Expand Down
24 changes: 24 additions & 0 deletions src/coreclr/vm/loongarch64/cgencpu.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,30 @@
#define USE_REDIRECT_FOR_GCSTRESS
#endif // TARGET_UNIX

#define ENUM_CALLEE_SAVED_REGISTERS() \
CALLEE_SAVED_REGISTER(Fp) \
CALLEE_SAVED_REGISTER(Ra) \
CALLEE_SAVED_REGISTER(S0) \
CALLEE_SAVED_REGISTER(S1) \
CALLEE_SAVED_REGISTER(S2) \
CALLEE_SAVED_REGISTER(S3) \
CALLEE_SAVED_REGISTER(S4) \
CALLEE_SAVED_REGISTER(S5) \
CALLEE_SAVED_REGISTER(S6) \
CALLEE_SAVED_REGISTER(S7) \
CALLEE_SAVED_REGISTER(S8) \
CALLEE_SAVED_REGISTER(Tp)

#define ENUM_FP_CALLEE_SAVED_REGISTERS() \
CALLEE_SAVED_REGISTER(F24) \
CALLEE_SAVED_REGISTER(F25) \
CALLEE_SAVED_REGISTER(F26) \
CALLEE_SAVED_REGISTER(F27) \
CALLEE_SAVED_REGISTER(F28) \
CALLEE_SAVED_REGISTER(F29) \
CALLEE_SAVED_REGISTER(F30) \
CALLEE_SAVED_REGISTER(F31)

EXTERN_C void getFPReturn(int fpSize, INT64 *pRetVal);
EXTERN_C void setFPReturn(int fpSize, INT64 retVal);

Expand Down
31 changes: 31 additions & 0 deletions src/coreclr/vm/riscv64/cgencpu.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,37 @@
#define USE_REDIRECT_FOR_GCSTRESS
#endif // TARGET_UNIX

#define ENUM_CALLEE_SAVED_REGISTERS() \
CALLEE_SAVED_REGISTER(Fp) \
CALLEE_SAVED_REGISTER(Ra) \
CALLEE_SAVED_REGISTER(S1) \
CALLEE_SAVED_REGISTER(S2) \
CALLEE_SAVED_REGISTER(S3) \
CALLEE_SAVED_REGISTER(S4) \
CALLEE_SAVED_REGISTER(S5) \
CALLEE_SAVED_REGISTER(S6) \
CALLEE_SAVED_REGISTER(S7) \
CALLEE_SAVED_REGISTER(S8) \
CALLEE_SAVED_REGISTER(S9) \
CALLEE_SAVED_REGISTER(S10) \
CALLEE_SAVED_REGISTER(S11) \
CALLEE_SAVED_REGISTER(Tp) \
CALLEE_SAVED_REGISTER(Gp)

#define ENUM_FP_CALLEE_SAVED_REGISTERS() \
CALLEE_SAVED_REGISTER(F8) \
CALLEE_SAVED_REGISTER(F9) \
CALLEE_SAVED_REGISTER(F18) \
CALLEE_SAVED_REGISTER(F19) \
CALLEE_SAVED_REGISTER(F20) \
CALLEE_SAVED_REGISTER(F21) \
CALLEE_SAVED_REGISTER(F22) \
CALLEE_SAVED_REGISTER(F23) \
CALLEE_SAVED_REGISTER(F24) \
CALLEE_SAVED_REGISTER(F25) \
CALLEE_SAVED_REGISTER(F26) \
CALLEE_SAVED_REGISTER(F27)

EXTERN_C void getFPReturn(int fpSize, INT64 *pRetVal);
EXTERN_C void setFPReturn(int fpSize, INT64 retVal);

Expand Down
18 changes: 8 additions & 10 deletions src/coreclr/vm/stackwalk.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1547,6 +1547,7 @@ BOOL StackFrameIterator::IsValid(void)
} // StackFrameIterator::IsValid()

#ifndef DACCESS_COMPILE
#ifdef FEATURE_EH_FUNCLETS
//---------------------------------------------------------------------------------------
//
// Advance to the position that the other iterator is currently at.
Expand Down Expand Up @@ -1580,31 +1581,28 @@ void StackFrameIterator::SkipTo(StackFrameIterator *pOtherStackFrameIterator)
*pRD->pCurrentContextPointers = *pOtherRD->pCurrentContextPointers;
SetIP(pRD->pCurrentContext, GetIP(pOtherRD->pCurrentContext));
SetSP(pRD->pCurrentContext, GetSP(pOtherRD->pCurrentContext));
#if defined(TARGET_ARM) || defined(TARGET_ARM64)
SetLR(pRD->pCurrentContext, GetLR(pOtherRD->pCurrentContext));
#elif defined(TARGET_RISCV64) || defined(TARGET_LOONGARCH64)
SetRA(pRD->pCurrentContext, GetRA(pOtherRD->pCurrentContext));
#endif // TARGET_ARM || TARGET_ARM64
#define CALLEE_SAVED_REGISTER(regname) pRD->pCurrentContext->regname = *pRD->pCurrentContextPointers->regname;
ENUM_CALLEE_SAVED_REGISTERS();
#undef CALLEE_SAVED_REGISTER
#define CALLEE_SAVED_REGISTER(regname) pRD->pCurrentContext->regname = pRD->pCurrentContext->regname;
ENUM_FP_CALLEE_SAVED_REGISTERS();
#undef CALLEE_SAVED_REGISTER
pRD->IsCallerContextValid = pOtherRD->IsCallerContextValid;
if (pRD->IsCallerContextValid)
{
*pRD->pCallerContextPointers = *pOtherRD->pCallerContextPointers;
SetIP(pRD->pCallerContext, GetIP(pOtherRD->pCallerContext));
SetSP(pRD->pCallerContext, GetSP(pOtherRD->pCallerContext));
#if defined(TARGET_ARM) || defined(TARGET_ARM64)
SetLR(pRD->pCallerContext, GetLR(pOtherRD->pCallerContext));
#elif defined(TARGET_RISCV64) || defined(TARGET_LOONGARCH64)
SetRA(pRD->pCallerContext, GetRA(pOtherRD->pCallerContext));
#endif // TARGET_ARM || TARGET_ARM64
#define CALLEE_SAVED_REGISTER(regname) pRD->pCallerContext->regname = *pRD->pCallerContextPointers->regname;
ENUM_CALLEE_SAVED_REGISTERS();
#undef CALLEE_SAVED_REGISTER
#define CALLEE_SAVED_REGISTER(regname) pRD->pCallerContext->regname = pRD->pCallerContext->regname;
ENUM_FP_CALLEE_SAVED_REGISTERS();
#undef CALLEE_SAVED_REGISTER
}
SyncRegDisplayToCurrentContext(pRD);
}
#endif // FEATURE_EH_FUNCLETS
#endif // DACCESS_COMPILE

//---------------------------------------------------------------------------------------
Expand Down
2 changes: 2 additions & 0 deletions src/coreclr/vm/stackwalk.h
Original file line number Diff line number Diff line change
Expand Up @@ -600,8 +600,10 @@ class StackFrameIterator
StackWalkAction Next(void);

#ifndef DACCESS_COMPILE
#ifdef FEATURE_EH_FUNCLETS
// advance to the position that the other iterator is currently at
void SkipTo(StackFrameIterator *pOtherStackFrameIterator);
#endif // FEATURE_EH_FUNCLETS
#endif // DACCESS_COMPILE

#ifdef FEATURE_EH_FUNCLETS
Expand Down

0 comments on commit d7b63b5

Please sign in to comment.