@@ -1483,10 +1483,20 @@ void AArch64FrameLowering::emitPrologue(MachineFunction &MF,
14831483 BuildMI (MBB, MBBI, DL, TII->get (AArch64::LOADgot), AArch64::X16)
14841484 .addExternalSymbol (" swift_async_extendedFramePointerFlags" ,
14851485 AArch64II::MO_GOT);
1486+ if (NeedsWinCFI) {
1487+ BuildMI (MBB, MBBI, DL, TII->get (AArch64::SEH_Nop))
1488+ .setMIFlags (MachineInstr::FrameSetup);
1489+ HasWinCFI = true ;
1490+ }
14861491 BuildMI (MBB, MBBI, DL, TII->get (AArch64::ORRXrs), AArch64::FP)
14871492 .addUse (AArch64::FP)
14881493 .addUse (AArch64::X16)
14891494 .addImm (Subtarget.isTargetILP32 () ? 32 : 0 );
1495+ if (NeedsWinCFI) {
1496+ BuildMI (MBB, MBBI, DL, TII->get (AArch64::SEH_Nop))
1497+ .setMIFlags (MachineInstr::FrameSetup);
1498+ HasWinCFI = true ;
1499+ }
14901500 break ;
14911501 }
14921502 [[fallthrough]];
@@ -1497,6 +1507,11 @@ void AArch64FrameLowering::emitPrologue(MachineFunction &MF,
14971507 .addUse (AArch64::FP)
14981508 .addImm (0x1100 )
14991509 .setMIFlag (MachineInstr::FrameSetup);
1510+ if (NeedsWinCFI) {
1511+ BuildMI (MBB, MBBI, DL, TII->get (AArch64::SEH_Nop))
1512+ .setMIFlags (MachineInstr::FrameSetup);
1513+ HasWinCFI = true ;
1514+ }
15001515 break ;
15011516
15021517 case SwiftAsyncFramePointerMode::Never:
@@ -1626,11 +1641,20 @@ void AArch64FrameLowering::emitPrologue(MachineFunction &MF,
16261641 bool HaveInitialContext = Attrs.hasAttrSomewhere (Attribute::SwiftAsync);
16271642 if (HaveInitialContext)
16281643 MBB.addLiveIn (AArch64::X22);
1644+ Register Reg = HaveInitialContext ? AArch64::X22 : AArch64::XZR;
16291645 BuildMI (MBB, MBBI, DL, TII->get (AArch64::StoreSwiftAsyncContext))
1630- .addUse (HaveInitialContext ? AArch64::X22 : AArch64::XZR )
1646+ .addUse (Reg )
16311647 .addUse (AArch64::SP)
16321648 .addImm (FPOffset - 8 )
16331649 .setMIFlags (MachineInstr::FrameSetup);
1650+ if (NeedsWinCFI) {
1651+ // WinCFI and arm64e, where StoreSwiftAsyncContext is expanded
1652+ // to multiple instructions, should be mutually-exclusive.
1653+ assert (Subtarget.getTargetTriple ().getArchName () != " arm64e" );
1654+ BuildMI (MBB, MBBI, DL, TII->get (AArch64::SEH_Nop))
1655+ .setMIFlags (MachineInstr::FrameSetup);
1656+ HasWinCFI = true ;
1657+ }
16341658 }
16351659
16361660 // Issue sub fp, sp, FPOffset or
@@ -2165,6 +2189,11 @@ void AArch64FrameLowering::emitEpilogue(MachineFunction &MF,
21652189 .addUse (AArch64::FP)
21662190 .addImm (0x10fe )
21672191 .setMIFlag (MachineInstr::FrameDestroy);
2192+ if (NeedsWinCFI) {
2193+ BuildMI (MBB, MBBI, DL, TII->get (AArch64::SEH_Nop))
2194+ .setMIFlags (MachineInstr::FrameDestroy);
2195+ HasWinCFI = true ;
2196+ }
21682197 break ;
21692198
21702199 case SwiftAsyncFramePointerMode::Never:
0 commit comments