diff options
Diffstat (limited to 'test/MC/ARM/eh-directive-setfp.s')
-rw-r--r-- | test/MC/ARM/eh-directive-setfp.s | 239 |
1 files changed, 239 insertions, 0 deletions
diff --git a/test/MC/ARM/eh-directive-setfp.s b/test/MC/ARM/eh-directive-setfp.s new file mode 100644 index 0000000000..3fbab5a3e7 --- /dev/null +++ b/test/MC/ARM/eh-directive-setfp.s @@ -0,0 +1,239 @@ +@ 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 substract 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 003F9B00 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 407F9B00 |.....@......@...| +@ CHECK: 0010: 00000000 7F7F9B01 B0B0B040 |...........@| +@ CHECK: ) +@ CHECK: } |