1 @ RUN: llvm-mc %s -triple=armv7-unknown-linux-gnueabi -filetype=obj -o - \ 2 @ RUN: | llvm-readobj -s -sd | FileCheck %s 3 4 @ Check the .save directive 5 6 @ The .save directive records the GPR registers which are pushed to the 7 @ stack. There are 4 different unwind opcodes: 8 @ 9 @ 0xB100: pop r[3:0] 10 @ 0xA0: pop r[(4+x):4] @ r[4+x]-r[4] must be consecutive. 11 @ 0xA8: pop r14, r[(4+x):4] @ r[4+x]-r[4] must be consecutive. 12 @ 0x8000: pop r[15:4] 13 @ 14 @ If register list specifed by .save directive is possible to be encoded 15 @ by 0xA0 or 0xA8, then the assembler should prefer them over 0x8000. 16 17 18 .syntax unified 19 20 @------------------------------------------------------------------------------- 21 @ TEST1 22 @------------------------------------------------------------------------------- 23 .section .TEST1 24 .globl func1a 25 .align 2 26 .type func1a,%function 27 .fnstart 28 func1a: 29 .save {r0} 30 push {r0} 31 pop {r0} 32 bx lr 33 .personality __gxx_personality_v0 34 .handlerdata 35 .fnend 36 37 .globl func1b 38 .align 2 39 .type func1b,%function 40 .fnstart 41 func1b: 42 .save {r0, r1} 43 push {r0, r1} 44 pop {r0, r1} 45 bx lr 46 .personality __gxx_personality_v0 47 .handlerdata 48 .fnend 49 50 .globl func1c 51 .align 2 52 .type func1c,%function 53 .fnstart 54 func1c: 55 .save {r0, r2} 56 push {r0, r2} 57 pop {r0, r2} 58 bx lr 59 .personality __gxx_personality_v0 60 .handlerdata 61 .fnend 62 63 .globl func1d 64 .align 2 65 .type func1d,%function 66 .fnstart 67 func1d: 68 .save {r1, r2} 69 push {r1, r2} 70 pop {r1, r2} 71 bx lr 72 .personality __gxx_personality_v0 73 .handlerdata 74 .fnend 75 76 .globl func1e 77 .align 2 78 .type func1e,%function 79 .fnstart 80 func1e: 81 .save {r0, r1, r2, r3} 82 push {r0, r1, r2, r3} 83 pop {r0, r1, r2, r3} 84 bx lr 85 .personality __gxx_personality_v0 86 .handlerdata 87 .fnend 88 89 @------------------------------------------------------------------------------- 90 @ The assembler should emit 0xB000 unwind opcode. 91 @------------------------------------------------------------------------------- 92 @ CHECK: Section { 93 @ CHECK: Name: .ARM.extab.TEST1 94 @ CHECK: SectionData ( 95 @ CHECK: 0000: 00000000 B001B100 00000000 B003B100 |................| 96 @ CHECK: 0010: 00000000 B005B100 00000000 B006B100 |................| 97 @ CHECK: 0020: 00000000 B00FB100 |........| 98 @ CHECK: ) 99 @ CHECK: } 100 101 102 103 @------------------------------------------------------------------------------- 104 @ TEST2 105 @------------------------------------------------------------------------------- 106 .section .TEST2 107 .globl func2a 108 .align 2 109 .type func2a,%function 110 .fnstart 111 func2a: 112 .save {r4} 113 push {r4} 114 pop {r4} 115 bx lr 116 .personality __gxx_personality_v0 117 .handlerdata 118 .fnend 119 120 .globl func2b 121 .align 2 122 .type func2b,%function 123 .fnstart 124 func2b: 125 .save {r4, r5} 126 push {r4, r5} 127 pop {r4, r5} 128 bx lr 129 .personality __gxx_personality_v0 130 .handlerdata 131 .fnend 132 133 .globl func2c 134 .align 2 135 .type func2c,%function 136 .fnstart 137 func2c: 138 .save {r4, r5, r6, r7, r8, r9, r10, r11} 139 push {r4, r5, r6, r7, r8, r9, r10, r11} 140 pop {r4, r5, r6, r7, r8, r9, r10, r11} 141 bx lr 142 .personality __gxx_personality_v0 143 .handlerdata 144 .fnend 145 146 @------------------------------------------------------------------------------- 147 @ The assembler should emit 0xA0 unwind opcode. 148 @------------------------------------------------------------------------------- 149 @ CHECK: Section { 150 @ CHECK: Name: .ARM.extab.TEST2 151 @ CHECK: SectionData ( 152 @ CHECK: 0000: 00000000 B0B0A000 00000000 B0B0A100 |................| 153 @ CHECK: 0010: 00000000 B0B0A700 |........| 154 @ CHECK: ) 155 @ CHECK: } 156 157 158 159 @------------------------------------------------------------------------------- 160 @ TEST3 161 @------------------------------------------------------------------------------- 162 .section .TEST3 163 .globl func3a 164 .align 2 165 .type func3a,%function 166 .fnstart 167 func3a: 168 .save {r4, r14} 169 push {r4, r14} 170 pop {r4, r14} 171 bx lr 172 .personality __gxx_personality_v0 173 .handlerdata 174 .fnend 175 176 .globl func3b 177 .align 2 178 .type func3b,%function 179 .fnstart 180 func3b: 181 .save {r4, r5, r14} 182 push {r4, r5, r14} 183 pop {r4, r5, r14} 184 bx lr 185 .personality __gxx_personality_v0 186 .handlerdata 187 .fnend 188 189 .globl func3c 190 .align 2 191 .type func3c,%function 192 .fnstart 193 func3c: 194 .save {r4, r5, r6, r7, r8, r9, r10, r11, r14} 195 push {r4, r5, r6, r7, r8, r9, r10, r11, r14} 196 pop {r4, r5, r6, r7, r8, r9, r10, r11, r14} 197 bx lr 198 .personality __gxx_personality_v0 199 .handlerdata 200 .fnend 201 202 @------------------------------------------------------------------------------- 203 @ The assembler should emit 0xA8 unwind opcode. 204 @------------------------------------------------------------------------------- 205 @ CHECK: Section { 206 @ CHECK: Name: .ARM.extab.TEST3 207 @ CHECK: SectionData ( 208 @ CHECK: 0000: 00000000 B0B0A800 00000000 B0B0A900 |................| 209 @ CHECK: 0010: 00000000 B0B0AF00 |........| 210 @ CHECK: ) 211 @ CHECK: } 212 213 214 215 @------------------------------------------------------------------------------- 216 @ TEST4 217 @------------------------------------------------------------------------------- 218 .section .TEST4 219 .globl func4a 220 .align 2 221 .type func4a,%function 222 .fnstart 223 func4a: 224 .save {r4, r5, r6, r7, r8, r9, r10, r11, r12, r14} 225 push {r4, r5, r6, r7, r8, r9, r10, r11, r12, r14} 226 pop {r4, r5, r6, r7, r8, r9, r10, r11, r12, r14} 227 bx lr 228 .personality __gxx_personality_v0 229 .handlerdata 230 .fnend 231 232 .globl func4b 233 .align 2 234 .type func4b,%function 235 .fnstart 236 func4b: 237 @ Note: r7 is missing intentionally. 238 .save {r4, r5, r6, r8, r9, r10, r11} 239 push {r4, r5, r6, r8, r9, r10, r11} 240 pop {r4, r5, r6, r8, r9, r10, r11} 241 bx lr 242 .personality __gxx_personality_v0 243 .handlerdata 244 .fnend 245 246 .globl func4c 247 .align 2 248 .type func4c,%function 249 .fnstart 250 func4c: 251 @ Note: r7 is missing intentionally. 252 .save {r4, r5, r6, r8, r9, r10, r11, r14} 253 push {r4, r5, r6, r8, r9, r10, r11, r14} 254 pop {r4, r5, r6, r8, r9, r10, r11, r14} 255 bx lr 256 .personality __gxx_personality_v0 257 .handlerdata 258 .fnend 259 260 .globl func4d 261 .align 2 262 .type func4d,%function 263 .fnstart 264 func4d: 265 @ Note: The register list is not start with r4. 266 .save {r5, r6, r7} 267 push {r5, r6, r7} 268 pop {r5, r6, r7} 269 bx lr 270 .personality __gxx_personality_v0 271 .handlerdata 272 .fnend 273 274 .globl func4e 275 .align 2 276 .type func4e,%function 277 .fnstart 278 func4e: 279 @ Note: The register list is not start with r4. 280 .save {r5, r6, r7, r14} 281 push {r5, r6, r7, r14} 282 pop {r5, r6, r7, r14} 283 bx lr 284 .personality __gxx_personality_v0 285 .handlerdata 286 .fnend 287 288 @------------------------------------------------------------------------------- 289 @ The assembler should emit 0x8000 unwind opcode. 290 @------------------------------------------------------------------------------- 291 @ CHECK: Section { 292 @ CHECK: Name: .ARM.extab.TEST4 293 @ CHECK: SectionData ( 294 @ CHECK: 0000: 00000000 B0FF8500 00000000 B0F78000 |................| 295 @ CHECK: 0010: 00000000 B0F78400 00000000 B00E8000 |................| 296 @ CHECK: 0020: 00000000 B00E8400 |........| 297 @ CHECK: ) 298 @ CHECK: } 299 300 301 302 @------------------------------------------------------------------------------- 303 @ TEST5 304 @------------------------------------------------------------------------------- 305 .section .TEST5 306 .globl func5a 307 .align 2 308 .type func5a,%function 309 .fnstart 310 func5a: 311 .save {r0, r1, r2, r3, r4, r5, r6} 312 push {r0, r1, r2, r3, r4, r5, r6} 313 pop {r0, r1, r2, r3, r4, r5, r6} 314 bx lr 315 .personality __gxx_personality_v0 316 .handlerdata 317 .fnend 318 319 .globl func5b 320 .align 2 321 .type func5b,%function 322 .fnstart 323 func5b: 324 .save {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r14} 325 push {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r14} 326 pop {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r14} 327 bx lr 328 .personality __gxx_personality_v0 329 .handlerdata 330 .fnend 331 332 @------------------------------------------------------------------------------- 333 @ Check the order of unwind opcode to pop registers. 334 @ 0xB10F "pop {r0-r3}" should be emitted before 0xA2 "pop {r4-r6}". 335 @ 0xB10F "pop {r0-r3}" should be emitted before 0x85FF "pop {r4-r12, r14}". 336 @------------------------------------------------------------------------------- 337 @ CHECK: Section { 338 @ CHECK: Name: .ARM.extab.TEST5 339 @ CHECK: SectionData ( 340 @ CHECK: 0000: 00000000 A20FB100 00000000 850FB101 |................| 341 @ CHECK: 0010: B0B0B0FF |....| 342 @ CHECK: ) 343 @ CHECK: } 344