[WinEH] Fix catch block parent frame pointer offset

r367088 made it so that funclets store XMM registers into their local
frame instead of storing them to the parent frame. However, that change
forgot to update the parent frame pointer offset for catch blocks. This
change does that.

Fixes crashes when an exception is rethrown in a catch block that saves
XMMs, as described in https://crbug.com/992860.

llvm-svn: 368631
This commit is contained in:
Reid Kleckner 2019-08-12 23:02:00 +00:00
parent b978c51ce4
commit e9865b9b31
2 changed files with 19 additions and 3 deletions

View File

@ -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<X86MachineFunctionInfo>();
// 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<X86MachineFunctionInfo>()->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;

View File

@ -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