@@ -1476,10 +1476,20 @@ void AArch64FrameLowering::emitPrologue(MachineFunction &MF,
14761476 BuildMI (MBB, MBBI, DL, TII->get (AArch64::LOADgot), AArch64::X16)
14771477 .addExternalSymbol (" swift_async_extendedFramePointerFlags" ,
14781478 AArch64II::MO_GOT);
1479+ if (NeedsWinCFI) {
1480+ BuildMI (MBB, MBBI, DL, TII->get (AArch64::SEH_Nop))
1481+ .setMIFlags (MachineInstr::FrameSetup);
1482+ HasWinCFI = true ;
1483+ }
14791484 BuildMI (MBB, MBBI, DL, TII->get (AArch64::ORRXrs), AArch64::FP)
14801485 .addUse (AArch64::FP)
14811486 .addUse (AArch64::X16)
14821487 .addImm (Subtarget.isTargetILP32 () ? 32 : 0 );
1488+ if (NeedsWinCFI) {
1489+ BuildMI (MBB, MBBI, DL, TII->get (AArch64::SEH_Nop))
1490+ .setMIFlags (MachineInstr::FrameSetup);
1491+ HasWinCFI = true ;
1492+ }
14831493 break ;
14841494 }
14851495 [[fallthrough]];
@@ -1490,6 +1500,11 @@ void AArch64FrameLowering::emitPrologue(MachineFunction &MF,
14901500 .addUse (AArch64::FP)
14911501 .addImm (0x1100 )
14921502 .setMIFlag (MachineInstr::FrameSetup);
1503+ if (NeedsWinCFI) {
1504+ BuildMI (MBB, MBBI, DL, TII->get (AArch64::SEH_Nop))
1505+ .setMIFlags (MachineInstr::FrameSetup);
1506+ HasWinCFI = true ;
1507+ }
14931508 break ;
14941509
14951510 case SwiftAsyncFramePointerMode::Never:
@@ -1613,11 +1628,20 @@ void AArch64FrameLowering::emitPrologue(MachineFunction &MF,
16131628 bool HaveInitialContext = Attrs.hasAttrSomewhere (Attribute::SwiftAsync);
16141629 if (HaveInitialContext)
16151630 MBB.addLiveIn (AArch64::X22);
1631+ Register Reg = HaveInitialContext ? AArch64::X22 : AArch64::XZR;
16161632 BuildMI (MBB, MBBI, DL, TII->get (AArch64::StoreSwiftAsyncContext))
1617- .addUse (HaveInitialContext ? AArch64::X22 : AArch64::XZR )
1633+ .addUse (Reg )
16181634 .addUse (AArch64::SP)
16191635 .addImm (FPOffset - 8 )
16201636 .setMIFlags (MachineInstr::FrameSetup);
1637+ if (NeedsWinCFI) {
1638+ // WinCFI and arm64e, where StoreSwiftAsyncContext is expanded
1639+ // to multiple instructions, should be mutually-exclusive.
1640+ assert (Subtarget.getTargetTriple ().getArchName () != " arm64e" );
1641+ BuildMI (MBB, MBBI, DL, TII->get (AArch64::SEH_Nop))
1642+ .setMIFlags (MachineInstr::FrameSetup);
1643+ HasWinCFI = true ;
1644+ }
16211645 }
16221646
16231647 if (HomPrologEpilog) {
@@ -2132,6 +2156,11 @@ void AArch64FrameLowering::emitEpilogue(MachineFunction &MF,
21322156 .addUse (AArch64::FP)
21332157 .addImm (0x10fe )
21342158 .setMIFlag (MachineInstr::FrameDestroy);
2159+ if (NeedsWinCFI) {
2160+ BuildMI (MBB, MBBI, DL, TII->get (AArch64::SEH_Nop))
2161+ .setMIFlags (MachineInstr::FrameDestroy);
2162+ HasWinCFI = true ;
2163+ }
21352164 break ;
21362165
21372166 case SwiftAsyncFramePointerMode::Never:
0 commit comments