@@ -1477,10 +1477,20 @@ void AArch64FrameLowering::emitPrologue(MachineFunction &MF,
1477
1477
BuildMI (MBB, MBBI, DL, TII->get (AArch64::LOADgot), AArch64::X16)
1478
1478
.addExternalSymbol (" swift_async_extendedFramePointerFlags" ,
1479
1479
AArch64II::MO_GOT);
1480
+ if (NeedsWinCFI) {
1481
+ BuildMI (MBB, MBBI, DL, TII->get (AArch64::SEH_Nop))
1482
+ .setMIFlags (MachineInstr::FrameSetup);
1483
+ HasWinCFI = true ;
1484
+ }
1480
1485
BuildMI (MBB, MBBI, DL, TII->get (AArch64::ORRXrs), AArch64::FP)
1481
1486
.addUse (AArch64::FP)
1482
1487
.addUse (AArch64::X16)
1483
1488
.addImm (Subtarget.isTargetILP32 () ? 32 : 0 );
1489
+ if (NeedsWinCFI) {
1490
+ BuildMI (MBB, MBBI, DL, TII->get (AArch64::SEH_Nop))
1491
+ .setMIFlags (MachineInstr::FrameSetup);
1492
+ HasWinCFI = true ;
1493
+ }
1484
1494
break ;
1485
1495
}
1486
1496
[[fallthrough]];
@@ -1491,6 +1501,11 @@ void AArch64FrameLowering::emitPrologue(MachineFunction &MF,
1491
1501
.addUse (AArch64::FP)
1492
1502
.addImm (0x1100 )
1493
1503
.setMIFlag (MachineInstr::FrameSetup);
1504
+ if (NeedsWinCFI) {
1505
+ BuildMI (MBB, MBBI, DL, TII->get (AArch64::SEH_Nop))
1506
+ .setMIFlags (MachineInstr::FrameSetup);
1507
+ HasWinCFI = true ;
1508
+ }
1494
1509
break ;
1495
1510
1496
1511
case SwiftAsyncFramePointerMode::Never:
@@ -1621,11 +1636,20 @@ void AArch64FrameLowering::emitPrologue(MachineFunction &MF,
1621
1636
bool HaveInitialContext = Attrs.hasAttrSomewhere (Attribute::SwiftAsync);
1622
1637
if (HaveInitialContext)
1623
1638
MBB.addLiveIn (AArch64::X22);
1639
+ Register Reg = HaveInitialContext ? AArch64::X22 : AArch64::XZR;
1624
1640
BuildMI (MBB, MBBI, DL, TII->get (AArch64::StoreSwiftAsyncContext))
1625
- .addUse (HaveInitialContext ? AArch64::X22 : AArch64::XZR )
1641
+ .addUse (Reg )
1626
1642
.addUse (AArch64::SP)
1627
1643
.addImm (FPOffset - 8 )
1628
1644
.setMIFlags (MachineInstr::FrameSetup);
1645
+ if (NeedsWinCFI) {
1646
+ // WinCFI and arm64e, where StoreSwiftAsyncContext is expanded
1647
+ // to multiple instructions, should be mutually-exclusive.
1648
+ assert (Subtarget.getTargetTriple ().getArchName () != " arm64e" );
1649
+ BuildMI (MBB, MBBI, DL, TII->get (AArch64::SEH_Nop))
1650
+ .setMIFlags (MachineInstr::FrameSetup);
1651
+ HasWinCFI = true ;
1652
+ }
1629
1653
}
1630
1654
1631
1655
// Issue sub fp, sp, FPOffset or
@@ -2123,6 +2147,11 @@ void AArch64FrameLowering::emitEpilogue(MachineFunction &MF,
2123
2147
.addUse (AArch64::FP)
2124
2148
.addImm (0x10fe )
2125
2149
.setMIFlag (MachineInstr::FrameDestroy);
2150
+ if (NeedsWinCFI) {
2151
+ BuildMI (MBB, MBBI, DL, TII->get (AArch64::SEH_Nop))
2152
+ .setMIFlags (MachineInstr::FrameDestroy);
2153
+ HasWinCFI = true ;
2154
+ }
2126
2155
break ;
2127
2156
2128
2157
case SwiftAsyncFramePointerMode::Never:
0 commit comments