| @ RUN: llvm-mc %s -triple=armv7-unknown-linux-gnueabi -filetype=obj -o - \ |
| @ RUN: | llvm-readobj -s -sd | FileCheck %s |
| |
| @ Check for different stack pointer offsets. |
| |
| @ The .pad directive will track the stack pointer offsets. There are several |
| @ ways to encode the stack offsets. We have to test: |
| @ |
| @ 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: |
| .pad #0 |
| sub sp, sp, #0 |
| add sp, sp, #0 |
| bx lr |
| .personality __gxx_personality_v0 |
| .handlerdata |
| .fnend |
| |
| @------------------------------------------------------------------------------- |
| @ The assembler should emit nothing (will be filled up with finish opcode). |
| @------------------------------------------------------------------------------- |
| @ CHECK: Section { |
| @ CHECK: Name: .ARM.extab.TEST1 |
| @ CHECK: SectionData ( |
| @ CHECK: 0000: 00000000 B0B0B000 |........| |
| @ CHECK: ) |
| @ CHECK: } |
| |
| |
| |
| @------------------------------------------------------------------------------- |
| @ TEST2 |
| @------------------------------------------------------------------------------- |
| .section .TEST2 |
| .globl func2a |
| .align 2 |
| .type func2a,%function |
| .fnstart |
| func2a: |
| .pad #0x4 |
| sub sp, sp, #0x4 |
| add sp, sp, #0x4 |
| bx lr |
| .personality __gxx_personality_v0 |
| .handlerdata |
| .fnend |
| |
| .globl func2b |
| .align 2 |
| .type func2b,%function |
| .fnstart |
| func2b: |
| .pad #0x100 |
| sub sp, sp, #0x100 |
| add sp, sp, #0x100 |
| bx lr |
| .personality __gxx_personality_v0 |
| .handlerdata |
| .fnend |
| |
| @------------------------------------------------------------------------------- |
| @ The assembler should emit ((offset - 4) >> 2). |
| @------------------------------------------------------------------------------- |
| @ CHECK: Section { |
| @ CHECK: Name: .ARM.extab.TEST2 |
| @ CHECK: SectionData ( |
| @ CHECK: 0000: 00000000 B0B00000 00000000 B0B03F00 |..............?.| |
| @ CHECK: ) |
| @ CHECK: } |
| |
| |
| @------------------------------------------------------------------------------- |
| @ TEST3 |
| @------------------------------------------------------------------------------- |
| .section .TEST3 |
| .globl func3a |
| .align 2 |
| .type func3a,%function |
| .fnstart |
| func3a: |
| .pad #0x104 |
| sub sp, sp, #0x104 |
| add sp, sp, #0x104 |
| bx lr |
| .personality __gxx_personality_v0 |
| .handlerdata |
| .fnend |
| |
| .globl func3b |
| .align 2 |
| .type func3b,%function |
| .fnstart |
| func3b: |
| .pad #0x200 |
| sub sp, sp, #0x200 |
| add sp, sp, #0x200 |
| bx lr |
| .personality __gxx_personality_v0 |
| .handlerdata |
| .fnend |
| |
| @------------------------------------------------------------------------------- |
| @ The assembler should emit 0x3F and ((offset - 0x104) >> 2). |
| @------------------------------------------------------------------------------- |
| @ CHECK: Section { |
| @ CHECK: Name: .ARM.extab.TEST3 |
| @ CHECK: SectionData ( |
| @ CHECK: 0000: 00000000 B03F0000 00000000 B03F3F00 |.....?.......??.| |
| @ CHECK: ) |
| @ CHECK: } |
| |
| |
| |
| @------------------------------------------------------------------------------- |
| @ TEST4 |
| @------------------------------------------------------------------------------- |
| .section .TEST4 |
| .globl func4a |
| .align 2 |
| .type func4a,%function |
| .fnstart |
| func4a: |
| .pad #0x204 |
| sub sp, sp, #0x204 |
| add sp, sp, #0x204 |
| bx lr |
| .personality __gxx_personality_v0 |
| .handlerdata |
| .fnend |
| |
| .globl func4b |
| .align 2 |
| .type func4b,%function |
| .fnstart |
| func4b: |
| .pad #0x580 |
| sub sp, sp, #0x580 |
| add sp, sp, #0x580 |
| bx lr |
| .personality __gxx_personality_v0 |
| .handlerdata |
| .fnend |
| |
| @------------------------------------------------------------------------------- |
| @ The assembler should emit 0xB2 and the ULEB128 encoding of |
| @ ((offset - 0x204) >> 2). |
| @------------------------------------------------------------------------------- |
| @ CHECK: Section { |
| @ CHECK: Name: .ARM.extab.TEST4 |
| @ CHECK: SectionData ( |
| @ CHECK: 0000: 00000000 B000B200 00000000 01DFB200 |................| |
| @ CHECK: ) |
| @ CHECK: } |
| |
| |
| |
| @------------------------------------------------------------------------------- |
| @ TEST5 |
| @------------------------------------------------------------------------------- |
| .section .TEST5 |
| .globl func4a |
| .align 2 |
| .type func4a,%function |
| .fnstart |
| func5a: |
| .pad #-0x4 |
| add sp, sp, #0x4 |
| sub sp, sp, #0x4 |
| bx lr |
| .personality __gxx_personality_v0 |
| .handlerdata |
| .fnend |
| |
| .globl func5b |
| .align 2 |
| .type func5b,%function |
| .fnstart |
| func5b: |
| .pad #-0x104 |
| add sp, sp, #0x104 |
| sub sp, sp, #0x4 |
| bx lr |
| .personality __gxx_personality_v0 |
| .handlerdata |
| .fnend |
| |
| .globl func5c |
| .align 2 |
| .type func5c,%function |
| .fnstart |
| func5c: |
| .pad #-0x204 |
| add sp, sp, #0x204 |
| sub sp, sp, #0x4 |
| bx lr |
| .personality __gxx_personality_v0 |
| .handlerdata |
| .fnend |
| |
| @------------------------------------------------------------------------------- |
| @ The assembler should emit (0x40 | (-offset - 4)) >> 2. When (-offset - 4) |
| @ is greater than 0x3f, then multiple 0x7f should be emitted. |
| @------------------------------------------------------------------------------- |
| @ CHECK: Section { |
| @ CHECK: Name: .ARM.extab.TEST5 |
| @ CHECK: SectionData ( |
| @ CHECK: 0000: 00000000 B0B04000 00000000 B07F4000 |......@.......@.| |
| @ CHECK: 0010: 00000000 7F7F4000 |......@.| |
| @ CHECK: ) |
| @ CHECK: } |