Revert: Generate IMAGE_REL_AMD64_ADDR32NB relocations for SEH data structures.
[oota-llvm.git] / test / MC / COFF / seh.s
1 // This test checks that the SEH directives emit the correct unwind data.
2
3 // RUN: llvm-mc -triple x86_64-pc-win32 -filetype=obj %s | llvm-readobj -s -u | FileCheck %s
4
5 // CHECK:      Sections [
6 // CHECK:        Section {
7 // CHECK:          Name: .text
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
14 // CHECK-NEXT:     ]
15 // CHECK-NEXT:   }
16 // CHECK:        Section {
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
24 // CHECK-NEXT:     ]
25 // CHECK-NEXT:   }
26 // CHECK:        Section {
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
33 // CHECK-NEXT:     ]
34 // CHECK-NEXT:   }
35 // CHECK-NEXT: ]
36
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
46 // CHECK-NEXT:       ]
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
58 // CHECK-NEXT:       ]
59 // CHECK-NEXT:       Handler: __C_specific_handler
60 // CHECK-NEXT:     }
61 // CHECK-NEXT:   }
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
70 // CHECK-NEXT:       ]
71 // CHECK-NEXT:       PrologSize: 0
72 // CHECK-NEXT:       FrameRegister: -
73 // CHECK-NEXT:       FrameOffset: -
74 // CHECK-NEXT:       UnwindCodeCount: 0
75 // CHECK-NEXT:       UnwindCodes [
76 // CHECK-NEXT:       ]
77 // CHECK-NEXT:       Chained {
78 // CHECK-NEXT:         StartAddress: [[CodeSect1]] [[BeginDisp1]]
79 // CHECK-NEXT:         EndAddress: [[CodeSect1]] [[EndDisp1]]
80 // CHECK-NEXT:         UnwindInfoAddress:
81 // CHECK-NEXT:       }
82 // CHECK-NEXT:     }
83 // CHECK-NEXT:   }
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 [
91 // CHECK-NEXT:       ]
92 // CHECK-NEXT:       PrologSize: 0
93 // CHECK-NEXT:       FrameRegister: -
94 // CHECK-NEXT:       FrameOffset: -
95 // CHECK-NEXT:       UnwindCodeCount: 0
96 // CHECK-NEXT:       UnwindCodes [
97 // CHECK-NEXT:       ]
98 // CHECK-NEXT:     }
99 // CHECK-NEXT:   }
100 // CHECK-NEXT: ]
101
102     .text
103     .globl func
104     .def func; .scl 2; .type 32; .endef
105     .seh_proc func
106 func:
107     .seh_pushframe @code
108     subq $24, %rsp
109     .seh_stackalloc 24
110     movq %rsi, 16(%rsp)
111     .seh_savereg %rsi, 16
112     movups %xmm8, (%rsp)
113     .seh_savexmm %xmm8, 0
114     pushq %rbx
115     .seh_pushreg 3
116     mov %rsp, %rbx
117     .seh_setframe 3, 0
118     .seh_endprologue
119     .seh_handler __C_specific_handler, @except
120     .seh_handlerdata
121     .long 0
122     .text
123     .seh_startchained
124     .seh_endprologue
125     .seh_endchained
126     lea (%rbx), %rsp
127     pop %rbx
128     addq $24, %rsp
129     ret
130     .seh_endproc
131
132 // Test emission of small functions.
133     .globl smallFunc
134     .def smallFunc; .scl 2; .type 32; .endef
135     .seh_proc smallFunc
136 smallFunc:
137     ret
138     .seh_endproc