Skip to content

Commit d7b63b5

Browse files
committed
Fix build on non-x64 platforms and add FP nonvol regs
1 parent 1ccb05f commit d7b63b5

8 files changed

Lines changed: 126 additions & 10 deletions

File tree

src/coreclr/inc/regdisp.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -426,6 +426,7 @@ inline void FillContextPointers(PT_KNONVOLATILE_CONTEXT_POINTERS pCtxPtrs, PT_CO
426426
{
427427
*(&pCtxPtrs->R4 + i) = (&pCtx->R4 + i);
428428
}
429+
*(&pCtxPtrs->Lr) = &pCtx->Lr;
429430
#elif defined(TARGET_X86) // TARGET_ARM
430431
for (int i = 0; i < 7; i++)
431432
{

src/coreclr/vm/amd64/cgencpu.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,9 @@ struct REGDISPLAY;
188188

189189
#define NUM_CALLEE_SAVED_REGISTERS 6
190190

191+
// No floating point callee saved registers on Unix AMD64
192+
#define ENUM_FP_CALLEE_SAVED_REGISTERS()
193+
191194
#else // UNIX_AMD64_ABI
192195

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

213216
#define NUM_CALLEE_SAVED_REGISTERS 8
214217

218+
#define ENUM_FP_CALLEE_SAVED_REGISTERS() \
219+
CALLEE_SAVED_REGISTER(Xmm6) \
220+
CALLEE_SAVED_REGISTER(Xmm7) \
221+
CALLEE_SAVED_REGISTER(Xmm8) \
222+
CALLEE_SAVED_REGISTER(Xmm9) \
223+
CALLEE_SAVED_REGISTER(Xmm10) \
224+
CALLEE_SAVED_REGISTER(Xmm11) \
225+
CALLEE_SAVED_REGISTER(Xmm12) \
226+
CALLEE_SAVED_REGISTER(Xmm13) \
227+
CALLEE_SAVED_REGISTER(Xmm14) \
228+
CALLEE_SAVED_REGISTER(Xmm15)
229+
215230
#endif // UNIX_AMD64_ABI
216231

217232
typedef DPTR(struct ArgumentRegisters) PTR_ArgumentRegisters;

src/coreclr/vm/arm/cgencpu.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,27 @@
2121
#define RESOLVE_STUB_THIRD_WORD 0xb460
2222
#define LOOKUP_STUB_FIRST_WORD 0xf8df
2323

24+
#define ENUM_CALLEE_SAVED_REGISTERS() \
25+
CALLEE_SAVED_REGISTER(R4) \
26+
CALLEE_SAVED_REGISTER(R5) \
27+
CALLEE_SAVED_REGISTER(R6) \
28+
CALLEE_SAVED_REGISTER(R7) \
29+
CALLEE_SAVED_REGISTER(R8) \
30+
CALLEE_SAVED_REGISTER(R9) \
31+
CALLEE_SAVED_REGISTER(R10) \
32+
CALLEE_SAVED_REGISTER(R11) \
33+
CALLEE_SAVED_REGISTER(Lr)
34+
35+
#define ENUM_FP_CALLEE_SAVED_REGISTERS() \
36+
CALLEE_SAVED_REGISTER(D8) \
37+
CALLEE_SAVED_REGISTER(D9) \
38+
CALLEE_SAVED_REGISTER(D10) \
39+
CALLEE_SAVED_REGISTER(D11) \
40+
CALLEE_SAVED_REGISTER(D12) \
41+
CALLEE_SAVED_REGISTER(D13) \
42+
CALLEE_SAVED_REGISTER(D14) \
43+
CALLEE_SAVED_REGISTER(D15)
44+
2445
class MethodDesc;
2546
class FramedMethodFrame;
2647
class Module;

src/coreclr/vm/arm64/cgencpu.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,30 @@
1717
#define USE_REDIRECT_FOR_GCSTRESS
1818
#endif // TARGET_UNIX
1919

20+
#define ENUM_CALLEE_SAVED_REGISTERS() \
21+
CALLEE_SAVED_REGISTER(Fp) \
22+
CALLEE_SAVED_REGISTER(Lr) \
23+
CALLEE_SAVED_REGISTER(X29) \
24+
CALLEE_SAVED_REGISTER(X30) \
25+
CALLEE_SAVED_REGISTER(X19) \
26+
CALLEE_SAVED_REGISTER(X20) \
27+
CALLEE_SAVED_REGISTER(X21) \
28+
CALLEE_SAVED_REGISTER(X22) \
29+
CALLEE_SAVED_REGISTER(X23) \
30+
CALLEE_SAVED_REGISTER(X24) \
31+
CALLEE_SAVED_REGISTER(X25) \
32+
CALLEE_SAVED_REGISTER(X26)
33+
34+
#define ENUM_FP_CALLEE_SAVED_REGISTERS() \
35+
CALLEE_SAVED_REGISTER(D8) \
36+
CALLEE_SAVED_REGISTER(D9) \
37+
CALLEE_SAVED_REGISTER(D10) \
38+
CALLEE_SAVED_REGISTER(D11) \
39+
CALLEE_SAVED_REGISTER(D12) \
40+
CALLEE_SAVED_REGISTER(D13) \
41+
CALLEE_SAVED_REGISTER(D14) \
42+
CALLEE_SAVED_REGISTER(D15)
43+
2044
EXTERN_C void getFPReturn(int fpSize, INT64 *pRetVal);
2145
EXTERN_C void setFPReturn(int fpSize, INT64 retVal);
2246

src/coreclr/vm/loongarch64/cgencpu.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,30 @@
1515
#define USE_REDIRECT_FOR_GCSTRESS
1616
#endif // TARGET_UNIX
1717

18+
#define ENUM_CALLEE_SAVED_REGISTERS() \
19+
CALLEE_SAVED_REGISTER(Fp) \
20+
CALLEE_SAVED_REGISTER(Ra) \
21+
CALLEE_SAVED_REGISTER(S0) \
22+
CALLEE_SAVED_REGISTER(S1) \
23+
CALLEE_SAVED_REGISTER(S2) \
24+
CALLEE_SAVED_REGISTER(S3) \
25+
CALLEE_SAVED_REGISTER(S4) \
26+
CALLEE_SAVED_REGISTER(S5) \
27+
CALLEE_SAVED_REGISTER(S6) \
28+
CALLEE_SAVED_REGISTER(S7) \
29+
CALLEE_SAVED_REGISTER(S8) \
30+
CALLEE_SAVED_REGISTER(Tp)
31+
32+
#define ENUM_FP_CALLEE_SAVED_REGISTERS() \
33+
CALLEE_SAVED_REGISTER(F24) \
34+
CALLEE_SAVED_REGISTER(F25) \
35+
CALLEE_SAVED_REGISTER(F26) \
36+
CALLEE_SAVED_REGISTER(F27) \
37+
CALLEE_SAVED_REGISTER(F28) \
38+
CALLEE_SAVED_REGISTER(F29) \
39+
CALLEE_SAVED_REGISTER(F30) \
40+
CALLEE_SAVED_REGISTER(F31)
41+
1842
EXTERN_C void getFPReturn(int fpSize, INT64 *pRetVal);
1943
EXTERN_C void setFPReturn(int fpSize, INT64 retVal);
2044

src/coreclr/vm/riscv64/cgencpu.h

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,37 @@
1515
#define USE_REDIRECT_FOR_GCSTRESS
1616
#endif // TARGET_UNIX
1717

18+
#define ENUM_CALLEE_SAVED_REGISTERS() \
19+
CALLEE_SAVED_REGISTER(Fp) \
20+
CALLEE_SAVED_REGISTER(Ra) \
21+
CALLEE_SAVED_REGISTER(S1) \
22+
CALLEE_SAVED_REGISTER(S2) \
23+
CALLEE_SAVED_REGISTER(S3) \
24+
CALLEE_SAVED_REGISTER(S4) \
25+
CALLEE_SAVED_REGISTER(S5) \
26+
CALLEE_SAVED_REGISTER(S6) \
27+
CALLEE_SAVED_REGISTER(S7) \
28+
CALLEE_SAVED_REGISTER(S8) \
29+
CALLEE_SAVED_REGISTER(S9) \
30+
CALLEE_SAVED_REGISTER(S10) \
31+
CALLEE_SAVED_REGISTER(S11) \
32+
CALLEE_SAVED_REGISTER(Tp) \
33+
CALLEE_SAVED_REGISTER(Gp)
34+
35+
#define ENUM_FP_CALLEE_SAVED_REGISTERS() \
36+
CALLEE_SAVED_REGISTER(F8) \
37+
CALLEE_SAVED_REGISTER(F9) \
38+
CALLEE_SAVED_REGISTER(F18) \
39+
CALLEE_SAVED_REGISTER(F19) \
40+
CALLEE_SAVED_REGISTER(F20) \
41+
CALLEE_SAVED_REGISTER(F21) \
42+
CALLEE_SAVED_REGISTER(F22) \
43+
CALLEE_SAVED_REGISTER(F23) \
44+
CALLEE_SAVED_REGISTER(F24) \
45+
CALLEE_SAVED_REGISTER(F25) \
46+
CALLEE_SAVED_REGISTER(F26) \
47+
CALLEE_SAVED_REGISTER(F27)
48+
1849
EXTERN_C void getFPReturn(int fpSize, INT64 *pRetVal);
1950
EXTERN_C void setFPReturn(int fpSize, INT64 retVal);
2051

src/coreclr/vm/stackwalk.cpp

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1547,6 +1547,7 @@ BOOL StackFrameIterator::IsValid(void)
15471547
} // StackFrameIterator::IsValid()
15481548

15491549
#ifndef DACCESS_COMPILE
1550+
#ifdef FEATURE_EH_FUNCLETS
15501551
//---------------------------------------------------------------------------------------
15511552
//
15521553
// Advance to the position that the other iterator is currently at.
@@ -1580,31 +1581,28 @@ void StackFrameIterator::SkipTo(StackFrameIterator *pOtherStackFrameIterator)
15801581
*pRD->pCurrentContextPointers = *pOtherRD->pCurrentContextPointers;
15811582
SetIP(pRD->pCurrentContext, GetIP(pOtherRD->pCurrentContext));
15821583
SetSP(pRD->pCurrentContext, GetSP(pOtherRD->pCurrentContext));
1583-
#if defined(TARGET_ARM) || defined(TARGET_ARM64)
1584-
SetLR(pRD->pCurrentContext, GetLR(pOtherRD->pCurrentContext));
1585-
#elif defined(TARGET_RISCV64) || defined(TARGET_LOONGARCH64)
1586-
SetRA(pRD->pCurrentContext, GetRA(pOtherRD->pCurrentContext));
1587-
#endif // TARGET_ARM || TARGET_ARM64
15881584
#define CALLEE_SAVED_REGISTER(regname) pRD->pCurrentContext->regname = *pRD->pCurrentContextPointers->regname;
15891585
ENUM_CALLEE_SAVED_REGISTERS();
1586+
#undef CALLEE_SAVED_REGISTER
1587+
#define CALLEE_SAVED_REGISTER(regname) pRD->pCurrentContext->regname = pRD->pCurrentContext->regname;
1588+
ENUM_FP_CALLEE_SAVED_REGISTERS();
15901589
#undef CALLEE_SAVED_REGISTER
15911590
pRD->IsCallerContextValid = pOtherRD->IsCallerContextValid;
15921591
if (pRD->IsCallerContextValid)
15931592
{
15941593
*pRD->pCallerContextPointers = *pOtherRD->pCallerContextPointers;
15951594
SetIP(pRD->pCallerContext, GetIP(pOtherRD->pCallerContext));
15961595
SetSP(pRD->pCallerContext, GetSP(pOtherRD->pCallerContext));
1597-
#if defined(TARGET_ARM) || defined(TARGET_ARM64)
1598-
SetLR(pRD->pCallerContext, GetLR(pOtherRD->pCallerContext));
1599-
#elif defined(TARGET_RISCV64) || defined(TARGET_LOONGARCH64)
1600-
SetRA(pRD->pCallerContext, GetRA(pOtherRD->pCallerContext));
1601-
#endif // TARGET_ARM || TARGET_ARM64
16021596
#define CALLEE_SAVED_REGISTER(regname) pRD->pCallerContext->regname = *pRD->pCallerContextPointers->regname;
16031597
ENUM_CALLEE_SAVED_REGISTERS();
1598+
#undef CALLEE_SAVED_REGISTER
1599+
#define CALLEE_SAVED_REGISTER(regname) pRD->pCallerContext->regname = pRD->pCallerContext->regname;
1600+
ENUM_FP_CALLEE_SAVED_REGISTERS();
16041601
#undef CALLEE_SAVED_REGISTER
16051602
}
16061603
SyncRegDisplayToCurrentContext(pRD);
16071604
}
1605+
#endif // FEATURE_EH_FUNCLETS
16081606
#endif // DACCESS_COMPILE
16091607

16101608
//---------------------------------------------------------------------------------------

src/coreclr/vm/stackwalk.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -600,8 +600,10 @@ class StackFrameIterator
600600
StackWalkAction Next(void);
601601

602602
#ifndef DACCESS_COMPILE
603+
#ifdef FEATURE_EH_FUNCLETS
603604
// advance to the position that the other iterator is currently at
604605
void SkipTo(StackFrameIterator *pOtherStackFrameIterator);
606+
#endif // FEATURE_EH_FUNCLETS
605607
#endif // DACCESS_COMPILE
606608

607609
#ifdef FEATURE_EH_FUNCLETS

0 commit comments

Comments
 (0)