llvm/test/CodeGen/X86/pr26757.ll
David Majnemer dcae508e2e [WinEH] Allocate the registration node before the catch objects
The CatchObjOffset is relative to the end of the EH registration node
for 32-bit x86 WinEH targets.  A special sentinel value, 0, is used to
indicate that no catch object should be initialized.

This means that a catch object allocated immediately before the
registration node would be assigned a CatchObjOffset of 0, leading the
runtime to believe that a catch object should not be initialized.

To handle this, allocate the registration node prior to any other frame
object.  This will ensure that catch objects will not be allocated
before the registration node.

This fixes PR26757.

Differential Revision: http://reviews.llvm.org/D17689

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@262294 91177308-0d34-0410-b5e6-96231b3b80d8
2016-03-01 04:30:16 +00:00

35 lines
798 B
LLVM

; 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(...)