| // This test checks error reporting for mismatched prolog/epilog lengths |
| |
| // RUN: not llvm-mc -triple thumbv7-pc-win32 -filetype=obj -o /dev/null %s 2>&1 | FileCheck %s |
| |
| // CHECK-NOT: func1 |
| // CHECK: error: Incorrect size for func2 epilogue: 6 bytes of instructions in range, but .seh directives corresponding to 4 bytes |
| // CHECK: error: Incorrect size for func3 prologue: 4 bytes of instructions in range, but .seh directives corresponding to 2 bytes |
| |
| .text |
| .syntax unified |
| |
| .seh_proc func1 |
| func1: |
| // Instruction with indeterminate length |
| b other |
| .seh_endprologue |
| nop |
| .seh_startepilogue |
| // The p2align causes the length of the epilogue to be unknown, so |
| // we can't report errors about the mismatch here. |
| .p2align 1 |
| pop {r4-r7-lr} |
| .seh_save_regs {r4-r7,lr} |
| bx lr |
| .seh_nop |
| .seh_endepilogue |
| .seh_endproc |
| |
| .seh_proc func2 |
| func2: |
| .seh_endprologue |
| nop |
| .seh_startepilogue |
| // As we're popping into lr instead of directly into pc, this pop |
| // becomes a wide instruction. |
| pop {r4-r7,lr} |
| // The directive things we're making a narrow instruction, which |
| // is wrong. |
| .seh_save_regs {r4-r7,lr} |
| bx lr |
| .seh_nop |
| .seh_endepilogue |
| .seh_endproc |
| |
| .seh_proc func3 |
| func3: |
| nop.w |
| .seh_nop |
| .seh_endprologue |
| nop |
| .seh_endproc |