@@ -1483,10 +1483,20 @@ void AArch64FrameLowering::emitPrologue(MachineFunction &MF,
1483
1483
BuildMI (MBB, MBBI, DL, TII->get (AArch64::LOADgot), AArch64::X16)
1484
1484
.addExternalSymbol (" swift_async_extendedFramePointerFlags" ,
1485
1485
AArch64II::MO_GOT);
1486
+ if (NeedsWinCFI) {
1487
+ BuildMI (MBB, MBBI, DL, TII->get (AArch64::SEH_Nop))
1488
+ .setMIFlags (MachineInstr::FrameSetup);
1489
+ HasWinCFI = true ;
1490
+ }
1486
1491
BuildMI (MBB, MBBI, DL, TII->get (AArch64::ORRXrs), AArch64::FP)
1487
1492
.addUse (AArch64::FP)
1488
1493
.addUse (AArch64::X16)
1489
1494
.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
+ }
1490
1500
break ;
1491
1501
}
1492
1502
[[fallthrough]];
@@ -1497,6 +1507,11 @@ void AArch64FrameLowering::emitPrologue(MachineFunction &MF,
1497
1507
.addUse (AArch64::FP)
1498
1508
.addImm (0x1100 )
1499
1509
.setMIFlag (MachineInstr::FrameSetup);
1510
+ if (NeedsWinCFI) {
1511
+ BuildMI (MBB, MBBI, DL, TII->get (AArch64::SEH_Nop))
1512
+ .setMIFlags (MachineInstr::FrameSetup);
1513
+ HasWinCFI = true ;
1514
+ }
1500
1515
break ;
1501
1516
1502
1517
case SwiftAsyncFramePointerMode::Never:
@@ -1626,11 +1641,20 @@ void AArch64FrameLowering::emitPrologue(MachineFunction &MF,
1626
1641
bool HaveInitialContext = Attrs.hasAttrSomewhere (Attribute::SwiftAsync);
1627
1642
if (HaveInitialContext)
1628
1643
MBB.addLiveIn (AArch64::X22);
1644
+ Register Reg = HaveInitialContext ? AArch64::X22 : AArch64::XZR;
1629
1645
BuildMI (MBB, MBBI, DL, TII->get (AArch64::StoreSwiftAsyncContext))
1630
- .addUse (HaveInitialContext ? AArch64::X22 : AArch64::XZR )
1646
+ .addUse (Reg )
1631
1647
.addUse (AArch64::SP)
1632
1648
.addImm (FPOffset - 8 )
1633
1649
.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
+ }
1634
1658
}
1635
1659
1636
1660
// Issue sub fp, sp, FPOffset or
@@ -2165,6 +2189,11 @@ void AArch64FrameLowering::emitEpilogue(MachineFunction &MF,
2165
2189
.addUse (AArch64::FP)
2166
2190
.addImm (0x10fe )
2167
2191
.setMIFlag (MachineInstr::FrameDestroy);
2192
+ if (NeedsWinCFI) {
2193
+ BuildMI (MBB, MBBI, DL, TII->get (AArch64::SEH_Nop))
2194
+ .setMIFlags (MachineInstr::FrameDestroy);
2195
+ HasWinCFI = true ;
2196
+ }
2168
2197
break ;
2169
2198
2170
2199
case SwiftAsyncFramePointerMode::Never:
0 commit comments