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 26 func1: 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 55 func2a: 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 68 func2b: 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 96 func3a: 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 109 func3b: 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 138 func4a: 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 151 func4b: 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 181 func5a: 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 194 func5b: 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 207 func5c: 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