@@ -1029,32 +1029,8 @@ void AArch64FrameLowering::emitPrologue(MachineFunction &MF,
10291029 ++MBBI;
10301030 }
10311031
1032- // The code below is not applicable to funclets. We have emitted all the SEH
1033- // opcodes that we needed to emit. The FP and BP belong to the containing
1034- // function.
1035- if (IsFunclet) {
1036- if (NeedsWinCFI) {
1037- HasWinCFI = true ;
1038- BuildMI (MBB, MBBI, DL, TII->get (AArch64::SEH_PrologEnd))
1039- .setMIFlag (MachineInstr::FrameSetup);
1040- }
1041-
1042- // SEH funclets are passed the frame pointer in X1. If the parent
1043- // function uses the base register, then the base register is used
1044- // directly, and is not retrieved from X1.
1045- if (F.hasPersonalityFn ()) {
1046- EHPersonality Per = classifyEHPersonality (F.getPersonalityFn ());
1047- if (isAsynchronousEHPersonality (Per)) {
1048- BuildMI (MBB, MBBI, DL, TII->get (TargetOpcode::COPY), AArch64::FP)
1049- .addReg (AArch64::X1).setMIFlag (MachineInstr::FrameSetup);
1050- MBB.addLiveIn (AArch64::X1);
1051- }
1052- }
1053-
1054- return ;
1055- }
1056-
1057- if (HasFP) {
1032+ // For funclets the FP belongs to the containing function.
1033+ if (!IsFunclet && HasFP) {
10581034 // Only set up FP if we actually need to.
10591035 int64_t FPOffset = isTargetDarwin (MF) ? (AFI->getCalleeSavedStackSize () - 16 ) : 0 ;
10601036
@@ -1197,7 +1173,9 @@ void AArch64FrameLowering::emitPrologue(MachineFunction &MF,
11971173
11981174 // Allocate space for the rest of the frame.
11991175 if (NumBytes) {
1200- const bool NeedsRealignment = RegInfo->needsStackRealignment (MF);
1176+ // Alignment is required for the parent frame, not the funclet
1177+ const bool NeedsRealignment =
1178+ !IsFunclet && RegInfo->needsStackRealignment (MF);
12011179 unsigned scratchSPReg = AArch64::SP;
12021180
12031181 if (NeedsRealignment) {
@@ -1250,7 +1228,8 @@ void AArch64FrameLowering::emitPrologue(MachineFunction &MF,
12501228 // FIXME: Clarify FrameSetup flags here.
12511229 // Note: Use emitFrameOffset() like above for FP if the FrameSetup flag is
12521230 // needed.
1253- if (RegInfo->hasBasePointer (MF)) {
1231+ // For funclets the BP belongs to the containing function.
1232+ if (!IsFunclet && RegInfo->hasBasePointer (MF)) {
12541233 TII->copyPhysReg (MBB, MBBI, DL, RegInfo->getBaseRegister (), AArch64::SP,
12551234 false );
12561235 if (NeedsWinCFI) {
@@ -1267,6 +1246,19 @@ void AArch64FrameLowering::emitPrologue(MachineFunction &MF,
12671246 .setMIFlag (MachineInstr::FrameSetup);
12681247 }
12691248
1249+ // SEH funclets are passed the frame pointer in X1. If the parent
1250+ // function uses the base register, then the base register is used
1251+ // directly, and is not retrieved from X1.
1252+ if (IsFunclet && F.hasPersonalityFn ()) {
1253+ EHPersonality Per = classifyEHPersonality (F.getPersonalityFn ());
1254+ if (isAsynchronousEHPersonality (Per)) {
1255+ BuildMI (MBB, MBBI, DL, TII->get (TargetOpcode::COPY), AArch64::FP)
1256+ .addReg (AArch64::X1)
1257+ .setMIFlag (MachineInstr::FrameSetup);
1258+ MBB.addLiveIn (AArch64::X1);
1259+ }
1260+ }
1261+
12701262 if (needsFrameMoves) {
12711263 const DataLayout &TD = MF.getDataLayout ();
12721264 const int StackGrowth = isTargetDarwin (MF)
0 commit comments