206 lines · plain
1// This test checks various cases around sharing opcodes between epilogue and prologue2 3// RUN: llvm-mc -triple thumbv7-pc-win32 -filetype=obj %s | llvm-readobj -u - | FileCheck %s4 5// CHECK: RuntimeFunction {6// CHECK-NEXT: Function: func17// CHECK-NEXT: ExceptionRecord:8// CHECK-NEXT: ExceptionData {9// CHECK-NEXT: FunctionLength:10// CHECK-NEXT: Version:11// CHECK-NEXT: ExceptionData:12// CHECK-NEXT: EpiloguePacked: Yes13// CHECK-NEXT: Fragment: No14// CHECK-NEXT: EpilogueOffset: 215// CHECK-NEXT: ByteCodeLength:16// CHECK-NEXT: Prologue [17// CHECK-NEXT: 0xf5 0x15 ; vpush {d1-d5}18// CHECK-NEXT: 0x05 ; sub sp, #(5 * 4)19// CHECK-NEXT: 0xa0 0xf0 ; push.w {r4-r7, lr}20// CHECK-NEXT: 0xfe ; b.w <target>21// CHECK-NEXT: ]22// CHECK-NEXT: Epilogue [23// CHECK-NEXT: 0x05 ; add sp, #(5 * 4)24// CHECK-NEXT: 0xa0 0xf0 ; pop.w {r4-r7, pc}25// CHECK-NEXT: 0xfe ; b.w <target>26// CHECK-NEXT: ]27// CHECK-NEXT: }28// CHECK-NEXT: }29// CHECK-NEXT: RuntimeFunction {30// CHECK-NEXT: Function: func231// CHECK-NEXT: ExceptionRecord:32// CHECK-NEXT: ExceptionData {33// CHECK-NEXT: FunctionLength:34// CHECK-NEXT: Version:35// CHECK-NEXT: ExceptionData:36// CHECK-NEXT: EpiloguePacked: Yes37// CHECK-NEXT: Fragment: No38// CHECK-NEXT: EpilogueOffset: 039// CHECK-NEXT: ByteCodeLength: 440// CHECK-NEXT: Prologue [41// CHECK-NEXT: 0xd2 ; push {r4-r6}42// CHECK-NEXT: 0x04 ; sub sp, #(4 * 4)43// CHECK-NEXT: 0xfd ; bx <reg>44// CHECK-NEXT: ]45// CHECK-NEXT: }46// CHECK-NEXT: }47// CHECK-NEXT: RuntimeFunction {48// CHECK-NEXT: Function: func349// CHECK-NEXT: ExceptionRecord:50// CHECK-NEXT: ExceptionData {51// CHECK-NEXT: FunctionLength:52// CHECK-NEXT: Version:53// CHECK-NEXT: ExceptionData:54// CHECK-NEXT: EpiloguePacked: Yes55// CHECK-NEXT: Fragment: No56// CHECK-NEXT: EpilogueOffset: 057// CHECK-NEXT: ByteCodeLength: 458// CHECK-NEXT: Prologue [59// CHECK-NEXT: 0xe1 ; vpush {d8-d9}60// CHECK-NEXT: 0xdf ; push.w {r4-r11, lr}61// CHECK-NEXT: ]62// CHECK-NEXT: }63// CHECK-NEXT: }64// CHECK-NEXT: RuntimeFunction {65// CHECK-NEXT: Function: notshared166// CHECK-NEXT: ExceptionRecord:67// CHECK-NEXT: ExceptionData {68// CHECK-NEXT: FunctionLength:69// CHECK-NEXT: Version:70// CHECK-NEXT: ExceptionData:71// CHECK-NEXT: EpiloguePacked: Yes72// CHECK-NEXT: Fragment:73// CHECK-NEXT: EpilogueOffset: 274// CHECK-NEXT: ByteCodeLength: 475// CHECK-NEXT: Prologue [76// CHECK-NEXT: 0xdf ; push.w {r4-r11, lr}77// CHECK-NEXT: ]78// CHECK-NEXT: Epilogue [79// CHECK-NEXT: 0xdb ; pop.w {r4-r11}80// CHECK-NEXT: 0xfd ; bx <reg>81// CHECK-NEXT: ]82// CHECK: RuntimeFunction {83// CHECK-NEXT: Function: notpacked284// CHECK-NEXT: ExceptionRecord:85// CHECK-NEXT: ExceptionData {86// CHECK-NEXT: FunctionLength:87// CHECK-NEXT: Version:88// CHECK-NEXT: ExceptionData:89// CHECK-NEXT: EpiloguePacked: No90// CHECK: RuntimeFunction {91// CHECK-NEXT: Function: notpacked392// CHECK-NEXT: ExceptionRecord:93// CHECK-NEXT: ExceptionData {94// CHECK-NEXT: FunctionLength:95// CHECK-NEXT: Version:96// CHECK-NEXT: ExceptionData:97// CHECK-NEXT: EpiloguePacked: No98 99 .text100 .syntax unified101 .seh_proc func1102func1:103 push.w {r4-r7,lr}104 .seh_save_regs_w {r4-r7,lr}105 sub sp, sp, #20106 .seh_stackalloc 20107 vpush {d1-d5}108 .seh_save_fregs {d1-d5}109 .seh_endprologue110 nop111 .seh_startepilogue112 add sp, sp, #20113 .seh_stackalloc 20114 // As we're popping into lr instead of directly into pc, this pop115 // becomes a wide instruction. To match prologue vs epilogue, the116 // push in the prologue has been made wide too.117 pop.w {r4-r7,lr}118 .seh_save_regs_w {r4-r7,lr}119 b.w tailcall120 .seh_nop_w121 .seh_endepilogue122 .seh_endproc123 124 .seh_proc func2125func2:126 sub sp, sp, #16127 .seh_stackalloc 16128 push {r4-r6}129 .seh_save_regs {r4-r6}130 .seh_endprologue131 nop132 .seh_startepilogue133 pop {r4-r6}134 .seh_save_regs {r4-r6}135 add sp, sp, #16136 .seh_stackalloc 16137 bx lr138 .seh_nop139 .seh_endepilogue140 .seh_endproc141 142 .seh_proc func3143func3:144 push {r4-r11,lr}145 .seh_save_regs_w {r4-r11,lr}146 vpush {d8-d9}147 .seh_save_fregs {d8-d9}148 .seh_endprologue149 nop150 .seh_startepilogue151 vpop {d8-d9}152 .seh_save_fregs {d8-d9}153 pop {r4-r11,pc}154 .seh_save_regs_w {r4-r11,pc}155 .seh_endepilogue156 .seh_endproc157 158 .seh_proc notshared1159notshared1:160 push {r4-r11,lr}161 .seh_save_regs_w {r4-r11,lr}162 .seh_endprologue163 nop164 .seh_startepilogue165 // Packed, but not shared as this opcode doesn't match the prolog166 pop {r4-r11}167 .seh_save_regs_w {r4-r11}168 bx lr169 .seh_nop170 .seh_endepilogue171 .seh_endproc172 173 .seh_proc notpacked2174notpacked2:175 push {r4-r11}176 .seh_save_regs_w {r4-r11}177 vpush {d8-d9}178 .seh_save_fregs {d8-d9}179 .seh_endprologue180 nop181 .seh_startepilogue182 vpop {d8-d9}183 .seh_save_fregs {d8-d9}184 pop {r4-r11}185 .seh_save_regs_w {r4-r11}186 bx lr187 .seh_nop188 .seh_endepilogue189 // Not packed, as the epilog isn't at the end of the function190 nop191 .seh_endproc192 193 .seh_proc notpacked3194notpacked3:195 push {r4-r11,lr}196 .seh_save_regs_w {r4-r11,lr}197 .seh_endprologue198 nop199 it ge200 // Not packed, as the epilog is conditional201 .seh_startepilogue_cond ge202 popge {r4-r11,pc}203 .seh_save_regs_w {r4-r11,pc}204 .seh_endepilogue205 .seh_endproc206