1c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// This test checks the alignment and padding of the unwind info.
2c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke
3c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// RUN: llvm-mc -triple x86_64-pc-win32 -filetype=obj %s | llvm-readobj -s -sd -sr -u | FileCheck %s
4c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke
5c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK:      Sections [
6c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK:        Section {
7c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK:          Name: .xdata
8c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK:          RawDataSize: 16
9c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK:          RelocationCount: 1
10c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK:          Characteristics [
11c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK-NEXT:       ALIGN_4BYTES
12c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK-NEXT:       CNT_INITIALIZED_DATA
13c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK-NEXT:       MEM_READ
14c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK-NEXT:     ]
15c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK:          Relocations [
16c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK-NEXT:       [[HandlerDisp:0x[A-F0-9]+]] IMAGE_REL_AMD64_ADDR32NB __C_specific_handler
17c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK-NEXT:     ]
18c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK:          SectionData (
19c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK-NEXT:       0000: 19000200 04D002C0 00000000 BEBAFECA
20c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK-NEXT:     )
21c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK-NEXT:   }
22c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK-NEXT:   Section {
23c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK:          Name: .pdata
24c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK:          RawDataSize: 12
25c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK:          RelocationCount: 3
26c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK:          Characteristics [
27c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK-NEXT:       IMAGE_SCN_ALIGN_4BYTES
28c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK-NEXT:       IMAGE_SCN_CNT_INITIALIZED_DATA
29c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK-NEXT:       IMAGE_SCN_MEM_READ
30c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK-NEXT:     ]
31c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK:          Relocations [
32c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK-NEXT:       [[BeginDisp:0x[A-F0-9]+]] IMAGE_REL_AMD64_ADDR32NB func
33c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK-NEXT:       [[EndDisp:0x[A-F0-9]+]] IMAGE_REL_AMD64_ADDR32NB func
34c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK-NEXT:       [[UnwindDisp:0x[A-F0-9]+]] IMAGE_REL_AMD64_ADDR32NB .xdata
35c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK-NEXT:     ]
36c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK:          SectionData (
37c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK-NEXT:       0000: FCFFFFFF 05000000 00000000
38c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK-NEXT:     )
39c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK-NEXT:   }
40c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK-NEXT: ]
41c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK:      UnwindInformation [
42c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK-NEXT:   RuntimeFunction {
43c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK-NEXT:     StartAddress: func {{(\+0x[A-F0-9]+ )?}}([[BeginDisp]])
44c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK-NEXT:     EndAddress: func {{(\+0x[A-F0-9]+ )?}}([[EndDisp]])
45c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK-NEXT:     UnwindInfoAddress: .xdata {{(\+0x[A-F0-9]+ )?}}([[UnwindDisp]])
46c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK-NEXT:     UnwindInfo {
47c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK-NEXT:       Version: 1
48c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK-NEXT:       Flags [
49c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK-NEXT:         ExceptionHandler
50c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK-NEXT:         TerminateHandler
51c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK-NEXT:       ]
52c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK-NEXT:       PrologSize: 0
53c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK-NEXT:       FrameRegister: -
54c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK-NEXT:       FrameOffset: -
55c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK-NEXT:       UnwindCodeCount: 2
56c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK-NEXT:       UnwindCodes [
57c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK-NEXT:         0x04: PUSH_NONVOL reg=R13
58c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK-NEXT:         0x02: PUSH_NONVOL reg=R12
59c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK-NEXT:       ]
60c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK-NEXT:       Handler: __C_specific_handler ([[HandlerDisp]])
61c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK-NEXT:     }
62c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK-NEXT:   }
63c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// CHECK-NEXT: ]
64c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke
65c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// Generates two unwind codes.
66c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke// Requires no padding of the unwind code array.
67c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke    .globl func
68c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke    .def func; .scl 2; .type 32; .endef
69c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke    .seh_proc func
70c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke    push %r12
71c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke    .seh_pushreg 12
72c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke    push %r13
73c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke    .seh_pushreg 13
74c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke    .seh_handler __C_specific_handler, @except, @unwind
75c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke    .seh_handlerdata
76c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke    .long 0xcafebabe
77c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke    .text
78c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke    .seh_endprologue
79c29a720b362790746ca899a0b44fa35a1b399a42Kai Nackefunc:
80c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke    pop %r13
81c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke    pop %r12
82c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke    ret
83c29a720b362790746ca899a0b44fa35a1b399a42Kai Nacke    .seh_endproc
84