diff options
author | Michael J. Spencer <bigcheesegs@gmail.com> | 2012-12-05 20:12:35 +0000 |
---|---|---|
committer | Michael J. Spencer <bigcheesegs@gmail.com> | 2012-12-05 20:12:35 +0000 |
commit | eef7b6219ebe5d0ded0be4adb3003055fa8a63c4 (patch) | |
tree | e61ae4017a7f1403a7d09efc78e915a504837167 /test/tools | |
parent | 717a142823f84bd3aa958755ead1d991860ca8f4 (diff) |
Add dump of Win64 EH unwind data.
The new command line option -unwind-info dumps the Win64 EH unwind
data to the console. This is a nice feature if you need to debug
generated EH data (e.g. from LLVM). Includes a test case.
Initial patch by João Matos, extensions and rework by Kai Nacke.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@169415 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/tools')
-rw-r--r-- | test/tools/llvm-objdump/win64-unwind-data.s | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/test/tools/llvm-objdump/win64-unwind-data.s b/test/tools/llvm-objdump/win64-unwind-data.s new file mode 100644 index 0000000000..1e4c7428ce --- /dev/null +++ b/test/tools/llvm-objdump/win64-unwind-data.s @@ -0,0 +1,106 @@ +// This test checks that the unwind data is dumped by llvm-objdump. +// RUN: llvm-mc -triple x86_64-pc-win32 -filetype=obj %s | llvm-objdump -u - | FileCheck %s + +// CHECK: Unwind info: +// CHECK: Function Table: +// CHECK-NEXT: Start Address: .text +// CHECK-NEXT: End Address: .text + 0x001b +// CHECK-NEXT: Unwind Info Address: .xdata +// CHECK-NEXT: Version: 1 +// CHECK-NEXT: Flags: 1 UNW_ExceptionHandler +// CHECK-NEXT: Size of prolog: 18 +// CHECK-NEXT: Number of Codes: 8 +// CHECK-NEXT: Frame register: RBX +// CHECK-NEXT: Frame offset: 0 +// CHECK-NEXT: Unwind Codes: +// CHECK-NEXT: 0x00: UOP_SetFPReg +// CHECK-NEXT: 0x0f: UOP_PushNonVol RBX +// CHECK-NEXT: 0x0e: UOP_SaveXMM128 XMM8 [0x0000] +// CHECK-NEXT: 0x09: UOP_SaveNonVol RSI [0x0010] +// CHECK-NEXT: 0x04: UOP_AllocSmall 24 +// CHECK-NEXT: 0x00: UOP_PushMachFrame w/o error code +// CHECK: Function Table: +// CHECK-NEXT: Start Address: .text + 0x0012 +// CHECK-NEXT: End Address: .text + 0x0012 +// CHECK-NEXT: Unwind Info Address: .xdata + 0x001c +// CHECK-NEXT: Version: 1 +// CHECK-NEXT: Flags: 4 UNW_ChainInfo +// CHECK-NEXT: Size of prolog: 0 +// CHECK-NEXT: Number of Codes: 0 +// CHECK-NEXT: No frame pointer used +// CHECK: Function Table: +// CHECK-NEXT: Start Address: .text + 0x001b +// CHECK-NEXT: End Address: .text + 0x001c +// CHECK-NEXT: Unwind Info Address: .xdata + 0x002c +// CHECK-NEXT: Version: 1 +// CHECK-NEXT: Flags: 0 +// CHECK-NEXT: Size of prolog: 0 +// CHECK-NEXT: Number of Codes: 0 +// CHECK-NEXT: No frame pointer used +// CHECK: Function Table: +// CHECK-NEXT: Start Address: .text + 0x001c +// CHECK-NEXT: End Address: .text + 0x0039 +// CHECK-NEXT: Unwind Info Address: .xdata + 0x0034 +// CHECK-NEXT: Version: 1 +// CHECK-NEXT: Flags: 0 +// CHECK-NEXT: Size of prolog: 14 +// CHECK-NEXT: Number of Codes: 6 +// CHECK-NEXT: No frame pointer used +// CHECK-NEXT: Unwind Codes: +// CHECK-NEXT: 0x0e: UOP_AllocLarge 8454128 +// CHECK-NEXT: 0x07: UOP_AllocLarge 8190 +// CHECK-NEXT: 0x00: UOP_PushMachFrame w/o error code + + .text + .globl func + .def func; .scl 2; .type 32; .endef + .seh_proc func +func: + .seh_pushframe @code + subq $24, %rsp + .seh_stackalloc 24 + movq %rsi, 16(%rsp) + .seh_savereg %rsi, 16 + movups %xmm8, (%rsp) + .seh_savexmm %xmm8, 0 + pushq %rbx + .seh_pushreg 3 + mov %rsp, %rbx + .seh_setframe 3, 0 + .seh_endprologue + .seh_handler __C_specific_handler, @except + .seh_handlerdata + .long 0 + .text + .seh_startchained + .seh_endprologue + .seh_endchained + lea (%rbx), %rsp + pop %rbx + addq $24, %rsp + ret + .seh_endproc + +// Test emission of small functions. + .globl smallFunc + .def smallFunc; .scl 2; .type 32; .endef + .seh_proc smallFunc +smallFunc: + ret + .seh_endproc + +// Function with big stack allocation. + .globl smallFunc + .def allocFunc; .scl 2; .type 32; .endef + .seh_proc smallFunc +allocFunc: + .seh_pushframe @code + subq $65520, %rsp + .seh_stackalloc 65520 + sub $8454128, %rsp + .seh_stackalloc 8454128 + .seh_endprologue + add $8454128, %rsp + addq $65520, %rsp + ret + .seh_endproc |