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
-r | 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-NEXT
: Relocations
[
38 // CHECK-NEXT
: Section
(4) .xdata {
39 // CHECK-NEXT
: 0x14 IMAGE_REL_AMD64_ADDR32NB __C_specific_handler
40 // CHECK-NEXT
: 0x20 IMAGE_REL_AMD64_ADDR32NB func
41 // CHECK-NEXT
: 0x24 IMAGE_REL_AMD64_ADDR32NB func
42 // CHECK-NEXT
: 0x28 IMAGE_REL_AMD64_ADDR32NB
.xdata
44 // CHECK-NEXT
: Section
(5) .pdata {
45 // CHECK-NEXT
: 0x0 IMAGE_REL_AMD64_ADDR32NB func
46 // CHECK-NEXT
: 0x4 IMAGE_REL_AMD64_ADDR32NB func
47 // CHECK-NEXT
: 0x8 IMAGE_REL_AMD64_ADDR32NB
.xdata
48 // CHECK-NEXT
: 0xC IMAGE_REL_AMD64_ADDR32NB func
49 // CHECK-NEXT
: 0x10 IMAGE_REL_AMD64_ADDR32NB func
50 // CHECK-NEXT
: 0x14 IMAGE_REL_AMD64_ADDR32NB
.xdata
51 // CHECK-NEXT
: 0x18 IMAGE_REL_AMD64_ADDR32NB smallFunc
52 // CHECK-NEXT
: 0x1C IMAGE_REL_AMD64_ADDR32NB smallFunc
53 // CHECK-NEXT
: 0x20 IMAGE_REL_AMD64_ADDR32NB
.xdata
58 // CHECK
: UnwindInformation
[
59 // CHECK-NEXT
: RuntimeFunction
{
60 // CHECK-NEXT
: StartAddress
: [[CodeSect1
:[^
]+]] [[BeginDisp1
:(\
+0x
[A-F0-
9]+)?
]]
61 // CHECK-NEXT
: EndAddress
: [[CodeSect1
]] [[EndDisp1
:(\
+0x
[A-F0-
9]+)?
]]
62 // CHECK-NEXT
: UnwindInfoAddress
:
63 // CHECK-NEXT
: UnwindInfo
{
64 // CHECK-NEXT
: Version
: 1
65 // CHECK-NEXT
: Flags
[
66 // CHECK-NEXT
: ExceptionHandler
68 // CHECK-NEXT
: PrologSize
: 18
69 // CHECK-NEXT
: FrameRegister
: RBX
70 // CHECK-NEXT
: FrameOffset
: 0x0
71 // CHECK-NEXT
: UnwindCodeCount
: 8
72 // CHECK-NEXT
: UnwindCodes
[
73 // CHECK-NEXT
: 0x12: SET_FPREG reg
=RBX
, offset
=0x0
74 // CHECK-NEXT
: 0x0F: PUSH_NONVOL reg
=RBX
75 // CHECK-NEXT
: 0x0E: SAVE_XMM128 reg
=XMM8
, offset
=0x0
76 // CHECK-NEXT
: 0x09: SAVE_NONVOL reg
=RSI
, offset
=0x10
77 // CHECK-NEXT
: 0x04: ALLOC_SMALL size
=24
78 // CHECK-NEXT
: 0x00: PUSH_MACHFRAME errcode
=yes
80 // CHECK-NEXT
: Handler
: __C_specific_handler
83 // CHECK-NEXT
: RuntimeFunction
{
84 // CHECK-NEXT
: StartAddress
: [[CodeSect2
:[^
]+]] [[BeginDisp2
:(\
+0x
[A-F0-
9]+)?
]]
85 // CHECK-NEXT
: EndAddress
: [[CodeSect2
]] [[BeginDisp2
:(\
+0x
[A-F0-
9]+)?
]]
86 // CHECK-NEXT
: UnwindInfoAddress
:
87 // CHECK-NEXT
: UnwindInfo
{
88 // CHECK-NEXT
: Version
: 1
89 // CHECK-NEXT
: Flags
[
90 // CHECK-NEXT
: ChainInfo
92 // CHECK-NEXT
: PrologSize
: 0
93 // CHECK-NEXT
: FrameRegister
: -
94 // CHECK-NEXT
: FrameOffset
: -
95 // CHECK-NEXT
: UnwindCodeCount
: 0
96 // CHECK-NEXT
: UnwindCodes
[
98 // CHECK-NEXT
: Chained
{
99 // CHECK-NEXT
: StartAddress
: [[CodeSect1
]] [[BeginDisp1
]]
100 // CHECK-NEXT
: EndAddress
: [[CodeSect1
]] [[EndDisp1
]]
101 // CHECK-NEXT
: UnwindInfoAddress
:
105 // CHECK-NEXT
: RuntimeFunction
{
106 // CHECK-NEXT
: StartAddress
: [[CodeSect3
:[^
]+]] [[BeginDisp3
:(\
+0x
[A-F0-
9]+)?
]]
107 // CHECK-NEXT
: EndAddress
: [[CodeSect3
]] [[BeginDisp3
:(\
+0x
[A-F0-
9]+)?
]]
108 // CHECK-NEXT
: UnwindInfoAddress
:
109 // CHECK-NEXT
: UnwindInfo
{
110 // CHECK-NEXT
: Version
: 1
111 // CHECK-NEXT
: Flags
[
113 // CHECK-NEXT
: PrologSize
: 0
114 // CHECK-NEXT
: FrameRegister
: -
115 // CHECK-NEXT
: FrameOffset
: -
116 // CHECK-NEXT
: UnwindCodeCount
: 0
117 // CHECK-NEXT
: UnwindCodes
[
125 .def func; .scl 2; .type 32; .endef
132 .seh_savereg %rsi, 16
134 .seh_savexmm %xmm8, 0
140 .seh_handler __C_specific_handler, @except
153 // Test emission of small functions.
155 .def smallFunc; .scl 2; .type 32; .endef