]> granicus.if.org Git - llvm/commitdiff
[WinEH] Fix catch block parent frame pointer offset
authorReid Kleckner <rnk@google.com>
Mon, 12 Aug 2019 23:02:00 +0000 (23:02 +0000)
committerReid Kleckner <rnk@google.com>
Mon, 12 Aug 2019 23:02:00 +0000 (23:02 +0000)
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.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@368631 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86FrameLowering.cpp
test/CodeGen/X86/win64-funclet-savexmm.ll

index 47be92e59727f529ffca64a7596a090a4fa8e689..9d8cb89dbefb5479b6818ac810adee50305a41bd 100644 (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;
index f41c52e00efebcfe7bad2add5ac349967357f82d..6b4b68f17287245c12ab715d72182f821109d42d 100644 (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