Home | History | Annotate | Download | only in COFF
      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