| @ RUN: llvm-mc -triple armv7-linux-eabi -filetype obj -o - %s \ | |
| @ RUN: | llvm-readobj -u | FileCheck %s | |
| .syntax unified | |
| .cpu cortex-a8 | |
| .fpu neon | |
| .section .personality | |
| .type __personality,%function | |
| __personality: | |
| .fnstart | |
| bkpt | |
| .fnend | |
| .section .personality0 | |
| .type personality0,%function | |
| personality0: | |
| .fnstart | |
| bx lr | |
| .fnend | |
| .section .personality1 | |
| .type personality1,%function | |
| personality1: | |
| .fnstart | |
| .pad #0x100 | |
| sub sp, sp, #0x100 | |
| .save {r0-r11} | |
| push {r0-r11} | |
| pop {r0-r11} | |
| add sp, sp, #0x100 | |
| bx lr | |
| .fnend | |
| .section .custom_personality | |
| .type custom_personality,%function | |
| custom_personality: | |
| .fnstart | |
| .personality __personality | |
| bx lr | |
| .fnend | |
| .section .opcodes | |
| .type opcodes,%function | |
| opcodes: | |
| .fnstart | |
| .vsave {d8-d12} | |
| vpush {d8-d12} | |
| vpop {d8-d12} | |
| bx lr | |
| .fnend | |
| .section .multiple | |
| .type function0,%function | |
| function0: | |
| .fnstart | |
| bx lr | |
| .fnend | |
| .type function1,%function | |
| function1: | |
| .fnstart | |
| .personality __personality | |
| bx lr | |
| .fnend | |
| .type function2,%function | |
| function2: | |
| .fnstart | |
| bx lr | |
| .fnend | |
| .section .raw | |
| .type raw,%function | |
| .thumb_func | |
| raw: | |
| .fnstart | |
| .unwind_raw 12, 0x02 | |
| .unwind_raw -12, 0x42 | |
| .unwind_raw 0, 0x80, 0x00 | |
| .unwind_raw 4, 0x81, 0x00 | |
| .unwind_raw 4, 0x80, 0x01 | |
| .unwind_raw 8, 0x80, 0xc0 | |
| .unwind_raw 12, 0x84, 0xc0 | |
| .unwind_raw 0, 0x91 | |
| .unwind_raw 8, 0xa1 | |
| .unwind_raw 12, 0xa9 | |
| .unwind_raw 0, 0xb0 | |
| .unwind_raw 4, 0xb1, 0x01 | |
| .unwind_raw 0xa04, 0xb2, 0x80, 0x04 | |
| .unwind_raw 24, 0xb3, 0x12 | |
| .unwind_raw 24, 0xba | |
| .unwind_raw 24, 0xc2 | |
| .unwind_raw 24, 0xc6, 0x02 | |
| .unwind_raw 8, 0xc7, 0x03 | |
| .unwind_raw 24, 0xc8, 0x02 | |
| .unwind_raw 24, 0xc9, 0x02 | |
| .unwind_raw 64, 0xd7 | |
| .fnend | |
| .section .spare | |
| .type spare,%function | |
| spare: | |
| .fnstart | |
| .unwind_raw 4, 0x00 | |
| .unwind_raw -4, 0x40 | |
| .unwind_raw 0, 0x80, 0x00 | |
| .unwind_raw 4, 0x88, 0x00 | |
| .unwind_raw 0, 0x91 | |
| .unwind_raw 0, 0x9d | |
| .unwind_raw 0, 0x9f | |
| .unwind_raw 0, 0xa0 | |
| .unwind_raw 0, 0xa8 | |
| .unwind_raw 0, 0xb0 | |
| .unwind_raw 0, 0xb1, 0x00 | |
| .unwind_raw 4, 0xb1, 0x01 | |
| .unwind_raw 0, 0xb1, 0x10 | |
| .unwind_raw 0x204, 0xb2, 0x00 | |
| .unwind_raw 16, 0xb3, 0x00 | |
| .unwind_raw 0, 0xb4 | |
| .unwind_raw 16, 0xb8 | |
| .unwind_raw 4, 0xc0 | |
| .unwind_raw 4, 0xc6, 0x00 | |
| .unwind_raw 4, 0xc7, 0x00 | |
| .unwind_raw 4, 0xc7, 0x01 | |
| .unwind_raw 0, 0xc7, 0x10 | |
| .unwind_raw 16, 0xc8, 0x00 | |
| .unwind_raw 16, 0xc9, 0x00 | |
| .unwind_raw 0, 0xca | |
| .unwind_raw 16, 0xd0 | |
| .unwind_raw 0, 0xd8 | |
| .fnend | |
| @ CHECK: UnwindInformation { | |
| @ CHECK: UnwindIndexTable { | |
| @ CHECK: SectionName: .ARM.exidx.personality | |
| @ CHECK: Entries [ | |
| @ CHECK: Entry { | |
| @ CHECK: FunctionAddress: 0x0 | |
| @ CHECK: FunctionName: __personality | |
| @ CHECK: Model: Compact (Inline) | |
| @ CHECK: PersonalityIndex: 0 | |
| @ CHECK: Opcodes [ | |
| @ CHECK: 0xB0 ; finish | |
| @ CHECK: 0xB0 ; finish | |
| @ CHECK: 0xB0 ; finish | |
| @ CHECK: ] | |
| @ CHECK: } | |
| @ CHECK: ] | |
| @ CHECK: } | |
| @ CHECK: UnwindIndexTable { | |
| @ CHECK: SectionName: .ARM.exidx.personality0 | |
| @ CHECK: Entries [ | |
| @ CHECK: Entry { | |
| @ CHECK: FunctionAddress: 0x0 | |
| @ CHECK: FunctionName: personality0 | |
| @ CHECK: Model: Compact (Inline) | |
| @ CHECK: PersonalityIndex: 0 | |
| @ CHECK: Opcodes [ | |
| @ CHECK: 0xB0 ; finish | |
| @ CHECK: 0xB0 ; finish | |
| @ CHECK: 0xB0 ; finish | |
| @ CHECK: ] | |
| @ CHECK: } | |
| @ CHECK: ] | |
| @ CHECK: } | |
| @ CHECK: UnwindIndexTable { | |
| @ CHECK: SectionName: .ARM.exidx.personality1 | |
| @ CHECK: Entries [ | |
| @ CHECK: Entry { | |
| @ CHECK: FunctionAddress: 0x0 | |
| @ CHECK: FunctionName: personality1 | |
| @ CHECK: ExceptionHandlingTable: .ARM.extab.personality1 | |
| @ CHECK: TableEntryOffset: 0x0 | |
| @ CHECK: Model: Compact | |
| @ CHECK: PersonalityIndex: 1 | |
| @ CHECK: Opcodes [ | |
| @ CHECK: 0xB1 0x0F ; pop {r0, r1, r2, r3} | |
| @ CHECK: 0xA7 ; pop {r4, r5, r6, r7, r8, r9, r10, fp} | |
| @ CHECK: 0x3F ; vsp = vsp + 256 | |
| @ CHECK: 0xB0 ; finish | |
| @ CHECK: 0xB0 ; finish | |
| @ CHECK: ] | |
| @ CHECK: } | |
| @ CHECK: ] | |
| @ CHECK: } | |
| @ CHECK: UnwindIndexTable { | |
| @ CHECK: SectionName: .ARM.exidx.custom_personality | |
| @ CHECK: Entries [ | |
| @ CHECK: Entry { | |
| @ CHECK: FunctionAddress: 0x0 | |
| @ CHECK: FunctionName: custom_personality | |
| @ CHECK: ExceptionHandlingTable: .ARM.extab.custom_personality | |
| @ CHECK: TableEntryOffset: 0x0 | |
| @ CHECK: Model: Generic | |
| @ CHECK: PersonalityRoutineAddress: 0x0 | |
| @ CHECK: } | |
| @ CHECK: ] | |
| @ CHECK: } | |
| @ CHECK: UnwindIndexTable { | |
| @ CHECK: SectionName: .ARM.exidx.opcodes | |
| @ CHECK: Entries [ | |
| @ CHECK: Entry { | |
| @ CHECK: FunctionAddress: 0x0 | |
| @ CHECK: FunctionName: opcodes | |
| @ CHECK: Model: Compact (Inline) | |
| @ CHECK: PersonalityIndex: 0 | |
| @ CHECK: Opcodes [ | |
| @ CHECK: 0xC9 0x84 ; pop {d8, d9, d10, d11, d12} | |
| @ CHECK: 0xB0 ; finish | |
| @ CHECK: ] | |
| @ CHECK: } | |
| @ CHECK: ] | |
| @ CHECK: } | |
| @ CHECK: UnwindIndexTable { | |
| @ CHECK: SectionName: .ARM.exidx.multiple | |
| @ CHECK: Entries [ | |
| @ CHECK: Entry { | |
| @ CHECK: FunctionAddress: 0x0 | |
| @ CHECK: FunctionName: function0 | |
| @ CHECK: Model: Compact (Inline) | |
| @ CHECK: PersonalityIndex: 0 | |
| @ CHECK: Opcodes [ | |
| @ CHECK: 0xB0 ; finish | |
| @ CHECK: 0xB0 ; finish | |
| @ CHECK: 0xB0 ; finish | |
| @ CHECK: ] | |
| @ CHECK: } | |
| @ CHECK: Entry { | |
| @ CHECK: FunctionAddress: 0x4 | |
| @ CHECK: FunctionName: function1 | |
| @ CHECK: ExceptionHandlingTable: .ARM.extab.multiple | |
| @ CHECK: Model: Generic | |
| @ CHECK: PersonalityRoutineAddress: 0x0 | |
| @ CHECK: } | |
| @ CHECK: Entry { | |
| @ CHECK: FunctionAddress: 0x8 | |
| @ CHECK: FunctionName: function2 | |
| @ CHECK: Model: Compact (Inline) | |
| @ CHECK: PersonalityIndex: 0 | |
| @ CHECK: Opcodes [ | |
| @ CHECK: 0xB0 ; finish | |
| @ CHECK: 0xB0 ; finish | |
| @ CHECK: 0xB0 ; finish | |
| @ CHECK: ] | |
| @ CHECK: } | |
| @ CHECK: ] | |
| @ CHECK: } | |
| @ CHECK: UnwindIndexTable { | |
| @ CHECK: SectionName: .ARM.exidx.raw | |
| @ CHECK: Entries [ | |
| @ CHECK: Opcodes [ | |
| @ CHECK: 0xD7 ; pop {d8, d9, d10, d11, d12, d13, d14, d15} | |
| @ CHECK: 0xC9 0x02 ; pop {d0, d1, d2} | |
| @ CHECK: 0xC8 0x02 ; pop {d16, d17, d18} | |
| @ CHECK: 0xC7 0x03 ; pop {wCGR0, wCGR1} | |
| @ CHECK: 0xC6 0x02 ; pop {wR0, wR1, wR2} | |
| @ CHECK: 0xC2 ; pop {wR10, wR11, wR12} | |
| @ CHECK: 0xBA ; pop {d8, d9, d10} | |
| @ CHECK: 0xB3 0x12 ; pop {d1, d2, d3} | |
| @ CHECK: 0xB2 0x80 0x04 ; vsp = vsp + 2564 | |
| @ CHECK: 0xB1 0x01 ; pop {r0} | |
| @ CHECK: 0xB0 ; finish | |
| @ CHECK: 0xA9 ; pop {r4, r5, lr} | |
| @ CHECK: 0xA1 ; pop {r4, r5} | |
| @ CHECK: 0x91 ; vsp = r1 | |
| @ CHECK: 0x84 0xC0 ; pop {r10, fp, lr} | |
| @ CHECK: 0x80 0xC0 ; pop {r10, fp} | |
| @ CHECK: 0x80 0x01 ; pop {r4} | |
| @ CHECK: 0x81 0x00 ; pop {ip} | |
| @ CHECK: 0x80 0x00 ; refuse to unwind | |
| @ CHECK: 0x42 ; vsp = vsp - 12 | |
| @ CHECK: 0x02 ; vsp = vsp + 12 | |
| @ CHECK: ] | |
| @ CHECK: ] | |
| @ CHECK: } | |
| @ CHECK: UnwindIndexTable { | |
| @ CHECK: SectionName: .ARM.exidx.spare | |
| @ CHECK: Entries [ | |
| @ CHECK: Opcodes [ | |
| @ CHECK: 0xD8 ; spare | |
| @ CHECK: 0xD0 ; pop {d8} | |
| @ CHECK: 0xCA ; spare | |
| @ CHECK: 0xC9 0x00 ; pop {d0} | |
| @ CHECK: 0xC8 0x00 ; pop {d16} | |
| @ CHECK: 0xC7 0x10 ; spare | |
| @ CHECK: 0xC7 0x01 ; pop {wCGR0} | |
| @ CHECK: 0xC7 0x00 ; spare | |
| @ CHECK: 0xC6 0x00 ; pop {wR0} | |
| @ CHECK: 0xC0 ; pop {wR10} | |
| @ CHECK: 0xB8 ; pop {d8} | |
| @ CHECK: 0xB4 ; spare | |
| @ CHECK: 0xB3 0x00 ; pop {d0} | |
| @ CHECK: 0xB2 0x00 ; vsp = vsp + 516 | |
| @ CHECK: 0xB1 0x10 ; spare | |
| @ CHECK: 0xB1 0x01 ; pop {r0} | |
| @ CHECK: 0xB1 0x00 ; spare | |
| @ CHECK: 0xB0 ; finish | |
| @ CHECK: 0xA8 ; pop {r4, lr} | |
| @ CHECK: 0xA0 ; pop {r4} | |
| @ CHECK: 0x9F ; reserved (WiMMX MOVrr) | |
| @ CHECK: 0x9D ; reserved (ARM MOVrr) | |
| @ CHECK: 0x91 ; vsp = r1 | |
| @ CHECK: 0x88 0x00 ; pop {pc} | |
| @ CHECK: 0x80 0x00 ; refuse to unwind | |
| @ CHECK: 0x40 ; vsp = vsp - 4 | |
| @ CHECK: 0x00 ; vsp = vsp + 4 | |
| @ CHECK: ] | |
| @ CHECK: ] | |
| @ CHECK: } | |
| @ CHECK: } | |