@ 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: }