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