-; RUN: llc -mtriple=i686-pc-windows-msvc < %s | FileCheck --check-prefix=X86 %s
-; RUN: llc -mtriple=x86_64-pc-windows-msvc < %s | FileCheck --check-prefix=X64 %s
+; RUN: llc -verify-machineinstrs -mtriple=i686-pc-windows-msvc < %s | FileCheck --check-prefix=X86 %s
+; RUN: llc -verify-machineinstrs -mtriple=x86_64-pc-windows-msvc < %s | FileCheck --check-prefix=X64 %s
%struct.Dtor = type { i8 }
ret void
ehcleanup: ; preds = %entry
- %0 = cleanuppad []
- call x86_thiscallcc void @"\01??1Dtor@@QAE@XZ"(%struct.Dtor* %o) #2
- cleanupret %0 unwind to caller
+ %0 = cleanuppad within none []
+ call x86_thiscallcc void @"\01??1Dtor@@QAE@XZ"(%struct.Dtor* %o) #2 [ "funclet"(token %0) ]
+ cleanupret from %0 unwind to caller
}
+; CHECK: simple_cleanup: # @simple_cleanup
+; CHECK: pushq %rbp
+; CHECK: subq $48, %rsp
+; CHECK: leaq 48(%rsp), %rbp
+; CHECK: movq $-2, -8(%rbp)
+; CHECK: movl $1, %ecx
+; CHECK: callq f
+; CHECK: callq "??1Dtor@@QAE@XZ"
+; CHECK: nop
+; CHECK: addq $48, %rsp
+; CHECK: popq %rbp
+; CHECK: retq
+
+; CHECK: "?dtor$2@?0?simple_cleanup@4HA":
+; CHECK: callq "??1Dtor@@QAE@XZ"
+; CHECK: retq
+
+; CHECK: $cppxdata$simple_cleanup:
+; CHECK-NEXT: .long 429065506
+; CHECK-NEXT: .long 1
+; CHECK-NEXT: .long ($stateUnwindMap$simple_cleanup)@IMGREL
+; CHECK-NEXT: .long 0
+; CHECK-NEXT: .long 0
+; CHECK-NEXT: .long 3
+; CHECK-NEXT: .long ($ip2state$simple_cleanup)@IMGREL
+; UnwindHelp offset should match the -2 store above
+; CHECK-NEXT: .long 40
+; CHECK-NEXT: .long 0
+; CHECK-NEXT: .long 1
+
declare void @f(i32) #0
declare i32 @__CxxFrameHandler3(...)
ret void
cleanup.inner: ; preds = %invoke.cont
- %0 = cleanuppad []
- call x86_thiscallcc void @"\01??1Dtor@@QAE@XZ"(%struct.Dtor* %o2) #2
- cleanupret %0 unwind label %cleanup.outer
+ %0 = cleanuppad within none []
+ call x86_thiscallcc void @"\01??1Dtor@@QAE@XZ"(%struct.Dtor* %o2) #2 [ "funclet"(token %0) ]
+ cleanupret from %0 unwind label %cleanup.outer
cleanup.outer: ; preds = %invoke.cont.1, %cleanup.inner, %entry
- %1 = cleanuppad []
- call x86_thiscallcc void @"\01??1Dtor@@QAE@XZ"(%struct.Dtor* %o1) #2
- cleanupret %1 unwind to caller
+ %1 = cleanuppad within none []
+ call x86_thiscallcc void @"\01??1Dtor@@QAE@XZ"(%struct.Dtor* %o1) #2 [ "funclet"(token %1) ]
+ cleanupret from %1 unwind to caller
}
; X86-LABEL: _nested_cleanup:
; X64-LABEL: nested_cleanup:
; X64: .Lfunc_begin1:
-; X64: .Ltmp14:
+; X64: .Ltmp13:
; X64: movl $1, %ecx
; X64: callq f
-; X64: .Ltmp16:
+; X64: .Ltmp15:
; X64: movl $2, %ecx
; X64: callq f
-; X64: .Ltmp17:
+; X64: .Ltmp16:
; X64: callq "??1Dtor@@QAE@XZ"
-; X64: .Ltmp18:
+; X64: .Ltmp17:
; X64: movl $3, %ecx
; X64: callq f
-; X64: .Ltmp19:
+; X64: .Ltmp18:
; X64: "?dtor$[[cleanup_inner:[0-9]+]]@?0?nested_cleanup@4HA":
; X64: LBB1_[[cleanup_inner]]: # %cleanup.inner{{$}}
; X64-NEXT: .long 0
; X64-NEXT: .long 5
; X64-NEXT: .long ($ip2state$nested_cleanup)@IMGREL
-; X64-NEXT: .long 40
+; X64-NEXT: .long 56
; X64-NEXT: .long 0
; X64-NEXT: .long 1
; X64: $ip2state$nested_cleanup:
; X64-NEXT: .long .Lfunc_begin1@IMGREL
; X64-NEXT: .long -1
-; X64-NEXT: .long .Ltmp14@IMGREL
+; X64-NEXT: .long .Ltmp13@IMGREL
; X64-NEXT: .long 0
-; X64-NEXT: .long .Ltmp16@IMGREL
+; X64-NEXT: .long .Ltmp15@IMGREL
; X64-NEXT: .long 1
-; X64-NEXT: .long .Ltmp18@IMGREL
+; X64-NEXT: .long .Ltmp17@IMGREL
; X64-NEXT: .long 0
-; X64-NEXT: .long .Ltmp19@IMGREL+1
+; X64-NEXT: .long .Ltmp18@IMGREL+1
; X64-NEXT: .long -1
attributes #0 = { "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-realign-stack" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }