1@ RUN: llvm-mc %s -triple=armv7-unknown-linux-gnueabi -filetype=obj -o - \ 2@ RUN: | llvm-readobj -s -sd | FileCheck %s 3 4@ Check for different stack pointer offsets. 5 6@ The .pad directive will track the stack pointer offsets. There are several 7@ ways to encode the stack offsets. We have to test: 8@ 9@ offset < 0x00 10@ offset == 0x00 11@ 0x04 <= offset <= 0x100 12@ 0x104 <= offset <= 0x200 13@ 0x204 <= offset 14 15 16 .syntax unified 17 18@------------------------------------------------------------------------------- 19@ TEST1 20@------------------------------------------------------------------------------- 21 .section .TEST1 22 .globl func1 23 .align 2 24 .type func1,%function 25 .fnstart 26func1: 27 .pad #0 28 sub sp, sp, #0 29 add sp, sp, #0 30 bx lr 31 .personality __gxx_personality_v0 32 .handlerdata 33 .fnend 34 35@------------------------------------------------------------------------------- 36@ The assembler should emit nothing (will be filled up with finish opcode). 37@------------------------------------------------------------------------------- 38@ CHECK: Section { 39@ CHECK: Name: .ARM.extab.TEST1 40@ CHECK: SectionData ( 41@ CHECK: 0000: 00000000 B0B0B000 |........| 42@ CHECK: ) 43@ CHECK: } 44 45 46 47@------------------------------------------------------------------------------- 48@ TEST2 49@------------------------------------------------------------------------------- 50 .section .TEST2 51 .globl func2a 52 .align 2 53 .type func2a,%function 54 .fnstart 55func2a: 56 .pad #0x4 57 sub sp, sp, #0x4 58 add sp, sp, #0x4 59 bx lr 60 .personality __gxx_personality_v0 61 .handlerdata 62 .fnend 63 64 .globl func2b 65 .align 2 66 .type func2b,%function 67 .fnstart 68func2b: 69 .pad #0x100 70 sub sp, sp, #0x100 71 add sp, sp, #0x100 72 bx lr 73 .personality __gxx_personality_v0 74 .handlerdata 75 .fnend 76 77@------------------------------------------------------------------------------- 78@ The assembler should emit ((offset - 4) >> 2). 79@------------------------------------------------------------------------------- 80@ CHECK: Section { 81@ CHECK: Name: .ARM.extab.TEST2 82@ CHECK: SectionData ( 83@ CHECK: 0000: 00000000 B0B00000 00000000 B0B03F00 |..............?.| 84@ CHECK: ) 85@ CHECK: } 86 87 88@------------------------------------------------------------------------------- 89@ TEST3 90@------------------------------------------------------------------------------- 91 .section .TEST3 92 .globl func3a 93 .align 2 94 .type func3a,%function 95 .fnstart 96func3a: 97 .pad #0x104 98 sub sp, sp, #0x104 99 add sp, sp, #0x104 100 bx lr 101 .personality __gxx_personality_v0 102 .handlerdata 103 .fnend 104 105 .globl func3b 106 .align 2 107 .type func3b,%function 108 .fnstart 109func3b: 110 .pad #0x200 111 sub sp, sp, #0x200 112 add sp, sp, #0x200 113 bx lr 114 .personality __gxx_personality_v0 115 .handlerdata 116 .fnend 117 118@------------------------------------------------------------------------------- 119@ The assembler should emit 0x3F and ((offset - 0x104) >> 2). 120@------------------------------------------------------------------------------- 121@ CHECK: Section { 122@ CHECK: Name: .ARM.extab.TEST3 123@ CHECK: SectionData ( 124@ CHECK: 0000: 00000000 B03F0000 00000000 B03F3F00 |.....?.......??.| 125@ CHECK: ) 126@ CHECK: } 127 128 129 130@------------------------------------------------------------------------------- 131@ TEST4 132@------------------------------------------------------------------------------- 133 .section .TEST4 134 .globl func4a 135 .align 2 136 .type func4a,%function 137 .fnstart 138func4a: 139 .pad #0x204 140 sub sp, sp, #0x204 141 add sp, sp, #0x204 142 bx lr 143 .personality __gxx_personality_v0 144 .handlerdata 145 .fnend 146 147 .globl func4b 148 .align 2 149 .type func4b,%function 150 .fnstart 151func4b: 152 .pad #0x580 153 sub sp, sp, #0x580 154 add sp, sp, #0x580 155 bx lr 156 .personality __gxx_personality_v0 157 .handlerdata 158 .fnend 159 160@------------------------------------------------------------------------------- 161@ The assembler should emit 0xB2 and the ULEB128 encoding of 162@ ((offset - 0x204) >> 2). 163@------------------------------------------------------------------------------- 164@ CHECK: Section { 165@ CHECK: Name: .ARM.extab.TEST4 166@ CHECK: SectionData ( 167@ CHECK: 0000: 00000000 B000B200 00000000 01DFB200 |................| 168@ CHECK: ) 169@ CHECK: } 170 171 172 173@------------------------------------------------------------------------------- 174@ TEST5 175@------------------------------------------------------------------------------- 176 .section .TEST5 177 .globl func4a 178 .align 2 179 .type func4a,%function 180 .fnstart 181func5a: 182 .pad #-0x4 183 add sp, sp, #0x4 184 sub sp, sp, #0x4 185 bx lr 186 .personality __gxx_personality_v0 187 .handlerdata 188 .fnend 189 190 .globl func5b 191 .align 2 192 .type func5b,%function 193 .fnstart 194func5b: 195 .pad #-0x104 196 add sp, sp, #0x104 197 sub sp, sp, #0x4 198 bx lr 199 .personality __gxx_personality_v0 200 .handlerdata 201 .fnend 202 203 .globl func5c 204 .align 2 205 .type func5c,%function 206 .fnstart 207func5c: 208 .pad #-0x204 209 add sp, sp, #0x204 210 sub sp, sp, #0x4 211 bx lr 212 .personality __gxx_personality_v0 213 .handlerdata 214 .fnend 215 216@------------------------------------------------------------------------------- 217@ The assembler should emit (0x40 | (-offset - 4)) >> 2. When (-offset - 4) 218@ is greater than 0x3f, then multiple 0x7f should be emitted. 219@------------------------------------------------------------------------------- 220@ CHECK: Section { 221@ CHECK: Name: .ARM.extab.TEST5 222@ CHECK: SectionData ( 223@ CHECK: 0000: 00000000 B0B04000 00000000 B07F4000 |......@.......@.| 224@ CHECK: 0010: 00000000 7F7F4000 |......@.| 225@ CHECK: ) 226@ CHECK: } 227