xref: /llvm-project/llvm/test/tools/llvm-readobj/COFF/arm-unwind-opcodes.s (revision 92f1028ceb30dc8e7eda3f06a8c7aa8e8082ff65)
1// REQUIRES: arm-registered-target
2// RUN: llvm-mc -filetype=obj -triple thumbv7-windows-gnu %s -o %t.o
3// RUN: llvm-readobj --unwind %t.o | FileCheck --strict-whitespace %s
4
5// CHECK:       RuntimeFunction {
6// CHECK-NEXT:    Function: func0
7// CHECK:           Prologue [
8// CHECK-NEXT:        0xcb                ; mov r11, sp
9// CHECK-NEXT:        0x95 0x00           ; push.w {r8, r10, r12}
10// CHECK-NEXT:        0xf6 0x13           ; vpush {d17-d19}
11// CHECK-NEXT:        0xfc                ; nop.w
12// CHECK-NEXT:        0xf5 0x35           ; vpush {d3-d5}
13// CHECK-NEXT:        0xfb                ; nop
14// CHECK-NEXT:        0xe2                ; vpush {d8-d10}
15// CHECK-NEXT:        0x08                ; sub sp, #(8 * 4)
16// CHECK-NEXT:        0xd6                ; push {r4-r6, lr}
17// CHECK-NEXT:      ]
18// CHECK-NEXT:      EpilogueScopes [
19// CHECK-NEXT:        EpilogueScope {
20// CHECK-NEXT:          StartOffset: 15
21// CHECK-NEXT:          Condition: 14
22// CHECK-NEXT:          EpilogueStartIndex: 13
23// CHECK-NEXT:          Opcodes [
24// CHECK-NEXT:            0xe2                ; vpop {d8-d10}
25// CHECK-NEXT:            0xcb                ; mov sp, r11
26// CHECK-NEXT:            0x08                ; add sp, #(8 * 4)
27// CHECK-NEXT:            0xd6                ; pop {r4-r6, pc}
28// CHECK-NEXT:          ]
29// CHECK-NEXT:        }
30// CHECK-NEXT:      ]
31// CHECK:       RuntimeFunction {
32// CHECK-NEXT:    Function: func1
33// CHECK:           Prologue [
34// CHECK-NEXT:        0xef 0x08           ; str.w lr, [sp, #-32]!
35// CHECK-NEXT:        0xd1                ; push {r4-r5}
36// CHECK-NEXT:        0xfd                ; bx <reg>
37// CHECK-NEXT:      ]
38// CHECK-NEXT:      EpilogueScopes [
39// CHECK-NEXT:        EpilogueScope {
40// CHECK-NEXT:          StartOffset: 4
41// CHECK-NEXT:          Condition: 14
42// CHECK-NEXT:          EpilogueStartIndex: 4
43// CHECK-NEXT:          Opcodes [
44// CHECK-NEXT:            0xef 0x08           ; ldr.w lr, [sp], #32
45// CHECK-NEXT:            0xd1                ; pop {r4-r5}
46// CHECK-NEXT:            0xfd                ; bx <reg>
47// CHECK-NEXT:          ]
48// CHECK-NEXT:        }
49// CHECK-NEXT:      ]
50// CHECK:       RuntimeFunction {
51// CHECK-NEXT:    Function: func2
52// CHECK-NEXT:    ExceptionRecord:
53// CHECK-NEXT:    ExceptionData {
54// CHECK-NEXT:      FunctionLength:
55// CHECK-NEXT:      Version:
56// CHECK-NEXT:      ExceptionData: No
57// CHECK-NEXT:      EpiloguePacked: Yes
58// CHECK-NEXT:      Fragment: No
59// CHECK-NEXT:      EpilogueOffset: 0
60// CHECK-NEXT:      ByteCodeLength:
61// CHECK-NEXT:      Prologue [
62// CHECK-NEXT:        0x04                ; sub sp, #(4 * 4)
63// CHECK-NEXT:        0xec 0x80           ; push {r7}
64// CHECK-NEXT:        0xc7                ; mov r7, sp
65// CHECK-NEXT:        0xfe                ; b.w <target>
66// CHECK-NEXT:      ]
67// CHECK-NEXT:    }
68// CHECK-NEXT:  }
69// CHECK-NEXT:  RuntimeFunction {
70// CHECK-NEXT:    Function: func3
71// CHECK-NEXT:    ExceptionRecord:
72// CHECK-NEXT:    ExceptionData {
73// CHECK-NEXT:      FunctionLength:
74// CHECK-NEXT:      Version:
75// CHECK-NEXT:      ExceptionData: No
76// CHECK-NEXT:      EpiloguePacked: Yes
77// CHECK-NEXT:      Fragment: Yes
78// CHECK-NEXT:      EpilogueOffset: 1
79// CHECK-NEXT:      ByteCodeLength:
80// CHECK-NEXT:      Prologue [
81// CHECK-NEXT:        0x04                ; sub sp, #(4 * 4)
82// CHECK-NEXT:        0xdf                ; push.w {r4-r11, lr}
83// CHECK-NEXT:      ]
84// CHECK-NEXT:      Epilogue [
85// CHECK-NEXT:        0xdf                ; pop.w {r4-r11, pc}
86// CHECK-NEXT:      ]
87// CHECK-NEXT:    }
88// CHECK-NEXT:  }
89// CHECK-NEXT:  RuntimeFunction {
90// CHECK-NEXT:    Function: func4
91// CHECK-NEXT:    ExceptionRecord:
92// CHECK-NEXT:    ExceptionData {
93// CHECK-NEXT:      FunctionLength:
94// CHECK-NEXT:      Version:
95// CHECK-NEXT:      ExceptionData: No
96// CHECK-NEXT:      EpiloguePacked: Yes
97// CHECK-NEXT:      Fragment: No
98// CHECK-NEXT:      EpilogueOffset: 0
99// CHECK-NEXT:      ByteCodeLength:
100// CHECK-NEXT:      Prologue [
101// CHECK-NEXT:        0xec 0x50           ; push {r4, r6}
102// CHECK-NEXT:        0xb5 0x00           ; push.w {r8, r10, r12, lr}
103// CHECK-NEXT:      ]
104// CHECK-NEXT:    }
105// CHECK-NEXT:  }
106// CHECK-NEXT:  RuntimeFunction {
107// CHECK-NEXT:    Function: func5
108// CHECK-NEXT:    ExceptionRecord:
109// CHECK-NEXT:    ExceptionData {
110// CHECK-NEXT:      FunctionLength:
111// CHECK-NEXT:      Version:
112// CHECK-NEXT:      ExceptionData: No
113// CHECK-NEXT:      EpiloguePacked: Yes
114// CHECK-NEXT:      Fragment: No
115// CHECK-NEXT:      EpilogueOffset: 16
116// CHECK-NEXT:      ByteCodeLength:
117// CHECK-NEXT:      Prologue [
118// CHECK-NEXT:        0xfa 0x00 0x00 0x20 ; sub.w sp, sp, #(32 * 4)
119// CHECK-NEXT:        0xf9 0x00 0x10      ; sub.w sp, sp, #(16 * 4)
120// CHECK-NEXT:        0xf8 0x00 0x00 0x08 ; sub sp, sp, #(8 * 4)
121// CHECK-NEXT:        0xf7 0x00 0x04      ; sub sp, sp, #(4 * 4)
122// CHECK-NEXT:        0xe8 0x02           ; sub.w sp, #(2 * 4)
123// CHECK-NEXT:        0xed 0x50           ; push {r4, r6, lr}
124// CHECK-NEXT:      ]
125// CHECK-NEXT:      Epilogue [
126// CHECK-NEXT:        0xed 0x50           ; pop {r4, r6, pc}
127// CHECK-NEXT:      ]
128// CHECK-NEXT:    }
129// CHECK-NEXT:  }
130
131        .thumb
132        .syntax unified
133func0:
134        push {r4-r6, lr}
135        sub sp, sp, #32
136        vpush {d8-d10}
137        nop
138        vpush {d3-d5}
139        nop.w
140        vpush {d17-d19}
141        push {r8, r10, r12}
142        mov r11, sp
143        nop
144        vpop {d8-d10}
145        mov sp, r11
146        add sp, sp, #32
147        pop {r4-r6, pc}
148
149func1:
150        push {r4-r5}
151        str lr, [sp, #-32]!
152        nop
153        ldr lr, [sp], #32
154        pop {r4-r5}
155        bx lr
156
157func2:
158        mov r7, sp
159        push {r7}
160        sub sp, sp, #16
161        nop
162        add sp, sp, #16
163        pop {r7}
164        mov sp, r7
165        b tailcall
166
167func3:
168        nop.w
169        nop
170        nop
171        add sp, sp, #16
172        pop {r4-r11, pc}
173
174func4:
175        push {r8, r10, r12, lr}
176        push {r4, r6}
177        nop
178        pop {r4, r6}
179        pop {r8, r10, r12, pc}
180
181func5:
182        push {r4, r6, lr}
183        subw sp, sp, #8
184        sub sp, sp, #16
185        sub sp, sp, #32
186        subw sp, sp, #64
187        subw sp, sp, #128
188        nop
189        pop {r4, r6, pc}
190
191        .section .pdata,"dr"
192        .rva func0
193        .rva .Lunwind_func0
194        .rva func1
195        .rva .Lunwind_func1
196        .rva func2
197        .rva .Lunwind_func2
198        .rva func3
199        .rva .Lunwind_func3
200        .rva func4
201        .rva .Lunwind_func4
202        .rva func5
203        .rva .Lunwind_func5
204
205        .section .xdata,"dr"
206.Lunwind_func0:
207.byte 0x14, 0x00, 0x80, 0x50
208.byte 0x0f, 0x00, 0xe0, 0x0d
209.byte 0xcb, 0x95, 0x00, 0xf6
210.byte 0x13, 0xfc, 0xf5, 0x35
211.byte 0xfb, 0xe2, 0x08, 0xd6
212.byte 0xff, 0xe2, 0xcb, 0x08
213.byte 0xd6, 0xff, 0x00, 0x00
214
215.Lunwind_func1:
216.byte 0x08, 0x00, 0x00, 0x00
217.byte 0x01, 0x00, 0x02, 0x00
218.byte 0x04, 0x00, 0xe0, 0x04
219.byte 0xef, 0x08, 0xd1, 0xfd
220.byte 0xef, 0x08, 0xd1, 0xfd
221
222.Lunwind_func2:
223.byte 0x09, 0x00, 0x20, 0x20
224.byte 0x04, 0xec, 0x80, 0xc7
225.byte 0xfe, 0x00, 0x00, 0x00
226.Lunwind_func3:
227.byte 0x07, 0x00, 0xe0, 0x10
228.byte 0x04, 0xdf, 0xff, 0x00
229.Lunwind_func4:
230.byte 0x07, 0x00, 0x20, 0x20
231.byte 0xec, 0x50, 0xb5, 0x00
232.byte 0xff, 0x00, 0x00, 0x00
233.Lunwind_func5:
234.byte 0x0b, 0x00, 0x20, 0x58
235.byte 0xfa, 0x00, 0x00, 0x20
236.byte 0xf9, 0x00, 0x10, 0xf8
237.byte 0x00, 0x00, 0x08, 0xf7
238.byte 0x00, 0x04, 0xe8, 0x02
239.byte 0xed, 0x50, 0xff, 0x00
240