344 lines · plain
1@ RUN: llvm-mc %s -triple=armv7-unknown-linux-gnueabi -filetype=obj -o - \2@ RUN: | llvm-readobj -S --sd - | FileCheck %s3 4@ Check the .save directive5 6@ The .save directive records the GPR registers which are pushed to the7@ stack. There are 4 different unwind opcodes:8@9@ 0xB100: pop r[3:0]10@ 0xA0: pop r[(4+x):4] @ r[4+x]-r[4] must be consecutive.11@ 0xA8: pop r14, r[(4+x):4] @ r[4+x]-r[4] must be consecutive.12@ 0x8000: pop r[15:4]13@14@ If register list specifed by .save directive is possible to be encoded15@ by 0xA0 or 0xA8, then the assembler should prefer them over 0x8000.16 17 18 .syntax unified19 20@-------------------------------------------------------------------------------21@ TEST122@-------------------------------------------------------------------------------23 .section .TEST124 .globl func1a25 .align 226 .type func1a,%function27 .fnstart28func1a:29 .save {r0}30 push {r0}31 pop {r0}32 bx lr33 .personality __gxx_personality_v034 .handlerdata35 .fnend36 37 .globl func1b38 .align 239 .type func1b,%function40 .fnstart41func1b:42 .save {r0, r1}43 push {r0, r1}44 pop {r0, r1}45 bx lr46 .personality __gxx_personality_v047 .handlerdata48 .fnend49 50 .globl func1c51 .align 252 .type func1c,%function53 .fnstart54func1c:55 .save {r0, r2}56 push {r0, r2}57 pop {r0, r2}58 bx lr59 .personality __gxx_personality_v060 .handlerdata61 .fnend62 63 .globl func1d64 .align 265 .type func1d,%function66 .fnstart67func1d:68 .save {r1, r2}69 push {r1, r2}70 pop {r1, r2}71 bx lr72 .personality __gxx_personality_v073 .handlerdata74 .fnend75 76 .globl func1e77 .align 278 .type func1e,%function79 .fnstart80func1e:81 .save {r0, r1, r2, r3}82 push {r0, r1, r2, r3}83 pop {r0, r1, r2, r3}84 bx lr85 .personality __gxx_personality_v086 .handlerdata87 .fnend88 89@-------------------------------------------------------------------------------90@ The assembler should emit 0xB000 unwind opcode.91@-------------------------------------------------------------------------------92@ CHECK: Section {93@ CHECK: Name: .ARM.extab.TEST194@ CHECK: SectionData (95@ CHECK: 0000: 00000000 B001B100 00000000 B003B100 |................|96@ CHECK: 0010: 00000000 B005B100 00000000 B006B100 |................|97@ CHECK: 0020: 00000000 B00FB100 |........|98@ CHECK: )99@ CHECK: }100 101 102 103@-------------------------------------------------------------------------------104@ TEST2105@-------------------------------------------------------------------------------106 .section .TEST2107 .globl func2a108 .align 2109 .type func2a,%function110 .fnstart111func2a:112 .save {r4}113 push {r4}114 pop {r4}115 bx lr116 .personality __gxx_personality_v0117 .handlerdata118 .fnend119 120 .globl func2b121 .align 2122 .type func2b,%function123 .fnstart124func2b:125 .save {r4, r5}126 push {r4, r5}127 pop {r4, r5}128 bx lr129 .personality __gxx_personality_v0130 .handlerdata131 .fnend132 133 .globl func2c134 .align 2135 .type func2c,%function136 .fnstart137func2c:138 .save {r4, r5, r6, r7, r8, r9, r10, r11}139 push {r4, r5, r6, r7, r8, r9, r10, r11}140 pop {r4, r5, r6, r7, r8, r9, r10, r11}141 bx lr142 .personality __gxx_personality_v0143 .handlerdata144 .fnend145 146@-------------------------------------------------------------------------------147@ The assembler should emit 0xA0 unwind opcode.148@-------------------------------------------------------------------------------149@ CHECK: Section {150@ CHECK: Name: .ARM.extab.TEST2151@ CHECK: SectionData (152@ CHECK: 0000: 00000000 B0B0A000 00000000 B0B0A100 |................|153@ CHECK: 0010: 00000000 B0B0A700 |........|154@ CHECK: )155@ CHECK: }156 157 158 159@-------------------------------------------------------------------------------160@ TEST3161@-------------------------------------------------------------------------------162 .section .TEST3163 .globl func3a164 .align 2165 .type func3a,%function166 .fnstart167func3a:168 .save {r4, r14}169 push {r4, r14}170 pop {r4, r14}171 bx lr172 .personality __gxx_personality_v0173 .handlerdata174 .fnend175 176 .globl func3b177 .align 2178 .type func3b,%function179 .fnstart180func3b:181 .save {r4, r5, r14}182 push {r4, r5, r14}183 pop {r4, r5, r14}184 bx lr185 .personality __gxx_personality_v0186 .handlerdata187 .fnend188 189 .globl func3c190 .align 2191 .type func3c,%function192 .fnstart193func3c:194 .save {r4, r5, r6, r7, r8, r9, r10, r11, r14}195 push {r4, r5, r6, r7, r8, r9, r10, r11, r14}196 pop {r4, r5, r6, r7, r8, r9, r10, r11, r14}197 bx lr198 .personality __gxx_personality_v0199 .handlerdata200 .fnend201 202@-------------------------------------------------------------------------------203@ The assembler should emit 0xA8 unwind opcode.204@-------------------------------------------------------------------------------205@ CHECK: Section {206@ CHECK: Name: .ARM.extab.TEST3207@ CHECK: SectionData (208@ CHECK: 0000: 00000000 B0B0A800 00000000 B0B0A900 |................|209@ CHECK: 0010: 00000000 B0B0AF00 |........|210@ CHECK: )211@ CHECK: }212 213 214 215@-------------------------------------------------------------------------------216@ TEST4217@-------------------------------------------------------------------------------218 .section .TEST4219 .globl func4a220 .align 2221 .type func4a,%function222 .fnstart223func4a:224 .save {r4, r5, r6, r7, r8, r9, r10, r11, r12, r14}225 push {r4, r5, r6, r7, r8, r9, r10, r11, r12, r14}226 pop {r4, r5, r6, r7, r8, r9, r10, r11, r12, r14}227 bx lr228 .personality __gxx_personality_v0229 .handlerdata230 .fnend231 232 .globl func4b233 .align 2234 .type func4b,%function235 .fnstart236func4b:237 @ Note: r7 is missing intentionally.238 .save {r4, r5, r6, r8, r9, r10, r11}239 push {r4, r5, r6, r8, r9, r10, r11}240 pop {r4, r5, r6, r8, r9, r10, r11}241 bx lr242 .personality __gxx_personality_v0243 .handlerdata244 .fnend245 246 .globl func4c247 .align 2248 .type func4c,%function249 .fnstart250func4c:251 @ Note: r7 is missing intentionally.252 .save {r4, r5, r6, r8, r9, r10, r11, r14}253 push {r4, r5, r6, r8, r9, r10, r11, r14}254 pop {r4, r5, r6, r8, r9, r10, r11, r14}255 bx lr256 .personality __gxx_personality_v0257 .handlerdata258 .fnend259 260 .globl func4d261 .align 2262 .type func4d,%function263 .fnstart264func4d:265 @ Note: The register list is not start with r4.266 .save {r5, r6, r7}267 push {r5, r6, r7}268 pop {r5, r6, r7}269 bx lr270 .personality __gxx_personality_v0271 .handlerdata272 .fnend273 274 .globl func4e275 .align 2276 .type func4e,%function277 .fnstart278func4e:279 @ Note: The register list is not start with r4.280 .save {r5, r6, r7, r14}281 push {r5, r6, r7, r14}282 pop {r5, r6, r7, r14}283 bx lr284 .personality __gxx_personality_v0285 .handlerdata286 .fnend287 288@-------------------------------------------------------------------------------289@ The assembler should emit 0x8000 unwind opcode.290@-------------------------------------------------------------------------------291@ CHECK: Section {292@ CHECK: Name: .ARM.extab.TEST4293@ CHECK: SectionData (294@ CHECK: 0000: 00000000 B0FF8500 00000000 B0F78000 |................|295@ CHECK: 0010: 00000000 B0F78400 00000000 B00E8000 |................|296@ CHECK: 0020: 00000000 B00E8400 |........|297@ CHECK: )298@ CHECK: }299 300 301 302@-------------------------------------------------------------------------------303@ TEST5304@-------------------------------------------------------------------------------305 .section .TEST5306 .globl func5a307 .align 2308 .type func5a,%function309 .fnstart310func5a:311 .save {r0, r1, r2, r3, r4, r5, r6}312 push {r0, r1, r2, r3, r4, r5, r6}313 pop {r0, r1, r2, r3, r4, r5, r6}314 bx lr315 .personality __gxx_personality_v0316 .handlerdata317 .fnend318 319 .globl func5b320 .align 2321 .type func5b,%function322 .fnstart323func5b:324 .save {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r14}325 push {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r14}326 pop {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r14}327 bx lr328 .personality __gxx_personality_v0329 .handlerdata330 .fnend331 332@-------------------------------------------------------------------------------333@ Check the order of unwind opcode to pop registers.334@ 0xB10F "pop {r0-r3}" should be emitted before 0xA2 "pop {r4-r6}".335@ 0xB10F "pop {r0-r3}" should be emitted before 0x85FF "pop {r4-r12, r14}".336@-------------------------------------------------------------------------------337@ CHECK: Section {338@ CHECK: Name: .ARM.extab.TEST5339@ CHECK: SectionData (340@ CHECK: 0000: 00000000 A20FB100 00000000 850FB101 |................|341@ CHECK: 0010: B0B0B0FF |....|342@ CHECK: )343@ CHECK: }344