Skip to content
This repository was archived by the owner on Jan 23, 2023. It is now read-only.

Commit e8eb5c6

Browse files
authored
Fix some more unwinding in R2R ARM (#17292)
There was one more change needed to make the unwinding work properly. Pushes in some prologs were missing the unwinder annotation. The fix is to use PROLOG_PUSH for them. To make things in this file consistent, I've also replaced pops in epilogs with EPILOG_POP macro and vpush / vpop with PROLOG_VPUSH / PROLOG_VPOP, although it is not functionally necessary. With these changes, all the EH related issues are gone.
1 parent 104ec55 commit e8eb5c6

File tree

1 file changed

+17
-17
lines changed

1 file changed

+17
-17
lines changed

src/vm/arm/asmhelpers.S

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ LOCAL_LABEL(LNullThis):
289289

290290
PROLOG_PUSH "{r0-r4,r7,r8,lr}" // add r8 to make stack aligned by 8B
291291
PROLOG_STACK_SAVE_OFFSET r7, #20
292-
vpush {d0-d7}
292+
PROLOG_VPUSH {d0-d7}
293293

294294
CHECK_STACK_ALIGNMENT
295295

@@ -300,8 +300,8 @@ LOCAL_LABEL(LNullThis):
300300
mov r12, r0
301301

302302
// Epilog
303-
vpop {d0-d7}
304-
pop {r0-r4,r7,r8,lr}
303+
EPILOG_VPOP {d0-d7}
304+
EPILOG_POP "{r0-r4,r7,r8,lr}"
305305
bx r12
306306

307307
NESTED_END TheUMEntryPrestub,_TEXT
@@ -542,16 +542,16 @@ ThePreStubPatchLabel:
542542
PROLOG_PUSH "{r0-r4,r7,r8,lr}" // Spill general argument registers, return address and
543543
PROLOG_STACK_SAVE_OFFSET r7, #20
544544
// arbitrary register to keep stack aligned
545-
vpush {d0-d7} // Spill floating point argument registers
545+
PROLOG_VPUSH {d0-d7} // Spill floating point argument registers
546546

547547
CHECK_STACK_ALIGNMENT
548548

549549
mov r0, r12
550550
bl C_FUNC(NDirectImportWorker)
551551
mov r12, r0
552552

553-
vpop {d0-d7}
554-
pop {r0-r4,r7,r8,lr}
553+
EPILOG_VPOP {d0-d7}
554+
EPILOG_POP "{r0-r4,r7,r8,lr}"
555555

556556
// If we got back from NDirectImportWorker, the MD has been successfully
557557
// linked. Proceed to execute the original DLL call.
@@ -972,7 +972,7 @@ LOCAL_LABEL(stackProbe_loop):
972972
// pop the stack and restore original register state
973973
vldm sp, {d0-d7}
974974
free_stack SIZEOF__FloatArgumentRegisters + 4
975-
pop {r0-r3, r7,r8, lr}
975+
EPILOG_POP "{r0-r3, r7,r8, lr}"
976976

977977
PATCH_LABEL VirtualMethodFixupPatchLabel
978978

@@ -1060,13 +1060,13 @@ LOCAL_LABEL(stackProbe_loop):
10601060

10611061
PROLOG_PUSH "{r0-r1, r7,r8, r11, lr}" // save integer return value
10621062
PROLOG_STACK_SAVE_OFFSET r7, #8
1063-
vpush {d0-d3} // floating point return value
1063+
PROLOG_VPUSH {d0-d3} // floating point return value
10641064

10651065
CHECK_STACK_ALIGNMENT
10661066

10671067
bl C_FUNC(JIT_RareDisableHelperWorker)
10681068

1069-
vpop {d0-d3}
1069+
EPILOG_VPOP {d0-d3}
10701070
EPILOG_POP "{r0-r1, r7,r8, r11, pc}"
10711071

10721072
NESTED_END JIT_RareDisableHelper, _TEXT
@@ -1193,8 +1193,8 @@ LOCAL_LABEL(ThrowIndexOutOfRangeException):
11931193
// r12 = array->GetArrayElementTypeHandle()
11941194
//
11951195
NESTED_ENTRY JIT_Stelem_Ref_NotExactMatch, _TEXT, NoHandler
1196-
push {lr}
1197-
push {r0-r2}
1196+
PROLOG_PUSH {lr}
1197+
PROLOG_PUSH {r0-r2}
11981198

11991199
CHECK_STACK_ALIGNMENT
12001200

@@ -1213,8 +1213,8 @@ LOCAL_LABEL(NeedFrame):
12131213
bl C_FUNC(ArrayStoreCheck) // ArrayStoreCheck(&val, &array)
12141214
12151215
LOCAL_LABEL(DoWrite):
1216-
pop {r0-r2}
1217-
pop {lr}
1216+
EPILOG_POP {r0-r2}
1217+
EPILOG_POP {lr}
12181218
b C_FUNC(JIT_Stelem_DoWrite)
12191219

12201220
NESTED_END JIT_Stelem_Ref_NotExactMatch, _TEXT
@@ -1410,13 +1410,13 @@ g_rgWriteBarrierDescriptors:
14101410
NESTED_ENTRY DelayLoad_MethodCall_FakeProlog, _TEXT, NoHandler
14111411

14121412
// Match what the lazy thunk has pushed. The actual method arguments will be spilled later.
1413-
push {r1-r3}
1413+
PROLOG_PUSH {r1-r3}
14141414

14151415
// This is where execution really starts.
14161416
DelayLoad_MethodCall:
14171417
.global DelayLoad_MethodCall
14181418

1419-
push {r0}
1419+
PROLOG_PUSH {r0}
14201420

14211421
PROLOG_WITH_TRANSITION_BLOCK 0x0, 1, DoNotPushArgRegs
14221422

@@ -1454,13 +1454,13 @@ DelayLoad_MethodCall:
14541454
NESTED_ENTRY DelayLoad_Helper\suffix\()_FakeProlog, _TEXT, NoHandler
14551455

14561456
// Match what the lazy thunk has pushed. The actual method arguments will be spilled later.
1457-
push {r1-r3}
1457+
PROLOG_PUSH {r1-r3}
14581458

14591459
// This is where execution really starts.
14601460
DelayLoad_Helper\suffix:
14611461
.global DelayLoad_Helper\suffix
14621462

1463-
push {r0}
1463+
PROLOG_PUSH {r0}
14641464

14651465
PROLOG_WITH_TRANSITION_BLOCK 0x4, 0, DoNotPushArgRegs
14661466

0 commit comments

Comments
 (0)