[PATCH] D17689: [WinEH] Allocate the registration node before the catch objects

David Majnemer via llvm-commits llvm-commits at lists.llvm.org
Mon Feb 29 20:35:07 PST 2016


This revision was automatically updated to reflect the committed changes.
Closed by commit rL262294: [WinEH] Allocate the registration node before the catch objects (authored by majnemer).

Changed prior to commit:
  http://reviews.llvm.org/D17689?vs=49312&id=49448#toc

Repository:
  rL LLVM

http://reviews.llvm.org/D17689

Files:
  llvm/trunk/lib/CodeGen/AsmPrinter/WinException.cpp
  llvm/trunk/lib/CodeGen/PrologEpilogInserter.cpp
  llvm/trunk/test/CodeGen/X86/cleanuppad-inalloca.ll
  llvm/trunk/test/CodeGen/X86/pr26757.ll

Index: llvm/trunk/test/CodeGen/X86/pr26757.ll
===================================================================
--- llvm/trunk/test/CodeGen/X86/pr26757.ll
+++ llvm/trunk/test/CodeGen/X86/pr26757.ll
@@ -0,0 +1,34 @@
+; RUN: llc < %s | FileCheck %s
+target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
+target triple = "i386-pc-windows-msvc"
+
+declare void @throw()
+
+define void @test1() personality i32 (...)* @__CxxFrameHandler3 {
+  %e = alloca i8, align 4
+  invoke void @throw()
+          to label %.noexc unwind label %catch.dispatch
+
+.noexc:
+  unreachable
+
+catch.object.Exception:
+  %cp = catchpad within %cs [i8* null, i32 0, i8* %e]
+  catchret from %cp to label %catchhandler
+
+catch.dispatch:
+  %cs = catchswitch within none [label %catch.object.Exception] unwind to caller
+
+catchhandler:
+  call void @use(i8* %e)
+  ret void
+}
+
+; CHECK-LABEL: $handlerMap$0$test1:
+; CHECK:      .long 0
+; CHECK-NEXT: .long 0
+; CHECK-NEXT: .long -20
+
+declare void @use(i8*)
+
+declare i32 @__CxxFrameHandler3(...)
Index: llvm/trunk/test/CodeGen/X86/cleanuppad-inalloca.ll
===================================================================
--- llvm/trunk/test/CodeGen/X86/cleanuppad-inalloca.ll
+++ llvm/trunk/test/CodeGen/X86/cleanuppad-inalloca.ll
@@ -51,7 +51,7 @@
 ; CHECK: "?dtor$2@?0?passes_two at 4HA":
 ; CHECK: pushl %ebp
 ; CHECK: subl $8, %esp
-; CHECK: addl $16, %ebp
+; CHECK: addl $12, %ebp
 ; CHECK: {{movl|leal}} -{{[0-9]+}}(%ebp), %ecx
 ; CHECK: calll "??1A@@QAE at XZ"
 ; CHECK: addl $8, %esp
Index: llvm/trunk/lib/CodeGen/PrologEpilogInserter.cpp
===================================================================
--- llvm/trunk/lib/CodeGen/PrologEpilogInserter.cpp
+++ llvm/trunk/lib/CodeGen/PrologEpilogInserter.cpp
@@ -709,6 +709,10 @@
 
   SmallVector<int, 8> ObjectsToAllocate;
 
+  int EHRegNodeFrameIndex = INT_MAX;
+  if (const WinEHFuncInfo *FuncInfo = Fn.getWinEHFuncInfo())
+    EHRegNodeFrameIndex = FuncInfo->EHRegNodeFrameIndex;
+
   // Then prepare to assign frame offsets to stack objects that are not used to
   // spill callee saved registers.
   for (unsigned i = 0, e = MFI->getObjectIndexEnd(); i != e; ++i) {
@@ -723,12 +727,20 @@
       continue;
     if (MFI->getStackProtectorIndex() == (int)i)
       continue;
+    if (EHRegNodeFrameIndex == (int)i)
+      continue;
     if (ProtectedObjs.count(i))
       continue;
 
     // Add the objects that we need to allocate to our working set.
     ObjectsToAllocate.push_back(i);
   }
+
+  // Allocate the EH registration node first if one is present.
+  if (EHRegNodeFrameIndex != INT_MAX)
+    AdjustStackOffset(MFI, EHRegNodeFrameIndex, StackGrowsDown, Offset,
+                      MaxAlign, Skew);
+
   // Give the targets a chance to order the objects the way they like it.
   if (Fn.getTarget().getOptLevel() != CodeGenOpt::None &&
       Fn.getTarget().Options.StackSymbolOrdering)
Index: llvm/trunk/lib/CodeGen/AsmPrinter/WinException.cpp
===================================================================
--- llvm/trunk/lib/CodeGen/AsmPrinter/WinException.cpp
+++ llvm/trunk/lib/CodeGen/AsmPrinter/WinException.cpp
@@ -793,6 +793,7 @@
         const MCExpr *FrameAllocOffsetRef = nullptr;
         if (HT.CatchObj.FrameIndex != INT_MAX) {
           int Offset = getFrameIndexOffset(HT.CatchObj.FrameIndex, FuncInfo);
+          assert(Offset != 0 && "Illegal offset for catch object!");
           FrameAllocOffsetRef = MCConstantExpr::create(Offset, Asm->OutContext);
         } else {
           FrameAllocOffsetRef = MCConstantExpr::create(0, Asm->OutContext);


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D17689.49448.patch
Type: text/x-patch
Size: 3598 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160301/4a0a1805/attachment.bin>


More information about the llvm-commits mailing list