248 lines · plain
1// This test checks that the SEH directives emit the correct unwind data.2 3// RUN: llvm-mc -triple aarch64-pc-win32 -filetype=obj %s | llvm-readobj -S -r -u - | FileCheck %s4 5// Check that the output assembler directives also can be parsed, and6// that they produce equivalent output:7 8// RUN: llvm-mc -triple aarch64-pc-win32 -filetype=asm %s | llvm-mc -triple aarch64-pc-win32 -filetype=obj - | llvm-readobj -S -r -u - | FileCheck %s9 10// CHECK: Sections [11// CHECK: Section {12// CHECK: Name: .text13// CHECK: RelocationCount: 014// CHECK: Characteristics [15// CHECK-NEXT: ALIGN_4BYTES16// CHECK-NEXT: CNT_CODE17// CHECK-NEXT: MEM_EXECUTE18// CHECK-NEXT: MEM_READ19// CHECK-NEXT: ]20// CHECK-NEXT: }21// CHECK: Section {22// CHECK: Name: .xdata23// CHECK: RawDataSize: 10024// CHECK: RelocationCount: 125// CHECK: Characteristics [26// CHECK-NEXT: ALIGN_4BYTES27// CHECK-NEXT: CNT_INITIALIZED_DATA28// CHECK-NEXT: MEM_READ29// CHECK-NEXT: ]30// CHECK-NEXT: }31// CHECK: Section {32// CHECK: Name: .pdata33// CHECK: RelocationCount: 234// CHECK: Characteristics [35// CHECK-NEXT: ALIGN_4BYTES36// CHECK-NEXT: CNT_INITIALIZED_DATA37// CHECK-NEXT: MEM_READ38// CHECK-NEXT: ]39// CHECK-NEXT: }40// CHECK-NEXT: ]41 42// CHECK-NEXT: Relocations [43// CHECK-NEXT: Section (4) .xdata {44// CHECK-NEXT: 0x58 IMAGE_REL_ARM64_ADDR32NB __C_specific_handler45// CHECK-NEXT: }46// CHECK-NEXT: Section (5) .pdata {47// CHECK-NEXT: 0x0 IMAGE_REL_ARM64_ADDR32NB .text48// CHECK-NEXT: 0x4 IMAGE_REL_ARM64_ADDR32NB .xdata49// CHECK-NEXT: }50// CHECK-NEXT: ]51 52// CHECK-NEXT: UnwindInformation [53// CHECK-NEXT: RuntimeFunction {54// CHECK-NEXT: Function: func55// CHECK-NEXT: ExceptionRecord: .xdata56// CHECK-NEXT: ExceptionData {57// CHECK-NEXT: FunctionLength: 17258// CHECK: Prologue [59// CHECK-NEXT: 0xe716c3 ; str p6, [sp, #3, mul vl]60// CHECK-NEXT: 0xe703c5 ; str z11, [sp, #5, mul vl]61// CHECK-NEXT: 0xdf05 ; addvl sp, #-562// CHECK-NEXT: 0xe76983 ; stp q9, q10, [sp, #-64]!63// CHECK-NEXT: 0xe73d83 ; str q29, [sp, #-64]!64// CHECK-NEXT: 0xe76243 ; stp d2, d3, [sp, #-64]!65// CHECK-NEXT: 0xe73f43 ; str d31, [sp, #-64]!66// CHECK-NEXT: 0xe77d03 ; stp x29, x30, [sp, #-64]!67// CHECK-NEXT: 0xe73e03 ; str x30, [sp, #-64]!68// CHECK-NEXT: 0xe74384 ; stp q3, q4, [sp, #64]69// CHECK-NEXT: 0xe71e84 ; str q30, [sp, #64]70// CHECK-NEXT: 0xe74444 ; stp d4, d5, [sp, #64]71// CHECK-NEXT: 0xe71d48 ; str d29, [sp, #64]72// CHECK-NEXT: 0xe74104 ; stp x1, x2, [sp, #64]73// CHECK-NEXT: 0xe70008 ; str x0, [sp, #64]74// CHECK-NEXT: 0xfc ; pacibsp75// CHECK-NEXT: 0xec ; clear unwound to call76// CHECK-NEXT: 0xeb ; EC context77// CHECK-NEXT: 0xea ; context78// CHECK-NEXT: 0xe9 ; machine frame79// CHECK-NEXT: 0xe8 ; trap frame80// CHECK-NEXT: 0xe3 ; nop81// CHECK-NEXT: 0xe202 ; add fp, sp, #1682// CHECK-NEXT: 0xdd41 ; str d13, [sp, #8]83// CHECK-NEXT: 0xde83 ; str d12, [sp, #-32]!84// CHECK-NEXT: 0xd884 ; stp d10, d11, [sp, #32]85// CHECK-NEXT: 0xda05 ; stp d8, d9, [sp, #-48]!86// CHECK-NEXT: 0x83 ; stp x29, x30, [sp, #-32]!87// CHECK-NEXT: 0x46 ; stp x29, x30, [sp, #48]88// CHECK-NEXT: 0xd141 ; str x24, [sp, #8]89// CHECK-NEXT: 0xd483 ; str x23, [sp, #-32]!90// CHECK-NEXT: 0xe6 ; save next91// CHECK-NEXT: 0xc882 ; stp x21, x22, [sp, #16]92// CHECK-NEXT: 0xd6c2 ; stp x25, lr, [sp, #16]93// CHECK-NEXT: 0x24 ; stp x19, x20, [sp, #-32]!94// CHECK-NEXT: 0xcc83 ; stp x21, x22, [sp, #-32]!95// CHECK-NEXT: 0x83 ; stp x29, x30, [sp, #-32]!96// CHECK-NEXT: 0xe1 ; mov fp, sp97// CHECK-NEXT: 0x01 ; sub sp, #1698// CHECK-NEXT: 0xe4 ; end99// CHECK-NEXT: ]100// CHECK-NEXT: EpilogueScopes [101// CHECK-NEXT: EpilogueScope {102// CHECK-NEXT: StartOffset: 41103// CHECK-NEXT: EpilogueStartIndex: 77104// CHECK-NEXT: Opcodes [105// CHECK-NEXT: 0x01 ; add sp, #16106// CHECK-NEXT: 0xe4 ; end107// CHECK-NEXT: ]108// CHECK-NEXT: }109// CHECK-NEXT: ]110// CHECK-NEXT: ExceptionHandler [111// CHECK-NEXT: Routine: __C_specific_handler (0x0)112// CHECK-NEXT: Parameter: 0x0113// CHECK-NEXT: ]114// CHECK-NEXT: }115// CHECK-NEXT: }116// CHECK-NEXT: ]117 118 119 .text120 .globl func121 .def func122 .scl 2123 .type 32124 .endef125 .seh_proc func126func:127 sub sp, sp, #24128 .seh_stackalloc 24129 mov x29, sp130 .seh_set_fp131 stp x29, x30, [sp, #-32]!132 .seh_save_fplr_x 32133 stp x21, x22, [sp, #-32]!134 .seh_save_regp_x x21, 32135 stp x19, x20, [sp, #-32]!136 .seh_save_r19r20_x 32137 stp x25, x30, [sp, #16]138 .seh_save_lrpair x25, 16139 stp x21, x22, [sp, #16]140 .seh_save_regp x21, 16141 stp x23, x24, [sp, #32]142 .seh_save_next143 str x23, [sp, #-32]!144 .seh_save_reg_x x23, 32145 str x24, [sp, #8]146 .seh_save_reg x24, 8147 stp x29, x30, [sp, #48]148 .seh_save_fplr 48149 stp x29, x30, [sp, #-32]!150 .seh_save_fplr_x 32151 stp d8, d9, [sp, #-48]!152 .seh_save_fregp_x d8, 48153 stp d10, d11, [sp, #32]154 .seh_save_fregp d10, 32155 str d12, [sp, #-32]!156 .seh_save_freg_x d12, 32157 str d13, [sp, #8]158 .seh_save_freg d13, 8159 add x29, sp, #16160 .seh_add_fp 16161 nop162 .seh_nop163 nop164 .seh_trap_frame165 nop166 .seh_pushframe167 nop168 .seh_context169 nop170 .seh_ec_context171 nop172 .seh_clear_unwound_to_call173 pacibsp174 .seh_pac_sign_lr175 nop176 .seh_save_any_reg x0, 64177 nop178 .seh_save_any_reg_p x1, 64179 nop180 .seh_save_any_reg d29, 64181 nop182 .seh_save_any_reg_p d4, 64183 nop184 .seh_save_any_reg q30, 64185 nop186 .seh_save_any_reg_p q3, 64187 nop188 .seh_save_any_reg_x lr, 64189 nop190 .seh_save_any_reg_px fp, 64191 nop192 .seh_save_any_reg_x d31, 64193 nop194 .seh_save_any_reg_px d2, 64195 nop196 .seh_save_any_reg_x q29, 64197 nop198 .seh_save_any_reg_px q9, 64199 nop200 .seh_allocz 5201 nop202 .seh_save_zreg z11, 5203 nop204 .seh_save_preg p6, 3205 nop206 .seh_endprologue207 nop208 .seh_startepilogue209 add sp, sp, #24210 .seh_stackalloc 24211 .seh_endepilogue212 ret213 .seh_handler __C_specific_handler, @except214 .seh_handlerdata215 .long 0216 .text217 .seh_endproc218 219 // Function with no .seh directives; no pdata/xdata entries are220 // generated.221 .globl smallFunc222 .def smallFunc223 .scl 2224 .type 32225 .endef226 .seh_proc smallFunc227smallFunc:228 ret229 .seh_endproc230 231 // Function with no .seh directives, but with .seh_handlerdata.232 // No xdata/pdata entries are generated, but the custom handler data233 // (the .long after .seh_handlerdata) is left orphaned in the xdata234 // section.235 .globl handlerFunc236 .def handlerFunc237 .scl 2238 .type 32239 .endef240 .seh_proc handlerFunc241handlerFunc:242 ret243 .seh_handler __C_specific_handler, @except244 .seh_handlerdata245 .long 0246 .text247 .seh_endproc248