@@ -1443,10 +1443,20 @@ void AArch64FrameLowering::emitPrologue(MachineFunction &MF,
1443
1443
BuildMI (MBB, MBBI, DL, TII->get (AArch64::LOADgot), AArch64::X16)
1444
1444
.addExternalSymbol (" swift_async_extendedFramePointerFlags" ,
1445
1445
AArch64II::MO_GOT);
1446
+ if (NeedsWinCFI) {
1447
+ BuildMI (MBB, MBBI, DL, TII->get (AArch64::SEH_Nop))
1448
+ .setMIFlags (MachineInstr::FrameSetup);
1449
+ HasWinCFI = true ;
1450
+ }
1446
1451
BuildMI (MBB, MBBI, DL, TII->get (AArch64::ORRXrs), AArch64::FP)
1447
1452
.addUse (AArch64::FP)
1448
1453
.addUse (AArch64::X16)
1449
1454
.addImm (Subtarget.isTargetILP32 () ? 32 : 0 );
1455
+ if (NeedsWinCFI) {
1456
+ BuildMI (MBB, MBBI, DL, TII->get (AArch64::SEH_Nop))
1457
+ .setMIFlags (MachineInstr::FrameSetup);
1458
+ HasWinCFI = true ;
1459
+ }
1450
1460
break ;
1451
1461
}
1452
1462
[[fallthrough]];
@@ -1457,6 +1467,11 @@ void AArch64FrameLowering::emitPrologue(MachineFunction &MF,
1457
1467
.addUse (AArch64::FP)
1458
1468
.addImm (0x1100 )
1459
1469
.setMIFlag (MachineInstr::FrameSetup);
1470
+ if (NeedsWinCFI) {
1471
+ BuildMI (MBB, MBBI, DL, TII->get (AArch64::SEH_Nop))
1472
+ .setMIFlags (MachineInstr::FrameSetup);
1473
+ HasWinCFI = true ;
1474
+ }
1460
1475
break ;
1461
1476
1462
1477
case SwiftAsyncFramePointerMode::Never:
@@ -1580,11 +1595,20 @@ void AArch64FrameLowering::emitPrologue(MachineFunction &MF,
1580
1595
bool HaveInitialContext = Attrs.hasAttrSomewhere (Attribute::SwiftAsync);
1581
1596
if (HaveInitialContext)
1582
1597
MBB.addLiveIn (AArch64::X22);
1598
+ Register Reg = HaveInitialContext ? AArch64::X22 : AArch64::XZR;
1583
1599
BuildMI (MBB, MBBI, DL, TII->get (AArch64::StoreSwiftAsyncContext))
1584
- .addUse (HaveInitialContext ? AArch64::X22 : AArch64::XZR )
1600
+ .addUse (Reg )
1585
1601
.addUse (AArch64::SP)
1586
1602
.addImm (FPOffset - 8 )
1587
1603
.setMIFlags (MachineInstr::FrameSetup);
1604
+ if (NeedsWinCFI) {
1605
+ // WinCFI and arm64e, where StoreSwiftAsyncContext is expanded
1606
+ // to multiple instructions, should be mutually-exclusive.
1607
+ assert (Subtarget.getTargetTriple ().getArchName () != " arm64e" );
1608
+ BuildMI (MBB, MBBI, DL, TII->get (AArch64::SEH_Nop))
1609
+ .setMIFlags (MachineInstr::FrameSetup);
1610
+ HasWinCFI = true ;
1611
+ }
1588
1612
}
1589
1613
1590
1614
if (HomPrologEpilog) {
@@ -2056,6 +2080,11 @@ void AArch64FrameLowering::emitEpilogue(MachineFunction &MF,
2056
2080
.addUse (AArch64::FP)
2057
2081
.addImm (0x10fe )
2058
2082
.setMIFlag (MachineInstr::FrameDestroy);
2083
+ if (NeedsWinCFI) {
2084
+ BuildMI (MBB, MBBI, DL, TII->get (AArch64::SEH_Nop))
2085
+ .setMIFlags (MachineInstr::FrameDestroy);
2086
+ HasWinCFI = true ;
2087
+ }
2059
2088
break ;
2060
2089
2061
2090
case SwiftAsyncFramePointerMode::Never:
0 commit comments