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); Index: llvm/trunk/lib/CodeGen/PrologEpilogInserter.cpp =================================================================== --- llvm/trunk/lib/CodeGen/PrologEpilogInserter.cpp +++ llvm/trunk/lib/CodeGen/PrologEpilogInserter.cpp @@ -709,6 +709,10 @@ SmallVector 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/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@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@XZ" ; CHECK: addl $8, %esp 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(...)