1*9880d681SAndroid Build Coastguard Worker// This test checks that the SEH directives emit the correct unwind data. 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker// RUN: llvm-mc -triple x86_64-pc-win32 -filetype=obj %s | llvm-readobj -s -u -r | FileCheck %s 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker// CHECK: Sections [ 6*9880d681SAndroid Build Coastguard Worker// CHECK: Section { 7*9880d681SAndroid Build Coastguard Worker// CHECK: Name: .text 8*9880d681SAndroid Build Coastguard Worker// CHECK: RelocationCount: 0 9*9880d681SAndroid Build Coastguard Worker// CHECK: Characteristics [ 10*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: ALIGN_4BYTES 11*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: CNT_CODE 12*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: MEM_EXECUTE 13*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: MEM_READ 14*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: ] 15*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: } 16*9880d681SAndroid Build Coastguard Worker// CHECK: Section { 17*9880d681SAndroid Build Coastguard Worker// CHECK: Name: .xdata 18*9880d681SAndroid Build Coastguard Worker// CHECK: RawDataSize: 52 19*9880d681SAndroid Build Coastguard Worker// CHECK: RelocationCount: 4 20*9880d681SAndroid Build Coastguard Worker// CHECK: Characteristics [ 21*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: ALIGN_4BYTES 22*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: CNT_INITIALIZED_DATA 23*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: MEM_READ 24*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: ] 25*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: } 26*9880d681SAndroid Build Coastguard Worker// CHECK: Section { 27*9880d681SAndroid Build Coastguard Worker// CHECK: Name: .pdata 28*9880d681SAndroid Build Coastguard Worker// CHECK: RelocationCount: 9 29*9880d681SAndroid Build Coastguard Worker// CHECK: Characteristics [ 30*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: ALIGN_4BYTES 31*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: CNT_INITIALIZED_DATA 32*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: MEM_READ 33*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: ] 34*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: } 35*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: ] 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: Relocations [ 38*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: Section (4) .xdata { 39*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: 0x14 IMAGE_REL_AMD64_ADDR32NB __C_specific_handler 40*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: 0x20 IMAGE_REL_AMD64_ADDR32NB func 41*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: 0x24 IMAGE_REL_AMD64_ADDR32NB func 42*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: 0x28 IMAGE_REL_AMD64_ADDR32NB .xdata 43*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: } 44*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: Section (5) .pdata { 45*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: 0x0 IMAGE_REL_AMD64_ADDR32NB func 46*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: 0x4 IMAGE_REL_AMD64_ADDR32NB func 47*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: 0x8 IMAGE_REL_AMD64_ADDR32NB .xdata 48*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: 0xC IMAGE_REL_AMD64_ADDR32NB func 49*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: 0x10 IMAGE_REL_AMD64_ADDR32NB func 50*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: 0x14 IMAGE_REL_AMD64_ADDR32NB .xdata 51*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: 0x18 IMAGE_REL_AMD64_ADDR32NB smallFunc 52*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: 0x1C IMAGE_REL_AMD64_ADDR32NB smallFunc 53*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: 0x20 IMAGE_REL_AMD64_ADDR32NB .xdata 54*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: } 55*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: ] 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker 58*9880d681SAndroid Build Coastguard Worker// CHECK: UnwindInformation [ 59*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: RuntimeFunction { 60*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: StartAddress: [[CodeSect1:[^ ]+]] [[BeginDisp1:(\+0x[A-F0-9]+)?]] 61*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: EndAddress: [[CodeSect1]] [[EndDisp1:(\+0x[A-F0-9]+)?]] 62*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: UnwindInfoAddress: 63*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: UnwindInfo { 64*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: Version: 1 65*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: Flags [ 66*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: ExceptionHandler 67*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: ] 68*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: PrologSize: 18 69*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: FrameRegister: RBX 70*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: FrameOffset: 0x0 71*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: UnwindCodeCount: 8 72*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: UnwindCodes [ 73*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: 0x12: SET_FPREG reg=RBX, offset=0x0 74*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: 0x0F: PUSH_NONVOL reg=RBX 75*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: 0x0E: SAVE_XMM128 reg=XMM8, offset=0x0 76*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: 0x09: SAVE_NONVOL reg=RSI, offset=0x10 77*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: 0x04: ALLOC_SMALL size=24 78*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: 0x00: PUSH_MACHFRAME errcode=yes 79*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: ] 80*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: Handler: __C_specific_handler 81*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: } 82*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: } 83*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: RuntimeFunction { 84*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: StartAddress: [[CodeSect2:[^ ]+]] [[BeginDisp2:(\+0x[A-F0-9]+)?]] 85*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: EndAddress: [[CodeSect2]] [[BeginDisp2:(\+0x[A-F0-9]+)?]] 86*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: UnwindInfoAddress: 87*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: UnwindInfo { 88*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: Version: 1 89*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: Flags [ 90*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: ChainInfo 91*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: ] 92*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: PrologSize: 0 93*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: FrameRegister: - 94*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: FrameOffset: - 95*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: UnwindCodeCount: 0 96*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: UnwindCodes [ 97*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: ] 98*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: Chained { 99*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: StartAddress: [[CodeSect1]] [[BeginDisp1]] 100*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: EndAddress: [[CodeSect1]] [[EndDisp1]] 101*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: UnwindInfoAddress: 102*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: } 103*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: } 104*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: } 105*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: RuntimeFunction { 106*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: StartAddress: [[CodeSect3:[^ ]+]] [[BeginDisp3:(\+0x[A-F0-9]+)?]] 107*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: EndAddress: [[CodeSect3]] [[BeginDisp3:(\+0x[A-F0-9]+)?]] 108*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: UnwindInfoAddress: 109*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: UnwindInfo { 110*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: Version: 1 111*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: Flags [ 112*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: ] 113*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: PrologSize: 0 114*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: FrameRegister: - 115*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: FrameOffset: - 116*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: UnwindCodeCount: 0 117*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: UnwindCodes [ 118*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: ] 119*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: } 120*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: } 121*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: ] 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Worker .text 124*9880d681SAndroid Build Coastguard Worker .globl func 125*9880d681SAndroid Build Coastguard Worker .def func; .scl 2; .type 32; .endef 126*9880d681SAndroid Build Coastguard Worker .seh_proc func 127*9880d681SAndroid Build Coastguard Workerfunc: 128*9880d681SAndroid Build Coastguard Worker .seh_pushframe @code 129*9880d681SAndroid Build Coastguard Worker subq $24, %rsp 130*9880d681SAndroid Build Coastguard Worker .seh_stackalloc 24 131*9880d681SAndroid Build Coastguard Worker movq %rsi, 16(%rsp) 132*9880d681SAndroid Build Coastguard Worker .seh_savereg %rsi, 16 133*9880d681SAndroid Build Coastguard Worker movups %xmm8, (%rsp) 134*9880d681SAndroid Build Coastguard Worker .seh_savexmm %xmm8, 0 135*9880d681SAndroid Build Coastguard Worker pushq %rbx 136*9880d681SAndroid Build Coastguard Worker .seh_pushreg 3 137*9880d681SAndroid Build Coastguard Worker mov %rsp, %rbx 138*9880d681SAndroid Build Coastguard Worker .seh_setframe 3, 0 139*9880d681SAndroid Build Coastguard Worker .seh_endprologue 140*9880d681SAndroid Build Coastguard Worker .seh_handler __C_specific_handler, @except 141*9880d681SAndroid Build Coastguard Worker .seh_handlerdata 142*9880d681SAndroid Build Coastguard Worker .long 0 143*9880d681SAndroid Build Coastguard Worker .text 144*9880d681SAndroid Build Coastguard Worker .seh_startchained 145*9880d681SAndroid Build Coastguard Worker .seh_endprologue 146*9880d681SAndroid Build Coastguard Worker .seh_endchained 147*9880d681SAndroid Build Coastguard Worker lea (%rbx), %rsp 148*9880d681SAndroid Build Coastguard Worker pop %rbx 149*9880d681SAndroid Build Coastguard Worker addq $24, %rsp 150*9880d681SAndroid Build Coastguard Worker ret 151*9880d681SAndroid Build Coastguard Worker .seh_endproc 152*9880d681SAndroid Build Coastguard Worker 153*9880d681SAndroid Build Coastguard Worker// Test emission of small functions. 154*9880d681SAndroid Build Coastguard Worker .globl smallFunc 155*9880d681SAndroid Build Coastguard Worker .def smallFunc; .scl 2; .type 32; .endef 156*9880d681SAndroid Build Coastguard Worker .seh_proc smallFunc 157*9880d681SAndroid Build Coastguard WorkersmallFunc: 158*9880d681SAndroid Build Coastguard Worker ret 159*9880d681SAndroid Build Coastguard Worker .seh_endproc 160