# RUN: yaml2obj %s -o %t.exe # RUN: llvm-objdump --unwind-info %t.exe | FileCheck %s # T18: V3 with EHANDLER and odd PayloadWords. # # When PayloadWords is odd, the payload region occupies 4 + odd*2 bytes, # which is not a multiple of 4. The V3 spec locates the handler RVA at # handler_offset = ALIGN_UP(sizeof(UNWIND_INFO_V3) + PayloadWords * 2, 4) # so the encoder emits 2 trailing zero padding bytes between the payload # and the handler. The decoder must therefore round up to the next 4-byte # boundary when looking for the handler. # # .xdata hex breakdown (PayloadWords=3, payload=6 bytes, padded to 8): # Byte 0: 0x0B (Version=3, Flags=1 (UNW_FLAG_EHANDLER)) # Byte 1: 0x07 (SizeOfProlog=7) # Byte 2: 0x03 (PayloadWords=3 words -> 6 bytes payload) # Byte 3: 0x02 (NumberOfOps=2, NumberOfEpilogs=0) # +0: 07 Prolog IP offset[0]: +7 # +1: 00 Prolog IP offset[1]: +0 # +2: 38 WOD pool[0]: WOD_ALLOC_SMALL Size=32 # +3: 34 WOD pool[1]: WOD_PUSH RSI # +4: 00 00 Unused pool tail (only 2 WODs referenced by NumberOfOps=2) # +6: 00 00 Padding: handler_offset = ALIGN_UP(4+6, 4) = 12 # Handler RVA at file offset 0xC: 00 10 00 00 = 0x1000 # CHECK-LABEL: Unwind info: # CHECK-EMPTY: # CHECK-NEXT: Function Table: # CHECK-NEXT: Start Address: 0x1000 # CHECK-NEXT: End Address: 0x1010 # CHECK-NEXT: Unwind Info Address: 0x2000 # CHECK-NEXT: Version: 3 # CHECK-NEXT: Flags: 0x1 UNW_ExceptionHandler # CHECK-NEXT: Size of prolog: 0x7 # CHECK-NEXT: PayloadWords: 3 # CHECK-NEXT: NumberOfOps: 2 # CHECK-NEXT: NumberOfEpilogs: 0 # CHECK-NEXT: Prolog [2 ops]: # CHECK-NEXT: [0] IP +0x0007: WOD_ALLOC_SMALL Size=0x20 # CHECK-NEXT: [1] IP +0x0000: WOD_PUSH Reg=RSI # CHECK-NEXT: Handler: 0x1000 --- !COFF OptionalHeader: AddressOfEntryPoint: 4096 ImageBase: 0 SectionAlignment: 4096 FileAlignment: 512 MajorOperatingSystemVersion: 6 MinorOperatingSystemVersion: 0 MajorImageVersion: 0 MinorImageVersion: 0 MajorSubsystemVersion: 6 MinorSubsystemVersion: 0 Subsystem: IMAGE_SUBSYSTEM_WINDOWS_CUI DLLCharacteristics: [ IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA, IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE, IMAGE_DLL_CHARACTERISTICS_NX_COMPAT ] SizeOfStackReserve: 1048576 SizeOfStackCommit: 4096 SizeOfHeapReserve: 1048576 SizeOfHeapCommit: 4096 ExportTable: RelativeVirtualAddress: 0 Size: 0 ImportTable: RelativeVirtualAddress: 0 Size: 0 ResourceTable: RelativeVirtualAddress: 0 Size: 0 ExceptionTable: RelativeVirtualAddress: 12288 Size: 12 CertificateTable: RelativeVirtualAddress: 0 Size: 0 BaseRelocationTable: RelativeVirtualAddress: 0 Size: 0 Debug: RelativeVirtualAddress: 0 Size: 0 Architecture: RelativeVirtualAddress: 0 Size: 0 GlobalPtr: RelativeVirtualAddress: 0 Size: 0 TlsTable: RelativeVirtualAddress: 0 Size: 0 LoadConfigTable: RelativeVirtualAddress: 0 Size: 0 BoundImport: RelativeVirtualAddress: 0 Size: 0 IAT: RelativeVirtualAddress: 0 Size: 0 DelayImportDescriptor: RelativeVirtualAddress: 0 Size: 0 ClrRuntimeHeader: RelativeVirtualAddress: 0 Size: 0 header: Machine: IMAGE_FILE_MACHINE_AMD64 Characteristics: [ IMAGE_FILE_EXECUTABLE_IMAGE, IMAGE_FILE_LARGE_ADDRESS_AWARE ] sections: - Name: .text Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ] VirtualAddress: 4096 VirtualSize: 16 SectionData: '00000000000000000000000000000000' - Name: .xdata Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ] VirtualAddress: 8192 VirtualSize: 16 SectionData: '0B070302070038340000000000100000' - Name: .pdata Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ] VirtualAddress: 12288 VirtualSize: 12 SectionData: '001000001010000000200000' symbols: - Name: .text Value: 0 SectionNumber: 1 SimpleType: IMAGE_SYM_TYPE_NULL ComplexType: IMAGE_SYM_DTYPE_NULL StorageClass: IMAGE_SYM_CLASS_STATIC - Name: .xdata Value: 0 SectionNumber: 2 SimpleType: IMAGE_SYM_TYPE_NULL ComplexType: IMAGE_SYM_DTYPE_NULL StorageClass: IMAGE_SYM_CLASS_STATIC - Name: .pdata Value: 0 SectionNumber: 3 SimpleType: IMAGE_SYM_TYPE_NULL ComplexType: IMAGE_SYM_DTYPE_NULL StorageClass: IMAGE_SYM_CLASS_STATIC ...