From 8d4e28c30e46800145f7271693bdbf035d7709cc Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Sat, 22 Feb 2025 06:53:35 -0800 Subject: [PATCH 1/3] add follow-up assert during unwinding --- src/coreclr/jit/unwindamd64.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/coreclr/jit/unwindamd64.cpp b/src/coreclr/jit/unwindamd64.cpp index a7f5c8c8a8454c..67f23ef055e2e0 100644 --- a/src/coreclr/jit/unwindamd64.cpp +++ b/src/coreclr/jit/unwindamd64.cpp @@ -423,7 +423,15 @@ void Compiler::unwindSaveRegWindows(regNumber reg, unsigned offset) code = (UNWIND_CODE*)&func->unwindCodes[func->unwindCodeSlot -= sizeof(UNWIND_CODE)]; code->UnwindOp = (genIsValidFloatReg(reg)) ? UWOP_SAVE_XMM128_FAR : UWOP_SAVE_NONVOL_FAR; } - code->OpInfo = (BYTE)(genIsValidFloatReg(reg) ? reg - XMMBASE : reg); + if (genIsValidFloatReg(reg)) + { + code->OpInfo = reg - XMMBASE; + } + else + { + assert(genIsValidIntReg(reg)); + code->OpInfo = reg; + } unsigned int cbProlog = unwindGetCurrentOffset(func); noway_assert((BYTE)cbProlog == cbProlog); code->CodeOffset = (BYTE)cbProlog; From f4b149fc3f2b28eefc2033a216b10efc513ea7f6 Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Sun, 23 Feb 2025 07:57:59 -0800 Subject: [PATCH 2/3] review feedback --- src/coreclr/jit/unwindamd64.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/coreclr/jit/unwindamd64.cpp b/src/coreclr/jit/unwindamd64.cpp index 67f23ef055e2e0..5f978add8933c7 100644 --- a/src/coreclr/jit/unwindamd64.cpp +++ b/src/coreclr/jit/unwindamd64.cpp @@ -423,15 +423,20 @@ void Compiler::unwindSaveRegWindows(regNumber reg, unsigned offset) code = (UNWIND_CODE*)&func->unwindCodes[func->unwindCodeSlot -= sizeof(UNWIND_CODE)]; code->UnwindOp = (genIsValidFloatReg(reg)) ? UWOP_SAVE_XMM128_FAR : UWOP_SAVE_NONVOL_FAR; } + unsigned unwindRegNum; if (genIsValidFloatReg(reg)) { - code->OpInfo = reg - XMMBASE; + unwindRegNum = reg - XMMBASE; } else { assert(genIsValidIntReg(reg)); - code->OpInfo = reg; + unwindRegNum = reg; } + assert(unwindRegNum <= 15); + code->OpInfo = (UCHAR)unwindRegNum; + assert((unsigned)code->OpInfo == unwindRegNum); + unsigned int cbProlog = unwindGetCurrentOffset(func); noway_assert((BYTE)cbProlog == cbProlog); code->CodeOffset = (BYTE)cbProlog; From b16e5b0cc8abda899943f411e17856680093f414 Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Mon, 24 Feb 2025 09:38:24 -0800 Subject: [PATCH 3/3] add a comment --- src/coreclr/jit/unwindamd64.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/coreclr/jit/unwindamd64.cpp b/src/coreclr/jit/unwindamd64.cpp index 5f978add8933c7..6e284aa230c199 100644 --- a/src/coreclr/jit/unwindamd64.cpp +++ b/src/coreclr/jit/unwindamd64.cpp @@ -433,6 +433,8 @@ void Compiler::unwindSaveRegWindows(regNumber reg, unsigned offset) assert(genIsValidIntReg(reg)); unwindRegNum = reg; } + // We only add unwind codes for non-volatile registers and for x86/x64, + // the max registers index for a non-volatile register is 15. assert(unwindRegNum <= 15); code->OpInfo = (UCHAR)unwindRegNum; assert((unsigned)code->OpInfo == unwindRegNum);