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