diff --git a/llvm/lib/Target/X86/X86FrameLowering.cpp b/llvm/lib/Target/X86/X86FrameLowering.cpp index 47be92e59727..9d8cb89dbefb 100644 --- a/llvm/lib/Target/X86/X86FrameLowering.cpp +++ b/llvm/lib/Target/X86/X86FrameLowering.cpp @@ -3191,14 +3191,19 @@ void X86FrameLowering::orderFrameObjects( std::reverse(ObjectsToAllocate.begin(), ObjectsToAllocate.end()); } - -unsigned X86FrameLowering::getWinEHParentFrameOffset(const MachineFunction &MF) const { +unsigned +X86FrameLowering::getWinEHParentFrameOffset(const MachineFunction &MF) const { + const X86MachineFunctionInfo *X86FI = MF.getInfo(); // RDX, the parent frame pointer, is homed into 16(%rsp) in the prologue. unsigned Offset = 16; // RBP is immediately pushed. Offset += SlotSize; // All callee-saved registers are then pushed. - Offset += MF.getInfo()->getCalleeSavedFrameSize(); + Offset += X86FI->getCalleeSavedFrameSize(); + // Funclets allocate space for however XMM registers are required. + int Ignore; + if (MF.getTarget().getMCAsmInfo()->usesWindowsCFI()) + Offset += X86FI->getCalleeSavedXMMFrameInfo(Ignore); // Every funclet allocates enough stack space for the largest outgoing call. Offset += getWinEHFuncletFrameSize(MF); return Offset; diff --git a/llvm/test/CodeGen/X86/win64-funclet-savexmm.ll b/llvm/test/CodeGen/X86/win64-funclet-savexmm.ll index f41c52e00efe..6b4b68f17287 100644 --- a/llvm/test/CodeGen/X86/win64-funclet-savexmm.ll +++ b/llvm/test/CodeGen/X86/win64-funclet-savexmm.ll @@ -66,3 +66,14 @@ unreachable: ; preds = %entry ; CHECK: popq %rbx ; CHECK: popq %rbp ; CHECK: retq # CATCHRET + +; CHECK-LABEL: "$handlerMap$0$?foo@@YAXXZ": +; CHECK-NEXT: .long 0 # Adjectives +; CHECK-NEXT: .long "??_R0H@8"@IMGREL # Type +; CHECK-NEXT: .long 44 # CatchObjOffset +; CHECK-NEXT: .long "?catch${{.*}}??foo@@YAXXZ@4HA"@IMGREL # Handler +; Sum of: +; 16 RDX store offset +; 16 two pushes +; 72 stack alloc +; CHECK-NEXT: .long 104 # ParentFrameOffset