1 ; ARM EHABI integrated test 2 3 ; This test case checks whether the ARM unwind directives are properly 4 ; generated or not. 5 6 ; The purpose of the test: 7 ; (1) .fnstart and .fnend directives should wrap the function. 8 ; (2) .setfp directive should be available if frame pointer is not eliminated. 9 ; (3) .save directive should come with push instruction. 10 ; (4) .vsave directive should come with vpush instruction. 11 ; (5) .pad directive should come with stack pointer adjustment. 12 ; (6) .cantunwind directive should be available if the function is marked with 13 ; nounwind function attribute. 14 15 ; We have to check several cases: 16 ; (1) arm with -disable-fp-elim 17 ; (2) arm without -disable-fp-elim 18 ; (3) armv7 with -disable-fp-elim 19 ; (4) armv7 without -disable-fp-elim 20 21 ; RUN: llc -mtriple arm-unknown-linux-gnueabi \ 22 ; RUN: -disable-fp-elim -filetype=asm -o - %s \ 23 ; RUN: | FileCheck %s --check-prefix=CHECK-FP 24 25 ; RUN: llc -mtriple arm-unknown-linux-gnueabi \ 26 ; RUN: -filetype=asm -o - %s \ 27 ; RUN: | FileCheck %s --check-prefix=CHECK-FP-ELIM 28 29 ; RUN: llc -mtriple armv7-unknown-linux-gnueabi \ 30 ; RUN: -disable-fp-elim -filetype=asm -o - %s \ 31 ; RUN: | FileCheck %s --check-prefix=CHECK-V7-FP 32 33 ; RUN: llc -mtriple armv7-unknown-linux-gnueabi \ 34 ; RUN: -filetype=asm -o - %s \ 35 ; RUN: | FileCheck %s --check-prefix=CHECK-V7-FP-ELIM 36 37 ; RUN: llc -mtriple arm-unknown-linux-androideabi \ 38 ; RUN: -disable-fp-elim -filetype=asm -o - %s \ 39 ; RUN: | FileCheck %s --check-prefix=CHECK-FP 40 41 ; RUN: llc -mtriple arm-unknown-linux-androideabi \ 42 ; RUN: -filetype=asm -o - %s \ 43 ; RUN: | FileCheck %s --check-prefix=CHECK-FP-ELIM 44 45 ; RUN: llc -mtriple armv7-unknown-linux-androideabi \ 46 ; RUN: -disable-fp-elim -filetype=asm -o - %s \ 47 ; RUN: | FileCheck %s --check-prefix=CHECK-V7-FP 48 49 ; RUN: llc -mtriple armv7-unknown-linux-androideabi \ 50 ; RUN: -filetype=asm -o - %s \ 51 ; RUN: | FileCheck %s --check-prefix=CHECK-V7-FP-ELIM 52 53 ; RUN: llc -mtriple arm-unknown-netbsd-eabi \ 54 ; RUN: -disable-fp-elim -filetype=asm -o - %s \ 55 ; RUN: | FileCheck %s --check-prefix=DWARF-FP 56 57 ; RUN: llc -mtriple arm-unknown-netbsd-eabi \ 58 ; RUN: -filetype=asm -o - %s \ 59 ; RUN: | FileCheck %s --check-prefix=DWARF-FP-ELIM 60 61 ; RUN: llc -mtriple armv7-unknown-netbsd-eabi \ 62 ; RUN: -disable-fp-elim -filetype=asm -o - %s \ 63 ; RUN: | FileCheck %s --check-prefix=DWARF-V7-FP 64 65 ; RUN: llc -mtriple armv7-unknown-netbsd-eabi \ 66 ; RUN: -filetype=asm -o - %s \ 67 ; RUN: | FileCheck %s --check-prefix=DWARF-V7-FP-ELIM 68 69 ;------------------------------------------------------------------------------- 70 ; Test 1 71 ;------------------------------------------------------------------------------- 72 ; This is the LLVM assembly generated from following C++ code: 73 ; 74 ; extern void print(int, int, int, int, int); 75 ; extern void print(double, double, double, double, double); 76 ; 77 ; void test(int a, int b, int c, int d, int e, 78 ; double m, double n, double p, double q, double r) { 79 ; try { 80 ; print(a, b, c, d, e); 81 ; } catch (...) { 82 ; print(m, n, p, q, r); 83 ; } 84 ; } 85 86 declare void @_Z5printiiiii(i32, i32, i32, i32, i32) 87 88 declare void @_Z5printddddd(double, double, double, double, double) 89 90 define void @_Z4testiiiiiddddd(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, 91 double %m, double %n, double %p, 92 double %q, double %r) personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) { 93 entry: 94 invoke void @_Z5printiiiii(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) 95 to label %try.cont unwind label %lpad 96 97 lpad: 98 %0 = landingpad { i8*, i32 } 99 catch i8* null 100 %1 = extractvalue { i8*, i32 } %0, 0 101 %2 = tail call i8* @__cxa_begin_catch(i8* %1) 102 invoke void @_Z5printddddd(double %m, double %n, double %p, 103 double %q, double %r) 104 to label %invoke.cont2 unwind label %lpad1 105 106 invoke.cont2: 107 tail call void @__cxa_end_catch() 108 br label %try.cont 109 110 try.cont: 111 ret void 112 113 lpad1: 114 %3 = landingpad { i8*, i32 } 115 cleanup 116 invoke void @__cxa_end_catch() 117 to label %eh.resume unwind label %terminate.lpad 118 119 eh.resume: 120 resume { i8*, i32 } %3 121 122 terminate.lpad: 123 %4 = landingpad { i8*, i32 } 124 catch i8* null 125 %5 = extractvalue { i8*, i32 } %4, 0 126 tail call void @__clang_call_terminate(i8* %5) 127 unreachable 128 } 129 130 declare void @__clang_call_terminate(i8*) 131 132 declare i32 @__gxx_personality_v0(...) 133 134 declare i8* @__cxa_begin_catch(i8*) 135 136 declare void @__cxa_end_catch() 137 138 declare void @_ZSt9terminatev() 139 140 ; CHECK-FP-LABEL: _Z4testiiiiiddddd: 141 ; CHECK-FP: .fnstart 142 ; CHECK-FP: .save {r4, r5, r6, r7, r8, r9, r10, r11, lr} 143 ; CHECK-FP: push {r4, r5, r6, r7, r8, r9, r10, r11, lr} 144 ; CHECK-FP: .setfp r11, sp, #28 145 ; CHECK-FP: add r11, sp, #28 146 ; CHECK-FP: .pad #44 147 ; CHECK-FP: sub sp, sp, #44 148 ; CHECK-FP: .personality __gxx_personality_v0 149 ; CHECK-FP: .handlerdata 150 ; CHECK-FP: .fnend 151 152 ; CHECK-FP-ELIM-LABEL: _Z4testiiiiiddddd: 153 ; CHECK-FP-ELIM: .fnstart 154 ; CHECK-FP-ELIM: .save {r4, r5, r6, r7, r8, r9, r10, r11, lr} 155 ; CHECK-FP-ELIM: push {r4, r5, r6, r7, r8, r9, r10, r11, lr} 156 ; CHECK-FP-ELIM: .pad #36 157 ; CHECK-FP-ELIM: sub sp, sp, #36 158 ; CHECK-FP-ELIM: .personality __gxx_personality_v0 159 ; CHECK-FP-ELIM: .handlerdata 160 ; CHECK-FP-ELIM: .fnend 161 162 ; CHECK-V7-FP-LABEL: _Z4testiiiiiddddd: 163 ; CHECK-V7-FP: .fnstart 164 ; CHECK-V7-FP: .save {r4, r10, r11, lr} 165 ; CHECK-V7-FP: push {r4, r10, r11, lr} 166 ; CHECK-V7-FP: .setfp r11, sp, #8 167 ; CHECK-V7-FP: add r11, sp, #8 168 ; CHECK-V7-FP: .vsave {d8, d9, d10, d11, d12} 169 ; CHECK-V7-FP: vpush {d8, d9, d10, d11, d12} 170 ; CHECK-V7-FP: .pad #24 171 ; CHECK-V7-FP: sub sp, sp, #24 172 ; CHECK-V7-FP: .personality __gxx_personality_v0 173 ; CHECK-V7-FP: .handlerdata 174 ; CHECK-V7-FP: .fnend 175 176 ; CHECK-V7-FP-ELIM-LABEL: _Z4testiiiiiddddd: 177 ; CHECK-V7-FP-ELIM: .fnstart 178 ; CHECK-V7-FP-ELIM: .save {r4, lr} 179 ; CHECK-V7-FP-ELIM: push {r4, lr} 180 ; CHECK-V7-FP-ELIM: .vsave {d8, d9, d10, d11, d12} 181 ; CHECK-V7-FP-ELIM: vpush {d8, d9, d10, d11, d12} 182 ; CHECK-V7-FP-ELIM: .pad #24 183 ; CHECK-V7-FP-ELIM: sub sp, sp, #24 184 ; CHECK-V7-FP-ELIM: .personality __gxx_personality_v0 185 ; CHECK-V7-FP-ELIM: .handlerdata 186 ; CHECK-V7-FP-ELIM: .fnend 187 188 ; DWARF-FP-LABEL: _Z4testiiiiiddddd: 189 ; DWARF-FP: .cfi_startproc 190 ; DWARF-FP: .cfi_personality 0, __gxx_personality_v0 191 ; DWARF-FP: .cfi_lsda 0, .Lexception0 192 ; DWARF-FP: push {r4, r5, r6, r7, r8, r9, r10, r11, lr} 193 ; DWARF-FP: .cfi_def_cfa_offset 36 194 ; DWARF-FP: .cfi_offset lr, -4 195 ; DWARF-FP: .cfi_offset r11, -8 196 ; DWARF-FP: .cfi_offset r10, -12 197 ; DWARF-FP: .cfi_offset r9, -16 198 ; DWARF-FP: .cfi_offset r8, -20 199 ; DWARF-FP: .cfi_offset r7, -24 200 ; DWARF-FP: .cfi_offset r6, -28 201 ; DWARF-FP: .cfi_offset r5, -32 202 ; DWARF-FP: .cfi_offset r4, -36 203 ; DWARF-FP: add r11, sp, #28 204 ; DWARF-FP: .cfi_def_cfa r11, 8 205 ; DWARF-FP: sub sp, sp, #44 206 ; DWARF-FP: sub sp, r11, #28 207 ; DWARF-FP: pop {r4, r5, r6, r7, r8, r9, r10, r11, lr} 208 ; DWARF-FP: mov pc, lr 209 ; DWARF-FP: .cfi_endproc 210 211 ; DWARF-FP-ELIM-LABEL: _Z4testiiiiiddddd: 212 ; DWARF-FP-ELIM: .cfi_startproc 213 ; DWARF-FP-ELIM: .cfi_personality 0, __gxx_personality_v0 214 ; DWARF-FP-ELIM: .cfi_lsda 0, .Lexception0 215 ; DWARF-FP-ELIM: push {r4, r5, r6, r7, r8, r9, r10, r11, lr} 216 ; DWARF-FP-ELIM: .cfi_def_cfa_offset 36 217 ; DWARF-FP-ELIM: .cfi_offset lr, -4 218 ; DWARF-FP-ELIM: .cfi_offset r11, -8 219 ; DWARF-FP-ELIM: .cfi_offset r10, -12 220 ; DWARF-FP-ELIM: .cfi_offset r9, -16 221 ; DWARF-FP-ELIM: .cfi_offset r8, -20 222 ; DWARF-FP-ELIM: .cfi_offset r7, -24 223 ; DWARF-FP-ELIM: .cfi_offset r6, -28 224 ; DWARF-FP-ELIM: .cfi_offset r5, -32 225 ; DWARF-FP-ELIM: .cfi_offset r4, -36 226 ; DWARF-FP-ELIM: sub sp, sp, #36 227 ; DWARF-FP-ELIM: .cfi_def_cfa_offset 72 228 ; DWARF-FP-ELIM: add sp, sp, #36 229 ; DWARF-FP-ELIM: pop {r4, r5, r6, r7, r8, r9, r10, r11, lr} 230 ; DWARF-FP-ELIM: mov pc, lr 231 ; DWARF-FP-ELIM: .cfi_endproc 232 233 ; DWARF-V7-FP-LABEL: _Z4testiiiiiddddd: 234 ; DWARF-V7-FP: .cfi_startproc 235 ; DWARF-V7-FP: .cfi_personality 0, __gxx_personality_v0 236 ; DWARF-V7-FP: .cfi_lsda 0, .Lexception0 237 ; DWARF-V7-FP: push {r4, r10, r11, lr} 238 ; DWARF-V7-FP: .cfi_def_cfa_offset 16 239 ; DWARF-V7-FP: .cfi_offset lr, -4 240 ; DWARF-V7-FP: .cfi_offset r11, -8 241 ; DWARF-V7-FP: .cfi_offset r10, -12 242 ; DWARF-V7-FP: .cfi_offset r4, -16 243 ; DWARF-V7-FP: add r11, sp, #8 244 ; DWARF-V7-FP: .cfi_def_cfa r11, 8 245 ; DWARF-V7-FP: vpush {d8, d9, d10, d11, d12} 246 ; DWARF-V7-FP: .cfi_offset d12, -24 247 ; DWARF-V7-FP: .cfi_offset d11, -32 248 ; DWARF-V7-FP: .cfi_offset d10, -40 249 ; DWARF-V7-FP: .cfi_offset d9, -48 250 ; DWARF-V7-FP: sub sp, sp, #24 251 ; DWARF-V7-FP: sub sp, r11, #48 252 ; DWARF-V7-FP: vpop {d8, d9, d10, d11, d12} 253 ; DWARF-V7-FP: pop {r4, r10, r11, pc} 254 ; DWARF-V7-FP: .cfi_endproc 255 256 ; DWARF-V7-FP-ELIM-LABEL: _Z4testiiiiiddddd: 257 ; DWARF-V7-FP-ELIM: .cfi_startproc 258 ; DWARF-V7-FP-ELIM: .cfi_personality 0, __gxx_personality_v0 259 ; DWARF-V7-FP-ELIM: .cfi_lsda 0, .Lexception0 260 ; DWARF-V7-FP-ELIM: push {r4, lr} 261 ; DWARF-V7-FP-ELIM: .cfi_def_cfa_offset 8 262 ; DWARF-V7-FP-ELIM: .cfi_offset lr, -4 263 ; DWARF-V7-FP-ELIM: .cfi_offset r4, -8 264 ; DWARF-V7-FP-ELIM: vpush {d8, d9, d10, d11, d12} 265 ; DWARF-V7-FP-ELIM: .cfi_offset d12, -16 266 ; DWARF-V7-FP-ELIM: .cfi_offset d11, -24 267 ; DWARF-V7-FP-ELIM: .cfi_offset d10, -32 268 ; DWARF-V7-FP-ELIM: .cfi_offset d9, -40 269 ; DWARF-V7-FP-ELIM: sub sp, sp, #24 270 ; DWARF-V7-FP-ELIM: .cfi_def_cfa_offset 72 271 ; DWARF-V7-FP-ELIM: add sp, sp, #24 272 ; DWARF-V7-FP-ELIM: vpop {d8, d9, d10, d11, d12} 273 ; DWARF-V7-FP-ELIM: pop {r4, pc} 274 ; DWARF-V7-FP-ELIM: .cfi_endproc 275 276 ;------------------------------------------------------------------------------- 277 ; Test 2 278 ;------------------------------------------------------------------------------- 279 280 declare void @throw_exception_2() 281 282 define void @test2() { 283 entry: 284 call void @throw_exception_2() 285 ret void 286 } 287 288 ; CHECK-FP-LABEL: test2: 289 ; CHECK-FP: .fnstart 290 ; CHECK-FP: .save {r11, lr} 291 ; CHECK-FP: push {r11, lr} 292 ; CHECK-FP: .setfp r11, sp 293 ; CHECK-FP: mov r11, sp 294 ; CHECK-FP: pop {r11, lr} 295 ; CHECK-FP: mov pc, lr 296 ; CHECK-FP: .fnend 297 298 ; CHECK-FP-ELIM-LABEL: test2: 299 ; CHECK-FP-ELIM: .fnstart 300 ; CHECK-FP-ELIM: .save {r11, lr} 301 ; CHECK-FP-ELIM: push {r11, lr} 302 ; CHECK-FP-ELIM: pop {r11, lr} 303 ; CHECK-FP-ELIM: mov pc, lr 304 ; CHECK-FP-ELIM: .fnend 305 306 ; CHECK-V7-FP-LABEL: test2: 307 ; CHECK-V7-FP: .fnstart 308 ; CHECK-V7-FP: .save {r11, lr} 309 ; CHECK-V7-FP: push {r11, lr} 310 ; CHECK-V7-FP: .setfp r11, sp 311 ; CHECK-V7-FP: mov r11, sp 312 ; CHECK-V7-FP: pop {r11, pc} 313 ; CHECK-V7-FP: .fnend 314 315 ; CHECK-V7-FP-ELIM-LABEL: test2: 316 ; CHECK-V7-FP-ELIM: .fnstart 317 ; CHECK-V7-FP-ELIM: .save {r11, lr} 318 ; CHECK-V7-FP-ELIM: push {r11, lr} 319 ; CHECK-V7-FP-ELIM: pop {r11, pc} 320 ; CHECK-V7-FP-ELIM: .fnend 321 322 ; DWARF-FP-LABEL: test2: 323 ; DWARF-FP: .cfi_startproc 324 ; DWARF-FP: push {r11, lr} 325 ; DWARF-FP: .cfi_def_cfa_offset 8 326 ; DWARF-FP: .cfi_offset lr, -4 327 ; DWARF-FP: .cfi_offset r11, -8 328 ; DWARF-FP: mov r11, sp 329 ; DWARF-FP: .cfi_def_cfa_register r11 330 ; DWARF-FP: pop {r11, lr} 331 ; DWARF-FP: mov pc, lr 332 ; DWARF-FP: .cfi_endproc 333 334 ; DWARF-FP-ELIM-LABEL: test2: 335 ; DWARF-FP-ELIM: .cfi_startproc 336 ; DWARF-FP-ELIM: push {r11, lr} 337 ; DWARF-FP-ELIM: .cfi_def_cfa_offset 8 338 ; DWARF-FP-ELIM: .cfi_offset lr, -4 339 ; DWARF-FP-ELIM: .cfi_offset r11, -8 340 ; DWARF-FP-ELIM: pop {r11, lr} 341 ; DWARF-FP-ELIM: mov pc, lr 342 ; DWARF-FP-ELIM: .cfi_endproc 343 344 ; DWARF-V7-FP-LABEL: test2: 345 ; DWARF-V7-FP: .cfi_startproc 346 ; DWARF-V7-FP: push {r11, lr} 347 ; DWARF-V7-FP: .cfi_def_cfa_offset 8 348 ; DWARF-V7-FP: .cfi_offset lr, -4 349 ; DWARF-V7-FP: .cfi_offset r11, -8 350 ; DWARF-V7-FP: mov r11, sp 351 ; DWARF-V7-FP: .cfi_def_cfa_register r11 352 ; DWARF-V7-FP: pop {r11, pc} 353 ; DWARF-V7-FP: .cfi_endproc 354 355 ; DWARF-V7-FP-ELIM-LABEL: test2: 356 ; DWARF-V7-FP-ELIM: .cfi_startproc 357 ; DWARF-V7-FP-ELIM: push {r11, lr} 358 ; DWARF-V7-FP-ELIM: .cfi_def_cfa_offset 8 359 ; DWARF-V7-FP-ELIM: .cfi_offset lr, -4 360 ; DWARF-V7-FP-ELIM: .cfi_offset r11, -8 361 ; DWARF-V7-FP-ELIM: pop {r11, pc} 362 ; DWARF-V7-FP-ELIM: .cfi_endproc 363 364 365 ;------------------------------------------------------------------------------- 366 ; Test 3 367 ;------------------------------------------------------------------------------- 368 369 declare void @throw_exception_3(i32) 370 371 define i32 @test3(i32 %a, i32 %b, i32 %c, i32 %d, 372 i32 %e, i32 %f, i32 %g, i32 %h) { 373 entry: 374 %add = add nsw i32 %b, %a 375 %add1 = add nsw i32 %add, %c 376 %add2 = add nsw i32 %add1, %d 377 tail call void @throw_exception_3(i32 %add2) 378 %add3 = add nsw i32 %f, %e 379 %add4 = add nsw i32 %add3, %g 380 %add5 = add nsw i32 %add4, %h 381 tail call void @throw_exception_3(i32 %add5) 382 %add6 = add nsw i32 %add5, %add2 383 ret i32 %add6 384 } 385 386 ; CHECK-FP-LABEL: test3: 387 ; CHECK-FP: .fnstart 388 ; CHECK-FP: .save {r4, r5, r11, lr} 389 ; CHECK-FP: push {r4, r5, r11, lr} 390 ; CHECK-FP: .setfp r11, sp, #8 391 ; CHECK-FP: add r11, sp, #8 392 ; CHECK-FP: pop {r4, r5, r11, lr} 393 ; CHECK-FP: mov pc, lr 394 ; CHECK-FP: .fnend 395 396 ; CHECK-FP-ELIM-LABEL: test3: 397 ; CHECK-FP-ELIM: .fnstart 398 ; CHECK-FP-ELIM: .save {r4, r5, r11, lr} 399 ; CHECK-FP-ELIM: push {r4, r5, r11, lr} 400 ; CHECK-FP-ELIM: pop {r4, r5, r11, lr} 401 ; CHECK-FP-ELIM: mov pc, lr 402 ; CHECK-FP-ELIM: .fnend 403 404 ; CHECK-V7-FP-LABEL: test3: 405 ; CHECK-V7-FP: .fnstart 406 ; CHECK-V7-FP: .save {r4, r5, r11, lr} 407 ; CHECK-V7-FP: push {r4, r5, r11, lr} 408 ; CHECK-V7-FP: .setfp r11, sp, #8 409 ; CHECK-V7-FP: add r11, sp, #8 410 ; CHECK-V7-FP: pop {r4, r5, r11, pc} 411 ; CHECK-V7-FP: .fnend 412 413 ; CHECK-V7-FP-ELIM-LABEL: test3: 414 ; CHECK-V7-FP-ELIM: .fnstart 415 ; CHECK-V7-FP-ELIM: .save {r4, r5, r11, lr} 416 ; CHECK-V7-FP-ELIM: push {r4, r5, r11, lr} 417 ; CHECK-V7-FP-ELIM: pop {r4, r5, r11, pc} 418 ; CHECK-V7-FP-ELIM: .fnend 419 420 ; DWARF-FP-LABEL: test3: 421 ; DWARF-FP: .cfi_startproc 422 ; DWARF-FP: push {r4, r5, r11, lr} 423 ; DWARF-FP: .cfi_def_cfa_offset 16 424 ; DWARF-FP: .cfi_offset lr, -4 425 ; DWARF-FP: .cfi_offset r11, -8 426 ; DWARF-FP: .cfi_offset r5, -12 427 ; DWARF-FP: .cfi_offset r4, -16 428 ; DWARF-FP: add r11, sp, #8 429 ; DWARF-FP: .cfi_def_cfa r11, 8 430 ; DWARF-FP: pop {r4, r5, r11, lr} 431 ; DWARF-FP: mov pc, lr 432 ; DWARF-FP: .cfi_endproc 433 434 ; DWARF-FP-ELIM-LABEL: test3: 435 ; DWARF-FP-ELIM: .cfi_startproc 436 ; DWARF-FP-ELIM: push {r4, r5, r11, lr} 437 ; DWARF-FP-ELIM: .cfi_def_cfa_offset 16 438 ; DWARF-FP-ELIM: .cfi_offset lr, -4 439 ; DWARF-FP-ELIM: .cfi_offset r11, -8 440 ; DWARF-FP-ELIM: .cfi_offset r5, -12 441 ; DWARF-FP-ELIM: .cfi_offset r4, -16 442 ; DWARF-FP-ELIM: pop {r4, r5, r11, lr} 443 ; DWARF-FP-ELIM: mov pc, lr 444 ; DWARF-FP-ELIM: .cfi_endproc 445 446 ; DWARF-V7-FP-LABEL: test3: 447 ; DWARF-V7-FP: .cfi_startproc 448 ; DWARF-V7-FP: push {r4, r5, r11, lr} 449 ; DWARF-V7-FP: .cfi_def_cfa_offset 16 450 ; DWARF-V7-FP: .cfi_offset lr, -4 451 ; DWARF-V7-FP: .cfi_offset r11, -8 452 ; DWARF-V7-FP: .cfi_offset r5, -12 453 ; DWARF-V7-FP: .cfi_offset r4, -16 454 ; DWARF-V7-FP: add r11, sp, #8 455 ; DWARF-V7-FP: .cfi_def_cfa r11, 8 456 ; DWARF-V7-FP: pop {r4, r5, r11, pc} 457 ; DWARF-V7-FP: .cfi_endproc 458 459 ; DWARF-V7-FP-ELIM-LABEL: test3: 460 ; DWARF-V7-FP-ELIM: .cfi_startproc 461 ; DWARF-V7-FP-ELIM: push {r4, r5, r11, lr} 462 ; DWARF-V7-FP-ELIM: .cfi_def_cfa_offset 16 463 ; DWARF-V7-FP-ELIM: .cfi_offset lr, -4 464 ; DWARF-V7-FP-ELIM: .cfi_offset r11, -8 465 ; DWARF-V7-FP-ELIM: .cfi_offset r5, -12 466 ; DWARF-V7-FP-ELIM: .cfi_offset r4, -16 467 ; DWARF-V7-FP-ELIM: pop {r4, r5, r11, pc} 468 ; DWARF-V7-FP-ELIM: .cfi_endproc 469 470 471 ;------------------------------------------------------------------------------- 472 ; Test 4 473 ;------------------------------------------------------------------------------- 474 475 define void @test4() nounwind { 476 entry: 477 ret void 478 } 479 480 ; CHECK-FP-LABEL: test4: 481 ; CHECK-FP: .fnstart 482 ; CHECK-FP: mov pc, lr 483 ; CHECK-FP: .cantunwind 484 ; CHECK-FP: .fnend 485 486 ; CHECK-FP-ELIM-LABEL: test4: 487 ; CHECK-FP-ELIM: .fnstart 488 ; CHECK-FP-ELIM: mov pc, lr 489 ; CHECK-FP-ELIM: .cantunwind 490 ; CHECK-FP-ELIM: .fnend 491 492 ; CHECK-V7-FP-LABEL: test4: 493 ; CHECK-V7-FP: .fnstart 494 ; CHECK-V7-FP: bx lr 495 ; CHECK-V7-FP: .cantunwind 496 ; CHECK-V7-FP: .fnend 497 498 ; CHECK-V7-FP-ELIM-LABEL: test4: 499 ; CHECK-V7-FP-ELIM: .fnstart 500 ; CHECK-V7-FP-ELIM: bx lr 501 ; CHECK-V7-FP-ELIM: .cantunwind 502 ; CHECK-V7-FP-ELIM: .fnend 503 504 ; DWARF-FP-LABEL: test4: 505 ; DWARF-FP-NOT: .cfi_startproc 506 ; DWARF-FP: mov pc, lr 507 ; DWARF-FP-NOT: .cfi_endproc 508 ; DWARF-FP: .size test4, 509 510 ; DWARF-FP-ELIM-LABEL: test4: 511 ; DWARF-FP-ELIM-NOT: .cfi_startproc 512 ; DWARF-FP-ELIM: mov pc, lr 513 ; DWARF-FP-ELIM-NOT: .cfi_endproc 514 ; DWARF-FP-ELIM: .size test4, 515 516 ; DWARF-V7-FP-LABEL: test4: 517 ; DWARF-V7-FP-NOT: .cfi_startproc 518 ; DWARF-V7-FP: bx lr 519 ; DWARF-V7-FP-NOT: .cfi_endproc 520 ; DWARF-V7-FP: .size test4, 521 522 ; DWARF-V7-FP-ELIM-LABEL: test4: 523 ; DWARF-V7-FP-ELIM-NOT: .cfi_startproc 524 ; DWARF-V7-FP-ELIM: bx lr 525 ; DWARF-V7-FP-ELIM-NOT: .cfi_endproc 526 ; DWARF-V7-FP-ELIM: .size test4, 527