@@ -1476,10 +1476,20 @@ void AArch64FrameLowering::emitPrologue(MachineFunction &MF,
1476
1476
BuildMI (MBB, MBBI, DL, TII->get (AArch64::LOADgot), AArch64::X16)
1477
1477
.addExternalSymbol (" swift_async_extendedFramePointerFlags" ,
1478
1478
AArch64II::MO_GOT);
1479
+ if (NeedsWinCFI) {
1480
+ BuildMI (MBB, MBBI, DL, TII->get (AArch64::SEH_Nop))
1481
+ .setMIFlags (MachineInstr::FrameSetup);
1482
+ HasWinCFI = true ;
1483
+ }
1479
1484
BuildMI (MBB, MBBI, DL, TII->get (AArch64::ORRXrs), AArch64::FP)
1480
1485
.addUse (AArch64::FP)
1481
1486
.addUse (AArch64::X16)
1482
1487
.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
+ }
1483
1493
break ;
1484
1494
}
1485
1495
[[fallthrough]];
@@ -1490,6 +1500,11 @@ void AArch64FrameLowering::emitPrologue(MachineFunction &MF,
1490
1500
.addUse (AArch64::FP)
1491
1501
.addImm (0x1100 )
1492
1502
.setMIFlag (MachineInstr::FrameSetup);
1503
+ if (NeedsWinCFI) {
1504
+ BuildMI (MBB, MBBI, DL, TII->get (AArch64::SEH_Nop))
1505
+ .setMIFlags (MachineInstr::FrameSetup);
1506
+ HasWinCFI = true ;
1507
+ }
1493
1508
break ;
1494
1509
1495
1510
case SwiftAsyncFramePointerMode::Never:
@@ -1613,11 +1628,20 @@ void AArch64FrameLowering::emitPrologue(MachineFunction &MF,
1613
1628
bool HaveInitialContext = Attrs.hasAttrSomewhere (Attribute::SwiftAsync);
1614
1629
if (HaveInitialContext)
1615
1630
MBB.addLiveIn (AArch64::X22);
1631
+ Register Reg = HaveInitialContext ? AArch64::X22 : AArch64::XZR;
1616
1632
BuildMI (MBB, MBBI, DL, TII->get (AArch64::StoreSwiftAsyncContext))
1617
- .addUse (HaveInitialContext ? AArch64::X22 : AArch64::XZR )
1633
+ .addUse (Reg )
1618
1634
.addUse (AArch64::SP)
1619
1635
.addImm (FPOffset - 8 )
1620
1636
.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
+ }
1621
1645
}
1622
1646
1623
1647
if (HomPrologEpilog) {
@@ -2132,6 +2156,11 @@ void AArch64FrameLowering::emitEpilogue(MachineFunction &MF,
2132
2156
.addUse (AArch64::FP)
2133
2157
.addImm (0x10fe )
2134
2158
.setMIFlag (MachineInstr::FrameDestroy);
2159
+ if (NeedsWinCFI) {
2160
+ BuildMI (MBB, MBBI, DL, TII->get (AArch64::SEH_Nop))
2161
+ .setMIFlags (MachineInstr::FrameDestroy);
2162
+ HasWinCFI = true ;
2163
+ }
2135
2164
break ;
2136
2165
2137
2166
case SwiftAsyncFramePointerMode::Never:
0 commit comments