# RUN: yaml2obj %s -o %t.exe # RUN: llvm-readobj --unwind %t.exe | FileCheck %s ## --unwind-show-wod-pool appends a raw dump of the WOD pool with byte ## offsets, useful for seeing how the pool is shared between prolog/epilogs. # RUN: llvm-readobj --unwind --unwind-show-wod-pool %t.exe \ # RUN: | FileCheck %s --check-prefixes=CHECK,POOL ## T3: V3 with multiple epilogs including inheritance. ## ## .xdata hex breakdown: ## Byte 0: 0x03 (Version=3, Flags=0) ## Byte 1: 0x0B (SizeOfProlog=11) ## Byte 2: 0x0D (PayloadWords=13 words -> 26 bytes payload) ## Byte 3: 0x63 (NumberOfOps=3, NumberOfEpilogs=3: (3<<5)|3=0x63) ## Payload (26 bytes): ## +0: 07 Prolog IP offset[0]: +7 ## +1: 02 Prolog IP offset[1]: +2 ## +2: 00 Prolog IP offset[2]: +0 ## +3: 18 Epilog[0] FlagsAndNumOps: flags=0, nops=3 -> (3<<3)|0 ## +4: 14 00 Epilog[0] EpilogOffset: +20 ## +6: 00 00 Epilog[0] FirstOp: 0 ## +8: 06 Epilog[0] IpOffsetOfLastInstruction: 6 ## +9: 00 04 05 Epilog[0] IP offsets ## +12: 00 Epilog[1] FlagsAndNumOps: nops=0 (inherited, 3 bytes only) ## +13: 0A 00 Epilog[1] EpilogOffset: +10 (delta from Epilog[0]; resolves to +30) ## +15: 10 Epilog[2] FlagsAndNumOps: nops=2 ## +16: 05 00 Epilog[2] EpilogOffset: +5 (delta from Epilog[1]; resolves to +35) ## +18: 01 00 Epilog[2] FirstOp: 1 (starts at WOD pool byte 1) ## +20: 03 Epilog[2] IpOffsetOfLastInstruction: 3 ## +21: 00 01 Epilog[2] IP offsets ## +23: 38 34 3C WOD pool: ALLOC_SMALL(32), PUSH RSI, PUSH RDI # CHECK-LABEL: UnwindInformation [ # CHECK-NEXT: RuntimeFunction { # CHECK: UnwindInfo { # CHECK-NEXT: Version: 3 # CHECK-NEXT: Flags [ (0x0) # CHECK-NEXT: ] # CHECK-NEXT: SizeOfProlog: 0xB # CHECK-NEXT: PayloadWords: 13 # CHECK-NEXT: NumberOfOps: 3 # CHECK-NEXT: NumberOfEpilogs: 3 # CHECK-NEXT: Prolog [3 ops]: # CHECK-NEXT: [0] IP +0x0007: ALLOC_SMALL Size=0x20 # CHECK-NEXT: [1] IP +0x0002: PUSH Reg=RSI # CHECK-NEXT: [2] IP +0x0000: PUSH Reg=RDI # CHECK-NEXT: Epilog [0] { # CHECK-NEXT: Flags [ (0x0) # CHECK-NEXT: ] # CHECK-NEXT: EpilogOffset: +0x14 # CHECK-NEXT: NumberOfOps: 3 # CHECK-NEXT: FirstOp: 0x0 # CHECK-NEXT: IpOffsetOfLastInstruction: 0x6 # CHECK-NEXT: [0] IP +0x0000: ALLOC_SMALL Size=0x20 # CHECK-NEXT: [1] IP +0x0004: PUSH Reg=RSI # CHECK-NEXT: [2] IP +0x0005: PUSH Reg=RDI # CHECK-NEXT: } # CHECK-NEXT: Epilog [1] { # CHECK-NEXT: Flags [ (0x0) # CHECK-NEXT: ] # CHECK-NEXT: EpilogOffset: +0x1E # CHECK-NEXT: NumberOfOps: 0 # CHECK-NEXT: (inherits from previous epilog: FirstOp=0x0, IpOffsetOfLastInstruction=0x6, 3 ops) # CHECK-NEXT: } # CHECK-NEXT: Epilog [2] { # CHECK-NEXT: Flags [ (0x0) # CHECK-NEXT: ] # CHECK-NEXT: EpilogOffset: +0x23 # CHECK-NEXT: NumberOfOps: 2 # CHECK-NEXT: FirstOp: 0x1 # CHECK-NEXT: IpOffsetOfLastInstruction: 0x3 # CHECK-NEXT: [0] IP +0x0000: PUSH Reg=RSI # CHECK-NEXT: [1] IP +0x0001: PUSH Reg=RDI # CHECK-NEXT: } # POOL-NEXT: WODPool [3 bytes] [ # POOL-NEXT: +0x0000: ALLOC_SMALL Size=0x20 # POOL-NEXT: +0x0001: PUSH Reg=RSI # POOL-NEXT: +0x0002: PUSH Reg=RDI # POOL-NEXT: ] # CHECK-NEXT: } # CHECK-NEXT: } # CHECK-NEXT: ] --- !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: 64 SectionData: '00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' - Name: .xdata Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ] VirtualAddress: 8192 VirtualSize: 30 SectionData: '030B0D63070200181400000006000405000A00100500010003000138343C' - Name: .pdata Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ] VirtualAddress: 12288 VirtualSize: 12 SectionData: '001000004010000000200000' 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 - Name: func Value: 0 SectionNumber: 1 SimpleType: IMAGE_SYM_TYPE_NULL ComplexType: IMAGE_SYM_DTYPE_FUNCTION StorageClass: IMAGE_SYM_CLASS_EXTERNAL ...