10 changes: 6 additions & 4 deletions llvm/test/CodeGen/X86/win-catchpad-csrs.ll
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,8 @@ catchendblock: ; preds = %catch,
; X86: addl $12, %ebp
; X86: jmp [[contbb]]

; X86: [[catch1bb:LBB0_[0-9]+]]: # %catch{{$}}
; X86: "?catch$[[catch1bb:[0-9]+]]@?0?try_catch_catch@4HA":
; X86: LBB0_[[catch1bb]]: # %catch{{$}}
; X86: pushl %ebp
; X86-NOT: pushl
; X86: addl $12, %ebp
Expand All @@ -89,7 +90,7 @@ catchendblock: ; preds = %catch,
; X86: .long 0
; X86: .long "??_R0H@8"
; X86: .long 0
; X86: .long [[catch1bb]]
; X86: .long "?catch$[[catch1bb]]@?0?try_catch_catch@4HA"

; X64-LABEL: try_catch_catch:
; X64: pushq %rbp
Expand All @@ -116,7 +117,8 @@ catchendblock: ; preds = %catch,
; X64: popq %rbp
; X64: retq

; X64: [[catch1bb:\.LBB0_[0-9]+]]: # %catch{{$}}
; X64: "?catch$[[catch1bb:[0-9]+]]@?0?try_catch_catch@4HA":
; X64: LBB0_[[catch1bb]]: # %catch{{$}}
; X64: movq %rdx, 16(%rsp)
; X64: pushq %rbp
; X64: movq %rdx, %rbp
Expand All @@ -132,5 +134,5 @@ catchendblock: ; preds = %catch,
; X64: .long 0
; X64: .long "??_R0H@8"@IMGREL
; X64: .long 0
; X64: .long [[catch1bb]]@IMGREL
; X64: .long "?catch$[[catch1bb]]@?0?try_catch_catch@4HA"@IMGREL
; X64: .long 56
20 changes: 12 additions & 8 deletions llvm/test/CodeGen/X86/win-catchpad.ll
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,8 @@ catchendblock: ; preds = %catch, %catch.2, %c
; X86: addl $12, %ebp
; X86: jmp [[contbb]]

; X86: [[catch1bb:LBB0_[0-9]+]]: # %catch{{$}}
; X86: "?catch$[[catch1bb:[0-9]+]]@?0?try_catch_catch@4HA":
; X86: LBB0_[[catch1bb]]: # %catch{{$}}
; X86: pushl %ebp
; X86: addl $12, %ebp
; X86: subl $8, %esp
Expand All @@ -93,7 +94,8 @@ catchendblock: ; preds = %catch, %catch.2, %c
; X86-NEXT: movl $[[restorebb]], %eax
; X86-NEXT: retl

; X86: [[catch2bb:LBB0_[0-9]+]]: # %catch.2{{$}}
; X86: "?catch$[[catch2bb:[0-9]+]]@?0?try_catch_catch@4HA":
; X86: LBB0_[[catch2bb]]: # %catch.2{{$}}
; X86: pushl %ebp
; X86: addl $12, %ebp
; X86: subl $8, %esp
Expand All @@ -112,11 +114,11 @@ catchendblock: ; preds = %catch, %catch.2, %c
; X86-NEXT: .long 0
; X86-NEXT: .long "??_R0H@8"
; X86-NEXT: .long -20
; X86-NEXT: .long [[catch1bb]]
; X86-NEXT: .long "?catch$[[catch1bb]]@?0?try_catch_catch@4HA"
; X86-NEXT: .long 64
; X86-NEXT: .long 0
; X86-NEXT: .long 0
; X86-NEXT: .long [[catch2bb]]
; X86-NEXT: .long "?catch$[[catch2bb]]@?0?try_catch_catch@4HA"

; X64-LABEL: try_catch_catch:
; X64: Lfunc_begin0:
Expand All @@ -135,7 +137,8 @@ catchendblock: ; preds = %catch, %catch.2, %c
; X64: popq %rbp
; X64: retq

; X64: [[catch1bb:\.LBB0_[0-9]+]]: # %catch{{$}}
; X64: "?catch$[[catch1bb:[0-9]+]]@?0?try_catch_catch@4HA":
; X64: LBB0_[[catch1bb]]: # %catch{{$}}
; X64: movq %rdx, 16(%rsp)
; X64: pushq %rbp
; X64: movq %rdx, %rbp
Expand All @@ -149,7 +152,8 @@ catchendblock: ; preds = %catch, %catch.2, %c
; X64-NEXT: leaq [[contbb]](%rip), %rax
; X64-NEXT: retq

; X64: [[catch2bb:\.LBB0_[0-9]+]]: # %catch.2{{$}}
; X64: "?catch$[[catch2bb:[0-9]+]]@?0?try_catch_catch@4HA":
; X64: LBB0_[[catch2bb]]: # %catch.2{{$}}
; X64: movq %rdx, 16(%rsp)
; X64: pushq %rbp
; X64: movq %rdx, %rbp
Expand Down Expand Up @@ -187,12 +191,12 @@ catchendblock: ; preds = %catch, %catch.2, %c
; X64-NEXT: .long "??_R0H@8"@IMGREL
; FIXME: This should probably be offset from rsp, not rbp.
; X64-NEXT: .long [[e_addr]]
; X64-NEXT: .long [[catch1bb]]@IMGREL
; X64-NEXT: .long "?catch$[[catch1bb]]@?0?try_catch_catch@4HA"@IMGREL
; X64-NEXT: .long 56
; X64-NEXT: .long 64
; X64-NEXT: .long 0
; X64-NEXT: .long 0
; X64-NEXT: .long [[catch2bb]]@IMGREL
; X64-NEXT: .long "?catch$[[catch2bb]]@?0?try_catch_catch@4HA"@IMGREL
; X64-NEXT: .long 56

; X64: $ip2state$try_catch_catch:
Expand Down
45 changes: 26 additions & 19 deletions llvm/test/CodeGen/X86/win-cleanuppad.ll
Original file line number Diff line number Diff line change
Expand Up @@ -65,14 +65,16 @@ cleanup.outer: ; preds = %invoke.cont.1, %c
; X86: movl $3, (%esp)
; X86: calll _f

; X86: LBB1_[[cleanup_inner:[0-9]+]]: # %cleanup.inner
; X86: "?dtor$[[cleanup_inner:[0-9]+]]@?0?nested_cleanup@4HA":
; X86: LBB1_[[cleanup_inner]]: # %cleanup.inner{{$}}
; X86: pushl %ebp
; X86: leal {{.*}}(%ebp), %ecx
; X86: calll "??1Dtor@@QAE@XZ"
; X86: popl %ebp
; X86: retl

; X86: LBB1_[[cleanup_outer:[0-9]+]]: # %cleanup.outer
; X86: "?dtor$[[cleanup_outer:[0-9]+]]@?0?nested_cleanup@4HA":
; X86: LBB1_[[cleanup_outer]]: # %cleanup.outer{{$}}
; X86: pushl %ebp
; X86: leal {{.*}}(%ebp), %ecx
; X86: calll "??1Dtor@@QAE@XZ"
Expand All @@ -91,41 +93,46 @@ cleanup.outer: ; preds = %invoke.cont.1, %c
; X86: .long 1
; X86: $stateUnwindMap$nested_cleanup:
; X86: .long -1
; X86: .long LBB1_[[cleanup_outer]]
; X86: .long "?dtor$[[cleanup_outer]]@?0?nested_cleanup@4HA"
; X86: .long 0
; X86: .long LBB1_[[cleanup_inner]]
; X86: .long "?dtor$[[cleanup_inner]]@?0?nested_cleanup@4HA"

; X64-LABEL: nested_cleanup:
; X64: .Lfunc_begin1:
; X64: .Ltmp8:
; X64: .Ltmp14:
; X64: movl $1, %ecx
; X64: callq f
; X64: .Ltmp10:
; X64: .Ltmp16:
; X64: movl $2, %ecx
; X64: callq f
; X64: .Ltmp11:
; X64: .Ltmp17:
; X64: callq "??1Dtor@@QAE@XZ"
; X64: .Ltmp12:
; X64: .Ltmp18:
; X64: movl $3, %ecx
; X64: callq f
; X64: .Ltmp13:
; X64: .Ltmp19:

; X64: .LBB1_[[cleanup_inner:[0-9]+]]: # %cleanup.inner
; X64: "?dtor$[[cleanup_inner:[0-9]+]]@?0?nested_cleanup@4HA":
; X64: LBB1_[[cleanup_inner]]: # %cleanup.inner{{$}}
; X64: pushq %rbp
; X64: leaq {{.*}}(%rbp), %rcx
; X64: callq "??1Dtor@@QAE@XZ"
; X64: popq %rbp
; X64: retq

; X64: .LBB1_[[cleanup_outer:[0-9]+]]: # %cleanup.outer
; X64: .seh_handlerdata
; X64: .text
; X64: .seh_endproc

; X64: "?dtor$[[cleanup_outer:[0-9]+]]@?0?nested_cleanup@4HA":
; X64: LBB1_[[cleanup_outer]]: # %cleanup.outer{{$}}
; X64: pushq %rbp
; X64: leaq {{.*}}(%rbp), %rcx
; X64: callq "??1Dtor@@QAE@XZ"
; X64: popq %rbp
; X64: retq

; X64: .seh_handlerdata
; X64-NEXT: .long ($cppxdata$nested_cleanup)@IMGREL
; X64: .section .xdata,"dr"
; X64-NEXT: .align 4
; X64: $cppxdata$nested_cleanup:
; X64-NEXT: .long 429065506
Expand All @@ -141,20 +148,20 @@ cleanup.outer: ; preds = %invoke.cont.1, %c

; X64: $stateUnwindMap$nested_cleanup:
; X64-NEXT: .long -1
; X64-NEXT: .long .LBB1_[[cleanup_outer]]@IMGREL
; X64-NEXT: .long "?dtor$[[cleanup_outer]]@?0?nested_cleanup@4HA"@IMGREL
; X64-NEXT: .long 0
; X64-NEXT: .long .LBB1_[[cleanup_inner]]@IMGREL
; X64-NEXT: .long "?dtor$[[cleanup_inner]]@?0?nested_cleanup@4HA"@IMGREL

; X64: $ip2state$nested_cleanup:
; X64-NEXT: .long .Lfunc_begin1@IMGREL
; X64-NEXT: .long -1
; X64-NEXT: .long .Ltmp8@IMGREL
; X64-NEXT: .long .Ltmp14@IMGREL
; X64-NEXT: .long 0
; X64-NEXT: .long .Ltmp10@IMGREL
; X64-NEXT: .long .Ltmp16@IMGREL
; X64-NEXT: .long 1
; X64-NEXT: .long .Ltmp12@IMGREL
; X64-NEXT: .long .Ltmp18@IMGREL
; X64-NEXT: .long 0
; X64-NEXT: .long .Ltmp13@IMGREL+1
; X64-NEXT: .long .Ltmp19@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" }
Expand Down
100 changes: 100 additions & 0 deletions llvm/test/CodeGen/X86/win-funclet-cfi.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
; RUN: llc -mtriple=x86_64-windows-msvc < %s | FileCheck %s

target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-windows-msvc"

define void @"\01?f@@YAXXZ"(i1 %B) personality i32 (...)* @__CxxFrameHandler3 {
entry:
invoke void @g()
to label %unreachable unwind label %cleanupblock

cleanupblock:
%cleanp = cleanuppad []
call void @g()
cleanupret %cleanp unwind label %catch.dispatch

catch.dispatch:
%cp = catchpad [i8* null, i32 64, i8* null]
to label %catch unwind label %catchendblock

catch:
call void @g()
catchret %cp to label %try.cont

try.cont:
ret void

catchendblock:
catchendpad unwind to caller

unreachable:
unreachable
}


declare void @g()

declare i32 @__CxxFrameHandler3(...)

; Destructors need CFI but they shouldn't use the .seh_handler directive.
; CHECK: "?dtor$[[cleanup:[0-9]+]]@?0??f@@YAXXZ@4HA":
; CHECK: .seh_proc "?dtor$[[cleanup]]@?0??f@@YAXXZ@4HA"
; CHECK-NOT: .seh_handler __CxxFrameHandler3
; CHECK: LBB0_[[cleanup]]: # %cleanupblock{{$}}

; Emit CFI for pushing RBP.
; CHECK: movq %rdx, 16(%rsp)
; CHECK: pushq %rbp
; CHECK: .seh_pushreg 5

; Emit CFI for allocating from the stack pointer.
; CHECK: subq $32, %rsp
; CHECK: .seh_stackalloc 32

; FIXME: This looks wrong...
; CHECK: leaq 32(%rsp), %rbp
; CHECK: .seh_setframe 5, 32

; Prologue is done, emit the .seh_endprologue directive.
; CHECK: .seh_endprologue

; Make sure there is a nop after a call if the call precedes the epilogue.
; CHECK: callq g
; CHECK-NEXT: nop

; Don't emit a reference to the LSDA.
; CHECK: .seh_handlerdata
; CHECK-NOT: .long ("$cppxdata$?f@@YAXXZ")@IMGREL
; CHECK-NEXT: .text
; CHECK: .seh_endproc

; CHECK: "?catch$[[catch:[0-9]+]]@?0??f@@YAXXZ@4HA":
; CHECK: .seh_proc "?catch$[[catch]]@?0??f@@YAXXZ@4HA"
; CHECK-NEXT: .seh_handler __CxxFrameHandler3, @unwind, @except
; CHECK: LBB0_[[catch]]: # %catch{{$}}

; Emit CFI for pushing RBP.
; CHECK: movq %rdx, 16(%rsp)
; CHECK: pushq %rbp
; CHECK: .seh_pushreg 5

; Emit CFI for allocating from the stack pointer.
; CHECK: subq $32, %rsp
; CHECK: .seh_stackalloc 32

; FIXME: This looks wrong...
; CHECK: leaq 32(%rsp), %rbp
; CHECK: .seh_setframe 5, 32

; Prologue is done, emit the .seh_endprologue directive.
; CHECK: .seh_endprologue

; Make sure there is a nop after a call if the call precedes the epilogue.
; CHECK: callq g
; CHECK-NEXT: nop

; Emit a reference to the LSDA.
; CHECK: .seh_handlerdata
; CHECK-NEXT: .long ("$cppxdata$?f@@YAXXZ")@IMGREL
; CHECK-NEXT: .text
; CHECK: .seh_endproc