; RUN: llc -verify-machineinstrs < %s | FileCheck %s | |
; CHECK-LABEL: "$cppxdata$?crash@@YAXH@Z": | |
; CHECK: .long ("$stateUnwindMap$?crash@@YAXH@Z") | |
; CHECK: .long ("$ip2state$?crash@@YAXH@Z") | |
; CHECK-LABEL: "$stateUnwindMap$?crash@@YAXH@Z": | |
; CHECK: .long -1 | |
; CHECK: .long "?dtor$ | |
; CHECK: .long 0 | |
; CHECK: .long "?dtor$ | |
; CHECK: .long 1 | |
; CHECK: .long "?dtor$ | |
; CHECK-LABEL: "$ip2state$?crash@@YAXH@Z": | |
; CHECK-NEXT: .long .Lfunc_begin0@IMGREL | |
; CHECK-NEXT: .long -1 | |
; CHECK-NEXT: .long .Ltmp | |
; CHECK-NEXT: .long 0 | |
; CHECK-NEXT: .long .Ltmp | |
; CHECK-NEXT: .long 1 | |
; CHECK-NEXT: .long .Ltmp | |
; CHECK-NEXT: .long 2 | |
; CHECK-NEXT: .long .Ltmp | |
; CHECK-NEXT: .long 1 | |
; CHECK-NEXT: .long .Ltmp | |
; CHECK-NEXT: .long 0 | |
; CHECK-NEXT: .long .Ltmp | |
; CHECK-NEXT: .long -1 | |
; ModuleID = 'windows-seh-EHa-CppDtors01.cpp' | |
source_filename = "windows-seh-EHa-CppDtors01.cpp" | |
target datalayout = "e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" | |
target triple = "x86_64-unknown-windows-msvc" | |
%struct.A = type { i8 } | |
%struct.B = type { i8 } | |
%struct.C = type { i8 } | |
$"??_C@_0CM@KAOHJHDK@?5Test?5CPP?5unwind?3?5in?5catch?5handl@" = comdat any | |
$"??_C@_0N@FCCEEGKL@?5in?5C?5dtor?5?6?$AA@" = comdat any | |
$"??_C@_0N@EFFPFCOI@?5in?5B?5dtor?5?6?$AA@" = comdat any | |
$"??_C@_0N@HMNCGOCN@?5in?5A?5dtor?5?6?$AA@" = comdat any | |
@"?g@@3HA" = dso_local global i32 0, align 4 | |
@"??_C@_0CM@KAOHJHDK@?5Test?5CPP?5unwind?3?5in?5catch?5handl@" = linkonce_odr dso_local unnamed_addr constant [44 x i8] c" Test CPP unwind: in catch handler i = %d \0A\00", comdat, align 1 | |
@"??_C@_0N@FCCEEGKL@?5in?5C?5dtor?5?6?$AA@" = linkonce_odr dso_local unnamed_addr constant [13 x i8] c" in C dtor \0A\00", comdat, align 1 | |
@"??_C@_0N@EFFPFCOI@?5in?5B?5dtor?5?6?$AA@" = linkonce_odr dso_local unnamed_addr constant [13 x i8] c" in B dtor \0A\00", comdat, align 1 | |
@"??_C@_0N@HMNCGOCN@?5in?5A?5dtor?5?6?$AA@" = linkonce_odr dso_local unnamed_addr constant [13 x i8] c" in A dtor \0A\00", comdat, align 1 | |
; Function Attrs: noinline optnone | |
define dso_local void @"?crash@@YAXH@Z"(i32 %i) #0 personality i8* bitcast (i32 (...)* @__CxxFrameHandler3 to i8*) { | |
entry: | |
%i.addr = alloca i32, align 4 | |
%ObjA = alloca %struct.A, align 1 | |
%ObjB = alloca %struct.B, align 1 | |
%ObjC = alloca %struct.C, align 1 | |
store i32 %i, i32* %i.addr, align 4 | |
invoke void @llvm.seh.scope.begin() | |
to label %invoke.cont unwind label %ehcleanup13 | |
invoke.cont: ; preds = %entry | |
%0 = load i32, i32* %i.addr, align 4 | |
%cmp = icmp eq i32 %0, 0 | |
br i1 %cmp, label %if.then, label %if.end | |
if.then: ; preds = %invoke.cont | |
store volatile i32 0, i32* inttoptr (i64 17 to i32*), align 4 | |
br label %if.end | |
if.end: ; preds = %if.then, %invoke.cont | |
invoke void @llvm.seh.scope.begin() | |
to label %invoke.cont1 unwind label %ehcleanup11 | |
invoke.cont1: ; preds = %if.end | |
%1 = load i32, i32* %i.addr, align 4 | |
%cmp2 = icmp eq i32 %1, 1 | |
br i1 %cmp2, label %if.then3, label %if.end4 | |
if.then3: ; preds = %invoke.cont1 | |
store volatile i32 0, i32* inttoptr (i64 17 to i32*), align 4 | |
br label %if.end4 | |
if.end4: ; preds = %if.then3, %invoke.cont1 | |
invoke void @llvm.seh.scope.begin() | |
to label %invoke.cont5 unwind label %ehcleanup | |
invoke.cont5: ; preds = %if.end4 | |
%2 = load i32, i32* %i.addr, align 4 | |
%cmp6 = icmp eq i32 %2, 2 | |
br i1 %cmp6, label %if.then7, label %if.end8 | |
if.then7: ; preds = %invoke.cont5 | |
store volatile i32 0, i32* inttoptr (i64 17 to i32*), align 4 | |
br label %if.end8 | |
if.end8: ; preds = %if.then7, %invoke.cont5 | |
invoke void @llvm.seh.scope.end() | |
to label %invoke.cont9 unwind label %ehcleanup | |
invoke.cont9: ; preds = %if.end8 | |
call void @"??1C@?1??crash@@YAXH@Z@QEAA@XZ"(%struct.C* %ObjC) #6 | |
invoke void @llvm.seh.scope.end() | |
to label %invoke.cont10 unwind label %ehcleanup11 | |
invoke.cont10: ; preds = %invoke.cont9 | |
call void @"??1B@?1??crash@@YAXH@Z@QEAA@XZ"(%struct.B* %ObjB) #6 | |
invoke void @llvm.seh.scope.end() | |
to label %invoke.cont12 unwind label %ehcleanup13 | |
invoke.cont12: ; preds = %invoke.cont10 | |
call void @"??1A@?1??crash@@YAXH@Z@QEAA@XZ"(%struct.A* %ObjA) #6 | |
ret void | |
ehcleanup: ; preds = %if.end8, %if.end4 | |
%3 = cleanuppad within none [] | |
call void @"??1C@?1??crash@@YAXH@Z@QEAA@XZ"(%struct.C* %ObjC) #6 [ "funclet"(token %3) ] | |
cleanupret from %3 unwind label %ehcleanup11 | |
ehcleanup11: ; preds = %invoke.cont9, %ehcleanup, %if.end | |
%4 = cleanuppad within none [] | |
call void @"??1B@?1??crash@@YAXH@Z@QEAA@XZ"(%struct.B* %ObjB) #6 [ "funclet"(token %4) ] | |
cleanupret from %4 unwind label %ehcleanup13 | |
ehcleanup13: ; preds = %invoke.cont10, %ehcleanup11, %entry | |
%5 = cleanuppad within none [] | |
call void @"??1A@?1??crash@@YAXH@Z@QEAA@XZ"(%struct.A* %ObjA) #6 [ "funclet"(token %5) ] | |
cleanupret from %5 unwind to caller | |
} | |
; Function Attrs: nounwind readnone | |
declare dso_local void @llvm.seh.scope.begin() #1 | |
declare dso_local i32 @__CxxFrameHandler3(...) | |
; Function Attrs: nounwind readnone | |
declare dso_local void @llvm.seh.scope.end() #1 | |
; Function Attrs: noinline nounwind optnone | |
define internal void @"??1C@?1??crash@@YAXH@Z@QEAA@XZ"(%struct.C* %this) unnamed_addr #2 align 2 { | |
entry: | |
%this.addr = alloca %struct.C*, align 8 | |
store %struct.C* %this, %struct.C** %this.addr, align 8 | |
%this1 = load %struct.C*, %struct.C** %this.addr, align 8 | |
call void (...) @"?printf@@YAXZZ"(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @"??_C@_0N@FCCEEGKL@?5in?5C?5dtor?5?6?$AA@", i64 0, i64 0)) | |
ret void | |
} | |
; Function Attrs: noinline nounwind optnone | |
define internal void @"??1B@?1??crash@@YAXH@Z@QEAA@XZ"(%struct.B* %this) unnamed_addr #2 align 2 { | |
entry: | |
%this.addr = alloca %struct.B*, align 8 | |
store %struct.B* %this, %struct.B** %this.addr, align 8 | |
%this1 = load %struct.B*, %struct.B** %this.addr, align 8 | |
call void (...) @"?printf@@YAXZZ"(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @"??_C@_0N@EFFPFCOI@?5in?5B?5dtor?5?6?$AA@", i64 0, i64 0)) | |
ret void | |
} | |
; Function Attrs: noinline nounwind optnone | |
define internal void @"??1A@?1??crash@@YAXH@Z@QEAA@XZ"(%struct.A* %this) unnamed_addr #2 align 2 { | |
entry: | |
%this.addr = alloca %struct.A*, align 8 | |
store %struct.A* %this, %struct.A** %this.addr, align 8 | |
%this1 = load %struct.A*, %struct.A** %this.addr, align 8 | |
call void (...) @"?printf@@YAXZZ"(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @"??_C@_0N@HMNCGOCN@?5in?5A?5dtor?5?6?$AA@", i64 0, i64 0)) | |
ret void | |
} | |
; Function Attrs: noinline norecurse optnone | |
define dso_local i32 @main() #3 personality i8* bitcast (i32 (...)* @__C_specific_handler to i8*) { | |
entry: | |
%retval = alloca i32, align 4 | |
%i = alloca i32, align 4 | |
%__exception_code = alloca i32, align 4 | |
store i32 0, i32* %retval, align 4 | |
store i32 0, i32* %i, align 4 | |
br label %for.cond | |
for.cond: ; preds = %for.inc, %entry | |
%0 = load i32, i32* %i, align 4 | |
%cmp = icmp slt i32 %0, 3 | |
br i1 %cmp, label %for.body, label %for.end | |
for.body: ; preds = %for.cond | |
invoke void @llvm.seh.try.begin() | |
to label %invoke.cont unwind label %catch.dispatch | |
invoke.cont: ; preds = %for.body | |
%1 = load volatile i32, i32* %i, align 4 | |
invoke void @"?crash@@YAXH@Z"(i32 %1) #7 | |
to label %invoke.cont1 unwind label %catch.dispatch | |
invoke.cont1: ; preds = %invoke.cont | |
invoke void @llvm.seh.try.end() | |
to label %invoke.cont2 unwind label %catch.dispatch | |
catch.dispatch: ; preds = %invoke.cont1, %invoke.cont, %for.body | |
%2 = catchswitch within none [label %__except] unwind to caller | |
__except: ; preds = %catch.dispatch | |
%3 = catchpad within %2 [i8* null] | |
catchret from %3 to label %__except3 | |
__except3: ; preds = %__except | |
%4 = call i32 @llvm.eh.exceptioncode(token %3) | |
store i32 %4, i32* %__exception_code, align 4 | |
%5 = load i32, i32* %i, align 4 | |
call void (...) @"?printf@@YAXZZ"(i8* getelementptr inbounds ([44 x i8], [44 x i8]* @"??_C@_0CM@KAOHJHDK@?5Test?5CPP?5unwind?3?5in?5catch?5handl@", i64 0, i64 0), i32 %5) | |
br label %__try.cont | |
__try.cont: ; preds = %__except3, %invoke.cont2 | |
br label %for.inc | |
for.inc: ; preds = %__try.cont | |
%6 = load i32, i32* %i, align 4 | |
%inc = add nsw i32 %6, 1 | |
store i32 %inc, i32* %i, align 4 | |
br label %for.cond | |
invoke.cont2: ; preds = %invoke.cont1 | |
br label %__try.cont | |
for.end: ; preds = %for.cond | |
ret i32 0 | |
} | |
; Function Attrs: nounwind willreturn | |
declare dso_local void @llvm.seh.try.begin() #4 | |
declare dso_local i32 @__C_specific_handler(...) | |
; Function Attrs: nounwind willreturn | |
declare dso_local void @llvm.seh.try.end() #4 | |
; Function Attrs: nounwind readnone | |
declare i32 @llvm.eh.exceptioncode(token) #1 | |
declare dso_local void @"?printf@@YAXZZ"(...) #5 | |
attributes #0 = { noinline optnone "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="none" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-features"="+cx8,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" } | |
attributes #1 = { nounwind readnone } | |
attributes #2 = { noinline nounwind optnone "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="none" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-features"="+cx8,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" } | |
attributes #3 = { noinline norecurse optnone "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="none" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-features"="+cx8,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" } | |
attributes #4 = { nounwind willreturn } | |
attributes #5 = { "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="none" "less-precise-fpmad"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-features"="+cx8,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" } | |
attributes #6 = { nounwind } | |
attributes #7 = { noinline } | |
!llvm.module.flags = !{!0, !1} | |
!0 = !{i32 1, !"wchar_size", i32 2} | |
!1 = !{i32 2, !"eh-asynch", i32 1} |