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