xref: /aosp_15_r20/external/llvm/test/MC/COFF/seh.s (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker// This test checks that the SEH directives emit the correct unwind data.
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker// RUN: llvm-mc -triple x86_64-pc-win32 -filetype=obj %s | llvm-readobj -s -u -r | FileCheck %s
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker// CHECK:      Sections [
6*9880d681SAndroid Build Coastguard Worker// CHECK:        Section {
7*9880d681SAndroid Build Coastguard Worker// CHECK:          Name: .text
8*9880d681SAndroid Build Coastguard Worker// CHECK:          RelocationCount: 0
9*9880d681SAndroid Build Coastguard Worker// CHECK:          Characteristics [
10*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:       ALIGN_4BYTES
11*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:       CNT_CODE
12*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:       MEM_EXECUTE
13*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:       MEM_READ
14*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:     ]
15*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:   }
16*9880d681SAndroid Build Coastguard Worker// CHECK:        Section {
17*9880d681SAndroid Build Coastguard Worker// CHECK:          Name: .xdata
18*9880d681SAndroid Build Coastguard Worker// CHECK:          RawDataSize: 52
19*9880d681SAndroid Build Coastguard Worker// CHECK:          RelocationCount: 4
20*9880d681SAndroid Build Coastguard Worker// CHECK:          Characteristics [
21*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:       ALIGN_4BYTES
22*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:       CNT_INITIALIZED_DATA
23*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:       MEM_READ
24*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:     ]
25*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:   }
26*9880d681SAndroid Build Coastguard Worker// CHECK:        Section {
27*9880d681SAndroid Build Coastguard Worker// CHECK:          Name: .pdata
28*9880d681SAndroid Build Coastguard Worker// CHECK:          RelocationCount: 9
29*9880d681SAndroid Build Coastguard Worker// CHECK:          Characteristics [
30*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:       ALIGN_4BYTES
31*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:       CNT_INITIALIZED_DATA
32*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:       MEM_READ
33*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:     ]
34*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:   }
35*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: ]
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: Relocations [
38*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:   Section (4) .xdata {
39*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:     0x14 IMAGE_REL_AMD64_ADDR32NB __C_specific_handler
40*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:     0x20 IMAGE_REL_AMD64_ADDR32NB func
41*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:     0x24 IMAGE_REL_AMD64_ADDR32NB func
42*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:     0x28 IMAGE_REL_AMD64_ADDR32NB .xdata
43*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:   }
44*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:   Section (5) .pdata {
45*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:     0x0 IMAGE_REL_AMD64_ADDR32NB func
46*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:     0x4 IMAGE_REL_AMD64_ADDR32NB func
47*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:     0x8 IMAGE_REL_AMD64_ADDR32NB .xdata
48*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:     0xC IMAGE_REL_AMD64_ADDR32NB func
49*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:     0x10 IMAGE_REL_AMD64_ADDR32NB func
50*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:     0x14 IMAGE_REL_AMD64_ADDR32NB .xdata
51*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:     0x18 IMAGE_REL_AMD64_ADDR32NB smallFunc
52*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:     0x1C IMAGE_REL_AMD64_ADDR32NB smallFunc
53*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:     0x20 IMAGE_REL_AMD64_ADDR32NB .xdata
54*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:   }
55*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: ]
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard Worker
58*9880d681SAndroid Build Coastguard Worker// CHECK:      UnwindInformation [
59*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:   RuntimeFunction {
60*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:     StartAddress: [[CodeSect1:[^ ]+]] [[BeginDisp1:(\+0x[A-F0-9]+)?]]
61*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:     EndAddress: [[CodeSect1]] [[EndDisp1:(\+0x[A-F0-9]+)?]]
62*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:     UnwindInfoAddress:
63*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:     UnwindInfo {
64*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:       Version: 1
65*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:       Flags [
66*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:         ExceptionHandler
67*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:       ]
68*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:       PrologSize: 18
69*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:       FrameRegister: RBX
70*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:       FrameOffset: 0x0
71*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:       UnwindCodeCount: 8
72*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:       UnwindCodes [
73*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:         0x12: SET_FPREG reg=RBX, offset=0x0
74*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:         0x0F: PUSH_NONVOL reg=RBX
75*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:         0x0E: SAVE_XMM128 reg=XMM8, offset=0x0
76*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:         0x09: SAVE_NONVOL reg=RSI, offset=0x10
77*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:         0x04: ALLOC_SMALL size=24
78*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:         0x00: PUSH_MACHFRAME errcode=yes
79*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:       ]
80*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:       Handler: __C_specific_handler
81*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:     }
82*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:   }
83*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:   RuntimeFunction {
84*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:     StartAddress: [[CodeSect2:[^ ]+]] [[BeginDisp2:(\+0x[A-F0-9]+)?]]
85*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:     EndAddress: [[CodeSect2]] [[BeginDisp2:(\+0x[A-F0-9]+)?]]
86*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:     UnwindInfoAddress:
87*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:     UnwindInfo {
88*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:       Version: 1
89*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:       Flags [
90*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:         ChainInfo
91*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:       ]
92*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:       PrologSize: 0
93*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:       FrameRegister: -
94*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:       FrameOffset: -
95*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:       UnwindCodeCount: 0
96*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:       UnwindCodes [
97*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:       ]
98*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:       Chained {
99*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:         StartAddress: [[CodeSect1]] [[BeginDisp1]]
100*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:         EndAddress: [[CodeSect1]] [[EndDisp1]]
101*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:         UnwindInfoAddress:
102*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:       }
103*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:     }
104*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:   }
105*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:   RuntimeFunction {
106*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:     StartAddress: [[CodeSect3:[^ ]+]] [[BeginDisp3:(\+0x[A-F0-9]+)?]]
107*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:     EndAddress: [[CodeSect3]] [[BeginDisp3:(\+0x[A-F0-9]+)?]]
108*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:     UnwindInfoAddress:
109*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:     UnwindInfo {
110*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:       Version: 1
111*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:       Flags [
112*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:       ]
113*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:       PrologSize: 0
114*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:       FrameRegister: -
115*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:       FrameOffset: -
116*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:       UnwindCodeCount: 0
117*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:       UnwindCodes [
118*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:       ]
119*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:     }
120*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT:   }
121*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: ]
122*9880d681SAndroid Build Coastguard Worker
123*9880d681SAndroid Build Coastguard Worker    .text
124*9880d681SAndroid Build Coastguard Worker    .globl func
125*9880d681SAndroid Build Coastguard Worker    .def func; .scl 2; .type 32; .endef
126*9880d681SAndroid Build Coastguard Worker    .seh_proc func
127*9880d681SAndroid Build Coastguard Workerfunc:
128*9880d681SAndroid Build Coastguard Worker    .seh_pushframe @code
129*9880d681SAndroid Build Coastguard Worker    subq $24, %rsp
130*9880d681SAndroid Build Coastguard Worker    .seh_stackalloc 24
131*9880d681SAndroid Build Coastguard Worker    movq %rsi, 16(%rsp)
132*9880d681SAndroid Build Coastguard Worker    .seh_savereg %rsi, 16
133*9880d681SAndroid Build Coastguard Worker    movups %xmm8, (%rsp)
134*9880d681SAndroid Build Coastguard Worker    .seh_savexmm %xmm8, 0
135*9880d681SAndroid Build Coastguard Worker    pushq %rbx
136*9880d681SAndroid Build Coastguard Worker    .seh_pushreg 3
137*9880d681SAndroid Build Coastguard Worker    mov %rsp, %rbx
138*9880d681SAndroid Build Coastguard Worker    .seh_setframe 3, 0
139*9880d681SAndroid Build Coastguard Worker    .seh_endprologue
140*9880d681SAndroid Build Coastguard Worker    .seh_handler __C_specific_handler, @except
141*9880d681SAndroid Build Coastguard Worker    .seh_handlerdata
142*9880d681SAndroid Build Coastguard Worker    .long 0
143*9880d681SAndroid Build Coastguard Worker    .text
144*9880d681SAndroid Build Coastguard Worker    .seh_startchained
145*9880d681SAndroid Build Coastguard Worker    .seh_endprologue
146*9880d681SAndroid Build Coastguard Worker    .seh_endchained
147*9880d681SAndroid Build Coastguard Worker    lea (%rbx), %rsp
148*9880d681SAndroid Build Coastguard Worker    pop %rbx
149*9880d681SAndroid Build Coastguard Worker    addq $24, %rsp
150*9880d681SAndroid Build Coastguard Worker    ret
151*9880d681SAndroid Build Coastguard Worker    .seh_endproc
152*9880d681SAndroid Build Coastguard Worker
153*9880d681SAndroid Build Coastguard Worker// Test emission of small functions.
154*9880d681SAndroid Build Coastguard Worker    .globl smallFunc
155*9880d681SAndroid Build Coastguard Worker    .def smallFunc; .scl 2; .type 32; .endef
156*9880d681SAndroid Build Coastguard Worker    .seh_proc smallFunc
157*9880d681SAndroid Build Coastguard WorkersmallFunc:
158*9880d681SAndroid Build Coastguard Worker    ret
159*9880d681SAndroid Build Coastguard Worker    .seh_endproc
160