[WinEH] Use operand bundles to describe call sites
[oota-llvm.git] / test / CodeGen / X86 / win-cleanuppad.ll
index 02ead25603fbc4d0ddf91c1f8515b1444b2c709e..4b0a543a876a755fdb18b36ddabf696ad038580e 100644 (file)
@@ -1,5 +1,5 @@
-; 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 }
 
@@ -14,11 +14,41 @@ invoke.cont:                                      ; preds = %entry
   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(...)
@@ -47,14 +77,14 @@ invoke.cont.2:                                    ; preds = %invoke.cont.1
   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:
@@ -99,18 +129,18 @@ cleanup.outer:                                      ; preds = %invoke.cont.1, %c
 
 ; 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{{$}}
@@ -142,7 +172,7 @@ cleanup.outer:                                      ; preds = %invoke.cont.1, %c
 ; 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
 
@@ -155,13 +185,13 @@ cleanup.outer:                                      ; preds = %invoke.cont.1, %c
 ; 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" }