213 lines · plain
1// This test checks that we emit unwind info correctly for functions2// larger than 1MB.3// RUN: llvm-mc -triple aarch64-pc-win32 -filetype=obj %s -o %t.o4// RUN: llvm-readobj -S -r -u %t.o | FileCheck %s5 6// CHECK: Section {7// CHECK: Number: 48// CHECK-NEXT: Name: .xdata (2E 78 64 61 74 61 00 00)9// CHECK-NEXT: VirtualSize: 0x010// CHECK-NEXT: VirtualAddress: 0x011// CHECK-NEXT: RawDataSize: 5212// CHECK-NEXT: PointerToRawData: 0x3D0A2013// CHECK-NEXT: PointerToRelocations: 0x014// CHECK-NEXT: PointerToLineNumbers: 0x015// CHECK-NEXT: RelocationCount: 016// CHECK-NEXT: LineNumberCount: 017// CHECK-NEXT: Characteristics [ (0x40300040)18// CHECK-NEXT: IMAGE_SCN_ALIGN_4BYTES (0x300000)19// CHECK-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA (0x40)20// CHECK-NEXT: IMAGE_SCN_MEM_READ (0x40000000)21// CHECK-NEXT: ]22// CHECK-NEXT: }23// CHECK-NEXT: Section {24// CHECK-NEXT: Number: 525// CHECK-NEXT: Name: .pdata (2E 70 64 61 74 61 00 00)26// CHECK-NEXT: VirtualSize: 0x027// CHECK-NEXT: VirtualAddress: 0x028// CHECK-NEXT: RawDataSize: 4029// CHECK-NEXT: PointerToRawData: 0x3D0A5430// CHECK-NEXT: PointerToRelocations: 0x3D0A7C31// CHECK-NEXT: PointerToLineNumbers: 0x032// CHECK-NEXT: RelocationCount: 1033// CHECK-NEXT: LineNumberCount: 034// CHECK-NEXT: Characteristics [ (0x40300040)35// CHECK-NEXT: IMAGE_SCN_ALIGN_4BYTES (0x300000)36// CHECK-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA (0x40)37// CHECK-NEXT: IMAGE_SCN_MEM_READ (0x40000000)38// CHECK-NEXT: ]39// CHECK-NEXT: }40// CHECK-NEXT: ]41// CHECK-LABEL: Relocations [42// CHECK-NEXT: Section (1) .text {43// CHECK-NEXT: 0x186A04 IMAGE_REL_ARM64_BRANCH26 foo (14)44// CHECK-NEXT: 0x3D091C IMAGE_REL_ARM64_BRANCH26 foo (14)45// CHECK-NEXT: }46// CHECK-NEXT: Section (5) .pdata {47// CHECK-NEXT: 0x0 IMAGE_REL_ARM64_ADDR32NB .text (0)48// CHECK-NEXT: 0x4 IMAGE_REL_ARM64_ADDR32NB .xdata (9)49// CHECK-NEXT: 0x8 IMAGE_REL_ARM64_ADDR32NB .text (0)50// CHECK-NEXT: 0xC IMAGE_REL_ARM64_ADDR32NB .xdata (9)51// CHECK-NEXT: 0x10 IMAGE_REL_ARM64_ADDR32NB $L.text_1 (2)52// CHECK-NEXT: 0x14 IMAGE_REL_ARM64_ADDR32NB .xdata (9)53// CHECK-NEXT: 0x18 IMAGE_REL_ARM64_ADDR32NB $L.text_2 (3)54// CHECK-NEXT: 0x1C IMAGE_REL_ARM64_ADDR32NB .xdata (9)55// CHECK-NEXT: 0x20 IMAGE_REL_ARM64_ADDR32NB $L.text_3 (4)56// CHECK-NEXT: 0x24 IMAGE_REL_ARM64_ADDR32NB .xdata (9)57// CHECK-NEXT: }58// CHECK-NEXT: ]59// CHECK-LABEL: UnwindInformation [60// CHECK-NEXT: RuntimeFunction {61// CHECK-NEXT: Function: a (0x0)62// CHECK-NEXT: ExceptionRecord: .xdata (0x0)63// CHECK-NEXT: ExceptionData {64// CHECK-NEXT: FunctionLength: 104857265// CHECK-NEXT: Version: 066// CHECK-NEXT: ExceptionData: No67// CHECK-NEXT: EpiloguePacked: No68// CHECK-NEXT: EpilogueScopes: 069// CHECK-NEXT: ByteCodeLength: 470// CHECK-NEXT: Prologue [71// CHECK-NEXT: 0xd561 ; str x30, [sp, #-16]!72// CHECK-NEXT: 0xe4 ; end73// CHECK-NEXT: ]74// CHECK-NEXT: EpilogueScopes [75// CHECK-NEXT: ]76// CHECK-NEXT: }77// CHECK-NEXT: }78// CHECK-NEXT: RuntimeFunction {79// CHECK-NEXT: Function: a +0xFFFFC (0xFFFFC)80// CHECK-NEXT: ExceptionRecord: .xdata +0x8 (0x8)81// CHECK-NEXT: ExceptionData {82// CHECK-NEXT: FunctionLength: 55144483// CHECK-NEXT: Version: 084// CHECK-NEXT: ExceptionData: No85// CHECK-NEXT: EpiloguePacked: Yes86// CHECK-NEXT: EpilogueOffset: 187// CHECK-NEXT: ByteCodeLength: 488// CHECK-NEXT: Prologue [89// CHECK-NEXT: 0xe5 ; end_c90// CHECK-NEXT: 0xd561 ; str x30, [sp, #-16]!91// CHECK-NEXT: 0xe4 ; end92// CHECK-NEXT: ]93// CHECK-NEXT: Epilogue [94// CHECK-NEXT: 0xd561 ; ldr x30, [sp], #1695// CHECK-NEXT: 0xe4 ; end96// CHECK-NEXT: ]97// CHECK-NEXT: }98// CHECK-NEXT: }99// CHECK-NEXT: RuntimeFunction {100// CHECK-NEXT: Function: b (0x186A10)101// CHECK-NEXT: ExceptionRecord: .xdata +0x10 (0x10)102// CHECK-NEXT: ExceptionData {103// CHECK-NEXT: FunctionLength: 1048572104// CHECK-NEXT: Version: 0105// CHECK-NEXT: ExceptionData: No106// CHECK-NEXT: EpiloguePacked: No107// CHECK-NEXT: EpilogueScopes: 0108// CHECK-NEXT: ByteCodeLength: 8109// CHECK-NEXT: Prologue [110// CHECK-NEXT: 0xe1 ; mov fp, sp111// CHECK-NEXT: 0xc81e ; stp x19, x20, [sp, #240]112// CHECK-NEXT: 0x9f ; stp x29, x30, [sp, #-256]!113// CHECK-NEXT: 0xe4 ; end114// CHECK-NEXT: ]115// CHECK-NEXT: EpilogueScopes [116// CHECK-NEXT: ]117// CHECK-NEXT: }118// CHECK-NEXT: }119// CHECK-NEXT: RuntimeFunction {120// CHECK-NEXT: Function: $L.text_2 +0x86A0C (0x286A0C)121// CHECK-NEXT: ExceptionRecord: .xdata +0x1C (0x1C)122// CHECK-NEXT: ExceptionData {123// CHECK-NEXT: FunctionLength: 1048572124// CHECK-NEXT: Version: 0125// CHECK-NEXT: ExceptionData: No126// CHECK-NEXT: EpiloguePacked: Yes127// CHECK-NEXT: EpilogueOffset: 0128// CHECK-NEXT: ByteCodeLength: 8129// CHECK-NEXT: Prologue [130// CHECK-NEXT: 0xe5 ; end_c131// CHECK-NEXT: 0xe1 ; mov fp, sp132// CHECK-NEXT: 0xc81e ; stp x19, x20, [sp, #240]133// CHECK-NEXT: 0x9f ; stp x29, x30, [sp, #-256]!134// CHECK-NEXT: 0xe4 ; end135// CHECK-NEXT: ]136// CHECK-NEXT: }137// CHECK-NEXT: }138// CHECK-NEXT: RuntimeFunction {139// CHECK-NEXT: Function: $L.text_3 +0x86A08 (0x386A08)140// CHECK-NEXT: ExceptionRecord: .xdata +0x28 (0x28)141// CHECK-NEXT: ExceptionData {142// CHECK-NEXT: FunctionLength: 302888143// CHECK-NEXT: Version: 0144// CHECK-NEXT: ExceptionData: No145// CHECK-NEXT: EpiloguePacked: Yes146// CHECK-NEXT: EpilogueOffset: 1147// CHECK-NEXT: ByteCodeLength: 8148// CHECK-NEXT: Prologue [149// CHECK-NEXT: 0xe5 ; end_c150// CHECK-NEXT: 0xe1 ; mov fp, sp151// CHECK-NEXT: 0xc81e ; stp x19, x20, [sp, #240]152// CHECK-NEXT: 0x9f ; stp x29, x30, [sp, #-256]!153// CHECK-NEXT: 0xe4 ; end154// CHECK-NEXT: ]155// CHECK-NEXT: Epilogue [156// CHECK-NEXT: 0xe1 ; mov sp, fp157// CHECK-NEXT: 0xc81e ; ldp x19, x20, [sp, #240]158// CHECK-NEXT: 0x9f ; ldp x29, x30, [sp], #256159// CHECK-NEXT: 0xe4 ; end160// CHECK-NEXT: ]161// CHECK-NEXT: }162// CHECK-NEXT: }163// CHECK-NEXT: ]164 165 .text166// A simple function with an single epilog mirroring the prolog.167 .global a168 .p2align 2169 .seh_proc a170a:171 str x30, [sp, #-16]!172 .seh_save_reg_x x30, 16173 .seh_endprologue174 .rept 400000175 nop176 .endr177 bl foo178 .seh_startepilogue179 ldr x30, [sp], #16180 .seh_save_reg_x x30, 16181 .seh_endepilogue182 ret183 .seh_endfunclet184 .seh_endproc185 186// Example 1 from https://docs.microsoft.com/en-us/cpp/build/arm64-exception-handling#function-fragments187 .global b188 .p2align 2189 .seh_proc b190b:191 stp x29, lr, [sp, #-256]!192 .seh_save_fplr_x 256193 stp x19, x20, [sp, #240]194 .seh_save_regp x19, 240195 mov x29, fp196 .seh_set_fp197 .seh_endprologue198 .rept 600000199 nop200 .endr201 bl foo202 .seh_startepilogue203 mov sp, x29204 .seh_set_fp205 ldp x19, x20, [sp, #240]206 .seh_save_regp x19, 240207 ldp x29, lr, [sp], #256208 .seh_save_fplr_x 256209 .seh_endepilogue210 ret211 .seh_endfunclet212 .seh_endproc213