Logan Chien | 4ea23b5 | 2013-05-10 16:17:24 +0000 | [diff] [blame] | 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 .setfp directive. |
| 5 | |
| 6 | @ The .setfp directive will track the offset between the frame pointer and |
| 7 | @ the stack pointer. This is required for the function that will change |
| 8 | @ the stack pointer out of the function prologue. If the exception is thrown, |
| 9 | @ then libunwind will reconstruct the stack pointer from the frame pointer. |
| 10 | @ The reconstruction code is implemented by two different unwind opcode: |
| 11 | @ (i) the unwind opcode to copy stack offset from the other register, and |
Alp Toker | cb40291 | 2014-01-24 17:20:08 +0000 | [diff] [blame] | 12 | @ (ii) the unwind opcode to add or subtract the stack offset. |
Logan Chien | 4ea23b5 | 2013-05-10 16:17:24 +0000 | [diff] [blame] | 13 | @ |
| 14 | @ This file includes several cases separated by different range of -offset |
| 15 | @ |
| 16 | @ (-offset) < 0x00 |
| 17 | @ (-offset) == 0x00 |
| 18 | @ 0x04 <= (-offset) <= 0x100 |
| 19 | @ 0x104 <= (-offset) <= 0x200 |
| 20 | @ 0x204 <= (-offset) |
| 21 | |
| 22 | |
| 23 | .syntax unified |
| 24 | |
| 25 | @------------------------------------------------------------------------------- |
| 26 | @ TEST1 |
| 27 | @------------------------------------------------------------------------------- |
| 28 | .section .TEST1 |
| 29 | .globl func1 |
| 30 | .align 2 |
| 31 | .type func1,%function |
| 32 | .fnstart |
| 33 | func1: |
| 34 | .setfp fp, sp, #0 |
| 35 | add fp, sp, #0 |
| 36 | sub sp, fp, #0 |
| 37 | bx lr |
| 38 | .personality __gxx_personality_v0 |
| 39 | .handlerdata |
| 40 | .fnend |
| 41 | |
| 42 | @------------------------------------------------------------------------------- |
| 43 | @ The assembler should emit 0x9B to copy stack pointer from r11. |
| 44 | @------------------------------------------------------------------------------- |
| 45 | @ CHECK: Section { |
| 46 | @ CHECK: Name: .ARM.extab.TEST1 |
| 47 | @ CHECK: SectionData ( |
| 48 | @ CHECK: 0000: 00000000 B0B09B00 |........| |
| 49 | @ CHECK: ) |
| 50 | @ CHECK: } |
| 51 | |
| 52 | |
| 53 | |
| 54 | @------------------------------------------------------------------------------- |
| 55 | @ TEST2 |
| 56 | @------------------------------------------------------------------------------- |
| 57 | .section .TEST2 |
| 58 | .globl func2a |
| 59 | .align 2 |
| 60 | .type func2a,%function |
| 61 | .fnstart |
| 62 | func2a: |
| 63 | .setfp fp, sp, #-4 |
| 64 | add fp, sp, #4 |
| 65 | sub sp, fp, #4 |
| 66 | bx lr |
| 67 | .personality __gxx_personality_v0 |
| 68 | .handlerdata |
| 69 | .fnend |
| 70 | |
| 71 | .globl func2b |
| 72 | .align 2 |
| 73 | .type func2b,%function |
| 74 | .fnstart |
| 75 | func2b: |
| 76 | .setfp fp, sp, #-0x100 |
| 77 | add fp, sp, #0x100 |
| 78 | sub sp, fp, #0x100 |
| 79 | bx lr |
| 80 | .personality __gxx_personality_v0 |
| 81 | .handlerdata |
| 82 | .fnend |
| 83 | |
| 84 | @------------------------------------------------------------------------------- |
| 85 | @ The assembler should emit 0x9B to copy stack pointer from r11. |
| 86 | @ The assembler should emit ((-offset - 4) >> 2) for offset. |
| 87 | @------------------------------------------------------------------------------- |
| 88 | @ CHECK: Section { |
| 89 | @ CHECK: Name: .ARM.extab.TEST2 |
| 90 | @ CHECK: SectionData ( |
| 91 | @ CHECK: 0000: 00000000 B0009B00 00000000 B03F9B00 |.............?..| |
| 92 | @ CHECK: ) |
| 93 | @ CHECK: } |
| 94 | |
| 95 | |
| 96 | |
| 97 | @------------------------------------------------------------------------------- |
| 98 | @ TEST3 |
| 99 | @------------------------------------------------------------------------------- |
| 100 | .section .TEST3 |
| 101 | .globl func3a |
| 102 | .align 2 |
| 103 | .type func3a,%function |
| 104 | .fnstart |
| 105 | func3a: |
| 106 | .setfp fp, sp, #-0x104 |
| 107 | sub fp, sp, #0x104 |
| 108 | add sp, fp, #0x104 |
| 109 | bx lr |
| 110 | .personality __gxx_personality_v0 |
| 111 | .handlerdata |
| 112 | .fnend |
| 113 | |
| 114 | .globl func3b |
| 115 | .align 2 |
| 116 | .type func3b,%function |
| 117 | .fnstart |
| 118 | func3b: |
| 119 | .setfp fp, sp, #-0x200 |
| 120 | sub fp, sp, #0x200 |
| 121 | add sp, fp, #0x200 |
| 122 | bx lr |
| 123 | .personality __gxx_personality_v0 |
| 124 | .handlerdata |
| 125 | .fnend |
| 126 | |
| 127 | @------------------------------------------------------------------------------- |
| 128 | @ The assembler should emit 0x9B to copy stack pointer from r11. |
| 129 | @ The assembler should emit 0x3F and ((-offset - 0x104) >> 2) for offset. |
| 130 | @------------------------------------------------------------------------------- |
| 131 | @ CHECK: Section { |
| 132 | @ CHECK: Name: .ARM.extab.TEST3 |
| 133 | @ CHECK: SectionData ( |
Logan Chien | 325823a | 2013-06-09 12:22:30 +0000 | [diff] [blame] | 134 | @ CHECK: 0000: 00000000 3F009B00 00000000 3F3F9B00 |....?.......??..| |
Logan Chien | 4ea23b5 | 2013-05-10 16:17:24 +0000 | [diff] [blame] | 135 | @ CHECK: ) |
| 136 | @ CHECK: } |
| 137 | |
| 138 | |
| 139 | |
| 140 | @------------------------------------------------------------------------------- |
| 141 | @ TEST4 |
| 142 | @------------------------------------------------------------------------------- |
| 143 | .section .TEST4 |
| 144 | .globl func4a |
| 145 | .align 2 |
| 146 | .type func4a,%function |
| 147 | .fnstart |
| 148 | func4a: |
| 149 | .setfp fp, sp, #-0x204 |
| 150 | sub fp, sp, #0x204 |
| 151 | add sp, fp, #0x204 |
| 152 | bx lr |
| 153 | .personality __gxx_personality_v0 |
| 154 | .handlerdata |
| 155 | .fnend |
| 156 | |
| 157 | .globl func4b |
| 158 | .align 2 |
| 159 | .type func4b,%function |
| 160 | .fnstart |
| 161 | func4b: |
| 162 | .setfp fp, sp, #-0x580 |
| 163 | sub fp, sp, #0x580 |
| 164 | add sp, fp, #0x580 |
| 165 | bx lr |
| 166 | .personality __gxx_personality_v0 |
| 167 | .handlerdata |
| 168 | .fnend |
| 169 | |
| 170 | @------------------------------------------------------------------------------- |
| 171 | @ The assembler should emit 0x9B to copy stack pointer from r11. |
| 172 | @ The assembler should emit 0xB2 and the ULEB128 encoding of |
| 173 | @ ((-offset - 0x204) >> 2) for offset. |
| 174 | @------------------------------------------------------------------------------- |
| 175 | @ CHECK: Section { |
| 176 | @ CHECK: Name: .ARM.extab.TEST4 |
| 177 | @ CHECK: SectionData ( |
| 178 | @ CHECK: 0000: 00000000 00B29B00 00000000 DFB29B01 |................| |
| 179 | @ CHECK: 0010: B0B0B001 |....| |
| 180 | @ CHECK: ) |
| 181 | @ CHECK: } |
| 182 | |
| 183 | |
| 184 | |
| 185 | @------------------------------------------------------------------------------- |
| 186 | @ TEST5 |
| 187 | @------------------------------------------------------------------------------- |
| 188 | .section .TEST5 |
| 189 | .globl func5a |
| 190 | .align 2 |
| 191 | .type func5a,%function |
| 192 | .fnstart |
| 193 | func5a: |
| 194 | .setfp fp, sp, #0x4 |
| 195 | add fp, sp, #0x4 |
| 196 | sub sp, fp, #0x4 |
| 197 | bx lr |
| 198 | .personality __gxx_personality_v0 |
| 199 | .handlerdata |
| 200 | .fnend |
| 201 | |
| 202 | .globl func5b |
| 203 | .align 2 |
| 204 | .type func5b,%function |
| 205 | .fnstart |
| 206 | func5b: |
| 207 | .setfp fp, sp, #0x104 |
| 208 | add fp, sp, #0x104 |
| 209 | sub sp, fp, #0x104 |
| 210 | bx lr |
| 211 | .personality __gxx_personality_v0 |
| 212 | .handlerdata |
| 213 | .fnend |
| 214 | |
| 215 | .globl func5c |
| 216 | .align 2 |
| 217 | .type func5c,%function |
| 218 | .fnstart |
| 219 | func5c: |
| 220 | .setfp fp, sp, #0x204 |
| 221 | add fp, sp, #0x204 |
| 222 | sub sp, fp, #0x204 |
| 223 | bx lr |
| 224 | .personality __gxx_personality_v0 |
| 225 | .handlerdata |
| 226 | .fnend |
| 227 | |
| 228 | @------------------------------------------------------------------------------- |
| 229 | @ The assembler should emit 0x9B to copy stack pointer from r11. |
| 230 | @ The assembler should emit (0x40 | (offset - 4)) >> 2 for offset. |
| 231 | @ If (offset - 4) is greater than 0x3f, then multiple 0x7f should be emitted. |
| 232 | @------------------------------------------------------------------------------- |
| 233 | @ CHECK: Section { |
| 234 | @ CHECK: Name: .ARM.extab.TEST5 |
| 235 | @ CHECK: SectionData ( |
Logan Chien | 325823a | 2013-06-09 12:22:30 +0000 | [diff] [blame] | 236 | @ CHECK: 0000: 00000000 B0409B00 00000000 7F409B00 |.....@.......@..| |
| 237 | @ CHECK: 0010: 00000000 7F409B01 B0B0B07F |.....@......| |
Logan Chien | 4ea23b5 | 2013-05-10 16:17:24 +0000 | [diff] [blame] | 238 | @ CHECK: ) |
| 239 | @ CHECK: } |