1eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer// This test checks that the unwind data is dumped by llvm-objdump. 2eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer// RUN: llvm-mc -triple x86_64-pc-win32 -filetype=obj %s | llvm-objdump -u - | FileCheck %s 3eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer 4eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer// CHECK: Unwind info: 5eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer// CHECK: Function Table: 6eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer// CHECK-NEXT: Start Address: .text 7eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer// CHECK-NEXT: End Address: .text + 0x001b 8eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer// CHECK-NEXT: Unwind Info Address: .xdata 9eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer// CHECK-NEXT: Version: 1 10eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer// CHECK-NEXT: Flags: 1 UNW_ExceptionHandler 11eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer// CHECK-NEXT: Size of prolog: 18 12eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer// CHECK-NEXT: Number of Codes: 8 13eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer// CHECK-NEXT: Frame register: RBX 14eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer// CHECK-NEXT: Frame offset: 0 15eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer// CHECK-NEXT: Unwind Codes: 16eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer// CHECK-NEXT: 0x00: UOP_SetFPReg 17eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer// CHECK-NEXT: 0x0f: UOP_PushNonVol RBX 18eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer// CHECK-NEXT: 0x0e: UOP_SaveXMM128 XMM8 [0x0000] 19eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer// CHECK-NEXT: 0x09: UOP_SaveNonVol RSI [0x0010] 20eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer// CHECK-NEXT: 0x04: UOP_AllocSmall 24 21eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer// CHECK-NEXT: 0x00: UOP_PushMachFrame w/o error code 22eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer// CHECK: Function Table: 23eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer// CHECK-NEXT: Start Address: .text + 0x0012 24eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer// CHECK-NEXT: End Address: .text + 0x0012 25eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer// CHECK-NEXT: Unwind Info Address: .xdata + 0x001c 26eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer// CHECK-NEXT: Version: 1 27eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer// CHECK-NEXT: Flags: 4 UNW_ChainInfo 28eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer// CHECK-NEXT: Size of prolog: 0 29eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer// CHECK-NEXT: Number of Codes: 0 30eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer// CHECK-NEXT: No frame pointer used 31eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer// CHECK: Function Table: 32eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer// CHECK-NEXT: Start Address: .text + 0x001b 33eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer// CHECK-NEXT: End Address: .text + 0x001c 34eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer// CHECK-NEXT: Unwind Info Address: .xdata + 0x002c 35eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer// CHECK-NEXT: Version: 1 36eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer// CHECK-NEXT: Flags: 0 37eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer// CHECK-NEXT: Size of prolog: 0 38eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer// CHECK-NEXT: Number of Codes: 0 39eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer// CHECK-NEXT: No frame pointer used 40eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer// CHECK: Function Table: 41eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer// CHECK-NEXT: Start Address: .text + 0x001c 42eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer// CHECK-NEXT: End Address: .text + 0x0039 43eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer// CHECK-NEXT: Unwind Info Address: .xdata + 0x0034 44eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer// CHECK-NEXT: Version: 1 45eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer// CHECK-NEXT: Flags: 0 46eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer// CHECK-NEXT: Size of prolog: 14 47eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer// CHECK-NEXT: Number of Codes: 6 48eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer// CHECK-NEXT: No frame pointer used 49eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer// CHECK-NEXT: Unwind Codes: 50eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer// CHECK-NEXT: 0x0e: UOP_AllocLarge 8454128 51eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer// CHECK-NEXT: 0x07: UOP_AllocLarge 8190 52eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer// CHECK-NEXT: 0x00: UOP_PushMachFrame w/o error code 53eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer 54eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer .text 55eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer .globl func 56eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer .def func; .scl 2; .type 32; .endef 57eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer .seh_proc func 58eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencerfunc: 59eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer .seh_pushframe @code 60eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer subq $24, %rsp 61eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer .seh_stackalloc 24 62eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer movq %rsi, 16(%rsp) 63eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer .seh_savereg %rsi, 16 64eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer movups %xmm8, (%rsp) 65eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer .seh_savexmm %xmm8, 0 66eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer pushq %rbx 67eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer .seh_pushreg 3 68eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer mov %rsp, %rbx 69eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer .seh_setframe 3, 0 70eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer .seh_endprologue 71eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer .seh_handler __C_specific_handler, @except 72eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer .seh_handlerdata 73eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer .long 0 74eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer .text 75eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer .seh_startchained 76eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer .seh_endprologue 77eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer .seh_endchained 78eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer lea (%rbx), %rsp 79eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer pop %rbx 80eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer addq $24, %rsp 81eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer ret 82eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer .seh_endproc 83eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer 84eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer// Test emission of small functions. 85eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer .globl smallFunc 86eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer .def smallFunc; .scl 2; .type 32; .endef 87eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer .seh_proc smallFunc 88eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. SpencersmallFunc: 89eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer ret 90eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer .seh_endproc 91eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer 92eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer// Function with big stack allocation. 93eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer .globl smallFunc 94eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer .def allocFunc; .scl 2; .type 32; .endef 95eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer .seh_proc smallFunc 96eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. SpencerallocFunc: 97eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer .seh_pushframe @code 98eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer subq $65520, %rsp 99eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer .seh_stackalloc 65520 100eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer sub $8454128, %rsp 101eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer .seh_stackalloc 8454128 102eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer .seh_endprologue 103eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer add $8454128, %rsp 104eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer addq $65520, %rsp 105eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer ret 106eef7b6219ebe5d0ded0be4adb3003055fa8a63c4Michael J. Spencer .seh_endproc 107