162 lines · plain
1// This test checks that the SEH directives emit the correct unwind data.2 3// RUN: llvm-mc -triple x86_64-pc-win32 -filetype=obj %s | llvm-readobj -S -u -r - | FileCheck %s4 5// CHECK: Sections [6// CHECK: Section {7// CHECK: Name: .text8// CHECK: RelocationCount: 09// CHECK: Characteristics [10// CHECK-NEXT: ALIGN_4BYTES11// CHECK-NEXT: CNT_CODE12// CHECK-NEXT: MEM_EXECUTE13// CHECK-NEXT: MEM_READ14// CHECK-NEXT: ]15// CHECK-NEXT: }16// CHECK: Section {17// CHECK: Name: .xdata18// CHECK: RawDataSize: 5219// CHECK: RelocationCount: 420// CHECK: Characteristics [21// CHECK-NEXT: ALIGN_4BYTES22// CHECK-NEXT: CNT_INITIALIZED_DATA23// CHECK-NEXT: MEM_READ24// CHECK-NEXT: ]25// CHECK-NEXT: }26// CHECK: Section {27// CHECK: Name: .pdata28// CHECK: RelocationCount: 929// CHECK: Characteristics [30// CHECK-NEXT: ALIGN_4BYTES31// CHECK-NEXT: CNT_INITIALIZED_DATA32// CHECK-NEXT: MEM_READ33// CHECK-NEXT: ]34// CHECK-NEXT: }35// CHECK-NEXT: ]36 37// CHECK-NEXT: Relocations [38// CHECK-NEXT: Section (4) .xdata {39// CHECK-NEXT: 0x14 IMAGE_REL_AMD64_ADDR32NB __C_specific_handler40// CHECK-NEXT: 0x20 IMAGE_REL_AMD64_ADDR32NB .text41// CHECK-NEXT: 0x24 IMAGE_REL_AMD64_ADDR32NB .text42// CHECK-NEXT: 0x28 IMAGE_REL_AMD64_ADDR32NB .xdata43// CHECK-NEXT: }44// CHECK-NEXT: Section (5) .pdata {45// CHECK-NEXT: 0x0 IMAGE_REL_AMD64_ADDR32NB .text46// CHECK-NEXT: 0x4 IMAGE_REL_AMD64_ADDR32NB .text47// CHECK-NEXT: 0x8 IMAGE_REL_AMD64_ADDR32NB .xdata48// CHECK-NEXT: 0xC IMAGE_REL_AMD64_ADDR32NB .text49// CHECK-NEXT: 0x10 IMAGE_REL_AMD64_ADDR32NB .text50// CHECK-NEXT: 0x14 IMAGE_REL_AMD64_ADDR32NB .xdata51// CHECK-NEXT: 0x18 IMAGE_REL_AMD64_ADDR32NB .text52// CHECK-NEXT: 0x1C IMAGE_REL_AMD64_ADDR32NB .text53// CHECK-NEXT: 0x20 IMAGE_REL_AMD64_ADDR32NB .xdata54// CHECK-NEXT: }55// CHECK-NEXT: ]56 57 58// CHECK: UnwindInformation [59// CHECK-NEXT: RuntimeFunction {60// CHECK-NEXT: StartAddress: [[CodeSect1:[^ ]+]] [[BeginDisp1:(\+0x[A-F0-9]+)?]]61// CHECK-NEXT: EndAddress: [[CodeSect1]] [[EndDisp1:(\+0x[A-F0-9]+)?]]62// CHECK-NEXT: UnwindInfoAddress:63// CHECK-NEXT: UnwindInfo {64// CHECK-NEXT: Version: 165// CHECK-NEXT: Flags [66// CHECK-NEXT: ExceptionHandler67// CHECK-NEXT: ]68// CHECK-NEXT: PrologSize: 1869// CHECK-NEXT: FrameRegister: RBX70// CHECK-NEXT: FrameOffset: 0x071// CHECK-NEXT: UnwindCodeCount: 872// CHECK-NEXT: UnwindCodes [73// CHECK-NEXT: 0x12: SET_FPREG reg=RBX, offset=0x074// CHECK-NEXT: 0x0F: PUSH_NONVOL reg=RBX75// CHECK-NEXT: 0x0E: SAVE_XMM128 reg=XMM8, offset=0x076// CHECK-NEXT: 0x09: SAVE_NONVOL reg=RSI, offset=0x1077// CHECK-NEXT: 0x04: ALLOC_SMALL size=2478// CHECK-NEXT: 0x00: PUSH_MACHFRAME errcode=yes79// CHECK-NEXT: ]80// CHECK-NEXT: Handler: __C_specific_handler81// CHECK-NEXT: }82// CHECK-NEXT: }83// CHECK-NEXT: RuntimeFunction {84// CHECK-NEXT: StartAddress: [[CodeSect2:[^ ]+]] [[BeginDisp2:(\+0x[A-F0-9]+)?]]85// CHECK-NEXT: EndAddress: [[CodeSect2]] [[BeginDisp2:(\+0x[A-F0-9]+)?]]86// CHECK-NEXT: UnwindInfoAddress:87// CHECK-NEXT: UnwindInfo {88// CHECK-NEXT: Version: 189// CHECK-NEXT: Flags [90// CHECK-NEXT: ChainInfo91// CHECK-NEXT: ]92// CHECK-NEXT: PrologSize: 093// CHECK-NEXT: FrameRegister: -94// CHECK-NEXT: FrameOffset: -95// CHECK-NEXT: UnwindCodeCount: 096// CHECK-NEXT: UnwindCodes [97// CHECK-NEXT: ]98// CHECK-NEXT: Chained {99// CHECK-NEXT: StartAddress: [[CodeSect1]] [[BeginDisp1]]100// CHECK-NEXT: EndAddress: [[CodeSect1]] [[EndDisp1]]101// CHECK-NEXT: UnwindInfoAddress:102// CHECK-NEXT: }103// CHECK-NEXT: }104// CHECK-NEXT: }105// CHECK-NEXT: RuntimeFunction {106// CHECK-NEXT: StartAddress: [[CodeSect3:[^ ]+]] [[BeginDisp3:(\+0x[A-F0-9]+)?]]107// CHECK-NEXT: EndAddress: [[CodeSect3]] [[BeginDisp3:(\+0x[A-F0-9]+)?]]108// CHECK-NEXT: UnwindInfoAddress:109// CHECK-NEXT: UnwindInfo {110// CHECK-NEXT: Version: 1111// CHECK-NEXT: Flags [112// CHECK-NEXT: ]113// CHECK-NEXT: PrologSize: 0114// CHECK-NEXT: FrameRegister: -115// CHECK-NEXT: FrameOffset: -116// CHECK-NEXT: UnwindCodeCount: 0117// CHECK-NEXT: UnwindCodes [118// CHECK-NEXT: ]119// CHECK-NEXT: }120// CHECK-NEXT: }121// CHECK-NEXT: ]122 123 .text124 .globl func125 .def func; .scl 2; .type 32; .endef126 .seh_proc func127func:128 .seh_pushframe @code129 subq $24, %rsp130 .seh_stackalloc 24131 movq %rsi, 16(%rsp)132 .seh_savereg %rsi, 16133 movups %xmm8, (%rsp)134 .seh_savexmm %xmm8, 0135 pushq %rbx136 .seh_pushreg %rbx137 mov %rsp, %rbx138 .seh_setframe 3, 0139 .seh_endprologue140 .seh_handler __C_specific_handler, @except141 .seh_handlerdata142 .long 0143 .text144 .seh_startchained145 .seh_endprologue146 .seh_endchained147 .seh_startepilogue148 lea (%rbx), %rsp149 pop %rbx150 addq $24, %rsp151 .seh_endepilogue152 ret153 .seh_endproc154 155// Test emission of small functions.156 .globl smallFunc157 .def smallFunc; .scl 2; .type 32; .endef158 .seh_proc smallFunc159smallFunc:160 ret161 .seh_endproc162