Skip to content

Commit 66245b1

Browse files
Update unwind logic
1 parent 0ca16c1 commit 66245b1

File tree

8 files changed

+72
-2
lines changed

8 files changed

+72
-2
lines changed

src/coreclr/jit/codegenxarch.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10359,8 +10359,7 @@ void CodeGen::genPushCalleeSavedRegisters()
1035910359

1036010360
GetEmitter()->emitIns_R_R(INS_push2, EA_PTRSIZE, reg1, reg2,
1036110361
(insOpts)(INS_OPTS_EVEX_nd | INS_OPTS_APX_ppx));
10362-
compiler->unwindPush(reg1);
10363-
compiler->unwindPush(reg2);
10362+
compiler->unwindPush2(reg1, reg2);
1036410363
}
1036510364

1036610365
if (regStack.Height() == 1)

src/coreclr/jit/compiler.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8806,6 +8806,7 @@ class Compiler
88068806
//
88078807

88088808
void unwindPush(regNumber reg);
8809+
void unwindPush2(regNumber reg1, regNumber reg2);
88098810
void unwindAllocStack(unsigned size);
88108811
void unwindSetFrameReg(regNumber reg, unsigned offset);
88118812
void unwindSaveReg(regNumber reg, unsigned offset);
@@ -8878,6 +8879,7 @@ class Compiler
88788879

88798880
void unwindBegPrologWindows();
88808881
void unwindPushWindows(regNumber reg);
8882+
void unwindPush2Windows(regNumber reg1, regNumber reg2);
88818883
void unwindAllocStackWindows(unsigned size);
88828884
void unwindSetFrameRegWindows(regNumber reg, unsigned offset);
88838885
void unwindSaveRegWindows(regNumber reg, unsigned offset);
@@ -8896,6 +8898,7 @@ class Compiler
88968898
short mapRegNumToDwarfReg(regNumber reg);
88978899
void createCfiCode(FuncInfoDsc* func, UNATIVE_OFFSET codeOffset, UCHAR opcode, short dwarfReg, INT offset = 0);
88988900
void unwindPushPopCFI(regNumber reg);
8901+
void unwindPush2Pop2CFI(regNumber reg1, regNumber reg2);
88998902
void unwindBegPrologCFI();
89008903
void unwindPushPopMaskCFI(regMaskTP regMask, bool isFloat);
89018904
void unwindAllocStackCFI(unsigned size);

src/coreclr/jit/unwind.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,20 @@ void Compiler::unwindPushPopCFI(regNumber reg)
176176
}
177177
}
178178

179+
//------------------------------------------------------------------------
180+
// Compiler::unwindPush2Pop2CFI: Record push/save of 2 registers simultaneously.
181+
//
182+
// Arguments:
183+
// reg1 - The first register being pushed/saved.
184+
// reg2 - The second register being pushed/saved.
185+
//
186+
void Compiler::unwindPush2Pop2CFI(regNumber reg1, regNumber reg2)
187+
{
188+
// ToDo: This is a placeholder till OS has unwind support for push2/pop2.
189+
unwindPushPopCFI(reg1);
190+
unwindPushPopCFI(reg2);
191+
}
192+
179193
typedef jitstd::vector<CFI_CODE> CFICodeVector;
180194

181195
void Compiler::unwindBegPrologCFI()

src/coreclr/jit/unwindamd64.cpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,27 @@ void Compiler::unwindPush(regNumber reg)
225225
}
226226
}
227227

228+
//------------------------------------------------------------------------
229+
// Compiler::unwindPush2Windows: Record push/save of 2 registers simultaneously.
230+
//
231+
// Arguments:
232+
// reg1 - The first register being pushed/saved.
233+
// reg2 - The second register being pushed/saved.
234+
//
235+
void Compiler::unwindPush2(regNumber reg1, regNumber reg2)
236+
{
237+
#ifdef UNIX_AMD64_ABI
238+
if (generateCFIUnwindCodes())
239+
{
240+
unwindPush2Pop2CFI(reg1, reg2);
241+
}
242+
else
243+
#endif // UNIX_AMD64_ABI
244+
{
245+
unwindPush2Windows(reg1, reg2);
246+
}
247+
}
248+
228249
void Compiler::unwindPushWindows(regNumber reg)
229250
{
230251
assert(compGeneratingProlog);
@@ -260,6 +281,20 @@ void Compiler::unwindPushWindows(regNumber reg)
260281
}
261282
}
262283

284+
//------------------------------------------------------------------------
285+
// Compiler::unwindPush2Windows: Record push/save of 2 registers simultaneously in windows OS.
286+
//
287+
// Arguments:
288+
// reg1 - The first register being pushed/saved.
289+
// reg2 - The second register being pushed/saved.
290+
//
291+
void Compiler::unwindPush2Windows(regNumber reg1, regNumber reg2)
292+
{
293+
// ToDo: This is a placeholder till Windows OS has unwind support for push2/pop2.
294+
unwindPushWindows(reg1);
295+
unwindPushWindows(reg2);
296+
}
297+
263298
#ifdef UNIX_AMD64_ABI
264299
#endif // UNIX_AMD64_ABI
265300

src/coreclr/jit/unwindarm64.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,11 @@ void Compiler::unwindPush(regNumber reg)
230230
unreached(); // use one of the unwindSaveReg* functions instead.
231231
}
232232

233+
void Compiler::unwindPush2(regNumber reg1, regNumber reg2)
234+
{
235+
unreached(); // use one of the unwindSaveReg* functions instead.
236+
}
237+
233238
void Compiler::unwindAllocStack(unsigned size)
234239
{
235240
#if defined(FEATURE_CFI_SUPPORT)

src/coreclr/jit/unwindloongarch64.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,11 @@ void Compiler::unwindPush(regNumber reg)
230230
unreached(); // use one of the unwindSaveReg* functions instead.
231231
}
232232

233+
void Compiler::unwindPush2(regNumber reg1, regNumber reg2)
234+
{
235+
unreached(); // use one of the unwindSaveReg* functions instead.
236+
}
237+
233238
void Compiler::unwindAllocStack(unsigned size)
234239
{
235240
#if defined(FEATURE_CFI_SUPPORT)

src/coreclr/jit/unwindriscv64.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,11 @@ void Compiler::unwindPush(regNumber reg)
4242
unreached(); // use one of the unwindSaveReg* functions instead.
4343
}
4444

45+
void Compiler::unwindPush2(regNumber reg1, regNumber reg2)
46+
{
47+
unreached(); // use one of the unwindSaveReg* functions instead.
48+
}
49+
4550
void Compiler::unwindAllocStack(unsigned size)
4651
{
4752
#if defined(FEATURE_CFI_SUPPORT)

src/coreclr/jit/unwindx86.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ void Compiler::unwindPush(regNumber reg)
5050
{
5151
}
5252

53+
void Compiler::unwindPush2(regNumber reg1, regNumber reg2)
54+
{
55+
}
56+
5357
void Compiler::unwindAllocStack(unsigned size)
5458
{
5559
}

0 commit comments

Comments
 (0)