1 // This test checks that the SEH directives emit the correct unwind data.
3 // RUN: llvm-mc -triple x86_64-pc-win32 -filetype=obj %s | llvm-readobj -s -u | FileCheck %s
8 // CHECK: RelocationCount: 0
9 // CHECK: Characteristics [
10 // CHECK-NEXT: ALIGN_4BYTES
11 // CHECK-NEXT: CNT_CODE
12 // CHECK-NEXT: MEM_EXECUTE
13 // CHECK-NEXT: MEM_READ
17 // CHECK: Name: .xdata
18 // CHECK: RawDataSize: 52
19 // CHECK: RelocationCount: 4
20 // CHECK: Characteristics [
21 // CHECK-NEXT: ALIGN_4BYTES
22 // CHECK-NEXT: CNT_INITIALIZED_DATA
23 // CHECK-NEXT: MEM_READ
27 // CHECK: Name: .pdata
28 // CHECK: RelocationCount: 9
29 // CHECK: Characteristics [
30 // CHECK-NEXT: ALIGN_4BYTES
31 // CHECK-NEXT: CNT_INITIALIZED_DATA
32 // CHECK-NEXT: MEM_READ
37 // CHECK: UnwindInformation [
38 // CHECK-NEXT: RuntimeFunction {
39 // CHECK-NEXT: StartAddress: [[CodeSect1:[^ ]+]] [[BeginDisp1:(\+0x[A-F0-9]+)?]]
40 // CHECK-NEXT: EndAddress: [[CodeSect1]] [[EndDisp1:(\+0x[A-F0-9]+)?]]
41 // CHECK-NEXT: UnwindInfoAddress:
42 // CHECK-NEXT: UnwindInfo {
43 // CHECK-NEXT: Version: 1
44 // CHECK-NEXT: Flags [
45 // CHECK-NEXT: ExceptionHandler
47 // CHECK-NEXT: PrologSize: 18
48 // CHECK-NEXT: FrameRegister: RBX
49 // CHECK-NEXT: FrameOffset: 0x0
50 // CHECK-NEXT: UnwindCodeCount: 8
51 // CHECK-NEXT: UnwindCodes [
52 // CHECK-NEXT: 0x12: SET_FPREG reg=RBX, offset=0x0
53 // CHECK-NEXT: 0x0F: PUSH_NONVOL reg=RBX
54 // CHECK-NEXT: 0x0E: SAVE_XMM128 reg=XMM8, offset=0x0
55 // CHECK-NEXT: 0x09: SAVE_NONVOL reg=RSI, offset=0x10
56 // CHECK-NEXT: 0x04: ALLOC_SMALL size=24
57 // CHECK-NEXT: 0x00: PUSH_MACHFRAME errcode=yes
59 // CHECK-NEXT: Handler: __C_specific_handler
62 // CHECK-NEXT: RuntimeFunction {
63 // CHECK-NEXT: StartAddress: [[CodeSect2:[^ ]+]] [[BeginDisp2:(\+0x[A-F0-9]+)?]]
64 // CHECK-NEXT: EndAddress: [[CodeSect2]] [[BeginDisp2:(\+0x[A-F0-9]+)?]]
65 // CHECK-NEXT: UnwindInfoAddress:
66 // CHECK-NEXT: UnwindInfo {
67 // CHECK-NEXT: Version: 1
68 // CHECK-NEXT: Flags [
69 // CHECK-NEXT: ChainInfo
71 // CHECK-NEXT: PrologSize: 0
72 // CHECK-NEXT: FrameRegister: -
73 // CHECK-NEXT: FrameOffset: -
74 // CHECK-NEXT: UnwindCodeCount: 0
75 // CHECK-NEXT: UnwindCodes [
77 // CHECK-NEXT: Chained {
78 // CHECK-NEXT: StartAddress: [[CodeSect1]] [[BeginDisp1]]
79 // CHECK-NEXT: EndAddress: [[CodeSect1]] [[EndDisp1]]
80 // CHECK-NEXT: UnwindInfoAddress:
84 // CHECK-NEXT: RuntimeFunction {
85 // CHECK-NEXT: StartAddress: [[CodeSect3:[^ ]+]] [[BeginDisp3:(\+0x[A-F0-9]+)?]]
86 // CHECK-NEXT: EndAddress: [[CodeSect3]] [[BeginDisp3:(\+0x[A-F0-9]+)?]]
87 // CHECK-NEXT: UnwindInfoAddress:
88 // CHECK-NEXT: UnwindInfo {
89 // CHECK-NEXT: Version: 1
90 // CHECK-NEXT: Flags [
92 // CHECK-NEXT: PrologSize: 0
93 // CHECK-NEXT: FrameRegister: -
94 // CHECK-NEXT: FrameOffset: -
95 // CHECK-NEXT: UnwindCodeCount: 0
96 // CHECK-NEXT: UnwindCodes [
104 .def func; .scl 2; .type 32; .endef
111 .seh_savereg %rsi, 16
113 .seh_savexmm %xmm8, 0
119 .seh_handler __C_specific_handler, @except
132 // Test emission of small functions.
134 .def smallFunc; .scl 2; .type 32; .endef