| @ RUN: llvm-mc %s -triple=armv7-unknown-linux-gnueabi -filetype=obj -o - \ | |
| @ RUN: | llvm-readobj -s -sd | FileCheck %s | |
| @ Check for .setfp directive. | |
| @ The .setfp directive will track the offset between the frame pointer and | |
| @ the stack pointer. This is required for the function that will change | |
| @ the stack pointer out of the function prologue. If the exception is thrown, | |
| @ then libunwind will reconstruct the stack pointer from the frame pointer. | |
| @ The reconstruction code is implemented by two different unwind opcode: | |
| @ (i) the unwind opcode to copy stack offset from the other register, and | |
| @ (ii) the unwind opcode to add or subtract the stack offset. | |
| @ | |
| @ This file includes several cases separated by different range of -offset | |
| @ | |
| @ (-offset) < 0x00 | |
| @ (-offset) == 0x00 | |
| @ 0x04 <= (-offset) <= 0x100 | |
| @ 0x104 <= (-offset) <= 0x200 | |
| @ 0x204 <= (-offset) | |
| .syntax unified | |
| @------------------------------------------------------------------------------- | |
| @ TEST1 | |
| @------------------------------------------------------------------------------- | |
| .section .TEST1 | |
| .globl func1 | |
| .align 2 | |
| .type func1,%function | |
| .fnstart | |
| func1: | |
| .setfp fp, sp, #0 | |
| add fp, sp, #0 | |
| sub sp, fp, #0 | |
| bx lr | |
| .personality __gxx_personality_v0 | |
| .handlerdata | |
| .fnend | |
| @------------------------------------------------------------------------------- | |
| @ The assembler should emit 0x9B to copy stack pointer from r11. | |
| @------------------------------------------------------------------------------- | |
| @ CHECK: Section { | |
| @ CHECK: Name: .ARM.extab.TEST1 | |
| @ CHECK: SectionData ( | |
| @ CHECK: 0000: 00000000 B0B09B00 |........| | |
| @ CHECK: ) | |
| @ CHECK: } | |
| @------------------------------------------------------------------------------- | |
| @ TEST2 | |
| @------------------------------------------------------------------------------- | |
| .section .TEST2 | |
| .globl func2a | |
| .align 2 | |
| .type func2a,%function | |
| .fnstart | |
| func2a: | |
| .setfp fp, sp, #-4 | |
| add fp, sp, #4 | |
| sub sp, fp, #4 | |
| bx lr | |
| .personality __gxx_personality_v0 | |
| .handlerdata | |
| .fnend | |
| .globl func2b | |
| .align 2 | |
| .type func2b,%function | |
| .fnstart | |
| func2b: | |
| .setfp fp, sp, #-0x100 | |
| add fp, sp, #0x100 | |
| sub sp, fp, #0x100 | |
| bx lr | |
| .personality __gxx_personality_v0 | |
| .handlerdata | |
| .fnend | |
| @------------------------------------------------------------------------------- | |
| @ The assembler should emit 0x9B to copy stack pointer from r11. | |
| @ The assembler should emit ((-offset - 4) >> 2) for offset. | |
| @------------------------------------------------------------------------------- | |
| @ CHECK: Section { | |
| @ CHECK: Name: .ARM.extab.TEST2 | |
| @ CHECK: SectionData ( | |
| @ CHECK: 0000: 00000000 B0009B00 00000000 B03F9B00 |.............?..| | |
| @ CHECK: ) | |
| @ CHECK: } | |
| @------------------------------------------------------------------------------- | |
| @ TEST3 | |
| @------------------------------------------------------------------------------- | |
| .section .TEST3 | |
| .globl func3a | |
| .align 2 | |
| .type func3a,%function | |
| .fnstart | |
| func3a: | |
| .setfp fp, sp, #-0x104 | |
| sub fp, sp, #0x104 | |
| add sp, fp, #0x104 | |
| bx lr | |
| .personality __gxx_personality_v0 | |
| .handlerdata | |
| .fnend | |
| .globl func3b | |
| .align 2 | |
| .type func3b,%function | |
| .fnstart | |
| func3b: | |
| .setfp fp, sp, #-0x200 | |
| sub fp, sp, #0x200 | |
| add sp, fp, #0x200 | |
| bx lr | |
| .personality __gxx_personality_v0 | |
| .handlerdata | |
| .fnend | |
| @------------------------------------------------------------------------------- | |
| @ The assembler should emit 0x9B to copy stack pointer from r11. | |
| @ The assembler should emit 0x3F and ((-offset - 0x104) >> 2) for offset. | |
| @------------------------------------------------------------------------------- | |
| @ CHECK: Section { | |
| @ CHECK: Name: .ARM.extab.TEST3 | |
| @ CHECK: SectionData ( | |
| @ CHECK: 0000: 00000000 3F009B00 00000000 3F3F9B00 |....?.......??..| | |
| @ CHECK: ) | |
| @ CHECK: } | |
| @------------------------------------------------------------------------------- | |
| @ TEST4 | |
| @------------------------------------------------------------------------------- | |
| .section .TEST4 | |
| .globl func4a | |
| .align 2 | |
| .type func4a,%function | |
| .fnstart | |
| func4a: | |
| .setfp fp, sp, #-0x204 | |
| sub fp, sp, #0x204 | |
| add sp, fp, #0x204 | |
| bx lr | |
| .personality __gxx_personality_v0 | |
| .handlerdata | |
| .fnend | |
| .globl func4b | |
| .align 2 | |
| .type func4b,%function | |
| .fnstart | |
| func4b: | |
| .setfp fp, sp, #-0x580 | |
| sub fp, sp, #0x580 | |
| add sp, fp, #0x580 | |
| bx lr | |
| .personality __gxx_personality_v0 | |
| .handlerdata | |
| .fnend | |
| @------------------------------------------------------------------------------- | |
| @ The assembler should emit 0x9B to copy stack pointer from r11. | |
| @ The assembler should emit 0xB2 and the ULEB128 encoding of | |
| @ ((-offset - 0x204) >> 2) for offset. | |
| @------------------------------------------------------------------------------- | |
| @ CHECK: Section { | |
| @ CHECK: Name: .ARM.extab.TEST4 | |
| @ CHECK: SectionData ( | |
| @ CHECK: 0000: 00000000 00B29B00 00000000 DFB29B01 |................| | |
| @ CHECK: 0010: B0B0B001 |....| | |
| @ CHECK: ) | |
| @ CHECK: } | |
| @------------------------------------------------------------------------------- | |
| @ TEST5 | |
| @------------------------------------------------------------------------------- | |
| .section .TEST5 | |
| .globl func5a | |
| .align 2 | |
| .type func5a,%function | |
| .fnstart | |
| func5a: | |
| .setfp fp, sp, #0x4 | |
| add fp, sp, #0x4 | |
| sub sp, fp, #0x4 | |
| bx lr | |
| .personality __gxx_personality_v0 | |
| .handlerdata | |
| .fnend | |
| .globl func5b | |
| .align 2 | |
| .type func5b,%function | |
| .fnstart | |
| func5b: | |
| .setfp fp, sp, #0x104 | |
| add fp, sp, #0x104 | |
| sub sp, fp, #0x104 | |
| bx lr | |
| .personality __gxx_personality_v0 | |
| .handlerdata | |
| .fnend | |
| .globl func5c | |
| .align 2 | |
| .type func5c,%function | |
| .fnstart | |
| func5c: | |
| .setfp fp, sp, #0x204 | |
| add fp, sp, #0x204 | |
| sub sp, fp, #0x204 | |
| bx lr | |
| .personality __gxx_personality_v0 | |
| .handlerdata | |
| .fnend | |
| @------------------------------------------------------------------------------- | |
| @ The assembler should emit 0x9B to copy stack pointer from r11. | |
| @ The assembler should emit (0x40 | (offset - 4)) >> 2 for offset. | |
| @ If (offset - 4) is greater than 0x3f, then multiple 0x7f should be emitted. | |
| @------------------------------------------------------------------------------- | |
| @ CHECK: Section { | |
| @ CHECK: Name: .ARM.extab.TEST5 | |
| @ CHECK: SectionData ( | |
| @ CHECK: 0000: 00000000 B0409B00 00000000 7F409B00 |.....@.......@..| | |
| @ CHECK: 0010: 00000000 7F409B01 B0B0B07F |.....@......| | |
| @ CHECK: ) | |
| @ CHECK: } |