xref: /llvm-project/llvm/test/CodeGen/X86/cfguard-checks-funclet.ll (revision 1d8c8f11699ef03e8cc299245a16b2bd141b2ba7)
1; RUN: llc < %s -mtriple=i686-pc-windows-msvc | FileCheck %s -check-prefix=X86
2; RUN: llc < %s -mtriple=x86_64-pc-windows-msvc | FileCheck %s -check-prefixes=X64
3; Control Flow Guard is currently only available on Windows
4
5; funclets only supported in MSVC env.
6
7; Test that Control Flow Guard Checks are added well for targets in try-catch.
8
9
10declare i32 @target_func()
11
12
13%eh.ThrowInfo = type { i32, ptr, ptr, ptr }
14
15declare i32 @__CxxFrameHandler3(...)
16declare void @_CxxThrowException(ptr, ptr)
17
18define i32 @func_cf_exception() personality ptr @__CxxFrameHandler3 {
19entry:
20  %func_ptr = alloca ptr, align 8
21  store ptr @target_func, ptr %func_ptr, align 8
22  invoke void @_CxxThrowException(ptr null, ptr null) #11
23          to label %unreachable unwind label %ehcleanup
24
25ehcleanup:
26  %0 = cleanuppad within none []
27  %isnull = icmp eq ptr %func_ptr, null
28  br i1 %isnull, label %exit, label %callfn
29
30callfn:
31  %1 = load ptr, ptr %func_ptr, align 8
32  %2 = call i32 %1() #9 [ "funclet"(token %0) ]
33  br label %exit
34
35exit:
36  cleanupret from %0 unwind label %catch.dispatch
37
38unreachable:
39  unreachable
40
41catch.dispatch:
42  %3 = catchswitch within none [label %catch] unwind to caller
43
44catch:
45  %4 = catchpad within %3 [ptr null, i32 64, ptr null]
46  catchret from %4 to label %try.cont
47
48try.cont:
49  ret i32 0
50
51  ; X86-LABEL: func_cf_exception
52  ; X86:         calll *___guard_check_icall_fptr
53  ; X86-NEXT:    calll *%ecx
54
55  ; X64-LABEL: func_cf_exception
56  ; X64:       callq *__guard_dispatch_icall_fptr(%rip)
57  ; X64-NOT:   callq
58}
59
60
61!llvm.module.flags = !{!0}
62!0 = !{i32 2, !"cfguard", i32 2}
63