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 12@ (ii) the unwind opcode to add or subtract the stack offset. 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 33func1: 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 62func2a: 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 75func2b: 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 105func3a: 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 118func3b: 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 ( 134@ CHECK: 0000: 00000000 3F009B00 00000000 3F3F9B00 |....?.......??..| 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 148func4a: 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 161func4b: 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 193func5a: 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 206func5b: 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 219func5c: 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 ( 236@ CHECK: 0000: 00000000 B0409B00 00000000 7F409B00 |.....@.......@..| 237@ CHECK: 0010: 00000000 7F409B01 B0B0B07F |.....@......| 238@ CHECK: ) 239@ CHECK: } 240